📄 vbnetoutputvisitor.cs
字号:
PrintTemplates(methodDeclaration.Templates);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(methodDeclaration.Parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
if (!isSub) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.As);
outputFormatter.Space();
nodeTracker.TrackedVisit(methodDeclaration.TypeReference, data);
}
PrintInterfaceImplementations(methodDeclaration.InterfaceImplementations);
outputFormatter.NewLine();
if (!IsAbstract(methodDeclaration)) {
nodeTracker.BeginNode(methodDeclaration.Body);
++outputFormatter.IndentationLevel;
exitTokenStack.Push(isSub ? Tokens.Sub : Tokens.Function);
methodDeclaration.Body.AcceptVisitor(this, data);
exitTokenStack.Pop();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
if (isSub) {
outputFormatter.PrintToken(Tokens.Sub);
} else {
outputFormatter.PrintToken(Tokens.Function);
}
outputFormatter.NewLine();
nodeTracker.EndNode(methodDeclaration.Body);
}
return null;
}
public object VisitInterfaceImplementation(InterfaceImplementation interfaceImplementation, object data)
{
throw new InvalidOperationException();
}
bool IsAbstract(AttributedNode node)
{
if ((node.Modifier & Modifiers.Abstract) == Modifiers.Abstract)
return true;
return currentType != null && currentType.Type == ClassType.Interface;
}
public object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data)
{
VisitAttributes(constructorDeclaration.Attributes, data);
outputFormatter.Indent();
OutputModifier(constructorDeclaration.Modifier);
outputFormatter.PrintToken(Tokens.Sub);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.New);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(constructorDeclaration.Parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
exitTokenStack.Push(Tokens.Sub);
nodeTracker.TrackedVisit(constructorDeclaration.ConstructorInitializer, data);
nodeTracker.TrackedVisit(constructorDeclaration.Body, data);
exitTokenStack.Pop();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Sub);
outputFormatter.NewLine();
return null;
}
public object VisitConstructorInitializer(ConstructorInitializer constructorInitializer, object data)
{
outputFormatter.Indent();
if (constructorInitializer.ConstructorInitializerType == ConstructorInitializerType.This) {
outputFormatter.PrintToken(Tokens.Me);
} else {
outputFormatter.PrintToken(Tokens.MyBase);
}
outputFormatter.PrintToken(Tokens.Dot);
outputFormatter.PrintToken(Tokens.New);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(constructorInitializer.Arguments);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
outputFormatter.NewLine();
return null;
}
public object VisitIndexerDeclaration(IndexerDeclaration indexerDeclaration, object data)
{
VisitAttributes(indexerDeclaration.Attributes, data);
outputFormatter.Indent();
OutputModifier(indexerDeclaration.Modifier);
outputFormatter.PrintToken(Tokens.Default);
outputFormatter.Space();
if (indexerDeclaration.IsReadOnly) {
outputFormatter.PrintToken(Tokens.ReadOnly);
outputFormatter.Space();
} else if (indexerDeclaration.IsWriteOnly) {
outputFormatter.PrintToken(Tokens.WriteOnly);
outputFormatter.Space();
}
outputFormatter.PrintToken(Tokens.Property);
outputFormatter.Space();
outputFormatter.PrintIdentifier("Item");
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(indexerDeclaration.Parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.As);
outputFormatter.Space();
nodeTracker.TrackedVisit(indexerDeclaration.TypeReference, data);
PrintInterfaceImplementations(indexerDeclaration.InterfaceImplementations);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
exitTokenStack.Push(Tokens.Property);
nodeTracker.TrackedVisit(indexerDeclaration.GetRegion, data);
nodeTracker.TrackedVisit(indexerDeclaration.SetRegion, data);
exitTokenStack.Pop();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Property);
outputFormatter.NewLine();
return null;
}
public object VisitDestructorDeclaration(DestructorDeclaration destructorDeclaration, object data)
{
outputFormatter.Indent();
outputFormatter.PrintText("Protected Overrides Sub Finalize()");
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
exitTokenStack.Push(Tokens.Sub);
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.Try);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
nodeTracker.TrackedVisit(destructorDeclaration.Body, data);
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.Finally);
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintText("MyBase.Finalize()");
outputFormatter.NewLine();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Try);
outputFormatter.NewLine();
exitTokenStack.Pop();
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Sub);
outputFormatter.NewLine();
return null;
}
public object VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration, object data)
{
VisitAttributes(operatorDeclaration.Attributes, data);
outputFormatter.Indent();
OutputModifier(operatorDeclaration.Modifier);
if (operatorDeclaration.IsConversionOperator) {
if (operatorDeclaration.ConversionType == ConversionType.Implicit) {
outputFormatter.PrintToken(Tokens.Widening);
} else {
outputFormatter.PrintToken(Tokens.Narrowing);
}
outputFormatter.Space();
}
outputFormatter.PrintToken(Tokens.Operator);
outputFormatter.Space();
int op = -1;
switch(operatorDeclaration.OverloadableOperator)
{
case OverloadableOperatorType.Add:
op = Tokens.Plus;
break;
case OverloadableOperatorType.Subtract:
op = Tokens.Minus;
break;
case OverloadableOperatorType.Multiply:
op = Tokens.Times;
break;
case OverloadableOperatorType.Divide:
op = Tokens.Div;
break;
case OverloadableOperatorType.Modulus:
op = Tokens.Mod;
break;
case OverloadableOperatorType.Concat:
op = Tokens.ConcatString;
break;
case OverloadableOperatorType.Not:
op = Tokens.Not;
break;
case OverloadableOperatorType.BitNot:
op = Tokens.Not;
break;
case OverloadableOperatorType.BitwiseAnd:
op = Tokens.And;
break;
case OverloadableOperatorType.BitwiseOr:
op = Tokens.Or;
break;
case OverloadableOperatorType.ExclusiveOr:
op = Tokens.Xor;
break;
case OverloadableOperatorType.ShiftLeft:
op = Tokens.ShiftLeft;
break;
case OverloadableOperatorType.ShiftRight:
op = Tokens.ShiftRight;
break;
case OverloadableOperatorType.GreaterThan:
op = Tokens.GreaterThan;
break;
case OverloadableOperatorType.GreaterThanOrEqual:
op = Tokens.GreaterEqual;
break;
case OverloadableOperatorType.Equality:
op = Tokens.Assign;
break;
case OverloadableOperatorType.InEquality:
op = Tokens.NotEqual;
break;
case OverloadableOperatorType.LessThan:
op = Tokens.LessThan;
break;
case OverloadableOperatorType.LessThanOrEqual:
op = Tokens.LessEqual;
break;
case OverloadableOperatorType.Increment:
Error("Increment operator is not supported in Visual Basic", operatorDeclaration.StartLocation);
break;
case OverloadableOperatorType.Decrement:
Error("Decrement operator is not supported in Visual Basic", operatorDeclaration.StartLocation);
break;
case OverloadableOperatorType.IsTrue:
outputFormatter.PrintText("IsTrue");
break;
case OverloadableOperatorType.IsFalse:
outputFormatter.PrintText("IsFalse");
break;
case OverloadableOperatorType.Like:
op = Tokens.Like;
break;
case OverloadableOperatorType.Power:
op = Tokens.Power;
break;
case OverloadableOperatorType.CType:
op = Tokens.CType;
break;
case OverloadableOperatorType.DivideInteger:
op = Tokens.DivInteger;
break;
}
if (operatorDeclaration.IsConversionOperator) {
outputFormatter.PrintToken(Tokens.CType);
} else {
if(op != -1) outputFormatter.PrintToken(op);
}
PrintTemplates(operatorDeclaration.Templates);
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(operatorDeclaration.Parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
if (!operatorDeclaration.TypeReference.IsNull) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.As);
outputFormatter.Space();
nodeTracker.TrackedVisit(operatorDeclaration.TypeReference, data);
}
outputFormatter.NewLine();
++outputFormatter.IndentationLevel;
nodeTracker.TrackedVisit(operatorDeclaration.Body, data);
--outputFormatter.IndentationLevel;
outputFormatter.Indent();
outputFormatter.PrintToken(Tokens.End);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Operator);
outputFormatter.NewLine();
return null;
}
public object VisitDeclareDeclaration(DeclareDeclaration declareDeclaration, object data)
{
VisitAttributes(declareDeclaration.Attributes, data);
outputFormatter.Indent();
OutputModifier(declareDeclaration.Modifier);
outputFormatter.PrintToken(Tokens.Declare);
outputFormatter.Space();
switch (declareDeclaration.Charset) {
case CharsetModifier.Auto:
outputFormatter.PrintToken(Tokens.Auto);
outputFormatter.Space();
break;
case CharsetModifier.Unicode:
outputFormatter.PrintToken(Tokens.Unicode);
outputFormatter.Space();
break;
case CharsetModifier.Ansi:
outputFormatter.PrintToken(Tokens.Ansi);
outputFormatter.Space();
break;
}
bool isVoid = declareDeclaration.TypeReference.IsNull || declareDeclaration.TypeReference.SystemType == "System.Void";
if (isVoid) {
outputFormatter.PrintToken(Tokens.Sub);
} else {
outputFormatter.PrintToken(Tokens.Function);
}
outputFormatter.Space();
outputFormatter.PrintIdentifier(declareDeclaration.Name);
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.Lib);
outputFormatter.Space();
outputFormatter.PrintText('"' + ConvertString(declareDeclaration.Library) + '"');
outputFormatter.Space();
if (declareDeclaration.Alias.Length > 0) {
outputFormatter.PrintToken(Tokens.Alias);
outputFormatter.Space();
outputFormatter.PrintText('"' + ConvertString(declareDeclaration.Alias) + '"');
outputFormatter.Space();
}
outputFormatter.PrintToken(Tokens.OpenParenthesis);
AppendCommaSeparatedList(declareDeclaration.Parameters);
outputFormatter.PrintToken(Tokens.CloseParenthesis);
if (!isVoid) {
outputFormatter.Space();
outputFormatter.PrintToken(Tokens.As);
outputFormatter.Space();
nodeTracker.TrackedVisit(declareDeclaration.TypeReference, data);
}
outputFormatter.NewLine();
return null;
}
#endregion
#region Statements
public object VisitBlockStatement(BlockStatement blockStatement, object data)
{
VisitStatementList(blockStatement.Children);
return null;
}
void PrintIndentedBlock(Statement stmt)
{
outputFormatter.IndentationLevel += 1;
if (stmt is BlockStatement) {
nodeTracker.TrackedVisit(stmt, null);
} else {
outputFormatter.Indent();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -