2020-03-24 11:08:37 -07:00
|
|
|
// Copyright (c) Microsoft Corporation.
|
2018-02-13 09:23:53 -08:00
|
|
|
// Licensed under the MIT License.
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
using System.Diagnostics.CodeAnalysis;
|
|
|
|
|
|
|
|
|
|
namespace System.Management.Automation.Language
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
2023-07-12 22:16:57 -05:00
|
|
|
/// Each Visit* method in <see cref="AstVisitor" /> returns one of these values to control
|
2016-03-30 14:20:52 -07:00
|
|
|
/// how visiting nodes in the AST should proceed.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public enum AstVisitAction
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Continue visiting all nodes the ast.
|
|
|
|
|
/// </summary>
|
|
|
|
|
Continue,
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Skip visiting child nodes of currently visited node, but continue visiting other nodes.
|
|
|
|
|
/// </summary>
|
|
|
|
|
SkipChildren,
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Stop visiting all nodes.
|
|
|
|
|
/// </summary>
|
|
|
|
|
StopVisit,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2016-08-28 05:22:02 +00:00
|
|
|
/// AstVisitor is used for basic scenarios requiring traversal of the nodes in an Ast.
|
2016-03-30 14:20:52 -07:00
|
|
|
/// An implementation of AstVisitor does not explicitly traverse the Ast, instead,
|
|
|
|
|
/// the engine traverses all nodes in the Ast and calls the appropriate method on each node.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public abstract class AstVisitor
|
|
|
|
|
{
|
|
|
|
|
internal AstVisitAction CheckForPostAction(Ast ast, AstVisitAction action)
|
|
|
|
|
{
|
|
|
|
|
var postActionHandler = this as IAstPostVisitHandler;
|
2022-07-29 06:06:07 +02:00
|
|
|
postActionHandler?.PostVisit(ast);
|
2018-12-23 22:20:06 -08:00
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
return action;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction DefaultVisit(Ast ast) => AstVisitAction.Continue;
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitErrorStatement(ErrorStatementAst errorStatementAst) => DefaultVisit(errorStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitErrorExpression(ErrorExpressionAst errorExpressionAst) => DefaultVisit(errorExpressionAst);
|
|
|
|
|
|
|
|
|
|
/// <summary/>
|
|
|
|
|
public virtual AstVisitAction VisitScriptBlock(ScriptBlockAst scriptBlockAst) => DefaultVisit(scriptBlockAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Param")]
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "param")]
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitParamBlock(ParamBlockAst paramBlockAst) => DefaultVisit(paramBlockAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitNamedBlock(NamedBlockAst namedBlockAst) => DefaultVisit(namedBlockAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTypeConstraint(TypeConstraintAst typeConstraintAst) => DefaultVisit(typeConstraintAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitAttribute(AttributeAst attributeAst) => DefaultVisit(attributeAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitParameter(ParameterAst parameterAst) => DefaultVisit(parameterAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTypeExpression(TypeExpressionAst typeExpressionAst) => DefaultVisit(typeExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitFunctionDefinition(FunctionDefinitionAst functionDefinitionAst) => DefaultVisit(functionDefinitionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitStatementBlock(StatementBlockAst statementBlockAst) => DefaultVisit(statementBlockAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitIfStatement(IfStatementAst ifStmtAst) => DefaultVisit(ifStmtAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTrap(TrapStatementAst trapStatementAst) => DefaultVisit(trapStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitSwitchStatement(SwitchStatementAst switchStatementAst) => DefaultVisit(switchStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitDataStatement(DataStatementAst dataStatementAst) => DefaultVisit(dataStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitForEachStatement(ForEachStatementAst forEachStatementAst) => DefaultVisit(forEachStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitDoWhileStatement(DoWhileStatementAst doWhileStatementAst) => DefaultVisit(doWhileStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitForStatement(ForStatementAst forStatementAst) => DefaultVisit(forStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitWhileStatement(WhileStatementAst whileStatementAst) => DefaultVisit(whileStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitCatchClause(CatchClauseAst catchClauseAst) => DefaultVisit(catchClauseAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTryStatement(TryStatementAst tryStatementAst) => DefaultVisit(tryStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitBreakStatement(BreakStatementAst breakStatementAst) => DefaultVisit(breakStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitContinueStatement(ContinueStatementAst continueStatementAst) => DefaultVisit(continueStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitReturnStatement(ReturnStatementAst returnStatementAst) => DefaultVisit(returnStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitExitStatement(ExitStatementAst exitStatementAst) => DefaultVisit(exitStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitThrowStatement(ThrowStatementAst throwStatementAst) => DefaultVisit(throwStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitDoUntilStatement(DoUntilStatementAst doUntilStatementAst) => DefaultVisit(doUntilStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitAssignmentStatement(AssignmentStatementAst assignmentStatementAst) => DefaultVisit(assignmentStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitPipeline(PipelineAst pipelineAst) => DefaultVisit(pipelineAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitCommand(CommandAst commandAst) => DefaultVisit(commandAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitCommandExpression(CommandExpressionAst commandExpressionAst) => DefaultVisit(commandExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitCommandParameter(CommandParameterAst commandParameterAst) => DefaultVisit(commandParameterAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitMergingRedirection(MergingRedirectionAst redirectionAst) => DefaultVisit(redirectionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitFileRedirection(FileRedirectionAst redirectionAst) => DefaultVisit(redirectionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitBinaryExpression(BinaryExpressionAst binaryExpressionAst) => DefaultVisit(binaryExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitUnaryExpression(UnaryExpressionAst unaryExpressionAst) => DefaultVisit(unaryExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitConvertExpression(ConvertExpressionAst convertExpressionAst) => DefaultVisit(convertExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitConstantExpression(ConstantExpressionAst constantExpressionAst) => DefaultVisit(constantExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitStringConstantExpression(StringConstantExpressionAst stringConstantExpressionAst) => DefaultVisit(stringConstantExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "SubExpression")]
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "subExpression")]
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitSubExpression(SubExpressionAst subExpressionAst) => DefaultVisit(subExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitUsingExpression(UsingExpressionAst usingExpressionAst) => DefaultVisit(usingExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitVariableExpression(VariableExpressionAst variableExpressionAst) => DefaultVisit(variableExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitMemberExpression(MemberExpressionAst memberExpressionAst) => DefaultVisit(memberExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitInvokeMemberExpression(InvokeMemberExpressionAst methodCallAst) => DefaultVisit(methodCallAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitArrayExpression(ArrayExpressionAst arrayExpressionAst) => DefaultVisit(arrayExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitArrayLiteral(ArrayLiteralAst arrayLiteralAst) => DefaultVisit(arrayLiteralAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitHashtable(HashtableAst hashtableAst) => DefaultVisit(hashtableAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitScriptBlockExpression(ScriptBlockExpressionAst scriptBlockExpressionAst) => DefaultVisit(scriptBlockExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "Paren")]
|
|
|
|
|
[SuppressMessage("Microsoft.Naming", "CA1704:IdentifiersShouldBeSpelledCorrectly", MessageId = "paren")]
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitParenExpression(ParenExpressionAst parenExpressionAst) => DefaultVisit(parenExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitExpandableStringExpression(ExpandableStringExpressionAst expandableStringExpressionAst) => DefaultVisit(expandableStringExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitIndexExpression(IndexExpressionAst indexExpressionAst) => DefaultVisit(indexExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitAttributedExpression(AttributedExpressionAst attributedExpressionAst) => DefaultVisit(attributedExpressionAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitBlockStatement(BlockStatementAst blockStatementAst) => DefaultVisit(blockStatementAst);
|
|
|
|
|
|
2016-03-30 14:20:52 -07:00
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitNamedAttributeArgument(NamedAttributeArgumentAst namedAttributeArgumentAst) => DefaultVisit(namedAttributeArgumentAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
2019-01-06 04:40:24 +05:00
|
|
|
/// AstVisitor for new Ast node types.
|
2016-03-30 14:20:52 -07:00
|
|
|
/// </summary>
|
|
|
|
|
public abstract class AstVisitor2 : AstVisitor
|
|
|
|
|
{
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTypeDefinition(TypeDefinitionAst typeDefinitionAst) => DefaultVisit(typeDefinitionAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitPropertyMember(PropertyMemberAst propertyMemberAst) => DefaultVisit(propertyMemberAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitFunctionMember(FunctionMemberAst functionMemberAst) => DefaultVisit(functionMemberAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitBaseCtorInvokeMemberExpression(BaseCtorInvokeMemberExpressionAst baseCtorInvokeMemberExpressionAst) => DefaultVisit(baseCtorInvokeMemberExpressionAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitUsingStatement(UsingStatementAst usingStatementAst) => DefaultVisit(usingStatementAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitConfigurationDefinition(ConfigurationDefinitionAst configurationDefinitionAst) => DefaultVisit(configurationDefinitionAst);
|
2016-03-30 14:20:52 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitDynamicKeywordStatement(DynamicKeywordStatementAst dynamicKeywordStatementAst) => DefaultVisit(dynamicKeywordStatementAst);
|
2019-09-04 13:22:33 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitTernaryExpression(TernaryExpressionAst ternaryExpressionAst) => DefaultVisit(ternaryExpressionAst);
|
2019-10-17 14:43:46 -07:00
|
|
|
|
|
|
|
|
/// <summary/>
|
2020-07-31 10:16:59 -07:00
|
|
|
public virtual AstVisitAction VisitPipelineChain(PipelineChainAst statementChain) => DefaultVisit(statementChain);
|
2016-03-30 14:20:52 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Implement this interface when you implement <see cref="AstVisitor"/> or <see cref="AstVisitor2"/> when
|
|
|
|
|
/// you want to do something after possibly visiting the children of the ast.
|
|
|
|
|
/// </summary>
|
2020-12-09 21:33:29 +01:00
|
|
|
#nullable enable
|
2016-03-30 14:20:52 -07:00
|
|
|
public interface IAstPostVisitHandler
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// The function called on each ast node after processing it's children.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="ast">The ast whose children have all been processed and whose siblings
|
|
|
|
|
/// and parents are about to be processed.</param>
|
|
|
|
|
void PostVisit(Ast ast);
|
|
|
|
|
}
|
|
|
|
|
}
|