BoundNodeClassWriter.cs (175)
130WriteLine("{{");
137WriteLine("}}");
155WriteLine("// <auto-generated />");
156WriteLine("#nullable enable");
159WriteLine("' <auto-generated />"); break;
209WriteLine("using {0};", nsName); break;
211WriteLine("Imports {0}", nsName); break;
222WriteLine("namespace Microsoft.CodeAnalysis.CSharp");
226WriteLine("Namespace Microsoft.CodeAnalysis.VisualBasic");
243WriteLine("End Namespace");
255WriteLine("internal enum BoundKind : byte");
258WriteLine("{0},", FixKeyword(StripBound(node.Name)));
263WriteLine("Friend Enum BoundKind as Byte");
266WriteLine("{0}", FixKeyword(StripBound(node.Name)));
268WriteLine("End Enum");
302WriteLine("internal {2}partial class {0} : {1}", node.Name, node.Base, abstr);
314WriteLine("Partial Friend {1}Class {0}", node.Name, abstr);
316WriteLine("Inherits {0}", node.Base);
336WriteLine("End Class");
465WriteLine("this.{0} = {1};", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "null" : ToCamelCase(field.Name));
472WriteLine("Validate();");
480WriteLine(@"[Conditional(""DEBUG"")]");
481WriteLine("private partial void Validate();");
530WriteLine("Me._{0} = {1}", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "Nothing" : ToCamelCase(field.Name));
537WriteLine("Validate()");
541WriteLine("End Sub");
546WriteLine("Private Partial Sub Validate()");
547WriteLine("End Sub");
601WriteLine("this.{0} = {1};", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "null" : ToCamelCase(field.Name));
640WriteLine("Me._{0} = {1}", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "Nothing" : ToCamelCase(field.Name));
645WriteLine("Validate()");
649WriteLine("End Sub");
675WriteLine("RoslynDebug.Assert(!{0}.IsDefault, \"Field '{0}' cannot be null (use Null=\\\"allow\\\" in BoundNodes.xml to remove this check)\");", ToCamelCase(field.Name));
677WriteLine("RoslynDebug.Assert({0} is object, \"Field '{0}' cannot be null (make the type nullable in BoundNodes.xml to remove this check)\");", ToCamelCase(field.Name));
682WriteLine("Debug.Assert(Not ({0}.IsDefault), \"Field '{0}' cannot be null (use Null=\"\"allow\"\" in BoundNodes.xml to remove this check)\")", ToCamelCase(field.Name));
684WriteLine("Debug.Assert({0} IsNot Nothing, \"Field '{0}' cannot be null (use Null=\"\"allow\"\" in BoundNodes.xml to remove this check)\")", ToCamelCase(field.Name));
840WriteLine("public override {0}{1} {2} {{ get; }}", (IsNew(field) ? "new " : ""), field.Type, field.Name);
852WriteLine($"public new {field.Type} {field.Name} => base.{field.Name}{suppression};");
856WriteLine("public {0}{1} {2} {{ get; }}", (IsNew(field) ? "new " : ""), field.Type, field.Name);
862WriteLine("Private {0}ReadOnly _{2} As {1}", (IsNew(field) ? "Shadows " : ""), field.Type, field.Name);
863WriteLine("Public {0}ReadOnly Property {2} As {1}", (IsNew(field) ? "Shadows " : IsPropertyOverrides(field) ? "Overrides " : ""), field.Type, field.Name);
865WriteLine("Get");
867WriteLine("Return _{0}", field.Name);
869WriteLine("End Get");
871WriteLine("End Property");
885WriteLine("[DebuggerStepThrough]");
886WriteLine("public override BoundNode? Accept(BoundTreeVisitor visitor) => visitor.Visit{0}(this);", StripBound(name));
891WriteLine("<DebuggerStepThrough>");
892WriteLine("Public Overrides Function Accept(visitor as BoundTreeVisitor) As BoundNode");
894WriteLine("Return visitor.Visit{0}(Me)", StripBound(name));
896WriteLine("End Function");
976WriteLine(";");
977WriteLine("result.CopyAttributes(this);");
978WriteLine("return result;");
981WriteLine("return this;");
1012WriteLine(" As {0}", node.Name);
1019WriteLine(" Then");
1024WriteLine("");
1025WriteLine("result.CopyAttributes(Me)");
1026WriteLine("Return result");
1028WriteLine("End If");
1030WriteLine("Return Me");
1033WriteLine("End Function");
1075WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1079WriteLine("[MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough]");
1080WriteLine("internal R VisitInternal(BoundNode node, A arg)");
1082WriteLine("switch (node.Kind)");
1086WriteLine("case BoundKind.{0}:", FixKeyword(StripBound(node.Name)));
1088WriteLine("return Visit{0}(({1})node, arg);", StripBound(node.Name), node.Name);
1093WriteLine("return default(R)!;");
1098WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1102WriteLine($"public virtual R Visit{StripBound(node.Name)}({node.Name} node, A arg) => this.DefaultVisit(node, arg);");
1107WriteLine("internal abstract partial class BoundTreeVisitor");
1111WriteLine($"public virtual BoundNode? Visit{StripBound(node.Name)}({node.Name} node) => this.DefaultVisit(node);");
1118WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1122WriteLine("<MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough>");
1123WriteLine("Friend Function VisitInternal(node As BoundNode, arg As A) As R");
1125WriteLine("Select Case node.Kind");
1129WriteLine("Case BoundKind.{0}", FixKeyword(StripBound(node.Name)));
1131WriteLine("Return Visit{0}(CType(node, {1}), arg)", StripBound(node.Name), node.Name);
1135WriteLine("End Select");
1136WriteLine("Return DefaultVisit(node, arg)");
1138WriteLine("End Function");
1142WriteLine("End Class");
1145WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1149WriteLine("Public Overridable Function Visit{0}(node As {1}, arg As A) As R", StripBound(node.Name), node.Name);
1151WriteLine("Return Me.DefaultVisit(node, arg)");
1153WriteLine("End Function");
1157WriteLine("End Class");
1160WriteLine("Friend MustInherit Partial Class BoundTreeVisitor");
1164WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: false));
1166WriteLine("Return Me.DefaultVisit(node)");
1168WriteLine("End Function");
1172WriteLine("End Class");
1186WriteLine("internal abstract partial class BoundTreeWalker : BoundTreeVisitor");
1193WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => null;");
1196WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1200WriteLine("this.Visit{1}(node.{0});", field.Name, IsNodeList(field.Type) ? "List" : "");
1202WriteLine("return null;");
1211WriteLine("Friend MustInherit Partial Class BoundTreeWalker");
1213WriteLine("Inherits BoundTreeVisitor");
1218WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1221WriteLine("Me.Visit{1}(node.{0})", field.Name, IsNodeList(field.Type) ? "List" : "");
1222WriteLine("Return Nothing");
1224WriteLine("End Function");
1229WriteLine("End Class");
1244WriteLine("internal sealed class BoundTreeDumperNodeProducer : BoundTreeVisitor<object?, TreeDumperNode>");
1246WriteLine("private BoundTreeDumperNodeProducer()");
1249WriteLine("public static TreeDumperNode MakeTree(BoundNode node) => (new BoundTreeDumperNodeProducer()).Visit(node, null);");
1256WriteLine("new TreeDumperNode[]");
1278WriteLine(",");
1283WriteLine(",");
1289WriteLine(",");
1293WriteLine("");
1298WriteLine("Array.Empty<TreeDumperNode>()");
1300WriteLine(");");
1307WriteLine("Friend NotInheritable Class BoundTreeDumperNodeProducer");
1309WriteLine("Inherits BoundTreeVisitor(Of Object, TreeDumperNode)");
1311WriteLine("Private Sub New()");
1312WriteLine("End Sub");
1314WriteLine("Public Shared Function MakeTree(node As BoundNode) As TreeDumperNode");
1316WriteLine("Return (New BoundTreeDumperNodeProducer()).Visit(node, Nothing)");
1318WriteLine("End Function");
1323WriteLine("Public Overrides Function Visit{0}(node As {1}, arg As Object) As TreeDumperNode", StripBound(node.Name), node.Name);
1329WriteLine("New TreeDumperNode() {{");
1342WriteLine("");
1344WriteLine(",");
1347WriteLine("}})");
1351WriteLine("Array.Empty(Of TreeDumperNode)())");
1354WriteLine("End Function");
1358WriteLine("End Class");
1373WriteLine("internal abstract partial class BoundTreeRewriter : BoundTreeVisitor");
1379WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => node;");
1382WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1392WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.Visit{field.Type.TrimEnd('?')}(node.{field.Name});");
1396WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitLocals(node.{field.Name});");
1400WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitDeclaredLocalFunctions(node.{field.Name});");
1404WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitSymbols<{elementType}>(node.{field.Name});");
1417WriteLine("TypeSymbol? {0} = this.VisitType(node.{1});", ToCamelCase(field.Name), field.Name);
1430WriteLine(";");
1434WriteLine("return node;");
1446WriteLine("Friend MustInherit Partial Class BoundTreeRewriter");
1448WriteLine("Inherits BoundTreeVisitor");
1452WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1465WriteLine("Dim {0} as TypeSymbol = Me.VisitType(node.{1})", ToCamelCase(field.Name), field.Name);
1472WriteLine("");
1476WriteLine("Return node");
1480WriteLine("End Function");
1484WriteLine("End Class");
1503WriteLine("internal sealed partial class NullabilityRewriter : BoundTreeRewriter");
1509WriteLine($"private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> {updatedNullabilities};");
1510WriteLine($"private readonly NullableWalker.SnapshotManager? {snapshotManager};");
1511WriteLine($"private readonly ImmutableDictionary<Symbol, Symbol>.Builder {remappedSymbols};");
1514WriteLine("public NullabilityRewriter(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> updatedNullabilities, NullableWalker.SnapshotManager? snapshotManager, ImmutableDictionary<Symbol, Symbol>.Builder remappedSymbols)");
1516WriteLine($"{updatedNullabilities} = updatedNullabilities;");
1517WriteLine($"{snapshotManager} = snapshotManager;");
1518WriteLine($"{remappedSymbols} = remappedSymbols;");
1535WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1543WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedSymbol(node, node.{field.Name});");
1548WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedArray(node, node.{field.Name});");
1563WriteLine($"{node.Name} updatedNode;");
1570WriteLine("else");
1574WriteLine("return updatedNode;");
1580WriteLine("return node;");
1585WriteLine("return updatedNode;");
1592WriteLine(";");
1598=> WriteLine($"if ({(inverted ? "!" : "")}{updatedNullabilities}.TryGetValue(node, out (NullabilityInfo Info, TypeSymbol? Type) infoAndType))");
1604WriteLine(";");
1641WriteLine($"updatedNode.TopLevelNullability = infoAndType.Info;");
1911WriteLine($"{field.Type} {ToCamelCase(field.Name)} = node.{field.Name};");
1915WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitList(node.{field.Name});");
1919WriteLine($"{field.Type} {ToCamelCase(field.Name)} = ({field.Type})this.Visit(node.{field.Name});");
1927WriteLine("Dim {0} As {2} = node.{1}", ToCamelCase(field.Name), field.Name, field.Type);
1931WriteLine("Dim {0} As {2} = Me.VisitList(node.{1})", ToCamelCase(field.Name), field.Name, field.Type);
1935WriteLine("Dim {0} As {2} = DirectCast(Me.Visit(node.{1}), {2})", ToCamelCase(field.Name), field.Name, field.Type);