e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
73 lines
2.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|