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");
978WriteLine(";");
979WriteLine("result.CopyAttributes(this);");
980WriteLine("return result;");
983WriteLine("return this;");
1014WriteLine(" As {0}", node.Name);
1021WriteLine(" Then");
1026WriteLine("");
1027WriteLine("result.CopyAttributes(Me)");
1028WriteLine("Return result");
1030WriteLine("End If");
1032WriteLine("Return Me");
1035WriteLine("End Function");
1077WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1081WriteLine("[MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough]");
1082WriteLine("internal R VisitInternal(BoundNode node, A arg)");
1084WriteLine("switch (node.Kind)");
1088WriteLine("case BoundKind.{0}:", FixKeyword(StripBound(node.Name)));
1090WriteLine("return Visit{0}(({1})node, arg);", StripBound(node.Name), node.Name);
1095WriteLine("return default(R)!;");
1100WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1104WriteLine($"public virtual R Visit{StripBound(node.Name)}({node.Name} node, A arg) => this.DefaultVisit(node, arg);");
1109WriteLine("internal abstract partial class BoundTreeVisitor");
1113WriteLine($"public virtual BoundNode? Visit{StripBound(node.Name)}({node.Name} node) => this.DefaultVisit(node);");
1120WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1124WriteLine("<MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough>");
1125WriteLine("Friend Function VisitInternal(node As BoundNode, arg As A) As R");
1127WriteLine("Select Case node.Kind");
1131WriteLine("Case BoundKind.{0}", FixKeyword(StripBound(node.Name)));
1133WriteLine("Return Visit{0}(CType(node, {1}), arg)", StripBound(node.Name), node.Name);
1137WriteLine("End Select");
1138WriteLine("Return DefaultVisit(node, arg)");
1140WriteLine("End Function");
1144WriteLine("End Class");
1147WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1151WriteLine("Public Overridable Function Visit{0}(node As {1}, arg As A) As R", StripBound(node.Name), node.Name);
1153WriteLine("Return Me.DefaultVisit(node, arg)");
1155WriteLine("End Function");
1159WriteLine("End Class");
1162WriteLine("Friend MustInherit Partial Class BoundTreeVisitor");
1166WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: false));
1168WriteLine("Return Me.DefaultVisit(node)");
1170WriteLine("End Function");
1174WriteLine("End Class");
1188WriteLine("internal abstract partial class BoundTreeWalker : BoundTreeVisitor");
1195WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => null;");
1198WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1202WriteLine("this.Visit{1}(node.{0});", field.Name, IsNodeList(field.Type) ? "List" : "");
1204WriteLine("return null;");
1213WriteLine("Friend MustInherit Partial Class BoundTreeWalker");
1215WriteLine("Inherits BoundTreeVisitor");
1220WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1223WriteLine("Me.Visit{1}(node.{0})", field.Name, IsNodeList(field.Type) ? "List" : "");
1224WriteLine("Return Nothing");
1226WriteLine("End Function");
1231WriteLine("End Class");
1246WriteLine("internal sealed class BoundTreeDumperNodeProducer : BoundTreeVisitor<object?, TreeDumperNode>");
1248WriteLine("private BoundTreeDumperNodeProducer()");
1251WriteLine("public static TreeDumperNode MakeTree(BoundNode node) => (new BoundTreeDumperNodeProducer()).Visit(node, null);");
1258WriteLine("new TreeDumperNode[]");
1280WriteLine(",");
1285WriteLine(",");
1291WriteLine(",");
1295WriteLine("");
1300WriteLine("Array.Empty<TreeDumperNode>()");
1302WriteLine(");");
1309WriteLine("Friend NotInheritable Class BoundTreeDumperNodeProducer");
1311WriteLine("Inherits BoundTreeVisitor(Of Object, TreeDumperNode)");
1313WriteLine("Private Sub New()");
1314WriteLine("End Sub");
1316WriteLine("Public Shared Function MakeTree(node As BoundNode) As TreeDumperNode");
1318WriteLine("Return (New BoundTreeDumperNodeProducer()).Visit(node, Nothing)");
1320WriteLine("End Function");
1325WriteLine("Public Overrides Function Visit{0}(node As {1}, arg As Object) As TreeDumperNode", StripBound(node.Name), node.Name);
1331WriteLine("New TreeDumperNode() {{");
1344WriteLine("");
1346WriteLine(",");
1349WriteLine("}})");
1353WriteLine("Array.Empty(Of TreeDumperNode)())");
1356WriteLine("End Function");
1360WriteLine("End Class");
1375WriteLine("internal abstract partial class BoundTreeRewriter : BoundTreeVisitor");
1381WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => node;");
1384WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1394WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.Visit{field.Type.TrimEnd('?')}(node.{field.Name});");
1398WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitLocals(node.{field.Name});");
1402WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitDeclaredLocalFunctions(node.{field.Name});");
1406WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitSymbols<{elementType}>(node.{field.Name});");
1419WriteLine("TypeSymbol? {0} = this.VisitType(node.{1});", ToCamelCase(field.Name), field.Name);
1432WriteLine(";");
1436WriteLine("return node;");
1448WriteLine("Friend MustInherit Partial Class BoundTreeRewriter");
1450WriteLine("Inherits BoundTreeVisitor");
1454WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1467WriteLine("Dim {0} as TypeSymbol = Me.VisitType(node.{1})", ToCamelCase(field.Name), field.Name);
1474WriteLine("");
1478WriteLine("Return node");
1482WriteLine("End Function");
1486WriteLine("End Class");
1505WriteLine("internal sealed partial class NullabilityRewriter : BoundTreeRewriter");
1511WriteLine($"private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> {updatedNullabilities};");
1512WriteLine($"private readonly NullableWalker.SnapshotManager? {snapshotManager};");
1513WriteLine($"private readonly ImmutableDictionary<Symbol, Symbol>.Builder {remappedSymbols};");
1516WriteLine("public NullabilityRewriter(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> updatedNullabilities, NullableWalker.SnapshotManager? snapshotManager, ImmutableDictionary<Symbol, Symbol>.Builder remappedSymbols)");
1518WriteLine($"{updatedNullabilities} = updatedNullabilities;");
1519WriteLine($"{snapshotManager} = snapshotManager;");
1520WriteLine($"{remappedSymbols} = remappedSymbols;");
1537WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1545WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedSymbol(node, node.{field.Name});");
1550WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedArray(node, node.{field.Name});");
1565WriteLine($"{node.Name} updatedNode;");
1572WriteLine("else");
1576WriteLine("return updatedNode;");
1582WriteLine("return node;");
1587WriteLine("return updatedNode;");
1594WriteLine(";");
1600=> WriteLine($"if ({(inverted ? "!" : "")}{updatedNullabilities}.TryGetValue(node, out (NullabilityInfo Info, TypeSymbol? Type) infoAndType))");
1606WriteLine(";");
1643WriteLine($"updatedNode.TopLevelNullability = infoAndType.Info;");
1913WriteLine($"{field.Type} {ToCamelCase(field.Name)} = node.{field.Name};");
1917WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitList(node.{field.Name});");
1921WriteLine($"{field.Type} {ToCamelCase(field.Name)} = ({field.Type})this.Visit(node.{field.Name});");
1929WriteLine("Dim {0} As {2} = node.{1}", ToCamelCase(field.Name), field.Name, field.Type);
1933WriteLine("Dim {0} As {2} = Me.VisitList(node.{1})", ToCamelCase(field.Name), field.Name, field.Type);
1937WriteLine("Dim {0} As {2} = DirectCast(Me.Visit(node.{1}), {2})", ToCamelCase(field.Name), field.Name, field.Type);