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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|