diff --git a/src/System.Management.Automation/engine/parser/AstVisitor.cs b/src/System.Management.Automation/engine/parser/AstVisitor.cs index 03ce04ea4a..dcc7da489d 100644 --- a/src/System.Management.Automation/engine/parser/AstVisitor.cs +++ b/src/System.Management.Automation/engine/parser/AstVisitor.cs @@ -13,136 +13,189 @@ namespace System.Management.Automation.Language public interface ICustomAstVisitor { /// - object VisitErrorStatement(ErrorStatementAst errorStatementAst); + object DefaultVisit(Ast ast) => null; + /// - object VisitErrorExpression(ErrorExpressionAst errorExpressionAst); + object VisitErrorStatement(ErrorStatementAst errorStatementAst) => DefaultVisit(errorStatementAst); + + /// + object VisitErrorExpression(ErrorExpressionAst errorExpressionAst) => DefaultVisit(errorExpressionAst); #region Script Blocks /// - object VisitScriptBlock(ScriptBlockAst scriptBlockAst); + object VisitScriptBlock(ScriptBlockAst scriptBlockAst) => DefaultVisit(scriptBlockAst); + /// [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Param")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "param")] - object VisitParamBlock(ParamBlockAst paramBlockAst); + object VisitParamBlock(ParamBlockAst paramBlockAst) => DefaultVisit(paramBlockAst); + /// - object VisitNamedBlock(NamedBlockAst namedBlockAst); + object VisitNamedBlock(NamedBlockAst namedBlockAst) => DefaultVisit(namedBlockAst); + /// - object VisitTypeConstraint(TypeConstraintAst typeConstraintAst); + object VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => DefaultVisit(typeConstraintAst); + /// - object VisitAttribute(AttributeAst attributeAst); + object VisitAttribute(AttributeAst attributeAst) => DefaultVisit(attributeAst); + /// - object VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst); + object VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) => DefaultVisit(namedAttributeArgumentAst); + /// - object VisitParameter(ParameterAst parameterAst); + object VisitParameter(ParameterAst parameterAst) => DefaultVisit(parameterAst); #endregion Script Blocks #region Statements /// - object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst); + object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) => DefaultVisit(functionDefinitionAst); + /// - object VisitStatementBlock(StatementBlockAst statementBlockAst); + object VisitStatementBlock(StatementBlockAst statementBlockAst) => DefaultVisit(statementBlockAst); + /// - object VisitIfStatement(IfStatementAst ifStmtAst); + object VisitIfStatement(IfStatementAst ifStmtAst) => DefaultVisit(ifStmtAst); + /// - object VisitTrap(TrapStatementAst trapStatementAst); + object VisitTrap(TrapStatementAst trapStatementAst) => DefaultVisit(trapStatementAst); + /// - object VisitSwitchStatement(SwitchStatementAst switchStatementAst); + object VisitSwitchStatement(SwitchStatementAst switchStatementAst) => DefaultVisit(switchStatementAst); + /// - object VisitDataStatement(DataStatementAst dataStatementAst); + object VisitDataStatement(DataStatementAst dataStatementAst) => DefaultVisit(dataStatementAst); + /// - object VisitForEachStatement(ForEachStatementAst forEachStatementAst); + object VisitForEachStatement(ForEachStatementAst forEachStatementAst) => DefaultVisit(forEachStatementAst); + /// - object VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst); + object VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) => DefaultVisit(doWhileStatementAst); + /// - object VisitForStatement(ForStatementAst forStatementAst); + object VisitForStatement(ForStatementAst forStatementAst) => DefaultVisit(forStatementAst); + /// - object VisitWhileStatement(WhileStatementAst whileStatementAst); + object VisitWhileStatement(WhileStatementAst whileStatementAst) => DefaultVisit(whileStatementAst); + /// - object VisitCatchClause(CatchClauseAst catchClauseAst); + object VisitCatchClause(CatchClauseAst catchClauseAst) => DefaultVisit(catchClauseAst); + /// - object VisitTryStatement(TryStatementAst tryStatementAst); + object VisitTryStatement(TryStatementAst tryStatementAst) => DefaultVisit(tryStatementAst); + /// - object VisitBreakStatement(BreakStatementAst breakStatementAst); + object VisitBreakStatement(BreakStatementAst breakStatementAst) => DefaultVisit(breakStatementAst); + /// - object VisitContinueStatement(ContinueStatementAst continueStatementAst); + object VisitContinueStatement(ContinueStatementAst continueStatementAst) => DefaultVisit(continueStatementAst); + /// - object VisitReturnStatement(ReturnStatementAst returnStatementAst); + object VisitReturnStatement(ReturnStatementAst returnStatementAst) => DefaultVisit(returnStatementAst); + /// - object VisitExitStatement(ExitStatementAst exitStatementAst); + object VisitExitStatement(ExitStatementAst exitStatementAst) => DefaultVisit(exitStatementAst); + /// - object VisitThrowStatement(ThrowStatementAst throwStatementAst); + object VisitThrowStatement(ThrowStatementAst throwStatementAst) => DefaultVisit(throwStatementAst); + /// - object VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst); + object VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) => DefaultVisit(doUntilStatementAst); + /// - object VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst); + object VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) => DefaultVisit(assignmentStatementAst); #endregion Statements #region Pipelines /// - object VisitPipeline(PipelineAst pipelineAst); + object VisitPipeline(PipelineAst pipelineAst) => DefaultVisit(pipelineAst); + /// - object VisitCommand(CommandAst commandAst); + object VisitCommand(CommandAst commandAst) => DefaultVisit(commandAst); + /// - object VisitCommandExpression(CommandExpressionAst commandExpressionAst); + object VisitCommandExpression(CommandExpressionAst commandExpressionAst) => DefaultVisit(commandExpressionAst); + /// - object VisitCommandParameter(CommandParameterAst commandParameterAst); + object VisitCommandParameter(CommandParameterAst commandParameterAst) => DefaultVisit(commandParameterAst); + /// - object VisitFileRedirection(FileRedirectionAst fileRedirectionAst); + object VisitFileRedirection(FileRedirectionAst fileRedirectionAst) => DefaultVisit(fileRedirectionAst); + /// - object VisitMergingRedirection(MergingRedirectionAst mergingRedirectionAst); + object VisitMergingRedirection(MergingRedirectionAst mergingRedirectionAst) => DefaultVisit(mergingRedirectionAst); + #endregion Pipelines #region Expressions /// - object VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst); + object VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) => DefaultVisit(binaryExpressionAst); + /// - object VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst); + object VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) => DefaultVisit(unaryExpressionAst); + /// - object VisitConvertExpression(ConvertExpressionAst convertExpressionAst); + object VisitConvertExpression(ConvertExpressionAst convertExpressionAst) => DefaultVisit(convertExpressionAst); + /// - object VisitConstantExpression(ConstantExpressionAst constantExpressionAst); + object VisitConstantExpression(ConstantExpressionAst constantExpressionAst) => DefaultVisit(constantExpressionAst); + /// - object VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst); + object VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) => DefaultVisit(stringConstantExpressionAst); + /// [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubExpression")] [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "subExpression")] - object VisitSubExpression(SubExpressionAst subExpressionAst); + object VisitSubExpression(SubExpressionAst subExpressionAst) => DefaultVisit(subExpressionAst); + /// - object VisitUsingExpression(UsingExpressionAst usingExpressionAst); + object VisitUsingExpression(UsingExpressionAst usingExpressionAst) => DefaultVisit(usingExpressionAst); + /// - object VisitVariableExpression(VariableExpressionAst variableExpressionAst); + object VisitVariableExpression(VariableExpressionAst variableExpressionAst) => DefaultVisit(variableExpressionAst); + /// - object VisitTypeExpression(TypeExpressionAst typeExpressionAst); + object VisitTypeExpression(TypeExpressionAst typeExpressionAst) => DefaultVisit(typeExpressionAst); + /// - object VisitMemberExpression(MemberExpressionAst memberExpressionAst); + object VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst); + /// - object VisitInvokeMemberExpression(InvokeMemberExpressionAst invokeMemberExpressionAst); + object VisitInvokeMemberExpression(InvokeMemberExpressionAst invokeMemberExpressionAst) => DefaultVisit(invokeMemberExpressionAst); + /// - object VisitArrayExpression(ArrayExpressionAst arrayExpressionAst); + object VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) => DefaultVisit(arrayExpressionAst); + /// - object VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst); + object VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) => DefaultVisit(arrayLiteralAst); + /// - object VisitHashtable(HashtableAst hashtableAst); + object VisitHashtable(HashtableAst hashtableAst) => DefaultVisit(hashtableAst); + /// - object VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst); + object VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) => DefaultVisit(scriptBlockExpressionAst); + /// [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Paren")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "paren")] - object VisitParenExpression(ParenExpressionAst parenExpressionAst); + object VisitParenExpression(ParenExpressionAst parenExpressionAst) => DefaultVisit(parenExpressionAst); + /// - object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst); + object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => DefaultVisit(expandableStringExpressionAst); + /// - object VisitIndexExpression(IndexExpressionAst indexExpressionAst); + object VisitIndexExpression(IndexExpressionAst indexExpressionAst) => DefaultVisit(indexExpressionAst); + /// - object VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst); + object VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) => DefaultVisit(attributedExpressionAst); + /// - object VisitBlockStatement(BlockStatementAst blockStatementAst); + object VisitBlockStatement(BlockStatementAst blockStatementAst) => DefaultVisit(blockStatementAst); #endregion Expressions } @@ -150,28 +203,26 @@ namespace System.Management.Automation.Language /// public interface ICustomAstVisitor2 : ICustomAstVisitor { - private object DefaultVisit(Ast ast) => null; + /// + object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) => DefaultVisit(typeDefinitionAst); /// - object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst); + object VisitPropertyMember(PropertyMemberAst propertyMemberAst) => DefaultVisit(propertyMemberAst); /// - object VisitPropertyMember(PropertyMemberAst propertyMemberAst); + object VisitFunctionMember(FunctionMemberAst functionMemberAst) => DefaultVisit(functionMemberAst); /// - object VisitFunctionMember(FunctionMemberAst functionMemberAst); + object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) => DefaultVisit(baseCtorInvokeMemberExpressionAst); /// - object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst); + object VisitUsingStatement(UsingStatementAst usingStatement) => DefaultVisit(usingStatement); /// - object VisitUsingStatement(UsingStatementAst usingStatement); + object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst) => DefaultVisit(configurationDefinitionAst); /// - object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst); - - /// - object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst); + object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst) => DefaultVisit(dynamicKeywordAst); /// object VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) => DefaultVisit(ternaryExpressionAst); @@ -567,113 +618,169 @@ namespace System.Management.Automation.Language public abstract class DefaultCustomAstVisitor : ICustomAstVisitor { /// - public virtual object VisitErrorStatement(ErrorStatementAst errorStatementAst) { return null; } + public virtual object DefaultVisit(Ast ast) => null; + /// - public virtual object VisitErrorExpression(ErrorExpressionAst errorExpressionAst) { return null; } + public virtual object VisitErrorStatement(ErrorStatementAst errorStatementAst) => DefaultVisit(errorStatementAst); + /// - public virtual object VisitScriptBlock(ScriptBlockAst scriptBlockAst) { return null; } + public virtual object VisitErrorExpression(ErrorExpressionAst errorExpressionAst) => DefaultVisit(errorExpressionAst); + /// - public virtual object VisitParamBlock(ParamBlockAst paramBlockAst) { return null; } + public virtual object VisitScriptBlock(ScriptBlockAst scriptBlockAst) => DefaultVisit(scriptBlockAst); + /// - public virtual object VisitNamedBlock(NamedBlockAst namedBlockAst) { return null; } + public virtual object VisitParamBlock(ParamBlockAst paramBlockAst) => DefaultVisit(paramBlockAst); + /// - public virtual object VisitTypeConstraint(TypeConstraintAst typeConstraintAst) { return null; } + public virtual object VisitNamedBlock(NamedBlockAst namedBlockAst) => DefaultVisit(namedBlockAst); + /// - public virtual object VisitAttribute(AttributeAst attributeAst) { return null; } + public virtual object VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => DefaultVisit(typeConstraintAst); + /// - public virtual object VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) { return null; } + public virtual object VisitAttribute(AttributeAst attributeAst) => DefaultVisit(attributeAst); + /// - public virtual object VisitParameter(ParameterAst parameterAst) { return null; } + public virtual object VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) => DefaultVisit(namedAttributeArgumentAst); + /// - public virtual object VisitStatementBlock(StatementBlockAst statementBlockAst) { return null; } + public virtual object VisitParameter(ParameterAst parameterAst) => DefaultVisit(parameterAst); + /// - public virtual object VisitIfStatement(IfStatementAst ifStmtAst) { return null; } + public virtual object VisitStatementBlock(StatementBlockAst statementBlockAst) => DefaultVisit(statementBlockAst); + /// - public virtual object VisitTrap(TrapStatementAst trapStatementAst) { return null; } + public virtual object VisitIfStatement(IfStatementAst ifStmtAst) => DefaultVisit(ifStmtAst); + /// - public virtual object VisitSwitchStatement(SwitchStatementAst switchStatementAst) { return null; } + public virtual object VisitTrap(TrapStatementAst trapStatementAst) => DefaultVisit(trapStatementAst); + /// - public virtual object VisitDataStatement(DataStatementAst dataStatementAst) { return null; } + public virtual object VisitSwitchStatement(SwitchStatementAst switchStatementAst) => DefaultVisit(switchStatementAst); + /// - public virtual object VisitForEachStatement(ForEachStatementAst forEachStatementAst) { return null; } + public virtual object VisitDataStatement(DataStatementAst dataStatementAst) => DefaultVisit(dataStatementAst); + /// - public virtual object VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) { return null; } + public virtual object VisitForEachStatement(ForEachStatementAst forEachStatementAst) => DefaultVisit(forEachStatementAst); + /// - public virtual object VisitForStatement(ForStatementAst forStatementAst) { return null; } + public virtual object VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) => DefaultVisit(doWhileStatementAst); + /// - public virtual object VisitWhileStatement(WhileStatementAst whileStatementAst) { return null; } + public virtual object VisitForStatement(ForStatementAst forStatementAst) => DefaultVisit(forStatementAst); + /// - public virtual object VisitCatchClause(CatchClauseAst catchClauseAst) { return null; } + public virtual object VisitWhileStatement(WhileStatementAst whileStatementAst) => DefaultVisit(whileStatementAst); + /// - public virtual object VisitTryStatement(TryStatementAst tryStatementAst) { return null; } + public virtual object VisitCatchClause(CatchClauseAst catchClauseAst) => DefaultVisit(catchClauseAst); + /// - public virtual object VisitBreakStatement(BreakStatementAst breakStatementAst) { return null; } + public virtual object VisitTryStatement(TryStatementAst tryStatementAst) => DefaultVisit(tryStatementAst); + /// - public virtual object VisitContinueStatement(ContinueStatementAst continueStatementAst) { return null; } + public virtual object VisitBreakStatement(BreakStatementAst breakStatementAst) => DefaultVisit(breakStatementAst); + /// - public virtual object VisitReturnStatement(ReturnStatementAst returnStatementAst) { return null; } + public virtual object VisitContinueStatement(ContinueStatementAst continueStatementAst) => DefaultVisit(continueStatementAst); + /// - public virtual object VisitExitStatement(ExitStatementAst exitStatementAst) { return null; } + public virtual object VisitReturnStatement(ReturnStatementAst returnStatementAst) => DefaultVisit(returnStatementAst); + /// - public virtual object VisitThrowStatement(ThrowStatementAst throwStatementAst) { return null; } + public virtual object VisitExitStatement(ExitStatementAst exitStatementAst) => DefaultVisit(exitStatementAst); + /// - public virtual object VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) { return null; } + public virtual object VisitThrowStatement(ThrowStatementAst throwStatementAst) => DefaultVisit(throwStatementAst); + /// - public virtual object VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) { return null; } + public virtual object VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) => DefaultVisit(doUntilStatementAst); + /// - public virtual object VisitPipeline(PipelineAst pipelineAst) { return null; } + public virtual object VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) => DefaultVisit(assignmentStatementAst); + /// - public virtual object VisitCommand(CommandAst commandAst) { return null; } + public virtual object VisitPipeline(PipelineAst pipelineAst) => DefaultVisit(pipelineAst); + /// - public virtual object VisitCommandExpression(CommandExpressionAst commandExpressionAst) { return null; } + public virtual object VisitCommand(CommandAst commandAst) => DefaultVisit(commandAst); + /// - public virtual object VisitCommandParameter(CommandParameterAst commandParameterAst) { return null; } + public virtual object VisitCommandExpression(CommandExpressionAst commandExpressionAst) => DefaultVisit(commandExpressionAst); + /// - public virtual object VisitFileRedirection(FileRedirectionAst fileRedirectionAst) { return null; } + public virtual object VisitCommandParameter(CommandParameterAst commandParameterAst) => DefaultVisit(commandParameterAst); + /// - public virtual object VisitMergingRedirection(MergingRedirectionAst mergingRedirectionAst) { return null; } + public virtual object VisitFileRedirection(FileRedirectionAst fileRedirectionAst) => DefaultVisit(fileRedirectionAst); + /// - public virtual object VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) { return null; } + public virtual object VisitMergingRedirection(MergingRedirectionAst mergingRedirectionAst) => DefaultVisit(mergingRedirectionAst); + /// - public virtual object VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) { return null; } + public virtual object VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) => DefaultVisit(binaryExpressionAst); + /// - public virtual object VisitConvertExpression(ConvertExpressionAst convertExpressionAst) { return null; } + public virtual object VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) => DefaultVisit(unaryExpressionAst); + /// - public virtual object VisitConstantExpression(ConstantExpressionAst constantExpressionAst) { return null; } + public virtual object VisitConvertExpression(ConvertExpressionAst convertExpressionAst) => DefaultVisit(convertExpressionAst); + /// - public virtual object VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) { return null; } + public virtual object VisitConstantExpression(ConstantExpressionAst constantExpressionAst) => DefaultVisit(constantExpressionAst); + /// - public virtual object VisitSubExpression(SubExpressionAst subExpressionAst) { return null; } + public virtual object VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) => DefaultVisit(stringConstantExpressionAst); + /// - public virtual object VisitUsingExpression(UsingExpressionAst usingExpressionAst) { return null; } + public virtual object VisitSubExpression(SubExpressionAst subExpressionAst) => DefaultVisit(subExpressionAst); + /// - public virtual object VisitVariableExpression(VariableExpressionAst variableExpressionAst) { return null; } + public virtual object VisitUsingExpression(UsingExpressionAst usingExpressionAst) => DefaultVisit(usingExpressionAst); + /// - public virtual object VisitTypeExpression(TypeExpressionAst typeExpressionAst) { return null; } + public virtual object VisitVariableExpression(VariableExpressionAst variableExpressionAst) => DefaultVisit(variableExpressionAst); + /// - public virtual object VisitMemberExpression(MemberExpressionAst memberExpressionAst) { return null; } + public virtual object VisitTypeExpression(TypeExpressionAst typeExpressionAst) => DefaultVisit(typeExpressionAst); + /// - public virtual object VisitInvokeMemberExpression(InvokeMemberExpressionAst invokeMemberExpressionAst) { return null; } + public virtual object VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst); + /// - public virtual object VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) { return null; } + public virtual object VisitInvokeMemberExpression(InvokeMemberExpressionAst invokeMemberExpressionAst) => DefaultVisit(invokeMemberExpressionAst); + /// - public virtual object VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) { return null; } + public virtual object VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) => DefaultVisit(arrayExpressionAst); + /// - public virtual object VisitHashtable(HashtableAst hashtableAst) { return null; } + public virtual object VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) => DefaultVisit(arrayLiteralAst); + /// - public virtual object VisitParenExpression(ParenExpressionAst parenExpressionAst) { return null; } + public virtual object VisitHashtable(HashtableAst hashtableAst) => DefaultVisit(hashtableAst); + /// - public virtual object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return null; } + public virtual object VisitParenExpression(ParenExpressionAst parenExpressionAst) => DefaultVisit(parenExpressionAst); + /// - public virtual object VisitIndexExpression(IndexExpressionAst indexExpressionAst) { return null; } + public virtual object VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => DefaultVisit(expandableStringExpressionAst); + /// - public virtual object VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) { return null; } + public virtual object VisitIndexExpression(IndexExpressionAst indexExpressionAst) => DefaultVisit(indexExpressionAst); + /// - public virtual object VisitBlockStatement(BlockStatementAst blockStatementAst) { return null; } + public virtual object VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) => DefaultVisit(attributedExpressionAst); + /// - public virtual object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) { return null; } + public virtual object VisitBlockStatement(BlockStatementAst blockStatementAst) => DefaultVisit(blockStatementAst); + /// - public virtual object VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) { return null; } + public virtual object VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) => DefaultVisit(functionDefinitionAst); + + /// + public virtual object VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) => DefaultVisit(scriptBlockExpressionAst); } /// @@ -682,22 +789,30 @@ namespace System.Management.Automation.Language public abstract class DefaultCustomAstVisitor2 : DefaultCustomAstVisitor, ICustomAstVisitor2 { /// - public virtual object VisitPropertyMember(PropertyMemberAst propertyMemberAst) { return null; } + public virtual object VisitPropertyMember(PropertyMemberAst propertyMemberAst) => DefaultVisit(propertyMemberAst); + /// - public virtual object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) { return null; } + public virtual object VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) => DefaultVisit(baseCtorInvokeMemberExpressionAst); + /// - public virtual object VisitUsingStatement(UsingStatementAst usingStatement) { return null; } + public virtual object VisitUsingStatement(UsingStatementAst usingStatement) => DefaultVisit(usingStatement); + /// - public virtual object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationAst) { return null; } + public virtual object VisitConfigurationDefinition(ConfigurationDefinitionAst configurationAst) => DefaultVisit(configurationAst); + /// - public virtual object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst) { return null; } + public virtual object VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordAst) => DefaultVisit(dynamicKeywordAst); + /// - public virtual object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) { return null; } + public virtual object VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) => DefaultVisit(typeDefinitionAst); + /// - public virtual object VisitFunctionMember(FunctionMemberAst functionMemberAst) { return null; } + public virtual object VisitFunctionMember(FunctionMemberAst functionMemberAst) => DefaultVisit(functionMemberAst); + /// - public virtual object VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) { return null; } + public virtual object VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) => DefaultVisit(ternaryExpressionAst); + /// - public virtual object VisitPipelineChain(PipelineChainAst statementChainAst) { return null; } + public virtual object VisitPipelineChain(PipelineChainAst statementChainAst) => DefaultVisit(statementChainAst); } } diff --git a/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs b/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs index b865a76ee4..0bf5368fdd 100644 --- a/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs +++ b/src/System.Management.Automation/engine/parser/PreOrderVisitor.cs @@ -46,119 +46,175 @@ namespace System.Management.Automation.Language } /// - public virtual AstVisitAction VisitErrorStatement(ErrorStatementAst errorStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction DefaultVisit(Ast ast) => AstVisitAction.Continue; + /// - public virtual AstVisitAction VisitErrorExpression(ErrorExpressionAst errorExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitErrorStatement(ErrorStatementAst errorStatementAst) => DefaultVisit(errorStatementAst); + /// - public virtual AstVisitAction VisitScriptBlock(ScriptBlockAst scriptBlockAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitErrorExpression(ErrorExpressionAst errorExpressionAst) => DefaultVisit(errorExpressionAst); + + /// + public virtual AstVisitAction VisitScriptBlock(ScriptBlockAst scriptBlockAst) => DefaultVisit(scriptBlockAst); + /// [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Param")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "param")] - public virtual AstVisitAction VisitParamBlock(ParamBlockAst paramBlockAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitParamBlock(ParamBlockAst paramBlockAst) => DefaultVisit(paramBlockAst); + /// - public virtual AstVisitAction VisitNamedBlock(NamedBlockAst namedBlockAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitNamedBlock(NamedBlockAst namedBlockAst) => DefaultVisit(namedBlockAst); + /// - public virtual AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => DefaultVisit(typeConstraintAst); + /// - public virtual AstVisitAction VisitAttribute(AttributeAst attributeAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitAttribute(AttributeAst attributeAst) => DefaultVisit(attributeAst); + /// - public virtual AstVisitAction VisitParameter(ParameterAst parameterAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitParameter(ParameterAst parameterAst) => DefaultVisit(parameterAst); + /// - public virtual AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst) => DefaultVisit(typeExpressionAst); + /// - public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) => DefaultVisit(functionDefinitionAst); + /// - public virtual AstVisitAction VisitStatementBlock(StatementBlockAst statementBlockAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitStatementBlock(StatementBlockAst statementBlockAst) => DefaultVisit(statementBlockAst); + /// - public virtual AstVisitAction VisitIfStatement(IfStatementAst ifStmtAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitIfStatement(IfStatementAst ifStmtAst) => DefaultVisit(ifStmtAst); + /// - public virtual AstVisitAction VisitTrap(TrapStatementAst trapStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTrap(TrapStatementAst trapStatementAst) => DefaultVisit(trapStatementAst); + /// - public virtual AstVisitAction VisitSwitchStatement(SwitchStatementAst switchStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitSwitchStatement(SwitchStatementAst switchStatementAst) => DefaultVisit(switchStatementAst); + /// - public virtual AstVisitAction VisitDataStatement(DataStatementAst dataStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitDataStatement(DataStatementAst dataStatementAst) => DefaultVisit(dataStatementAst); + /// - public virtual AstVisitAction VisitForEachStatement(ForEachStatementAst forEachStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitForEachStatement(ForEachStatementAst forEachStatementAst) => DefaultVisit(forEachStatementAst); + /// - public virtual AstVisitAction VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) => DefaultVisit(doWhileStatementAst); + /// - public virtual AstVisitAction VisitForStatement(ForStatementAst forStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitForStatement(ForStatementAst forStatementAst) => DefaultVisit(forStatementAst); + /// - public virtual AstVisitAction VisitWhileStatement(WhileStatementAst whileStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitWhileStatement(WhileStatementAst whileStatementAst) => DefaultVisit(whileStatementAst); + /// - public virtual AstVisitAction VisitCatchClause(CatchClauseAst catchClauseAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitCatchClause(CatchClauseAst catchClauseAst) => DefaultVisit(catchClauseAst); + /// - public virtual AstVisitAction VisitTryStatement(TryStatementAst tryStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTryStatement(TryStatementAst tryStatementAst) => DefaultVisit(tryStatementAst); + /// - public virtual AstVisitAction VisitBreakStatement(BreakStatementAst breakStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitBreakStatement(BreakStatementAst breakStatementAst) => DefaultVisit(breakStatementAst); + /// - public virtual AstVisitAction VisitContinueStatement(ContinueStatementAst continueStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitContinueStatement(ContinueStatementAst continueStatementAst) => DefaultVisit(continueStatementAst); + /// - public virtual AstVisitAction VisitReturnStatement(ReturnStatementAst returnStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitReturnStatement(ReturnStatementAst returnStatementAst) => DefaultVisit(returnStatementAst); + /// - public virtual AstVisitAction VisitExitStatement(ExitStatementAst exitStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitExitStatement(ExitStatementAst exitStatementAst) => DefaultVisit(exitStatementAst); + /// - public virtual AstVisitAction VisitThrowStatement(ThrowStatementAst throwStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitThrowStatement(ThrowStatementAst throwStatementAst) => DefaultVisit(throwStatementAst); + /// - public virtual AstVisitAction VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) => DefaultVisit(doUntilStatementAst); + /// - public virtual AstVisitAction VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) => DefaultVisit(assignmentStatementAst); + /// - public virtual AstVisitAction VisitPipeline(PipelineAst pipelineAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitPipeline(PipelineAst pipelineAst) => DefaultVisit(pipelineAst); + /// - public virtual AstVisitAction VisitCommand(CommandAst commandAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitCommand(CommandAst commandAst) => DefaultVisit(commandAst); + /// - public virtual AstVisitAction VisitCommandExpression(CommandExpressionAst commandExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitCommandExpression(CommandExpressionAst commandExpressionAst) => DefaultVisit(commandExpressionAst); + /// - public virtual AstVisitAction VisitCommandParameter(CommandParameterAst commandParameterAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitCommandParameter(CommandParameterAst commandParameterAst) => DefaultVisit(commandParameterAst); + /// - public virtual AstVisitAction VisitMergingRedirection(MergingRedirectionAst redirectionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitMergingRedirection(MergingRedirectionAst redirectionAst) => DefaultVisit(redirectionAst); + /// - public virtual AstVisitAction VisitFileRedirection(FileRedirectionAst redirectionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitFileRedirection(FileRedirectionAst redirectionAst) => DefaultVisit(redirectionAst); + /// - public virtual AstVisitAction VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) => DefaultVisit(binaryExpressionAst); + /// - public virtual AstVisitAction VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) => DefaultVisit(unaryExpressionAst); + /// - public virtual AstVisitAction VisitConvertExpression(ConvertExpressionAst convertExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitConvertExpression(ConvertExpressionAst convertExpressionAst) => DefaultVisit(convertExpressionAst); + /// - public virtual AstVisitAction VisitConstantExpression(ConstantExpressionAst constantExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitConstantExpression(ConstantExpressionAst constantExpressionAst) => DefaultVisit(constantExpressionAst); + /// - public virtual AstVisitAction VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) => DefaultVisit(stringConstantExpressionAst); + /// [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubExpression")] [SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "subExpression")] - public virtual AstVisitAction VisitSubExpression(SubExpressionAst subExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitSubExpression(SubExpressionAst subExpressionAst) => DefaultVisit(subExpressionAst); + /// - public virtual AstVisitAction VisitUsingExpression(UsingExpressionAst usingExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitUsingExpression(UsingExpressionAst usingExpressionAst) => DefaultVisit(usingExpressionAst); + /// - public virtual AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst) => DefaultVisit(variableExpressionAst); + /// - public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst); + /// - public virtual AstVisitAction VisitInvokeMemberExpression(InvokeMemberExpressionAst methodCallAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitInvokeMemberExpression(InvokeMemberExpressionAst methodCallAst) => DefaultVisit(methodCallAst); + /// - public virtual AstVisitAction VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) => DefaultVisit(arrayExpressionAst); + /// - public virtual AstVisitAction VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) => DefaultVisit(arrayLiteralAst); + /// - public virtual AstVisitAction VisitHashtable(HashtableAst hashtableAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitHashtable(HashtableAst hashtableAst) => DefaultVisit(hashtableAst); + /// - public virtual AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) => DefaultVisit(scriptBlockExpressionAst); + /// [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Paren")] [SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "paren")] - public virtual AstVisitAction VisitParenExpression(ParenExpressionAst parenExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitParenExpression(ParenExpressionAst parenExpressionAst) => DefaultVisit(parenExpressionAst); + /// - public virtual AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => DefaultVisit(expandableStringExpressionAst); + /// - public virtual AstVisitAction VisitIndexExpression(IndexExpressionAst indexExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitIndexExpression(IndexExpressionAst indexExpressionAst) => DefaultVisit(indexExpressionAst); + /// - public virtual AstVisitAction VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) => DefaultVisit(attributedExpressionAst); + /// - public virtual AstVisitAction VisitBlockStatement(BlockStatementAst blockStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitBlockStatement(BlockStatementAst blockStatementAst) => DefaultVisit(blockStatementAst); + /// - public virtual AstVisitAction VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) => DefaultVisit(namedAttributeArgumentAst); } /// @@ -167,31 +223,31 @@ namespace System.Management.Automation.Language public abstract class AstVisitor2 : AstVisitor { /// - public virtual AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) => DefaultVisit(typeDefinitionAst); /// - public virtual AstVisitAction VisitPropertyMember(PropertyMemberAst propertyMemberAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitPropertyMember(PropertyMemberAst propertyMemberAst) => DefaultVisit(propertyMemberAst); /// - public virtual AstVisitAction VisitFunctionMember(FunctionMemberAst functionMemberAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitFunctionMember(FunctionMemberAst functionMemberAst) => DefaultVisit(functionMemberAst); /// - public virtual AstVisitAction VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) => DefaultVisit(baseCtorInvokeMemberExpressionAst); /// - public virtual AstVisitAction VisitUsingStatement(UsingStatementAst usingStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitUsingStatement(UsingStatementAst usingStatementAst) => DefaultVisit(usingStatementAst); /// - public virtual AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst) => DefaultVisit(configurationDefinitionAst); /// - public virtual AstVisitAction VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordStatementAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordStatementAst) => DefaultVisit(dynamicKeywordStatementAst); /// - public virtual AstVisitAction VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) => DefaultVisit(ternaryExpressionAst); /// - public virtual AstVisitAction VisitPipelineChain(PipelineChainAst statementChain) { return AstVisitAction.Continue; } + public virtual AstVisitAction VisitPipelineChain(PipelineChainAst statementChain) => DefaultVisit(statementChain); } /// diff --git a/test/xUnit/csharp/test_AstDefaultVisit.cs b/test/xUnit/csharp/test_AstDefaultVisit.cs new file mode 100644 index 0000000000..925f2c6be5 --- /dev/null +++ b/test/xUnit/csharp/test_AstDefaultVisit.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT License. + +using System; +using System.Collections.Generic; +using System.Management.Automation.Language; +using Xunit; + +namespace PSTests.Parallel +{ + internal class MyICustomAstVisitor2 : ICustomAstVisitor2 + { + public object DefaultVisit(Ast ast) => ast.GetType().Name; + } + + internal class MyDefaultCustomAstVisitor2 : DefaultCustomAstVisitor2 + { + public override object DefaultVisit(Ast ast) => ast.GetType().Name; + } + + internal class MyAstVisitor2 : AstVisitor2 + { + public List Commands { get; } + + public MyAstVisitor2() + { + Commands = new List(); + } + + public override AstVisitAction DefaultVisit(Ast ast) + { + if (ast is CommandAst commandAst && commandAst.CommandElements[0] is StringConstantExpressionAst str) + { + Commands.Add(str.Value); + } + + return AstVisitAction.Continue; + } + } + + public static class AstDefaultVisitTests + { + [Fact] + public static void TestCustomAstVisitor() + { + var ast = Parser.ParseInput("a | b", out _, out _); + var expected = typeof(NamedBlockAst).Name; + + var myVisitor1 = new MyICustomAstVisitor2(); + var result1 = ast.EndBlock.Accept(myVisitor1); + Assert.Equal(expected, result1); + + var myVisitor2 = new MyDefaultCustomAstVisitor2(); + var result2 = ast.EndBlock.Accept(myVisitor2); + Assert.Equal(expected, result2); + } + + [Fact] + public static void TestAstVisitor() + { + var ast = Parser.ParseInput("a | b", out _, out _); + var myVisitor = new MyAstVisitor2(); + + ast.Visit(myVisitor); + Assert.Equal(2, myVisitor.Commands.Count); + Assert.Equal("a", myVisitor.Commands[0]); + Assert.Equal("b", myVisitor.Commands[1]); + } + } +}