public override bool SemanticAnalysis(INamable instance, BaseFilter expectation)
{
bool retVal = base.SemanticAnalysis(instance, expectation);
if (retVal)
{
// Called
if (Called != null)
{
Called.SemanticAnalysis(instance, IsCallable.INSTANCE);
StaticUsage.AddUsages(Called.StaticUsage, Usage.ModeEnum.Call);
// Actual parameters
int i = 0;
foreach (Expression actual in ActualParameters)
{
Usage.ModeEnum mode = Usage.ModeEnum.Read;
ICallable called = Called.Ref as ICallable;
if (called != null)
{
Parameter parameter = (Parameter)called.FormalParameters[i];
mode = called.ModeForParameter(parameter);
}
actual.SemanticAnalysis(instance, IsActualParameter.INSTANCE);
StaticUsage.AddUsages(actual.StaticUsage, mode);
i += 1;
}
foreach (KeyValuePair<Designator, Expression> pair in NamedActualParameters)
{
Usage.ModeEnum mode = Usage.ModeEnum.Read;
ICallable called = Called.Ref as ICallable;
if (called != null)
{
Parameter parameter = called.GetFormalParameter(pair.Key.Image);
pair.Key.Ref = parameter;
StaticUsage.AddUsage(pair.Key.Ref, Root, Usage.ModeEnum.Parameter);
mode = called.ModeForParameter(parameter);
}
pair.Value.SemanticAnalysis(instance, IsActualParameter.INSTANCE);
StaticUsage.AddUsages(pair.Value.StaticUsage, mode);
}
ParameterAssociation = CreateParameterAssociation(Called.Ref as ICallable);
}
else
{
AddError("Called function not provided", RuleChecksEnum.SemanticAnalysisError);
}
}
return retVal;
}