1
ļ»æ// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
2
// This code is distributed under MIT X11 license (for details please see \doc\license.txt)
5
using System.Collections.Generic;
6
using System.Diagnostics;
7
using System.Globalization;
12
using ICSharpCode.NRefactory.PatternMatching;
13
using ICSharpCode.NRefactory.VB.Ast;
15
namespace ICSharpCode.NRefactory.VB
18
/// Description of OutputVisitor.
20
public class OutputVisitor : IAstVisitor<object, object>
22
readonly IOutputFormatter formatter;
23
readonly VBFormattingOptions policy;
25
readonly Stack<AstNode> containerStack = new Stack<AstNode>();
26
readonly Stack<AstNode> positionStack = new Stack<AstNode>();
29
/// Used to insert the minimal amount of spaces so that the lexer recognizes the tokens that were written.
31
LastWritten lastWritten;
40
public OutputVisitor(TextWriter textWriter, VBFormattingOptions formattingPolicy)
42
if (textWriter == null)
43
throw new ArgumentNullException("textWriter");
44
if (formattingPolicy == null)
45
throw new ArgumentNullException("formattingPolicy");
46
this.formatter = new TextWriterOutputFormatter(textWriter);
47
this.policy = formattingPolicy;
50
public OutputVisitor(IOutputFormatter formatter, VBFormattingOptions formattingPolicy)
52
if (formatter == null)
53
throw new ArgumentNullException("formatter");
54
if (formattingPolicy == null)
55
throw new ArgumentNullException("formattingPolicy");
56
this.formatter = formatter;
57
this.policy = formattingPolicy;
60
public object VisitCompilationUnit(CompilationUnit compilationUnit, object data)
62
// don't do node tracking as we visit all children directly
63
foreach (AstNode node in compilationUnit.Children)
64
node.AcceptVisitor(this, data);
68
public object VisitBlockStatement(BlockStatement blockStatement, object data)
70
StartNode(blockStatement);
71
foreach (var stmt in blockStatement) {
72
stmt.AcceptVisitor(this, data);
75
return EndNode(blockStatement);
78
public object VisitPatternPlaceholder(AstNode placeholder, Pattern pattern, object data)
80
throw new NotImplementedException();
83
public object VisitTypeParameterDeclaration(TypeParameterDeclaration typeParameterDeclaration, object data)
85
StartNode(typeParameterDeclaration);
87
switch (typeParameterDeclaration.Variance) {
88
case ICSharpCode.NRefactory.TypeSystem.VarianceModifier.Invariant:
90
case ICSharpCode.NRefactory.TypeSystem.VarianceModifier.Covariant:
93
case ICSharpCode.NRefactory.TypeSystem.VarianceModifier.Contravariant:
97
throw new Exception("Invalid value for VarianceModifier");
100
WriteIdentifier(typeParameterDeclaration.Name);
101
if (typeParameterDeclaration.Constraints.Any()) {
103
if (typeParameterDeclaration.Constraints.Count > 1)
104
WriteToken("{", TypeParameterDeclaration.Roles.LBrace);
105
WriteCommaSeparatedList(typeParameterDeclaration.Constraints);
106
if (typeParameterDeclaration.Constraints.Count > 1)
107
WriteToken("}", TypeParameterDeclaration.Roles.RBrace);
110
return EndNode(typeParameterDeclaration);
113
public object VisitParameterDeclaration(ParameterDeclaration parameterDeclaration, object data)
115
StartNode(parameterDeclaration);
116
WriteAttributes(parameterDeclaration.Attributes);
117
WriteModifiers(parameterDeclaration.ModifierTokens);
118
WriteIdentifier(parameterDeclaration.Name.Name);
119
if (!parameterDeclaration.Type.IsNull) {
121
parameterDeclaration.Type.AcceptVisitor(this, data);
123
if (!parameterDeclaration.OptionalValue.IsNull) {
124
WriteToken("=", ParameterDeclaration.Roles.Assign);
125
parameterDeclaration.OptionalValue.AcceptVisitor(this, data);
127
return EndNode(parameterDeclaration);
130
public object VisitVBTokenNode(VBTokenNode vBTokenNode, object data)
132
var mod = vBTokenNode as VBModifierToken;
134
StartNode(vBTokenNode);
135
WriteKeyword(VBModifierToken.GetModifierName(mod.Modifier));
136
return EndNode(vBTokenNode);
138
throw new NotSupportedException("Should never visit individual tokens");
142
public object VisitAliasImportsClause(AliasImportsClause aliasImportsClause, object data)
144
throw new NotImplementedException();
147
public object VisitAttribute(ICSharpCode.NRefactory.VB.Ast.Attribute attribute, object data)
149
StartNode(attribute);
151
if (attribute.Target != AttributeTarget.None) {
152
switch (attribute.Target) {
153
case AttributeTarget.None:
155
case AttributeTarget.Assembly:
156
WriteKeyword("Assembly");
158
case AttributeTarget.Module:
159
WriteKeyword("Module");
162
throw new Exception("Invalid value for AttributeTarget");
164
WriteToken(":", Ast.Attribute.Roles.Colon);
167
attribute.Type.AcceptVisitor(this, data);
168
WriteCommaSeparatedListInParenthesis(attribute.Arguments, false);
170
return EndNode(attribute);
173
public object VisitAttributeBlock(AttributeBlock attributeBlock, object data)
175
StartNode(attributeBlock);
177
WriteToken("<", AttributeBlock.Roles.LChevron);
178
WriteCommaSeparatedList(attributeBlock.Attributes);
179
WriteToken(">", AttributeBlock.Roles.RChevron);
180
if (attributeBlock.Parent is ParameterDeclaration)
185
return EndNode(attributeBlock);
188
public object VisitImportsStatement(ImportsStatement importsStatement, object data)
190
StartNode(importsStatement);
192
WriteKeyword("Imports", AstNode.Roles.Keyword);
194
WriteCommaSeparatedList(importsStatement.ImportsClauses);
197
return EndNode(importsStatement);
200
public object VisitMemberImportsClause(MemberImportsClause memberImportsClause, object data)
202
StartNode(memberImportsClause);
203
memberImportsClause.Member.AcceptVisitor(this, data);
204
return EndNode(memberImportsClause);
207
public object VisitNamespaceDeclaration(NamespaceDeclaration namespaceDeclaration, object data)
209
StartNode(namespaceDeclaration);
211
WriteKeyword("Namespace");
213
foreach (Identifier node in namespaceDeclaration.Identifiers) {
217
WriteToken(".", NamespaceDeclaration.Roles.Dot);
219
node.AcceptVisitor(this, null);
222
WriteMembers(namespaceDeclaration.Members);
224
WriteKeyword("Namespace");
226
return EndNode(namespaceDeclaration);
229
public object VisitOptionStatement(OptionStatement optionStatement, object data)
231
throw new NotImplementedException();
234
public object VisitTypeDeclaration(TypeDeclaration typeDeclaration, object data)
236
StartNode(typeDeclaration);
237
WriteAttributes(typeDeclaration.Attributes);
238
WriteModifiers(typeDeclaration.ModifierTokens);
239
WriteClassTypeKeyword(typeDeclaration);
240
WriteIdentifier(typeDeclaration.Name.Name);
244
if (!typeDeclaration.InheritsType.IsNull) {
246
WriteKeyword("Inherits");
247
typeDeclaration.InheritsType.AcceptVisitor(this, data);
251
if (typeDeclaration.ImplementsTypes.Any()) {
253
WriteImplementsClause(typeDeclaration.ImplementsTypes);
258
if (!typeDeclaration.InheritsType.IsNull || typeDeclaration.ImplementsTypes.Any())
261
WriteMembers(typeDeclaration.Members);
264
WriteClassTypeKeyword(typeDeclaration);
267
return EndNode(typeDeclaration);
270
void WriteClassTypeKeyword(TypeDeclaration typeDeclaration)
272
switch (typeDeclaration.ClassType) {
273
case ClassType.Class:
274
WriteKeyword("Class");
276
case ClassType.Interface:
277
WriteKeyword("Interface");
279
case ClassType.Struct:
280
WriteKeyword("Structure");
282
case ClassType.Module:
283
WriteKeyword("Module");
286
throw new Exception("Invalid value for ClassType");
290
public object VisitXmlNamespaceImportsClause(XmlNamespaceImportsClause xmlNamespaceImportsClause, object data)
292
throw new NotImplementedException();
295
public object VisitEnumDeclaration(EnumDeclaration enumDeclaration, object data)
297
StartNode(enumDeclaration);
299
WriteAttributes(enumDeclaration.Attributes);
300
WriteModifiers(enumDeclaration.ModifierTokens);
301
WriteKeyword("Enum");
302
WriteIdentifier(enumDeclaration.Name.Name);
303
if (!enumDeclaration.UnderlyingType.IsNull) {
306
enumDeclaration.UnderlyingType.AcceptVisitor(this, data);
312
foreach (var member in enumDeclaration.Members) {
313
member.AcceptVisitor(this, null);
318
WriteKeyword("Enum");
322
return EndNode(enumDeclaration);
325
public object VisitEnumMemberDeclaration(EnumMemberDeclaration enumMemberDeclaration, object data)
327
StartNode(enumMemberDeclaration);
329
WriteAttributes(enumMemberDeclaration.Attributes);
330
WriteIdentifier(enumMemberDeclaration.Name.Name);
332
if (!enumMemberDeclaration.Value.IsNull) {
334
WriteToken("=", EnumMemberDeclaration.Roles.Assign);
336
enumMemberDeclaration.Value.AcceptVisitor(this, data);
340
return EndNode(enumMemberDeclaration);
343
public object VisitDelegateDeclaration(DelegateDeclaration delegateDeclaration, object data)
345
StartNode(delegateDeclaration);
347
WriteAttributes(delegateDeclaration.Attributes);
348
WriteModifiers(delegateDeclaration.ModifierTokens);
349
WriteKeyword("Delegate");
350
if (delegateDeclaration.IsSub)
353
WriteKeyword("Function");
354
WriteIdentifier(delegateDeclaration.Name.Name);
355
WriteTypeParameters(delegateDeclaration.TypeParameters);
356
WriteCommaSeparatedListInParenthesis(delegateDeclaration.Parameters, false);
357
if (!delegateDeclaration.IsSub) {
360
WriteAttributes(delegateDeclaration.ReturnTypeAttributes);
361
delegateDeclaration.ReturnType.AcceptVisitor(this, data);
365
return EndNode(delegateDeclaration);
368
public object VisitIdentifier(Identifier identifier, object data)
370
StartNode(identifier);
371
WriteIdentifier(identifier.Name);
372
WriteTypeCharacter(identifier.TypeCharacter);
373
return EndNode(identifier);
376
public object VisitXmlIdentifier(XmlIdentifier xmlIdentifier, object data)
378
throw new NotImplementedException();
381
public object VisitXmlLiteralString(XmlLiteralString xmlLiteralString, object data)
383
throw new NotImplementedException();
386
public object VisitSimpleNameExpression(SimpleNameExpression simpleNameExpression, object data)
388
StartNode(simpleNameExpression);
390
simpleNameExpression.Identifier.AcceptVisitor(this, data);
391
WriteTypeArguments(simpleNameExpression.TypeArguments);
393
return EndNode(simpleNameExpression);
396
public object VisitPrimitiveExpression(PrimitiveExpression primitiveExpression, object data)
398
StartNode(primitiveExpression);
400
WritePrimitiveValue(primitiveExpression.Value);
402
return EndNode(primitiveExpression);
405
public object VisitInstanceExpression(InstanceExpression instanceExpression, object data)
407
StartNode(instanceExpression);
409
switch (instanceExpression.Type) {
410
case InstanceExpressionType.Me:
413
case InstanceExpressionType.MyBase:
414
WriteKeyword("MyBase");
416
case InstanceExpressionType.MyClass:
417
WriteKeyword("MyClass");
420
throw new Exception("Invalid value for InstanceExpressionType");
423
return EndNode(instanceExpression);
426
public object VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression, object data)
428
StartNode(parenthesizedExpression);
431
parenthesizedExpression.Expression.AcceptVisitor(this, data);
434
return EndNode(parenthesizedExpression);
437
public object VisitGetTypeExpression(GetTypeExpression getTypeExpression, object data)
439
StartNode(getTypeExpression);
441
WriteKeyword("GetType");
443
getTypeExpression.Type.AcceptVisitor(this, data);
446
return EndNode(getTypeExpression);
449
public object VisitTypeOfIsExpression(TypeOfIsExpression typeOfIsExpression, object data)
451
StartNode(typeOfIsExpression);
453
WriteKeyword("TypeOf");
454
typeOfIsExpression.TypeOfExpression.AcceptVisitor(this, data);
456
typeOfIsExpression.Type.AcceptVisitor(this, data);
458
return EndNode(typeOfIsExpression);
461
public object VisitGetXmlNamespaceExpression(GetXmlNamespaceExpression getXmlNamespaceExpression, object data)
463
throw new NotImplementedException();
466
public object VisitMemberAccessExpression(MemberAccessExpression memberAccessExpression, object data)
468
StartNode(memberAccessExpression);
470
memberAccessExpression.Target.AcceptVisitor(this, data);
471
WriteToken(".", MemberAccessExpression.Roles.Dot);
472
memberAccessExpression.MemberName.AcceptVisitor(this, data);
473
WriteTypeArguments(memberAccessExpression.TypeArguments);
475
return EndNode(memberAccessExpression);
478
public object VisitTypeReferenceExpression(TypeReferenceExpression typeReferenceExpression, object data)
480
StartNode(typeReferenceExpression);
482
typeReferenceExpression.Type.AcceptVisitor(this, data);
484
return EndNode(typeReferenceExpression);
487
public object VisitEventMemberSpecifier(EventMemberSpecifier eventMemberSpecifier, object data)
489
StartNode(eventMemberSpecifier);
491
eventMemberSpecifier.Target.AcceptVisitor(this, data);
492
WriteToken(".", EventMemberSpecifier.Roles.Dot);
493
eventMemberSpecifier.Member.AcceptVisitor(this, data);
495
return EndNode(eventMemberSpecifier);
498
public object VisitInterfaceMemberSpecifier(InterfaceMemberSpecifier interfaceMemberSpecifier, object data)
500
StartNode(interfaceMemberSpecifier);
502
interfaceMemberSpecifier.Target.AcceptVisitor(this, data);
503
WriteToken(".", EventMemberSpecifier.Roles.Dot);
504
interfaceMemberSpecifier.Member.AcceptVisitor(this, data);
506
return EndNode(interfaceMemberSpecifier);
510
public object VisitConstructorDeclaration(ConstructorDeclaration constructorDeclaration, object data)
512
StartNode(constructorDeclaration);
514
WriteAttributes(constructorDeclaration.Attributes);
515
WriteModifiers(constructorDeclaration.ModifierTokens);
518
WriteCommaSeparatedListInParenthesis(constructorDeclaration.Parameters, false);
523
WriteBlock(constructorDeclaration.Body);
531
return EndNode(constructorDeclaration);
534
public object VisitMethodDeclaration(MethodDeclaration methodDeclaration, object data)
536
StartNode(methodDeclaration);
538
WriteAttributes(methodDeclaration.Attributes);
539
WriteModifiers(methodDeclaration.ModifierTokens);
540
if (methodDeclaration.IsSub)
543
WriteKeyword("Function");
544
methodDeclaration.Name.AcceptVisitor(this, data);
545
WriteTypeParameters(methodDeclaration.TypeParameters);
546
WriteCommaSeparatedListInParenthesis(methodDeclaration.Parameters, false);
547
if (!methodDeclaration.IsSub && !methodDeclaration.ReturnType.IsNull) {
550
WriteAttributes(methodDeclaration.ReturnTypeAttributes);
551
methodDeclaration.ReturnType.AcceptVisitor(this, data);
553
WriteHandlesClause(methodDeclaration.HandlesClause);
554
WriteImplementsClause(methodDeclaration.ImplementsClause);
555
if (!methodDeclaration.Body.IsNull) {
559
WriteBlock(methodDeclaration.Body);
562
if (methodDeclaration.IsSub)
565
WriteKeyword("Function");
570
return EndNode(methodDeclaration);
573
public object VisitFieldDeclaration(FieldDeclaration fieldDeclaration, object data)
575
StartNode(fieldDeclaration);
577
WriteAttributes(fieldDeclaration.Attributes);
578
WriteModifiers(fieldDeclaration.ModifierTokens);
579
WriteCommaSeparatedList(fieldDeclaration.Variables);
582
return EndNode(fieldDeclaration);
585
public object VisitPropertyDeclaration(PropertyDeclaration propertyDeclaration, object data)
587
StartNode(propertyDeclaration);
589
WriteAttributes(propertyDeclaration.Attributes);
590
WriteModifiers(propertyDeclaration.ModifierTokens);
591
WriteKeyword("Property");
592
WriteIdentifier(propertyDeclaration.Name.Name);
593
WriteCommaSeparatedListInParenthesis(propertyDeclaration.Parameters, false);
594
if (!propertyDeclaration.ReturnType.IsNull) {
597
WriteAttributes(propertyDeclaration.ReturnTypeAttributes);
598
propertyDeclaration.ReturnType.AcceptVisitor(this, data);
601
bool needsBody = !propertyDeclaration.Getter.Body.IsNull || !propertyDeclaration.Setter.Body.IsNull;
608
if (!propertyDeclaration.Getter.Body.IsNull) {
609
propertyDeclaration.Getter.AcceptVisitor(this, data);
612
if (!propertyDeclaration.Setter.Body.IsNull) {
613
propertyDeclaration.Setter.AcceptVisitor(this, data);
618
WriteKeyword("Property");
623
return EndNode(propertyDeclaration);
628
public object VisitPrimitiveType(PrimitiveType primitiveType, object data)
630
StartNode(primitiveType);
632
WriteKeyword(primitiveType.Keyword);
634
return EndNode(primitiveType);
637
public object VisitQualifiedType(QualifiedType qualifiedType, object data)
639
StartNode(qualifiedType);
641
qualifiedType.Target.AcceptVisitor(this, data);
642
WriteToken(".", AstNode.Roles.Dot);
643
WriteIdentifier(qualifiedType.Name);
644
WriteTypeArguments(qualifiedType.TypeArguments);
646
return EndNode(qualifiedType);
649
public object VisitComposedType(ComposedType composedType, object data)
651
StartNode(composedType);
653
composedType.BaseType.AcceptVisitor(this, data);
654
if (composedType.HasNullableSpecifier)
655
WriteToken("?", ComposedType.Roles.QuestionMark);
656
WriteArraySpecifiers(composedType.ArraySpecifiers);
658
return EndNode(composedType);
661
public object VisitArraySpecifier(ArraySpecifier arraySpecifier, object data)
663
StartNode(arraySpecifier);
666
for (int i = 0; i < arraySpecifier.Dimensions - 1; i++) {
667
WriteToken(",", ArraySpecifier.Roles.Comma);
671
return EndNode(arraySpecifier);
674
public object VisitSimpleType(SimpleType simpleType, object data)
676
StartNode(simpleType);
678
WriteIdentifier(simpleType.Identifier);
679
WriteTypeArguments(simpleType.TypeArguments);
681
return EndNode(simpleType);
685
#region StartNode/EndNode
686
void StartNode(AstNode node)
688
// Ensure that nodes are visited in the proper nested order.
689
// Jumps to different subtrees are allowed only for the child of a placeholder node.
690
Debug.Assert(containerStack.Count == 0 || node.Parent == containerStack.Peek());
691
if (positionStack.Count > 0)
692
WriteSpecialsUpToNode(node);
693
containerStack.Push(node);
694
positionStack.Push(node.FirstChild);
695
formatter.StartNode(node);
698
object EndNode(AstNode node)
700
Debug.Assert(node == containerStack.Peek());
701
AstNode pos = positionStack.Pop();
702
Debug.Assert(pos == null || pos.Parent == node);
703
WriteSpecials(pos, null);
704
containerStack.Pop();
705
formatter.EndNode(node);
710
#region WriteSpecials
712
/// Writes all specials from start to end (exclusive). Does not touch the positionStack.
714
void WriteSpecials(AstNode start, AstNode end)
716
for (AstNode pos = start; pos != end; pos = pos.NextSibling) {
717
if (pos.Role == AstNode.Roles.Comment) {
718
pos.AcceptVisitor(this, null);
724
/// Writes all specials between the current position (in the positionStack) and the next
725
/// node with the specified role. Advances the current position.
727
void WriteSpecialsUpToRole(Role role)
729
for (AstNode pos = positionStack.Peek(); pos != null; pos = pos.NextSibling) {
730
if (pos.Role == role) {
731
WriteSpecials(positionStack.Pop(), pos);
732
positionStack.Push(pos);
739
/// Writes all specials between the current position (in the positionStack) and the specified node.
740
/// Advances the current position.
742
void WriteSpecialsUpToNode(AstNode node)
744
for (AstNode pos = positionStack.Peek(); pos != null; pos = pos.NextSibling) {
746
WriteSpecials(positionStack.Pop(), pos);
747
positionStack.Push(pos);
753
void WriteSpecialsUpToRole(Role role, AstNode nextNode)
755
// Look for the role between the current position and the nextNode.
756
for (AstNode pos = positionStack.Peek(); pos != null && pos != nextNode; pos = pos.NextSibling) {
757
if (pos.Role == AstNode.Roles.Comma) {
758
WriteSpecials(positionStack.Pop(), pos);
759
positionStack.Push(pos);
770
/// <param name="nextNode">The next node after the comma.</param>
771
/// <param name="noSpacesAfterComma">When set prevents printing a space after comma.</param>
772
void Comma(AstNode nextNode, bool noSpaceAfterComma = false)
774
WriteSpecialsUpToRole(AstNode.Roles.Comma, nextNode);
775
formatter.WriteToken(",");
776
lastWritten = LastWritten.Other;
777
Space(!noSpaceAfterComma); // TODO: Comma policy has changed.
780
void WriteCommaSeparatedList(IEnumerable<AstNode> list)
783
foreach (AstNode node in list) {
789
node.AcceptVisitor(this, null);
793
void WriteCommaSeparatedListInParenthesis(IEnumerable<AstNode> list, bool spaceWithin)
798
WriteCommaSeparatedList(list);
805
void WriteCommaSeparatedList(IEnumerable<VariableInitializer> list)
807
WriteCommaSeparatedList(list);
810
void WriteCommaSeparatedList(IEnumerable<AstType> list)
812
WriteCommaSeparatedList(list);
815
void WriteCommaSeparatedListInParenthesis(IEnumerable<Expression> list, bool spaceWithin)
817
WriteCommaSeparatedListInParenthesis(list.SafeCast<Expression, AstNode>(), spaceWithin);
820
void WriteCommaSeparatedListInParenthesis(IEnumerable<ParameterDeclaration> list, bool spaceWithin)
822
WriteCommaSeparatedListInParenthesis(list.SafeCast<ParameterDeclaration, AstNode>(), spaceWithin);
827
void WriteCommaSeparatedListInBrackets(IEnumerable<ParameterDeclaration> list, bool spaceWithin)
829
WriteToken("[", AstNode.Roles.LBracket);
832
WriteCommaSeparatedList(list);
835
WriteToken("]", AstNode.Roles.RBracket);
838
void WriteCommaSeparatedListInBrackets(IEnumerable<Expression> list)
840
WriteToken ("[", AstNode.Roles.LBracket);
843
WriteCommaSeparatedList(list);
846
WriteToken ("]", AstNode.Roles.RBracket);
852
/// Writes a keyword, and all specials up to
854
void WriteKeyword(string keyword, Role<VBTokenNode> tokenRole = null)
856
WriteSpecialsUpToRole(tokenRole ?? AstNode.Roles.Keyword);
857
if (lastWritten == LastWritten.KeywordOrIdentifier)
859
formatter.WriteKeyword(keyword);
860
lastWritten = LastWritten.KeywordOrIdentifier;
863
void WriteIdentifier(string identifier, Role<Identifier> identifierRole = null)
865
WriteSpecialsUpToRole(identifierRole ?? AstNode.Roles.Identifier);
866
if (IsKeyword(identifier, containerStack.Peek())) {
867
if (lastWritten == LastWritten.KeywordOrIdentifier)
868
Space(); // this space is not strictly required, so we call Space()
869
formatter.WriteToken("[");
870
} else if (lastWritten == LastWritten.KeywordOrIdentifier) {
871
formatter.Space(); // this space is strictly required, so we directly call the formatter
873
formatter.WriteIdentifier(identifier);
874
if (IsKeyword(identifier, containerStack.Peek())) {
875
formatter.WriteToken("]");
877
lastWritten = LastWritten.KeywordOrIdentifier;
880
void WriteToken(string token, Role<VBTokenNode> tokenRole)
882
WriteSpecialsUpToRole(tokenRole);
883
// Avoid that two +, - or ? tokens are combined into a ++, -- or ?? token.
884
// Note that we don't need to handle tokens like = because there's no valid
885
// C# program that contains the single token twice in a row.
886
// (for +, - and &, this can happen with unary operators;
887
// for ?, this can happen in "a is int? ? b : c" or "a as int? ?? 0";
888
// and for /, this can happen with "1/ *ptr" or "1/ //comment".)
889
// if (lastWritten == LastWritten.Plus && token[0] == '+'
890
// || lastWritten == LastWritten.Minus && token[0] == '-'
891
// || lastWritten == LastWritten.Ampersand && token[0] == '&'
892
// || lastWritten == LastWritten.QuestionMark && token[0] == '?'
893
// || lastWritten == LastWritten.Division && token[0] == '*')
895
// formatter.Space();
897
formatter.WriteToken(token);
899
// lastWritten = LastWritten.Plus;
900
// else if (token == "-")
901
// lastWritten = LastWritten.Minus;
902
// else if (token == "&")
903
// lastWritten = LastWritten.Ampersand;
904
// else if (token == "?")
905
// lastWritten = LastWritten.QuestionMark;
906
// else if (token == "/")
907
// lastWritten = LastWritten.Division;
909
lastWritten = LastWritten.Other;
912
void WriteTypeCharacter(TypeCode typeCharacter)
914
switch (typeCharacter) {
916
case TypeCode.Object:
917
case TypeCode.DBNull:
918
case TypeCode.Boolean:
931
case TypeCode.UInt16:
935
WriteToken("%", null);
937
case TypeCode.UInt32:
941
WriteToken("&", null);
943
case TypeCode.UInt64:
946
case TypeCode.Single:
947
WriteToken("!", null);
949
case TypeCode.Double:
950
WriteToken("#", null);
952
case TypeCode.Decimal:
953
WriteToken("@", null);
955
case TypeCode.DateTime:
958
case TypeCode.String:
959
WriteToken("$", null);
962
throw new Exception("Invalid value for TypeCode");
968
WriteToken("(", AstNode.Roles.LPar);
973
WriteToken(")", AstNode.Roles.LPar);
977
/// Writes a space depending on policy.
979
void Space(bool addSpace = true)
983
lastWritten = LastWritten.Whitespace;
990
lastWritten = LastWritten.Whitespace;
1000
formatter.Unindent();
1003
void MarkFoldStart()
1005
formatter.MarkFoldStart();
1010
formatter.MarkFoldEnd();
1014
#region IsKeyword Test
1015
static readonly HashSet<string> unconditionalKeywords = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
1016
"AddHandler", "AddressOf", "Alias", "And", "AndAlso", "As", "Boolean", "ByRef", "Byte",
1017
"ByVal", "Call", "Case", "Catch", "CBool", "CByte", "CChar", "CInt", "Class", "CLng",
1018
"CObj", "Const", "Continue", "CSByte", "CShort", "CSng", "CStr", "CType", "CUInt",
1019
"CULng", "CUShort", "Date", "Decimal", "Declare", "Default", "Delegate", "Dim",
1020
"DirectCast", "Do", "Double", "Each", "Else", "ElseIf", "End", "EndIf", "Enum", "Erase",
1021
"Error", "Event", "Exit", "False", "Finally", "For", "Friend", "Function", "Get",
1022
"GetType", "GetXmlNamespace", "Global", "GoSub", "GoTo", "Handles", "If", "Implements",
1023
"Imports", "In", "Inherits", "Integer", "Interface", "Is", "IsNot", "Let", "Lib", "Like",
1024
"Long", "Loop", "Me", "Mod", "Module", "MustInherit", "MustOverride", "MyBase", "MyClass",
1025
"Namespace", "Narrowing", "New", "Next", "Not", "Nothing", "NotInheritable", "NotOverridable",
1026
"Object", "Of", "On", "Operator", "Option", "Optional", "Or", "OrElse", "Overloads",
1027
"Overridable", "Overrides", "ParamArray", "Partial", "Private", "Property", "Protected",
1028
"Public", "RaiseEvent", "ReadOnly", "ReDim", "REM", "RemoveHandler", "Resume", "Return",
1029
"SByte", "Select", "Set", "Shadows", "Shared", "Short", "Single", "Static", "Step", "Stop",
1030
"String", "Structure", "Sub", "SyncLock", "Then", "Throw", "To", "True", "Try", "TryCast",
1031
"TypeOf", "UInteger", "ULong", "UShort", "Using", "Variant", "Wend", "When", "While",
1032
"Widening", "With", "WithEvents", "WriteOnly", "Xor"
1035
static readonly HashSet<string> queryKeywords = new HashSet<string> {
1040
/// Determines whether the specified identifier is a keyword in the given context.
1042
public static bool IsKeyword(string identifier, AstNode context)
1044
if (unconditionalKeywords.Contains(identifier))
1046
// if (context.Ancestors.Any(a => a is QueryExpression)) {
1047
// if (queryKeywords.Contains(identifier))
1054
#region Write constructs
1055
void WriteTypeArguments(IEnumerable<AstType> typeArguments)
1057
if (typeArguments.Any()) {
1060
WriteCommaSeparatedList(typeArguments);
1065
void WriteTypeParameters(IEnumerable<TypeParameterDeclaration> typeParameters)
1067
if (typeParameters.Any()) {
1070
WriteCommaSeparatedList(typeParameters);
1075
void WriteModifiers(IEnumerable<VBModifierToken> modifierTokens)
1077
foreach (VBModifierToken modifier in modifierTokens) {
1078
modifier.AcceptVisitor(this, null);
1082
void WriteArraySpecifiers(IEnumerable<ArraySpecifier> arraySpecifiers)
1084
foreach (ArraySpecifier specifier in arraySpecifiers) {
1085
specifier.AcceptVisitor(this, null);
1089
void WriteQualifiedIdentifier(IEnumerable<Identifier> identifiers)
1092
foreach (Identifier ident in identifiers) {
1095
if (lastWritten == LastWritten.KeywordOrIdentifier)
1098
WriteSpecialsUpToRole(AstNode.Roles.Dot, ident);
1099
formatter.WriteToken(".");
1100
lastWritten = LastWritten.Other;
1102
WriteSpecialsUpToNode(ident);
1103
formatter.WriteIdentifier(ident.Name);
1104
lastWritten = LastWritten.KeywordOrIdentifier;
1108
void WriteEmbeddedStatement(Statement embeddedStatement)
1110
if (embeddedStatement.IsNull)
1112
BlockStatement block = embeddedStatement as BlockStatement;
1114
VisitBlockStatement(block, null);
1116
embeddedStatement.AcceptVisitor(this, null);
1119
void WriteBlock(BlockStatement body)
1124
VisitBlockStatement(body, null);
1127
void WriteMembers(IEnumerable<AstNode> members)
1130
bool isFirst = true;
1131
foreach (var member in members) {
1137
member.AcceptVisitor(this, null);
1142
void WriteAttributes(IEnumerable<AttributeBlock> attributes)
1144
foreach (AttributeBlock attr in attributes) {
1145
attr.AcceptVisitor(this, null);
1149
void WritePrivateImplementationType(AstType privateImplementationType)
1151
if (!privateImplementationType.IsNull) {
1152
privateImplementationType.AcceptVisitor(this, null);
1153
WriteToken(".", AstNode.Roles.Dot);
1157
void WriteImplementsClause(AstNodeCollection<InterfaceMemberSpecifier> implementsClause)
1159
if (implementsClause.Any()) {
1161
WriteKeyword("Implements");
1162
WriteCommaSeparatedList(implementsClause);
1166
void WriteImplementsClause(AstNodeCollection<AstType> implementsClause)
1168
if (implementsClause.Any()) {
1169
WriteKeyword("Implements");
1170
WriteCommaSeparatedList(implementsClause);
1174
void WriteHandlesClause(AstNodeCollection<EventMemberSpecifier> handlesClause)
1176
if (handlesClause.Any()) {
1178
WriteKeyword("Handles");
1179
WriteCommaSeparatedList(handlesClause);
1183
void WritePrimitiveValue(object val)
1186
WriteKeyword("Nothing");
1192
WriteKeyword("True");
1194
WriteKeyword("False");
1199
if (val is string) {
1200
formatter.WriteToken("\"" + ConvertString(val.ToString()) + "\"");
1201
lastWritten = LastWritten.Other;
1202
} else if (val is char) {
1203
formatter.WriteToken("\"" + ConvertCharLiteral((char)val) + "\"c");
1204
lastWritten = LastWritten.Other;
1205
} else if (val is decimal) {
1206
formatter.WriteToken(((decimal)val).ToString(NumberFormatInfo.InvariantInfo) + "D");
1207
lastWritten = LastWritten.Other;
1208
} else if (val is float) {
1209
float f = (float)val;
1210
if (float.IsInfinity(f) || float.IsNaN(f)) {
1211
// Strictly speaking, these aren't PrimitiveExpressions;
1212
// but we still support writing these to make life easier for code generators.
1213
WriteKeyword("Single");
1214
WriteToken(".", AstNode.Roles.Dot);
1215
if (float.IsPositiveInfinity(f))
1216
WriteIdentifier("PositiveInfinity");
1217
else if (float.IsNegativeInfinity(f))
1218
WriteIdentifier("NegativeInfinity");
1220
WriteIdentifier("NaN");
1223
formatter.WriteToken(f.ToString("R", NumberFormatInfo.InvariantInfo) + "F");
1224
lastWritten = LastWritten.Other;
1225
} else if (val is double) {
1226
double f = (double)val;
1227
if (double.IsInfinity(f) || double.IsNaN(f)) {
1228
// Strictly speaking, these aren't PrimitiveExpressions;
1229
// but we still support writing these to make life easier for code generators.
1230
WriteKeyword("Double");
1231
WriteToken(".", AstNode.Roles.Dot);
1232
if (double.IsPositiveInfinity(f))
1233
WriteIdentifier("PositiveInfinity");
1234
else if (double.IsNegativeInfinity(f))
1235
WriteIdentifier("NegativeInfinity");
1237
WriteIdentifier("NaN");
1240
string number = f.ToString("R", NumberFormatInfo.InvariantInfo);
1241
if (number.IndexOf('.') < 0 && number.IndexOf('E') < 0)
1243
formatter.WriteToken(number);
1244
// needs space if identifier follows number; this avoids mistaking the following identifier as type suffix
1245
lastWritten = LastWritten.KeywordOrIdentifier;
1246
} else if (val is IFormattable) {
1247
StringBuilder b = new StringBuilder();
1248
// if (primitiveExpression.LiteralFormat == LiteralFormat.HexadecimalNumber) {
1250
// b.Append(((IFormattable)val).ToString("x", NumberFormatInfo.InvariantInfo));
1252
b.Append(((IFormattable)val).ToString(null, NumberFormatInfo.InvariantInfo));
1254
if (val is uint || val is ulong) {
1257
if (val is long || val is ulong) {
1260
formatter.WriteToken(b.ToString());
1261
// needs space if identifier follows number; this avoids mistaking the following identifier as type suffix
1262
lastWritten = LastWritten.KeywordOrIdentifier;
1264
formatter.WriteToken(val.ToString());
1265
lastWritten = LastWritten.Other;
1270
#region ConvertLiteral
1271
static string ConvertCharLiteral(char ch)
1273
if (ch == '"') return "\"\"";
1274
return ch.ToString();
1277
static string ConvertString(string str)
1279
StringBuilder sb = new StringBuilder();
1280
foreach (char ch in str) {
1281
sb.Append(ConvertCharLiteral(ch));
1283
return sb.ToString();
1287
public object VisitVariableIdentifier(VariableIdentifier variableIdentifier, object data)
1289
StartNode(variableIdentifier);
1291
WriteIdentifier(variableIdentifier.Name.Name);
1292
if (variableIdentifier.HasNullableSpecifier)
1293
WriteToken("?", VariableIdentifier.Roles.QuestionMark);
1294
WriteArraySpecifiers(variableIdentifier.ArraySpecifiers);
1296
return EndNode(variableIdentifier);
1299
public object VisitAccessor(Accessor accessor, object data)
1301
StartNode(accessor);
1302
WriteAttributes(accessor.Attributes);
1303
WriteModifiers(accessor.ModifierTokens);
1304
if (accessor.Role == PropertyDeclaration.GetterRole) {
1305
WriteKeyword("Get");
1306
} else if (accessor.Role == PropertyDeclaration.SetterRole) {
1307
WriteKeyword("Set");
1308
} else if (accessor.Role == EventDeclaration.AddHandlerRole) {
1309
WriteKeyword("AddHandler");
1310
} else if (accessor.Role == EventDeclaration.RemoveHandlerRole) {
1311
WriteKeyword("RemoveHandler");
1312
} else if (accessor.Role == EventDeclaration.RaiseEventRole) {
1313
WriteKeyword("RaiseEvent");
1315
if (accessor.Parameters.Any())
1316
WriteCommaSeparatedListInParenthesis(accessor.Parameters, false);
1319
WriteBlock(accessor.Body);
1321
WriteKeyword("End");
1323
if (accessor.Role == PropertyDeclaration.GetterRole) {
1324
WriteKeyword("Get");
1325
} else if (accessor.Role == PropertyDeclaration.SetterRole) {
1326
WriteKeyword("Set");
1327
} else if (accessor.Role == EventDeclaration.AddHandlerRole) {
1328
WriteKeyword("AddHandler");
1329
} else if (accessor.Role == EventDeclaration.RemoveHandlerRole) {
1330
WriteKeyword("RemoveHandler");
1331
} else if (accessor.Role == EventDeclaration.RaiseEventRole) {
1332
WriteKeyword("RaiseEvent");
1336
return EndNode(accessor);
1340
public object VisitLabelDeclarationStatement(LabelDeclarationStatement labelDeclarationStatement, object data)
1342
StartNode(labelDeclarationStatement);
1344
labelDeclarationStatement.Label.AcceptVisitor(this, data);
1345
WriteToken(":", LabelDeclarationStatement.Roles.Colon);
1347
return EndNode(labelDeclarationStatement);
1350
public object VisitLocalDeclarationStatement(LocalDeclarationStatement localDeclarationStatement, object data)
1352
StartNode(localDeclarationStatement);
1354
if (localDeclarationStatement.ModifierToken != null && !localDeclarationStatement.ModifierToken.IsNull)
1355
WriteModifiers(new [] { localDeclarationStatement.ModifierToken });
1356
WriteCommaSeparatedList(localDeclarationStatement.Variables);
1358
return EndNode(localDeclarationStatement);
1361
public object VisitWithStatement(WithStatement withStatement, object data)
1363
StartNode(withStatement);
1364
WriteKeyword("With");
1365
withStatement.Expression.AcceptVisitor(this, data);
1368
withStatement.Body.AcceptVisitor(this, data);
1370
WriteKeyword("End");
1371
WriteKeyword("With");
1372
return EndNode(withStatement);
1375
public object VisitSyncLockStatement(SyncLockStatement syncLockStatement, object data)
1377
StartNode(syncLockStatement);
1378
WriteKeyword("SyncLock");
1379
syncLockStatement.Expression.AcceptVisitor(this, data);
1382
syncLockStatement.Body.AcceptVisitor(this, data);
1384
WriteKeyword("End");
1385
WriteKeyword("SyncLock");
1386
return EndNode(syncLockStatement);
1389
public object VisitTryStatement(TryStatement tryStatement, object data)
1391
StartNode(tryStatement);
1392
WriteKeyword("Try");
1395
tryStatement.Body.AcceptVisitor(this, data);
1397
foreach (var clause in tryStatement.CatchBlocks) {
1398
clause.AcceptVisitor(this, data);
1400
if (!tryStatement.FinallyBlock.IsNull) {
1401
WriteKeyword("Finally");
1404
tryStatement.FinallyBlock.AcceptVisitor(this, data);
1407
WriteKeyword("End");
1408
WriteKeyword("Try");
1409
return EndNode(tryStatement);
1412
public object VisitCatchBlock(CatchBlock catchBlock, object data)
1414
StartNode(catchBlock);
1415
WriteKeyword("Catch");
1416
catchBlock.ExceptionVariable.AcceptVisitor(this, data);
1417
if (!catchBlock.ExceptionType.IsNull) {
1419
catchBlock.ExceptionType.AcceptVisitor(this, data);
1423
foreach (var stmt in catchBlock) {
1424
stmt.AcceptVisitor(this, data);
1428
return EndNode(catchBlock);
1431
public object VisitExpressionStatement(ExpressionStatement expressionStatement, object data)
1433
StartNode(expressionStatement);
1434
expressionStatement.Expression.AcceptVisitor(this, data);
1435
return EndNode(expressionStatement);
1438
public object VisitThrowStatement(ThrowStatement throwStatement, object data)
1440
StartNode(throwStatement);
1442
WriteKeyword("Throw");
1443
throwStatement.Expression.AcceptVisitor(this, data);
1445
return EndNode(throwStatement);
1448
public object VisitIfElseStatement(IfElseStatement ifElseStatement, object data)
1450
StartNode(ifElseStatement);
1452
ifElseStatement.Condition.AcceptVisitor(this, data);
1454
WriteKeyword("Then");
1457
ifElseStatement.Body.AcceptVisitor(this, data);
1459
if (!ifElseStatement.ElseBlock.IsNull) {
1460
WriteKeyword("Else");
1463
ifElseStatement.ElseBlock.AcceptVisitor(this, data);
1466
WriteKeyword("End");
1468
return EndNode(ifElseStatement);
1471
public object VisitReturnStatement(ReturnStatement returnStatement, object data)
1473
StartNode(returnStatement);
1474
WriteKeyword("Return");
1475
returnStatement.Expression.AcceptVisitor(this, data);
1476
return EndNode(returnStatement);
1479
public object VisitBinaryOperatorExpression(BinaryOperatorExpression binaryOperatorExpression, object data)
1481
StartNode(binaryOperatorExpression);
1482
binaryOperatorExpression.Left.AcceptVisitor(this, data);
1484
switch (binaryOperatorExpression.Operator) {
1485
case BinaryOperatorType.BitwiseAnd:
1486
WriteKeyword("And");
1488
case BinaryOperatorType.BitwiseOr:
1491
case BinaryOperatorType.LogicalAnd:
1492
WriteKeyword("AndAlso");
1494
case BinaryOperatorType.LogicalOr:
1495
WriteKeyword("OrElse");
1497
case BinaryOperatorType.ExclusiveOr:
1498
WriteKeyword("Xor");
1500
case BinaryOperatorType.GreaterThan:
1501
WriteToken(">", BinaryOperatorExpression.OperatorRole);
1503
case BinaryOperatorType.GreaterThanOrEqual:
1504
WriteToken(">=", BinaryOperatorExpression.OperatorRole);
1506
case BinaryOperatorType.Equality:
1507
WriteToken("=", BinaryOperatorExpression.OperatorRole);
1509
case BinaryOperatorType.InEquality:
1510
WriteToken("<>", BinaryOperatorExpression.OperatorRole);
1512
case BinaryOperatorType.LessThan:
1513
WriteToken("<", BinaryOperatorExpression.OperatorRole);
1515
case BinaryOperatorType.LessThanOrEqual:
1516
WriteToken("<=", BinaryOperatorExpression.OperatorRole);
1518
case BinaryOperatorType.Add:
1519
WriteToken("+", BinaryOperatorExpression.OperatorRole);
1521
case BinaryOperatorType.Subtract:
1522
WriteToken("-", BinaryOperatorExpression.OperatorRole);
1524
case BinaryOperatorType.Multiply:
1525
WriteToken("*", BinaryOperatorExpression.OperatorRole);
1527
case BinaryOperatorType.Divide:
1528
WriteToken("/", BinaryOperatorExpression.OperatorRole);
1530
case BinaryOperatorType.Modulus:
1531
WriteKeyword("Mod");
1533
case BinaryOperatorType.DivideInteger:
1534
WriteToken("\\", BinaryOperatorExpression.OperatorRole);
1536
case BinaryOperatorType.Power:
1537
WriteToken("*", BinaryOperatorExpression.OperatorRole);
1539
case BinaryOperatorType.Concat:
1540
WriteToken("&", BinaryOperatorExpression.OperatorRole);
1542
case BinaryOperatorType.ShiftLeft:
1543
WriteToken("<<", BinaryOperatorExpression.OperatorRole);
1545
case BinaryOperatorType.ShiftRight:
1546
WriteToken(">>", BinaryOperatorExpression.OperatorRole);
1548
case BinaryOperatorType.ReferenceEquality:
1551
case BinaryOperatorType.ReferenceInequality:
1552
WriteKeyword("IsNot");
1554
case BinaryOperatorType.Like:
1555
WriteKeyword("Like");
1557
case BinaryOperatorType.DictionaryAccess:
1558
WriteToken("!", BinaryOperatorExpression.OperatorRole);
1561
throw new Exception("Invalid value for BinaryOperatorType: " + binaryOperatorExpression.Operator);
1564
binaryOperatorExpression.Right.AcceptVisitor(this, data);
1565
return EndNode(binaryOperatorExpression);
1568
public object VisitIdentifierExpression(IdentifierExpression identifierExpression, object data)
1570
StartNode(identifierExpression);
1571
identifierExpression.Identifier.AcceptVisitor(this, data);
1572
WriteTypeArguments(identifierExpression.TypeArguments);
1573
return EndNode(identifierExpression);
1576
public object VisitAssignmentExpression(AssignmentExpression assignmentExpression, object data)
1578
StartNode(assignmentExpression);
1579
assignmentExpression.Left.AcceptVisitor(this, data);
1581
switch (assignmentExpression.Operator) {
1582
case AssignmentOperatorType.Assign:
1583
WriteToken("=", AssignmentExpression.OperatorRole);
1585
case AssignmentOperatorType.Add:
1586
WriteToken("+=", AssignmentExpression.OperatorRole);
1588
case AssignmentOperatorType.Subtract:
1589
WriteToken("-=", AssignmentExpression.OperatorRole);
1591
case AssignmentOperatorType.Multiply:
1592
WriteToken("*=", AssignmentExpression.OperatorRole);
1594
case AssignmentOperatorType.Divide:
1595
WriteToken("/=", AssignmentExpression.OperatorRole);
1597
case AssignmentOperatorType.Power:
1598
WriteToken("^=", AssignmentExpression.OperatorRole);
1600
case AssignmentOperatorType.DivideInteger:
1601
WriteToken("\\=", AssignmentExpression.OperatorRole);
1603
case AssignmentOperatorType.ConcatString:
1604
WriteToken("&=", AssignmentExpression.OperatorRole);
1606
case AssignmentOperatorType.ShiftLeft:
1607
WriteToken("<<=", AssignmentExpression.OperatorRole);
1609
case AssignmentOperatorType.ShiftRight:
1610
WriteToken(">>=", AssignmentExpression.OperatorRole);
1613
throw new Exception("Invalid value for AssignmentOperatorType: " + assignmentExpression.Operator);
1616
assignmentExpression.Right.AcceptVisitor(this, data);
1617
return EndNode(assignmentExpression);
1620
public object VisitInvocationExpression(InvocationExpression invocationExpression, object data)
1622
StartNode(invocationExpression);
1623
invocationExpression.Target.AcceptVisitor(this, data);
1624
WriteCommaSeparatedListInParenthesis(invocationExpression.Arguments, false);
1625
return EndNode(invocationExpression);
1628
public object VisitArrayInitializerExpression(ArrayInitializerExpression arrayInitializerExpression, object data)
1630
StartNode(arrayInitializerExpression);
1631
WriteToken("{", ArrayInitializerExpression.Roles.LBrace);
1633
WriteCommaSeparatedList(arrayInitializerExpression.Elements);
1635
WriteToken("}", ArrayInitializerExpression.Roles.RBrace);
1636
return EndNode(arrayInitializerExpression);
1639
public object VisitArrayCreateExpression(ArrayCreateExpression arrayCreateExpression, object data)
1641
StartNode(arrayCreateExpression);
1642
WriteKeyword("New");
1644
arrayCreateExpression.Type.AcceptVisitor(this, data);
1645
WriteCommaSeparatedListInParenthesis(arrayCreateExpression.Arguments, false);
1646
foreach (var specifier in arrayCreateExpression.AdditionalArraySpecifiers) {
1647
specifier.AcceptVisitor(this, data);
1649
if (!arrayCreateExpression.Initializer.IsNull) {
1651
WriteToken("=", ArrayCreateExpression.Roles.Assign);
1653
arrayCreateExpression.Initializer.AcceptVisitor(this, data);
1655
return EndNode(arrayCreateExpression);
1658
public object VisitObjectCreationExpression(ObjectCreationExpression objectCreationExpression, object data)
1660
StartNode(objectCreationExpression);
1662
WriteKeyword("New");
1663
objectCreationExpression.Type.AcceptVisitor(this, data);
1664
WriteCommaSeparatedListInParenthesis(objectCreationExpression.Arguments, false);
1665
if (!objectCreationExpression.Initializer.IsNull) {
1667
if (objectCreationExpression.Initializer.Elements.Any(x => x is FieldInitializerExpression))
1668
WriteKeyword("With");
1670
WriteKeyword("From");
1672
objectCreationExpression.Initializer.AcceptVisitor(this, data);
1675
return EndNode(objectCreationExpression);
1678
public object VisitCastExpression(CastExpression castExpression, object data)
1680
StartNode(castExpression);
1682
switch (castExpression.CastType) {
1683
case CastType.DirectCast:
1684
WriteKeyword("DirectCast");
1686
case CastType.TryCast:
1687
WriteKeyword("TryCast");
1689
case CastType.CType:
1690
WriteKeyword("CType");
1692
case CastType.CBool:
1693
WriteKeyword("CBool");
1695
case CastType.CByte:
1696
WriteKeyword("CByte");
1698
case CastType.CChar:
1699
WriteKeyword("CChar");
1701
case CastType.CDate:
1702
WriteKeyword("CDate");
1705
WriteKeyword("CType");
1708
WriteKeyword("CDec");
1711
WriteKeyword("CInt");
1714
WriteKeyword("CLng");
1717
WriteKeyword("CObj");
1719
case CastType.CSByte:
1720
WriteKeyword("CSByte");
1722
case CastType.CShort:
1723
WriteKeyword("CShort");
1726
WriteKeyword("CSng");
1729
WriteKeyword("CStr");
1731
case CastType.CUInt:
1732
WriteKeyword("CUInt");
1734
case CastType.CULng:
1735
WriteKeyword("CULng");
1737
case CastType.CUShort:
1738
WriteKeyword("CUShort");
1741
throw new Exception("Invalid value for CastType");
1744
WriteToken("(", CastExpression.Roles.LPar);
1745
castExpression.Expression.AcceptVisitor(this, data);
1747
if (castExpression.CastType == CastType.CType ||
1748
castExpression.CastType == CastType.DirectCast ||
1749
castExpression.CastType == CastType.TryCast) {
1750
WriteToken(",", CastExpression.Roles.Comma);
1752
castExpression.Type.AcceptVisitor(this, data);
1755
WriteToken(")", CastExpression.Roles.RPar);
1757
return EndNode(castExpression);
1760
public object VisitComment(Comment comment, object data)
1762
formatter.WriteComment(comment.IsDocumentationComment, comment.Content);
1766
public object VisitEventDeclaration(EventDeclaration eventDeclaration, object data)
1768
StartNode(eventDeclaration);
1770
WriteAttributes(eventDeclaration.Attributes);
1771
WriteModifiers(eventDeclaration.ModifierTokens);
1772
if (eventDeclaration.IsCustom)
1773
WriteKeyword("Custom");
1774
WriteKeyword("Event");
1775
WriteIdentifier(eventDeclaration.Name.Name);
1776
if (!eventDeclaration.IsCustom && eventDeclaration.ReturnType.IsNull)
1777
WriteCommaSeparatedListInParenthesis(eventDeclaration.Parameters, false);
1778
if (!eventDeclaration.ReturnType.IsNull) {
1781
eventDeclaration.ReturnType.AcceptVisitor(this, data);
1783
WriteImplementsClause(eventDeclaration.ImplementsClause);
1785
if (eventDeclaration.IsCustom) {
1790
eventDeclaration.AddHandlerBlock.AcceptVisitor(this, data);
1791
eventDeclaration.RemoveHandlerBlock.AcceptVisitor(this, data);
1792
eventDeclaration.RaiseEventBlock.AcceptVisitor(this, data);
1795
WriteKeyword("End");
1796
WriteKeyword("Event");
1801
return EndNode(eventDeclaration);
1804
public object VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression, object data)
1806
StartNode(unaryOperatorExpression);
1808
switch (unaryOperatorExpression.Operator) {
1809
case UnaryOperatorType.Not:
1810
WriteKeyword("Not");
1812
case UnaryOperatorType.Minus:
1813
WriteToken("-", UnaryOperatorExpression.OperatorRole);
1815
case UnaryOperatorType.Plus:
1816
WriteToken("+", UnaryOperatorExpression.OperatorRole);
1818
case UnaryOperatorType.AddressOf:
1819
WriteKeyword("AddressOf");
1821
case UnaryOperatorType.Await:
1822
WriteKeyword("Await");
1825
throw new Exception("Invalid value for UnaryOperatorType");
1828
unaryOperatorExpression.Expression.AcceptVisitor(this, data);
1830
return EndNode(unaryOperatorExpression);
1833
public object VisitFieldInitializerExpression(FieldInitializerExpression fieldInitializerExpression, object data)
1835
StartNode(fieldInitializerExpression);
1837
if (fieldInitializerExpression.IsKey && fieldInitializerExpression.Parent is AnonymousObjectCreationExpression) {
1838
WriteKeyword("Key");
1842
WriteToken(".", FieldInitializerExpression.Roles.Dot);
1843
fieldInitializerExpression.Identifier.AcceptVisitor(this, data);
1846
WriteToken("=", FieldInitializerExpression.Roles.Assign);
1848
fieldInitializerExpression.Expression.AcceptVisitor(this, data);
1850
return EndNode(fieldInitializerExpression);
1853
public object VisitNamedArgumentExpression(NamedArgumentExpression namedArgumentExpression, object data)
1855
throw new NotImplementedException();
1858
public object VisitConditionalExpression(ConditionalExpression conditionalExpression, object data)
1860
StartNode(conditionalExpression);
1863
WriteToken("(", ConditionalExpression.Roles.LPar);
1865
conditionalExpression.ConditionExpression.AcceptVisitor(this, data);
1866
WriteToken(",", ConditionalExpression.Roles.Comma);
1869
if (!conditionalExpression.TrueExpression.IsNull) {
1870
conditionalExpression.TrueExpression.AcceptVisitor(this, data);
1871
WriteToken(",", ConditionalExpression.Roles.Comma);
1875
conditionalExpression.FalseExpression.AcceptVisitor(this, data);
1877
WriteToken(")", ConditionalExpression.Roles.RPar);
1879
return EndNode(conditionalExpression);
1882
public object VisitWhileStatement(WhileStatement whileStatement, object data)
1884
StartNode(whileStatement);
1886
WriteKeyword("While");
1888
whileStatement.Condition.AcceptVisitor(this, data);
1891
whileStatement.Body.AcceptVisitor(this, data);
1893
WriteKeyword("End");
1894
WriteKeyword("While");
1896
return EndNode(whileStatement);
1899
public object VisitExitStatement(ExitStatement exitStatement, object data)
1901
StartNode(exitStatement);
1903
WriteKeyword("Exit");
1905
switch (exitStatement.ExitKind) {
1907
WriteKeyword("Sub");
1909
case ExitKind.Function:
1910
WriteKeyword("Function");
1912
case ExitKind.Property:
1913
WriteKeyword("Property");
1919
WriteKeyword("For");
1921
case ExitKind.While:
1922
WriteKeyword("While");
1924
case ExitKind.Select:
1925
WriteKeyword("Select");
1928
WriteKeyword("Try");
1931
throw new Exception("Invalid value for ExitKind");
1934
return EndNode(exitStatement);
1937
public object VisitForStatement(ForStatement forStatement, object data)
1939
StartNode(forStatement);
1941
WriteKeyword("For");
1942
forStatement.Variable.AcceptVisitor(this, data);
1944
forStatement.ToExpression.AcceptVisitor(this, data);
1945
if (!forStatement.StepExpression.IsNull) {
1946
WriteKeyword("Step");
1948
forStatement.StepExpression.AcceptVisitor(this, data);
1952
forStatement.Body.AcceptVisitor(this, data);
1954
WriteKeyword("Next");
1956
return EndNode(forStatement);
1959
public object VisitForEachStatement(ForEachStatement forEachStatement, object data)
1961
StartNode(forEachStatement);
1963
WriteKeyword("For");
1964
WriteKeyword("Each");
1965
forEachStatement.Variable.AcceptVisitor(this, data);
1968
forEachStatement.InExpression.AcceptVisitor(this, data);
1971
forEachStatement.Body.AcceptVisitor(this, data);
1973
WriteKeyword("Next");
1975
return EndNode(forEachStatement);
1978
public object VisitOperatorDeclaration(OperatorDeclaration operatorDeclaration, object data)
1980
StartNode(operatorDeclaration);
1982
WriteAttributes(operatorDeclaration.Attributes);
1983
WriteModifiers(operatorDeclaration.ModifierTokens);
1984
WriteKeyword("Operator");
1985
switch (operatorDeclaration.Operator) {
1986
case OverloadableOperatorType.Add:
1987
case OverloadableOperatorType.UnaryPlus:
1988
WriteToken("+", OperatorDeclaration.Roles.Keyword);
1990
case OverloadableOperatorType.Subtract:
1991
case OverloadableOperatorType.UnaryMinus:
1992
WriteToken("-", OperatorDeclaration.Roles.Keyword);
1994
case OverloadableOperatorType.Multiply:
1995
WriteToken("*", OperatorDeclaration.Roles.Keyword);
1997
case OverloadableOperatorType.Divide:
1998
WriteToken("/", OperatorDeclaration.Roles.Keyword);
2000
case OverloadableOperatorType.Modulus:
2001
WriteKeyword("Mod");
2003
case OverloadableOperatorType.Concat:
2004
WriteToken("&", OperatorDeclaration.Roles.Keyword);
2006
case OverloadableOperatorType.Not:
2007
WriteKeyword("Not");
2009
case OverloadableOperatorType.BitwiseAnd:
2010
WriteKeyword("And");
2012
case OverloadableOperatorType.BitwiseOr:
2015
case OverloadableOperatorType.ExclusiveOr:
2016
WriteKeyword("Xor");
2018
case OverloadableOperatorType.ShiftLeft:
2019
WriteToken("<<", OperatorDeclaration.Roles.Keyword);
2021
case OverloadableOperatorType.ShiftRight:
2022
WriteToken(">>", OperatorDeclaration.Roles.Keyword);
2024
case OverloadableOperatorType.GreaterThan:
2025
WriteToken(">", OperatorDeclaration.Roles.Keyword);
2027
case OverloadableOperatorType.GreaterThanOrEqual:
2028
WriteToken(">=", OperatorDeclaration.Roles.Keyword);
2030
case OverloadableOperatorType.Equality:
2031
WriteToken("=", OperatorDeclaration.Roles.Keyword);
2033
case OverloadableOperatorType.InEquality:
2034
WriteToken("<>", OperatorDeclaration.Roles.Keyword);
2036
case OverloadableOperatorType.LessThan:
2037
WriteToken("<", OperatorDeclaration.Roles.Keyword);
2039
case OverloadableOperatorType.LessThanOrEqual:
2040
WriteToken("<=", OperatorDeclaration.Roles.Keyword);
2042
case OverloadableOperatorType.IsTrue:
2043
WriteKeyword("IsTrue");
2045
case OverloadableOperatorType.IsFalse:
2046
WriteKeyword("IsFalse");
2048
case OverloadableOperatorType.Like:
2049
WriteKeyword("Like");
2051
case OverloadableOperatorType.Power:
2052
WriteToken("^", OperatorDeclaration.Roles.Keyword);
2054
case OverloadableOperatorType.CType:
2055
WriteKeyword("CType");
2057
case OverloadableOperatorType.DivideInteger:
2058
WriteToken("\\", OperatorDeclaration.Roles.Keyword);
2061
throw new Exception("Invalid value for OverloadableOperatorType");
2063
WriteCommaSeparatedListInParenthesis(operatorDeclaration.Parameters, false);
2064
if (!operatorDeclaration.ReturnType.IsNull) {
2067
WriteAttributes(operatorDeclaration.ReturnTypeAttributes);
2068
operatorDeclaration.ReturnType.AcceptVisitor(this, data);
2070
if (!operatorDeclaration.Body.IsNull) {
2074
WriteBlock(operatorDeclaration.Body);
2076
WriteKeyword("End");
2077
WriteKeyword("Operator");
2082
return EndNode(operatorDeclaration);
2085
public object VisitSelectStatement(SelectStatement selectStatement, object data)
2087
StartNode(selectStatement);
2089
WriteKeyword("Select");
2090
WriteKeyword("Case");
2091
selectStatement.Expression.AcceptVisitor(this, data);
2095
foreach (CaseStatement stmt in selectStatement.Cases) {
2096
stmt.AcceptVisitor(this, data);
2100
WriteKeyword("End");
2101
WriteKeyword("Select");
2103
return EndNode(selectStatement);
2106
public object VisitCaseStatement(CaseStatement caseStatement, object data)
2108
StartNode(caseStatement);
2110
WriteKeyword("Case");
2111
if (caseStatement.Clauses.Count == 1 && caseStatement.Clauses.First().Expression.IsNull)
2112
WriteKeyword("Else");
2115
WriteCommaSeparatedList(caseStatement.Clauses);
2119
caseStatement.Body.AcceptVisitor(this, data);
2122
return EndNode(caseStatement);
2125
public object VisitSimpleCaseClause(SimpleCaseClause simpleCaseClause, object data)
2127
StartNode(simpleCaseClause);
2128
simpleCaseClause.Expression.AcceptVisitor(this, data);
2129
return EndNode(simpleCaseClause);
2132
public object VisitRangeCaseClause(RangeCaseClause rangeCaseClause, object data)
2134
StartNode(rangeCaseClause);
2135
rangeCaseClause.Expression.AcceptVisitor(this, data);
2137
rangeCaseClause.ToExpression.AcceptVisitor(this, data);
2138
return EndNode(rangeCaseClause);
2141
public object VisitComparisonCaseClause(ComparisonCaseClause comparisonCaseClause, object data)
2143
StartNode(comparisonCaseClause);
2144
switch (comparisonCaseClause.Operator) {
2145
case ComparisonOperator.Equality:
2146
WriteToken("=", ComparisonCaseClause.OperatorRole);
2148
case ComparisonOperator.InEquality:
2149
WriteToken("<>", ComparisonCaseClause.OperatorRole);
2151
case ComparisonOperator.LessThan:
2152
WriteToken("<", ComparisonCaseClause.OperatorRole);
2154
case ComparisonOperator.GreaterThan:
2155
WriteToken(">", ComparisonCaseClause.OperatorRole);
2157
case ComparisonOperator.LessThanOrEqual:
2158
WriteToken("<=", ComparisonCaseClause.OperatorRole);
2160
case ComparisonOperator.GreaterThanOrEqual:
2161
WriteToken(">=", ComparisonCaseClause.OperatorRole);
2164
throw new Exception("Invalid value for ComparisonOperator");
2167
comparisonCaseClause.Expression.AcceptVisitor(this, data);
2168
return EndNode(comparisonCaseClause);
2172
public object VisitYieldStatement(YieldStatement yieldStatement, object data)
2174
StartNode(yieldStatement);
2175
WriteKeyword("Yield");
2176
yieldStatement.Expression.AcceptVisitor(this, data);
2177
return EndNode(yieldStatement);
2180
public object VisitVariableInitializer(VariableInitializer variableInitializer, object data)
2182
StartNode(variableInitializer);
2184
variableInitializer.Identifier.AcceptVisitor(this, data);
2185
if (!variableInitializer.Type.IsNull) {
2187
variableInitializer.Type.AcceptVisitor(this, data);
2189
if (!variableInitializer.Expression.IsNull) {
2191
WriteToken("=", VariableInitializer.Roles.Assign);
2193
variableInitializer.Expression.AcceptVisitor(this, data);
2196
return EndNode(variableInitializer);
2199
public object VisitVariableDeclaratorWithTypeAndInitializer(VariableDeclaratorWithTypeAndInitializer variableDeclaratorWithTypeAndInitializer, object data)
2201
StartNode(variableDeclaratorWithTypeAndInitializer);
2203
WriteCommaSeparatedList(variableDeclaratorWithTypeAndInitializer.Identifiers);
2205
variableDeclaratorWithTypeAndInitializer.Type.AcceptVisitor(this, data);
2206
if (!variableDeclaratorWithTypeAndInitializer.Initializer.IsNull) {
2208
WriteToken("=", VariableDeclarator.Roles.Assign);
2210
variableDeclaratorWithTypeAndInitializer.Initializer.AcceptVisitor(this, data);
2213
return EndNode(variableDeclaratorWithTypeAndInitializer);
2216
public object VisitVariableDeclaratorWithObjectCreation(VariableDeclaratorWithObjectCreation variableDeclaratorWithObjectCreation, object data)
2218
StartNode(variableDeclaratorWithObjectCreation);
2220
WriteCommaSeparatedList(variableDeclaratorWithObjectCreation.Identifiers);
2222
variableDeclaratorWithObjectCreation.Initializer.AcceptVisitor(this, data);
2224
return EndNode(variableDeclaratorWithObjectCreation);
2227
public object VisitDoLoopStatement(DoLoopStatement doLoopStatement, object data)
2229
StartNode(doLoopStatement);
2232
if (doLoopStatement.ConditionType == ConditionType.DoUntil) {
2233
WriteKeyword("Until");
2234
doLoopStatement.Expression.AcceptVisitor(this, data);
2236
if (doLoopStatement.ConditionType == ConditionType.DoWhile) {
2237
WriteKeyword("While");
2238
doLoopStatement.Expression.AcceptVisitor(this, data);
2242
doLoopStatement.Body.AcceptVisitor(this, data);
2244
WriteKeyword("Loop");
2245
if (doLoopStatement.ConditionType == ConditionType.LoopUntil) {
2246
WriteKeyword("Until");
2247
doLoopStatement.Expression.AcceptVisitor(this, data);
2249
if (doLoopStatement.ConditionType == ConditionType.LoopWhile) {
2250
WriteKeyword("While");
2251
doLoopStatement.Expression.AcceptVisitor(this, data);
2254
return EndNode(doLoopStatement);
2257
public object VisitUsingStatement(UsingStatement usingStatement, object data)
2259
StartNode(usingStatement);
2261
WriteKeyword("Using");
2262
WriteCommaSeparatedList(usingStatement.Resources);
2265
usingStatement.Body.AcceptVisitor(this, data);
2267
WriteKeyword("End");
2268
WriteKeyword("Using");
2270
return EndNode(usingStatement);
2273
public object VisitGoToStatement(GoToStatement goToStatement, object data)
2275
StartNode(goToStatement);
2277
WriteKeyword("GoTo");
2278
goToStatement.Label.AcceptVisitor(this, data);
2280
return EndNode(goToStatement);
2283
public object VisitSingleLineSubLambdaExpression(SingleLineSubLambdaExpression singleLineSubLambdaExpression, object data)
2285
StartNode(singleLineSubLambdaExpression);
2287
WriteModifiers(singleLineSubLambdaExpression.ModifierTokens);
2288
WriteKeyword("Sub");
2289
WriteCommaSeparatedListInParenthesis(singleLineSubLambdaExpression.Parameters, false);
2291
singleLineSubLambdaExpression.EmbeddedStatement.AcceptVisitor(this, data);
2293
return EndNode(singleLineSubLambdaExpression);
2296
public object VisitSingleLineFunctionLambdaExpression(SingleLineFunctionLambdaExpression singleLineFunctionLambdaExpression, object data)
2298
StartNode(singleLineFunctionLambdaExpression);
2300
WriteModifiers(singleLineFunctionLambdaExpression.ModifierTokens);
2301
WriteKeyword("Function");
2302
WriteCommaSeparatedListInParenthesis(singleLineFunctionLambdaExpression.Parameters, false);
2304
singleLineFunctionLambdaExpression.EmbeddedExpression.AcceptVisitor(this, data);
2306
return EndNode(singleLineFunctionLambdaExpression);
2309
public object VisitMultiLineLambdaExpression(MultiLineLambdaExpression multiLineLambdaExpression, object data)
2311
StartNode(multiLineLambdaExpression);
2313
WriteModifiers(multiLineLambdaExpression.ModifierTokens);
2314
if (multiLineLambdaExpression.IsSub)
2315
WriteKeyword("Sub");
2317
WriteKeyword("Function");
2318
WriteCommaSeparatedListInParenthesis(multiLineLambdaExpression.Parameters, false);
2321
multiLineLambdaExpression.Body.AcceptVisitor(this, data);
2323
WriteKeyword("End");
2324
if (multiLineLambdaExpression.IsSub)
2325
WriteKeyword("Sub");
2327
WriteKeyword("Function");
2329
return EndNode(multiLineLambdaExpression);
2332
public object VisitQueryExpression(QueryExpression queryExpression, object data)
2334
StartNode(queryExpression);
2336
foreach (var op in queryExpression.QueryOperators) {
2337
op.AcceptVisitor(this, data);
2340
return EndNode(queryExpression);
2343
public object VisitContinueStatement(ContinueStatement continueStatement, object data)
2345
StartNode(continueStatement);
2347
WriteKeyword("Continue");
2349
switch (continueStatement.ContinueKind) {
2350
case ContinueKind.Do:
2353
case ContinueKind.For:
2354
WriteKeyword("For");
2356
case ContinueKind.While:
2357
WriteKeyword("While");
2360
throw new Exception("Invalid value for ContinueKind");
2363
return EndNode(continueStatement);
2366
public object VisitExternalMethodDeclaration(ExternalMethodDeclaration externalMethodDeclaration, object data)
2368
StartNode(externalMethodDeclaration);
2370
WriteAttributes(externalMethodDeclaration.Attributes);
2371
WriteModifiers(externalMethodDeclaration.ModifierTokens);
2372
WriteKeyword("Declare");
2373
switch (externalMethodDeclaration.CharsetModifier) {
2374
case CharsetModifier.None:
2376
case CharsetModifier.Auto:
2377
WriteKeyword("Auto");
2379
case CharsetModifier.Unicode:
2380
WriteKeyword("Unicode");
2382
case CharsetModifier.Ansi:
2383
WriteKeyword("Ansi");
2386
throw new Exception("Invalid value for CharsetModifier");
2388
if (externalMethodDeclaration.IsSub)
2389
WriteKeyword("Sub");
2391
WriteKeyword("Function");
2392
externalMethodDeclaration.Name.AcceptVisitor(this, data);
2393
WriteKeyword("Lib");
2395
WritePrimitiveValue(externalMethodDeclaration.Library);
2397
if (externalMethodDeclaration.Alias != null) {
2398
WriteKeyword("Alias");
2400
WritePrimitiveValue(externalMethodDeclaration.Alias);
2403
WriteCommaSeparatedListInParenthesis(externalMethodDeclaration.Parameters, false);
2404
if (!externalMethodDeclaration.IsSub && !externalMethodDeclaration.ReturnType.IsNull) {
2407
WriteAttributes(externalMethodDeclaration.ReturnTypeAttributes);
2408
externalMethodDeclaration.ReturnType.AcceptVisitor(this, data);
2412
return EndNode(externalMethodDeclaration);
2415
public static string ToVBNetString(PrimitiveExpression primitiveExpression)
2417
var writer = new StringWriter();
2418
new OutputVisitor(writer, new VBFormattingOptions()).WritePrimitiveValue(primitiveExpression.Value);
2419
return writer.ToString();
2422
public object VisitEmptyExpression(EmptyExpression emptyExpression, object data)
2424
StartNode(emptyExpression);
2426
return EndNode(emptyExpression);
2429
public object VisitAnonymousObjectCreationExpression(AnonymousObjectCreationExpression anonymousObjectCreationExpression, object data)
2431
StartNode(anonymousObjectCreationExpression);
2433
WriteKeyword("New");
2434
WriteKeyword("With");
2436
WriteToken("{", AnonymousObjectCreationExpression.Roles.LBrace);
2438
WriteCommaSeparatedList(anonymousObjectCreationExpression.Initializer);
2440
WriteToken("}", AnonymousObjectCreationExpression.Roles.RBrace);
2442
return EndNode(anonymousObjectCreationExpression);
2445
public object VisitCollectionRangeVariableDeclaration(CollectionRangeVariableDeclaration collectionRangeVariableDeclaration, object data)
2447
StartNode(collectionRangeVariableDeclaration);
2449
collectionRangeVariableDeclaration.Identifier.AcceptVisitor(this, data);
2450
if (!collectionRangeVariableDeclaration.Type.IsNull) {
2452
collectionRangeVariableDeclaration.Type.AcceptVisitor(this, data);
2455
collectionRangeVariableDeclaration.Expression.AcceptVisitor(this, data);
2457
return EndNode(collectionRangeVariableDeclaration);
2460
public object VisitFromQueryOperator(FromQueryOperator fromQueryOperator, object data)
2462
StartNode(fromQueryOperator);
2464
WriteKeyword("From");
2465
WriteCommaSeparatedList(fromQueryOperator.Variables);
2467
return EndNode(fromQueryOperator);
2470
public object VisitAggregateQueryOperator(AggregateQueryOperator aggregateQueryOperator, object data)
2472
StartNode(aggregateQueryOperator);
2474
WriteKeyword("Aggregate");
2475
aggregateQueryOperator.Variable.AcceptVisitor(this, data);
2477
foreach (var operators in aggregateQueryOperator.SubQueryOperators) {
2478
operators.AcceptVisitor(this, data);
2481
WriteKeyword("Into");
2482
WriteCommaSeparatedList(aggregateQueryOperator.IntoExpressions);
2484
return EndNode(aggregateQueryOperator);
2487
public object VisitSelectQueryOperator(SelectQueryOperator selectQueryOperator, object data)
2489
StartNode(selectQueryOperator);
2491
WriteKeyword("Select");
2492
WriteCommaSeparatedList(selectQueryOperator.Variables);
2494
return EndNode(selectQueryOperator);
2497
public object VisitDistinctQueryOperator(DistinctQueryOperator distinctQueryOperator, object data)
2499
StartNode(distinctQueryOperator);
2501
WriteKeyword("Distinct");
2503
return EndNode(distinctQueryOperator);
2506
public object VisitWhereQueryOperator(WhereQueryOperator whereQueryOperator, object data)
2508
StartNode(whereQueryOperator);
2510
WriteKeyword("Where");
2511
whereQueryOperator.Condition.AcceptVisitor(this, data);
2513
return EndNode(whereQueryOperator);
2516
public object VisitPartitionQueryOperator(PartitionQueryOperator partitionQueryOperator, object data)
2518
StartNode(partitionQueryOperator);
2520
switch (partitionQueryOperator.Kind) {
2521
case PartitionKind.Take:
2522
WriteKeyword("Take");
2524
case PartitionKind.TakeWhile:
2525
WriteKeyword("Take");
2526
WriteKeyword("While");
2528
case PartitionKind.Skip:
2529
WriteKeyword("Skip");
2531
case PartitionKind.SkipWhile:
2532
WriteKeyword("Skip");
2533
WriteKeyword("While");
2536
throw new Exception("Invalid value for PartitionKind");
2539
partitionQueryOperator.Expression.AcceptVisitor(this, data);
2541
return EndNode(partitionQueryOperator);
2544
public object VisitOrderExpression(OrderExpression orderExpression, object data)
2546
StartNode(orderExpression);
2548
orderExpression.Expression.AcceptVisitor(this, data);
2550
switch (orderExpression.Direction) {
2551
case QueryOrderingDirection.None:
2553
case QueryOrderingDirection.Ascending:
2554
WriteKeyword("Ascending");
2556
case QueryOrderingDirection.Descending:
2557
WriteKeyword("Descending");
2560
throw new Exception("Invalid value for QueryExpressionOrderingDirection");
2563
return EndNode(orderExpression);
2566
public object VisitOrderByQueryOperator(OrderByQueryOperator orderByQueryOperator, object data)
2568
StartNode(orderByQueryOperator);
2570
WriteKeyword("Order");
2572
WriteCommaSeparatedList(orderByQueryOperator.Expressions);
2574
return EndNode(orderByQueryOperator);
2577
public object VisitLetQueryOperator(LetQueryOperator letQueryOperator, object data)
2579
StartNode(letQueryOperator);
2581
WriteKeyword("Let");
2582
WriteCommaSeparatedList(letQueryOperator.Variables);
2584
return EndNode(letQueryOperator);
2587
public object VisitGroupByQueryOperator(GroupByQueryOperator groupByQueryOperator, object data)
2589
StartNode(groupByQueryOperator);
2591
WriteKeyword("Group");
2592
WriteCommaSeparatedList(groupByQueryOperator.GroupExpressions);
2594
WriteCommaSeparatedList(groupByQueryOperator.ByExpressions);
2595
WriteKeyword("Into");
2596
WriteCommaSeparatedList(groupByQueryOperator.IntoExpressions);
2598
return EndNode(groupByQueryOperator);
2601
public object VisitJoinQueryOperator(JoinQueryOperator joinQueryOperator, object data)
2603
StartNode(joinQueryOperator);
2605
WriteKeyword("Join");
2606
joinQueryOperator.JoinVariable.AcceptVisitor(this, data);
2607
if (!joinQueryOperator.SubJoinQuery.IsNull) {
2608
joinQueryOperator.SubJoinQuery.AcceptVisitor(this, data);
2612
foreach (var cond in joinQueryOperator.JoinConditions) {
2616
WriteKeyword("And");
2617
cond.AcceptVisitor(this, data);
2620
return EndNode(joinQueryOperator);
2623
public object VisitJoinCondition(JoinCondition joinCondition, object data)
2625
StartNode(joinCondition);
2627
joinCondition.Left.AcceptVisitor(this, data);
2628
WriteKeyword("Equals");
2629
joinCondition.Right.AcceptVisitor(this, data);
2631
return EndNode(joinCondition);
2634
public object VisitGroupJoinQueryOperator(GroupJoinQueryOperator groupJoinQueryOperator, object data)
2636
StartNode(groupJoinQueryOperator);
2638
WriteKeyword("Group");
2639
WriteKeyword("Join");
2640
groupJoinQueryOperator.JoinVariable.AcceptVisitor(this, data);
2641
if (!groupJoinQueryOperator.SubJoinQuery.IsNull) {
2642
groupJoinQueryOperator.SubJoinQuery.AcceptVisitor(this, data);
2646
foreach (var cond in groupJoinQueryOperator.JoinConditions) {
2650
WriteKeyword("And");
2651
cond.AcceptVisitor(this, data);
2653
WriteKeyword("Into");
2654
WriteCommaSeparatedList(groupJoinQueryOperator.IntoExpressions);
2656
return EndNode(groupJoinQueryOperator);