diff --git a/Engine/Helper.cs b/Engine/Helper.cs index f66c9b33f..c436d3f28 100644 --- a/Engine/Helper.cs +++ b/Engine/Helper.cs @@ -637,7 +637,7 @@ public int Compare(Tuple t1, Tuple t2) /// /// Class used to do variable analysis on the whole script /// - public class ScriptAnalysis: ICustomAstVisitor2 + public class ScriptAnalysis: ICustomAstVisitor { private VariableAnalysis OuterAnalysis; @@ -663,7 +663,12 @@ public object VisitScriptBlock(ScriptBlockAst scriptBlockAst) if (scriptBlockAst == null) return null; VariableAnalysis previousOuter = OuterAnalysis; - OuterAnalysis = Helper.Instance.InitializeVariableAnalysisHelper(scriptBlockAst, OuterAnalysis); + + // We already run variable analysis in these cases so check + if (!(scriptBlockAst.Parent is FunctionDefinitionAst) && !(scriptBlockAst.Parent is FunctionMemberAst)) + { + OuterAnalysis = Helper.Instance.InitializeVariableAnalysisHelper(scriptBlockAst, OuterAnalysis); + } if (scriptBlockAst.DynamicParamBlock != null) { @@ -691,77 +696,40 @@ public object VisitScriptBlock(ScriptBlockAst scriptBlockAst) } /// - /// Do nothing + /// perform special visiting action if statement is a typedefinitionast /// - /// + /// /// - public object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) + private object VisitStatementHelper(StatementAst statementAst) { - return null; - } - - /// - /// Do nothing - /// - /// - /// - public object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst) - { - return null; - } - - /// - /// Do nothing - /// - /// - /// - public object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst) - { - return null; - } + if (statementAst == null) + { + return null; + } - /// - /// Set outer analysis before further visiting. - /// - /// - /// - public object VisitFunctionMember(FunctionMemberAst functionMemberAst) - { - var previousOuter = OuterAnalysis; - OuterAnalysis = Helper.Instance.InitializeVariableAnalysisHelper(functionMemberAst, OuterAnalysis); + TypeDefinitionAst typeAst = statementAst as TypeDefinitionAst; - if (functionMemberAst != null) + if (typeAst == null) { - functionMemberAst.Body.Visit(this); + statementAst.Visit(this); + return null; } - OuterAnalysis = previousOuter; + foreach (var member in typeAst.Members) + { + FunctionMemberAst functionMemberAst = member as FunctionMemberAst; - return null; - } + if (functionMemberAst != null) + { + var previousOuter = OuterAnalysis; + OuterAnalysis = Helper.Instance.InitializeVariableAnalysisHelper(functionMemberAst, OuterAnalysis); - /// - /// Do nothing - /// - /// - /// - public object VisitPropertyMember(PropertyMemberAst propertyMemberAst) - { - return null; - } + if (functionMemberAst != null) + { + functionMemberAst.Body.Visit(this); + } - /// - /// Visit the functions defined in class - /// - /// - /// - public object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) - { - if (typeDefinitionAst != null) - { - foreach (var member in typeDefinitionAst.Members) - { - member.Visit(this); + OuterAnalysis = previousOuter; } } @@ -1177,7 +1145,7 @@ public object VisitNamedBlock(NamedBlockAst namedBlockAst) { foreach (var statement in namedBlockAst.Statements) { - statement.Visit(this); + VisitStatementHelper(statement); } } @@ -1260,7 +1228,7 @@ public object VisitStatementBlock(StatementBlockAst statementBlockAst) { foreach (var statement in statementBlockAst.Statements) { - statement.Visit(this); + VisitStatementHelper(statement); } }