BoundNodeClassWriter.cs (183)
130WriteLine("{{");
137WriteLine("}}");
155WriteLine("// <auto-generated />");
156WriteLine("#nullable enable");
159WriteLine("' <auto-generated />"); break;
210WriteLine("using {0};", nsName); break;
212WriteLine("Imports {0}", nsName); break;
223WriteLine("namespace Microsoft.CodeAnalysis.CSharp");
227WriteLine("Namespace Microsoft.CodeAnalysis.VisualBasic");
244WriteLine("End Namespace");
256WriteLine("internal enum BoundKind : byte");
259WriteLine("{0},", FixKeyword(StripBound(node.Name)));
264WriteLine("Friend Enum BoundKind as Byte");
267WriteLine("{0}", FixKeyword(StripBound(node.Name)));
269WriteLine("End Enum");
303WriteLine("internal {2}partial class {0} : {1}", node.Name, node.Base, abstr);
315WriteLine("Partial Friend {1}Class {0}", node.Name, abstr);
317WriteLine("Inherits {0}", node.Base);
337WriteLine("End Class");
466WriteLine("this.{0} = {1};", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "null" : ToCamelCase(field.Name));
473WriteLine("Validate();");
481WriteLine(@"[Conditional(""DEBUG"")]");
482WriteLine("private partial void Validate();");
531WriteLine("Me._{0} = {1}", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "Nothing" : ToCamelCase(field.Name));
538WriteLine("Validate()");
542WriteLine("End Sub");
547WriteLine("Private Partial Sub Validate()");
548WriteLine("End Sub");
602WriteLine("this.{0} = {1};", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "null" : ToCamelCase(field.Name));
641WriteLine("Me._{0} = {1}", field.Name, FieldNullHandling(node, field.Name) == NullHandling.Always ? "Nothing" : ToCamelCase(field.Name));
646WriteLine("Validate()");
650WriteLine("End Sub");
676WriteLine("RoslynDebug.Assert(!{0}.IsDefault, \"Field '{0}' cannot be null (use Null=\\\"allow\\\" in BoundNodes.xml to remove this check)\");", ToCamelCase(field.Name));
678WriteLine("RoslynDebug.Assert({0} is object, \"Field '{0}' cannot be null (make the type nullable in BoundNodes.xml to remove this check)\");", ToCamelCase(field.Name));
683WriteLine("Debug.Assert(Not ({0}.IsDefault), \"Field '{0}' cannot be null (use Null=\"\"allow\"\" in BoundNodes.xml to remove this check)\")", ToCamelCase(field.Name));
685WriteLine("Debug.Assert({0} IsNot Nothing, \"Field '{0}' cannot be null (use Null=\"\"allow\"\" in BoundNodes.xml to remove this check)\")", ToCamelCase(field.Name));
841WriteLine("public override {0}{1} {2} {{ get; }}", (IsNew(field) ? "new " : ""), field.Type, field.Name);
853WriteLine($"public new {field.Type} {field.Name} => base.{field.Name}{suppression};");
857WriteLine("public {0}{1} {2} {{ get; }}", (IsNew(field) ? "new " : ""), field.Type, field.Name);
863WriteLine("Private {0}ReadOnly _{2} As {1}", (IsNew(field) ? "Shadows " : ""), field.Type, field.Name);
864WriteLine("Public {0}ReadOnly Property {2} As {1}", (IsNew(field) ? "Shadows " : IsPropertyOverrides(field) ? "Overrides " : ""), field.Type, field.Name);
866WriteLine("Get");
868WriteLine("Return _{0}", field.Name);
870WriteLine("End Get");
872WriteLine("End Property");
886WriteLine("[DebuggerStepThrough]");
887WriteLine("public override BoundNode? Accept(BoundTreeVisitor visitor) => visitor.Visit{0}(this);", StripBound(name));
892WriteLine("<DebuggerStepThrough>");
893WriteLine("Public Overrides Function Accept(visitor as BoundTreeVisitor) As BoundNode");
895WriteLine("Return visitor.Visit{0}(Me)", StripBound(name));
897WriteLine("End Function");
977WriteLine(";");
978WriteLine("result.CopyAttributes(this);");
979WriteLine("return result;");
982WriteLine("return this;");
1013WriteLine(" As {0}", node.Name);
1020WriteLine(" Then");
1025WriteLine("");
1026WriteLine("result.CopyAttributes(Me)");
1027WriteLine("Return result");
1029WriteLine("End If");
1031WriteLine("Return Me");
1034WriteLine("End Function");
1076WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1080WriteLine("[MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough]");
1081WriteLine("internal R VisitInternal(BoundNode node, A arg)");
1083WriteLine("switch (node.Kind)");
1087WriteLine("case BoundKind.{0}:", FixKeyword(StripBound(node.Name)));
1089WriteLine("return Visit{0}(({1})node, arg);", StripBound(node.Name), node.Name);
1094WriteLine("return default(R)!;");
1099WriteLine("internal abstract partial class BoundTreeVisitor<A, R>");
1103WriteLine($"public virtual R Visit{StripBound(node.Name)}({node.Name} node, A arg) => this.DefaultVisit(node, arg);");
1108WriteLine("internal abstract partial class BoundTreeVisitor");
1112WriteLine($"public virtual BoundNode? Visit{StripBound(node.Name)}({node.Name} node) => this.DefaultVisit(node);");
1119WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1123WriteLine("<MethodImpl(MethodImplOptions.NoInlining), DebuggerStepThrough>");
1124WriteLine("Friend Function VisitInternal(node As BoundNode, arg As A) As R");
1126WriteLine("Select Case node.Kind");
1130WriteLine("Case BoundKind.{0}", FixKeyword(StripBound(node.Name)));
1132WriteLine("Return Visit{0}(CType(node, {1}), arg)", StripBound(node.Name), node.Name);
1136WriteLine("End Select");
1137WriteLine("Return DefaultVisit(node, arg)");
1139WriteLine("End Function");
1143WriteLine("End Class");
1146WriteLine("Friend MustInherit Partial Class BoundTreeVisitor(Of A, R)");
1150WriteLine("Public Overridable Function Visit{0}(node As {1}, arg As A) As R", StripBound(node.Name), node.Name);
1152WriteLine("Return Me.DefaultVisit(node, arg)");
1154WriteLine("End Function");
1158WriteLine("End Class");
1161WriteLine("Friend MustInherit Partial Class BoundTreeVisitor");
1165WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: false));
1167WriteLine("Return Me.DefaultVisit(node)");
1169WriteLine("End Function");
1173WriteLine("End Class");
1187WriteLine("internal abstract partial class BoundTreeWalker : BoundTreeVisitor");
1194WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => null;");
1197WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1201WriteLine("this.Visit{1}(node.{0});", field.Name, IsNodeList(field.Type) ? "List" : "");
1203WriteLine("return null;");
1212WriteLine("Friend MustInherit Partial Class BoundTreeWalker");
1214WriteLine("Inherits BoundTreeVisitor");
1219WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1222WriteLine("Me.Visit{1}(node.{0})", field.Name, IsNodeList(field.Type) ? "List" : "");
1223WriteLine("Return Nothing");
1225WriteLine("End Function");
1230WriteLine("End Class");
1245WriteLine("internal sealed class BoundTreeDumperNodeProducer : BoundTreeVisitor<object?, TreeDumperNode>");
1247WriteLine("private BoundTreeDumperNodeProducer()");
1250WriteLine("public static TreeDumperNode MakeTree(BoundNode node) => (new BoundTreeDumperNodeProducer()).Visit(node, null);");
1257WriteLine("new TreeDumperNode[]");
1279WriteLine(",");
1284WriteLine(",");
1290WriteLine(",");
1294WriteLine("");
1299WriteLine("Array.Empty<TreeDumperNode>()");
1301WriteLine(");");
1308WriteLine("Friend NotInheritable Class BoundTreeDumperNodeProducer");
1310WriteLine("Inherits BoundTreeVisitor(Of Object, TreeDumperNode)");
1312WriteLine("Private Sub New()");
1313WriteLine("End Sub");
1315WriteLine("Public Shared Function MakeTree(node As BoundNode) As TreeDumperNode");
1317WriteLine("Return (New BoundTreeDumperNodeProducer()).Visit(node, Nothing)");
1319WriteLine("End Function");
1324WriteLine("Public Overrides Function Visit{0}(node As {1}, arg As Object) As TreeDumperNode", StripBound(node.Name), node.Name);
1330WriteLine("New TreeDumperNode() {{");
1343WriteLine("");
1345WriteLine(",");
1348WriteLine("}})");
1352WriteLine("Array.Empty(Of TreeDumperNode)())");
1355WriteLine("End Function");
1359WriteLine("End Class");
1374WriteLine("#if DEBUG");
1376WriteLine("internal sealed partial class PipelinePhaseValidator");
1378WriteLine("internal static PipelinePhase DoesNotSurvive(BoundKind kind)");
1380WriteLine("return kind switch");
1387WriteLine($"BoundKind.{StripBound(node.Name)} => PipelinePhase.{doesNotSurvive},");
1390WriteLine("_ => PipelinePhase.Emit");
1392WriteLine("}};");
1396WriteLine("#endif");
1407WriteLine("internal abstract partial class BoundTreeRewriter : BoundTreeVisitor");
1413WriteLine($"{GetVisitFunctionDeclaration(node.Name, isOverride: true)} => node;");
1416WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1426WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.Visit{field.Type.TrimEnd('?')}(node.{field.Name});");
1430WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitLocals(node.{field.Name});");
1434WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitDeclaredLocalFunctions(node.{field.Name});");
1438WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitSymbols<{elementType}>(node.{field.Name});");
1451WriteLine("TypeSymbol? {0} = this.VisitType(node.{1});", ToCamelCase(field.Name), field.Name);
1464WriteLine(";");
1468WriteLine("return node;");
1480WriteLine("Friend MustInherit Partial Class BoundTreeRewriter");
1482WriteLine("Inherits BoundTreeVisitor");
1486WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1499WriteLine("Dim {0} as TypeSymbol = Me.VisitType(node.{1})", ToCamelCase(field.Name), field.Name);
1506WriteLine("");
1510WriteLine("Return node");
1514WriteLine("End Function");
1518WriteLine("End Class");
1537WriteLine("internal sealed partial class NullabilityRewriter : BoundTreeRewriter");
1543WriteLine($"private readonly ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> {updatedNullabilities};");
1544WriteLine($"private readonly NullableWalker.SnapshotManager? {snapshotManager};");
1545WriteLine($"private readonly ImmutableDictionary<Symbol, Symbol>.Builder {remappedSymbols};");
1548WriteLine("public NullabilityRewriter(ImmutableDictionary<BoundExpression, (NullabilityInfo Info, TypeSymbol? Type)> updatedNullabilities, NullableWalker.SnapshotManager? snapshotManager, ImmutableDictionary<Symbol, Symbol>.Builder remappedSymbols)");
1550WriteLine($"{updatedNullabilities} = updatedNullabilities;");
1551WriteLine($"{snapshotManager} = snapshotManager;");
1552WriteLine($"{remappedSymbols} = remappedSymbols;");
1569WriteLine(GetVisitFunctionDeclaration(node.Name, isOverride: true));
1577WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedSymbol(node, node.{field.Name});");
1582WriteLine($"{field.Type} {ToCamelCase(field.Name)} = GetUpdatedArray(node, node.{field.Name});");
1597WriteLine($"{node.Name} updatedNode;");
1604WriteLine("else");
1608WriteLine("return updatedNode;");
1614WriteLine("return node;");
1619WriteLine("return updatedNode;");
1626WriteLine(";");
1632=> WriteLine($"if ({(inverted ? "!" : "")}{updatedNullabilities}.TryGetValue(node, out (NullabilityInfo Info, TypeSymbol? Type) infoAndType))");
1638WriteLine(";");
1675WriteLine($"updatedNode.TopLevelNullability = infoAndType.Info;");
1945WriteLine($"{field.Type} {ToCamelCase(field.Name)} = node.{field.Name};");
1949WriteLine($"{field.Type} {ToCamelCase(field.Name)} = this.VisitList(node.{field.Name});");
1953WriteLine($"{field.Type} {ToCamelCase(field.Name)} = ({field.Type})this.Visit(node.{field.Name});");
1961WriteLine("Dim {0} As {2} = node.{1}", ToCamelCase(field.Name), field.Name, field.Type);
1965WriteLine("Dim {0} As {2} = Me.VisitList(node.{1})", ToCamelCase(field.Name), field.Name, field.Type);
1969WriteLine("Dim {0} As {2} = DirectCast(Me.Visit(node.{1}), {2})", ToCamelCase(field.Name), field.Name, field.Type);