Xamarin Public Jenkins (auto-signing) e79aa3c0ed Imported Upstream version 4.6.0.125
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
2016-08-03 10:59:49 +00:00

73 lines
2.9 KiB
C#

//-----------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
//-----------------------------------------------------------------------------
namespace Microsoft.VisualBasic.Activities
{
using System;
using System.Activities;
using System.Activities.Expressions;
using System.Activities.Validation;
using System.Globalization;
using System.Reflection;
sealed class VisualBasicNameShadowingConstraint : Constraint
{
protected override void OnExecute(NativeActivityContext context, object objectToValidate, ValidationContext objectToValidateContext)
{
bool foundMultiple;
ActivityWithResult boundExpression;
LocationReference locationReference;
ActivityWithResult activity = (ActivityWithResult)objectToValidate;
foreach (RuntimeArgument runtimeArgument in activity.RuntimeArguments)
{
boundExpression = runtimeArgument.BoundArgument.Expression;
if (boundExpression != null && boundExpression is ILocationReferenceWrapper)
{
locationReference = ((ILocationReferenceWrapper)boundExpression).LocationReference;
if (locationReference != null)
{
foundMultiple = FindLocationReferencesFromEnvironment(objectToValidateContext.Environment, locationReference.Name);
if (foundMultiple)
{
Constraint.AddValidationError(context, new ValidationError(SR.AmbiguousVBVariableReference(locationReference.Name)));
}
}
}
}
}
static bool FindLocationReferencesFromEnvironment(LocationReferenceEnvironment environment, string targetName)
{
LocationReference foundLocationReference = null;
LocationReferenceEnvironment currentEnvironment;
bool foundMultiple = false;
currentEnvironment = environment;
while (currentEnvironment != null)
{
foreach (LocationReference reference in currentEnvironment.GetLocationReferences())
{
if (string.Equals(reference.Name, targetName, StringComparison.OrdinalIgnoreCase))
{
if (foundLocationReference != null)
{
foundMultiple = true;
return foundMultiple;
}
foundLocationReference = reference;
}
}
currentEnvironment = currentEnvironment.Parent;
}
return foundMultiple;
}
}
}