📄 vbnetoutputvisitor.cs
字号:
nodeTracker.TrackedVisit(stmt, null);
outputFormatter.NewLine();
}
outputFormatter.IndentationLevel -= 1;
}
void PrintIndentedBlock(IEnumerable statements)
{
outputFormatter.IndentationLevel += 1;
VisitStatementList(statements);
outputFormatter.IndentationLevel -= 1;
}
void VisitStatementList(IEnumerable statements)
{
foreach (Statement stmt in statements) {
if (stmt is BlockStatement) {
nodeTracker.TrackedVisit(stmt, null);
} else {
outputFormatter.Indent();
nodeTracker.TrackedVisit(stmt, null);
outputFormatter.NewLine();
}
}
}
public object VisitAddHandlerStatement(AddHandlerStatement addHandlerStatement, object data)
{
outputFormatter.PrintToken(Tokens.AddHandler);
outputFormatter.Space();
nodeTracker.TrackedVisit(addHandlerStatement.EventExpression, data);
outputFormatter.PrintToken(Tokens.Comma);
outputFormatter.Space();
nodeTracker.TrackedVisit(addHandlerStatement.HandlerExpression, data);
return null;
}
public object VisitRemoveHandlerStatement(RemoveHandlerStatement removeHandlerStatement, object data)
{
outputFormatter.PrintToken(Tokens.RemoveHandler);
outputFormatter.Space();
nodeTracker.TrackedVisit(removeHandlerStatement.EventExpression, data);
outputFormatter.PrintToken(Tokens.Comma);
outputFormatter.Space();
nodeTracker.TrackedVisit(removeHandlerStatement.HandlerExpression, data);
return null;
}
public object VisitRaiseEventStatement(RaiseEventStatement raiseEventStatement, object data)
{
outputFormatter.PrintToken(Tokens.RaiseEvent);
outputFormatter.Space();
outputFormatter.PrintIdentifier(raiseEventStatement.EventName);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(raiseEventStatement.Arguments);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
return null;
}
public object VisitEraseStatement(EraseStatement eraseStatement, object data)
{
outputFormatter.PrintToken(Tokens.Erase);
outputFormatter.Space();
AppendCommaSeparatedList(eraseStatement.Expressions);
return null;
}
public object VisitErrorStatement(ErrorStatement errorStatement, object data)
{
outputFormatter.PrintToken(Tokens.Error);
outputFormatter.Space();
nodeTracker.TrackedVisit(errorStatement.Expression, data);
return null;
}
public object VisitOnErrorStatement(OnErrorStatement onErrorStatement, object data)
{
outputFormatter.PrintToken(Tokens.On);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Error);
outputFormatter.Space();
nodeTracker.TrackedVisit(onErrorStatement.EmbeddedStatement, data);
return null;
}
public object VisitReDimStatement(ReDimStatement reDimStatement, object data)
{
outputFormatter.PrintToken(Tokens.ReDim);
outputFormatter.Space();
if (reDimStatement.IsPreserve) {
outputFormatter.PrintToken(Tokens.Preserve);
outputFormatter.Space();
}
AppendCommaSeparatedList(reDimStatement.ReDimClauses);
return null;
}
public object VisitExpressionStatement(ExpressionStatement expressionStatement, object data)
{
nodeTracker.TrackedVisit(expressionStatement.Expression, data);
return null;
}
public object VisitLocalVariableDeclaration(LocalVariableDeclaration localVariableDeclaration, object data)
{
if (localVariableDeclaration.Modifier != Modifiers.None) {
OutputModifier(localVariableDeclaration.Modifier);
}
if (!isUsingResourceAcquisition) {
if ((localVariableDeclaration.Modifier & Modifiers.Const) == 0) {
outputFormatter.PrintToken(Tokens.Dim);
}
outputFormatter.Space();
}
currentVariableType = localVariableDeclaration.TypeReference;
AppendCommaSeparatedList(localVariableDeclaration.Variables);
currentVariableType = null;
return null;
}
public object VisitEmptyStatement(EmptyStatement emptyStatement, object data)
{
outputFormatter.NewLine();
return null;
}
public virtual object VisitYieldStatement(YieldStatement yieldStatement, object data)
{
UnsupportedNode(yieldStatement);
return null;
}
public object VisitReturnStatement(ReturnStatement returnStatement, object data)
{
outputFormatter.PrintToken(Tokens.Return);
if (!returnStatement.Expression.IsNull) {
outputFormatter.Space();
nodeTracker.TrackedVisit(returnStatement.Expression, data);
}
return null;
}
public object VisitIfElseStatement(IfElseStatement ifElseStatement, object data)
{
outputFormatter.PrintToken(Tokens.If);
outputFormatter.Space();
nodeTracker.TrackedVisit(ifElseStatement.Condition, data);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Then);
outputFormatter.NewLine();
PrintIndentedBlock(ifElseStatement.TrueStatement);
foreach (ElseIfSection elseIfSection in ifElseStatement.ElseIfSections) {
nodeTracker.TrackedVisit(elseIfSection, data);
}
if (ifElseStatement.HasElseStatements) {
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.Else);
outputFormatter.NewLine();
PrintIndentedBlock(ifElseStatement.FalseStatement);
}
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.If);
return null;
}
public object VisitElseIfSection(ElseIfSection elseIfSection, object data)
{
outputFormatter.PrintToken(Tokens.ElseIf);
outputFormatter.Space();
nodeTracker.TrackedVisit(elseIfSection.Condition, data);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Then);
outputFormatter.NewLine();
PrintIndentedBlock(elseIfSection.EmbeddedStatement);
return null;
}
public object VisitForStatement(ForStatement forStatement, object data)
{
// Is converted to {initializer} while <Condition> {Embedded} {Iterators} end while
exitTokenStack.Push(Tokens.While);
bool isFirstLine = true;
foreach (INode node in forStatement.Initializers) {
if (!isFirstLine)
outputFormatter.Indent();
isFirstLine = false;
nodeTracker.TrackedVisit(node, data);
outputFormatter.NewLine();
}
if (!isFirstLine)
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.While);
outputFormatter.Space();
if (forStatement.Condition.IsNull) {
outputFormatter.PrintToken(Tokens.True);
} else {
nodeTracker.TrackedVisit(forStatement.Condition, data);
}
outputFormatter.NewLine();
PrintIndentedBlock(forStatement.EmbeddedStatement);
PrintIndentedBlock(forStatement.Iterator);
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.While);
exitTokenStack.Pop();
return null;
}
public object VisitLabelStatement(LabelStatement labelStatement, object data)
{
outputFormatter.PrintIdentifier(labelStatement.Label);
outputFormatter.PrintToken(Tokens.Colon);
return null;
}
public object VisitGotoStatement(GotoStatement gotoStatement, object data)
{
outputFormatter.PrintToken(Tokens.GoTo);
outputFormatter.Space();
outputFormatter.PrintIdentifier(gotoStatement.Label);
return null;
}
public object VisitSwitchStatement(SwitchStatement switchStatement, object data)
{
exitTokenStack.Push(Tokens.Select);
outputFormatter.PrintToken(Tokens.Select);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Case);
outputFormatter.Space();
nodeTracker.TrackedVisit(switchStatement.SwitchExpression, data);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
foreach (SwitchSection section in switchStatement.SwitchSections) {
nodeTracker.TrackedVisit(section, data);
}
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Select);
exitTokenStack.Pop();
return null;
}
public object VisitSwitchSection(SwitchSection switchSection, object data)
{
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.Case);
outputFormatter.Space();
this.AppendCommaSeparatedList(switchSection.SwitchLabels);
outputFormatter.NewLine();
PrintIndentedBlock(switchSection.Children);
return null;
}
public object VisitCaseLabel(CaseLabel caseLabel, object data)
{
if (caseLabel.IsDefault) {
outputFormatter.PrintToken(Tokens.Else);
} else {
if (caseLabel.BinaryOperatorType != BinaryOperatorType.None) {
switch (caseLabel.BinaryOperatorType) {
case BinaryOperatorType.Equality:
outputFormatter.PrintToken(Tokens.Assign);
break;
case BinaryOperatorType.InEquality:
outputFormatter.PrintToken(Tokens.LessThan);
outputFormatter.PrintToken(Tokens.GreaterThan);
break;
case BinaryOperatorType.GreaterThan:
outputFormatter.PrintToken(Tokens.GreaterThan);
break;
case BinaryOperatorType.GreaterThanOrEqual:
outputFormatter.PrintToken(Tokens.GreaterEqual);
break;
case BinaryOperatorType.LessThan:
outputFormatter.PrintToken(Tokens.LessThan);
break;
case BinaryOperatorType.LessThanOrEqual:
outputFormatter.PrintToken(Tokens.LessEqual);
break;
}
outputFormatter.Space();
}
nodeTracker.TrackedVisit(caseLabel.Label, data);
if (!caseLabel.ToExpression.IsNull) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.To);
outputFormatter.Space();
nodeTracker.TrackedVisit(caseLabel.ToExpression, data);
}
}
return null;
}
public object VisitBreakStatement(BreakStatement breakStatement, object data)
{
outputFormatter.PrintToken(Tokens.Exit);
if (exitTokenStack.Count > 0) {
outputFormatter.Space();
outputFormatter.PrintToken(exitTokenStack.Peek());
}
return null;
}
public object VisitStopStatement(StopStatement stopStatement, object data)
{
outputFormatter.PrintToken(Tokens.Stop);
return null;
}
public object VisitResumeStatement(ResumeStatement resumeStatement, object data)
{
outputFormatter.PrintToken(Tokens.Resume);
outputFormatter.Space();
if (resumeStatement.IsResumeNext) {
outputFormatter.PrintToken(Tokens.Next);
} else {
outputFormatter.PrintIdentifier(resumeStatement.LabelName);
}
return null;
}
public object VisitEndStatement(EndStatement endStatement, object data)
{
outputFormatter.PrintToken(Tokens.End);
return null;
}
public object VisitContinueStatement(ContinueStatement continueStatement, object data)
{
outputFormatter.PrintToken(Tokens.Continue);
outputFormatter.Space();
switch (continueStatement.ContinueType) {
case ContinueType.Do:
outputFormatter.PrintToken(Tokens.Do);
break;
case ContinueType.For:
outputFormatter.PrintToken(Tokens.For);
break;
case ContinueType.While:
outputFormatter.PrintToken(Tokens.While);
break;
default:
outputFormatter.PrintToken(exitTokenStack.Peek());
break;
}
return null;
}
public object VisitGotoCaseStatement(GotoCaseStatement gotoCaseStatement, object data)
{
outputFormatter.PrintText("goto case ");
if (gotoCaseStatement.IsDefaultCase) {
outputFormatter.PrintText("default");
} else {
nodeTracker.TrackedVisit(gotoCaseStatement.Expression, null);
}
return null;
}
public object VisitDoLoopStatement(DoLoopStatement doLoopStatement, object data)
{
if (doLoopStatement.ConditionPosition == ConditionPosition.None) {
Error(String.Format("Unknown condition position for loop : {0}.", doLoopStatement), doLoopStatement.StartLocation);
}
if (doLoopStatement.ConditionPosition == ConditionPosition.Start) {
switch (doLoopStatement.ConditionType) {
case ConditionType.DoWhile:
exitTokenStack.Push(Tokens.Do);
outputFormatter.PrintToken(Tokens.Do);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.While);
break;
case ConditionType.While:
exitTokenStack.Push(Tokens.While);
outputFormatter.PrintToken(Tokens.While);
break;
case ConditionType.Until:
exitTokenStack.Push(Tokens.Do);
outputFormatter.PrintToken(Tokens.Do);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.While);
break;
default:
throw new InvalidOperationException();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -