From 545a25edde6cdce31dbce8addc5670a531e90145 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Sat, 17 Apr 2021 12:43:25 -0700 Subject: [PATCH 01/12] Record-structs: remove RecordStructDeclarationSyntax --- .../CSharpDeclarationComputer.cs | 15 +- .../BinderFactory.BinderFactoryVisitor.cs | 6 +- .../Compilation/SyntaxTreeSemanticModel.cs | 38 +- .../Portable/Compiler/MethodCompiler.cs | 2 +- .../Declarations/DeclarationTreeBuilder.cs | 14 +- .../Portable/Generated/CSharp.Generated.g4 | 7 +- .../Syntax.xml.Internal.Generated.cs | 535 ++---------------- .../Syntax.xml.Main.Generated.cs | 80 +-- .../Syntax.xml.Syntax.Generated.cs | 202 +------ .../CSharp/Portable/Parser/LanguageParser.cs | 56 +- .../CSharp/Portable/PublicAPI.Unshipped.txt | 55 +- .../Source/SourceMemberContainerSymbol.cs | 27 +- .../Records/SynthesizedRecordConstructor.cs | 17 +- .../Syntax/RecordDeclarationSyntax.cs | 29 +- .../CSharp/Portable/Syntax/Syntax.xml | 30 +- .../Portable/Syntax/TypeDeclarationSyntax.cs | 4 +- .../Semantic/Semantics/RecordStructTests.cs | 11 +- .../Generated/Syntax.Test.xml.Generated.cs | 112 +--- ...CodeGenerator.CallSiteContainerRewriter.cs | 10 - .../GenerateType/CSharpGenerateTypeService.cs | 2 +- .../Organizers/RecordDeclarationOrganizer.cs | 2 +- .../RecordStructDeclarationOrganizer.cs | 43 -- .../Structure/CSharpBlockStructureProvider.cs | 1 - .../CodeGeneration/CSharpSyntaxGenerator.cs | 7 - .../CodeGeneration/NamedTypeGenerator.cs | 5 +- .../CodeGeneration/SyntaxGeneratorTests.cs | 2 +- .../Services/SyntaxFacts/CSharpSyntaxFacts.cs | 3 - 27 files changed, 195 insertions(+), 1120 deletions(-) delete mode 100644 src/Features/CSharp/Portable/Organizing/Organizers/RecordStructDeclarationOrganizer.cs diff --git a/src/Compilers/CSharp/CSharpAnalyzerDriver/CSharpDeclarationComputer.cs b/src/Compilers/CSharp/CSharpAnalyzerDriver/CSharpDeclarationComputer.cs index c22352438cb70..f7e4503bb47d1 100644 --- a/src/Compilers/CSharp/CSharpAnalyzerDriver/CSharpDeclarationComputer.cs +++ b/src/Compilers/CSharp/CSharpAnalyzerDriver/CSharpDeclarationComputer.cs @@ -98,6 +98,7 @@ private static void ComputeDeclarations( return; } case SyntaxKind.RecordDeclaration: + case SyntaxKind.RecordStructDeclaration: { if (associatedSymbol is IMethodSymbol ctor) { @@ -115,20 +116,6 @@ private static void ComputeDeclarations( return; } - goto case SyntaxKind.ClassDeclaration; - } - case SyntaxKind.RecordStructDeclaration: - { - if (associatedSymbol is IMethodSymbol ctor) - { - var recordDeclaration = (RecordStructDeclarationSyntax)node; - Debug.Assert(ctor.MethodKind == MethodKind.Constructor && recordDeclaration.ParameterList is object); - - var codeBlocks = GetParameterListInitializersAndAttributes(recordDeclaration.ParameterList); - builder.Add(GetDeclarationInfo(node, associatedSymbol, codeBlocks)); - return; - } - goto case SyntaxKind.ClassDeclaration; } case SyntaxKind.ClassDeclaration: diff --git a/src/Compilers/CSharp/Portable/Binder/BinderFactory.BinderFactoryVisitor.cs b/src/Compilers/CSharp/Portable/Binder/BinderFactory.BinderFactoryVisitor.cs index 3ebd9ecb6a811..66d21cd6a468c 100644 --- a/src/Compilers/CSharp/Portable/Binder/BinderFactory.BinderFactoryVisitor.cs +++ b/src/Compilers/CSharp/Portable/Binder/BinderFactory.BinderFactoryVisitor.cs @@ -758,9 +758,6 @@ public override Binder VisitInterfaceDeclaration(InterfaceDeclarationSyntax node public override Binder VisitRecordDeclaration(RecordDeclarationSyntax node) => VisitTypeDeclarationCore(node); - public override Binder VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) - => VisitTypeDeclarationCore(node); - public override Binder VisitNamespaceDeclaration(NamespaceDeclarationSyntax parent) { if (!LookupPosition.IsInNamespaceDeclaration(_position, parent)) @@ -1142,8 +1139,7 @@ private Binder GetParameterNameAttributeValueBinder(MemberDeclarationSyntax memb return new WithParametersBinder(method.Parameters, nextBinder); } - if (memberSyntax is RecordDeclarationSyntax { ParameterList: { ParameterCount: > 0 } } - or RecordStructDeclarationSyntax { ParameterList: { ParameterCount: > 0 } }) + if (memberSyntax is RecordDeclarationSyntax { ParameterList: { ParameterCount: > 0 } }) { Binder outerBinder = VisitCore(memberSyntax); SourceNamedTypeSymbol recordType = ((NamespaceOrTypeSymbol)outerBinder.ContainingMemberOrLambda).GetSourceTypeMember((TypeDeclarationSyntax)memberSyntax); diff --git a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs index 7fe901453d451..61f0a48e49946 100644 --- a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs @@ -1255,9 +1255,8 @@ MemberSemanticModel createMethodBodySemanticModel(CSharpSyntaxNode memberDecl, S } } - private SynthesizedRecordConstructor TryGetSynthesizedRecordConstructor(TypeDeclarationSyntax node) + private SynthesizedRecordConstructor TryGetSynthesizedRecordConstructor(RecordDeclarationSyntax node) { - Debug.Assert(node is RecordDeclarationSyntax or RecordStructDeclarationSyntax); NamedTypeSymbol recordType = GetDeclaredType(node); var symbol = recordType.GetMembersUnordered().OfType().SingleOrDefault(); @@ -2027,10 +2026,6 @@ private ParameterSymbol GetMethodParameterSymbol( { method = TryGetSynthesizedRecordConstructor(recordDecl); } - else if (memberDecl is RecordStructDeclarationSyntax recordStructDecl && recordStructDecl.ParameterList == paramList) - { - method = TryGetSynthesizedRecordConstructor(recordStructDecl); - } else { method = (GetDeclaredSymbol(memberDecl, cancellationToken) as IMethodSymbol).GetSymbol(); @@ -2435,33 +2430,6 @@ internal override Func GetSyntaxNodesToAnalyzeFilter(SyntaxNod } break; - case RecordStructDeclarationSyntax recordStructDeclaration when TryGetSynthesizedRecordConstructor(recordStructDeclaration) is SynthesizedRecordConstructor ctor: - switch (declaredSymbol.Kind) - { - case SymbolKind.Method: - Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor); - return (node) => - { - // Accept only nodes that either match, or above/below of a 'parameter list'. - if (node.Parent == recordStructDeclaration) - { - return node == recordStructDeclaration.ParameterList; - } - - return true; - }; - - case SymbolKind.NamedType: - Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor.ContainingSymbol); - // Accept nodes that do not match a 'parameter list'. - return (node) => node != recordStructDeclaration.ParameterList; - - default: - ExceptionUtilities.UnexpectedValue(declaredSymbol.Kind); - break; - } - break; - case PrimaryConstructorBaseTypeSyntax { Parent: BaseListSyntax { Parent: RecordDeclarationSyntax recordDeclaration } } baseType when recordDeclaration.PrimaryConstructorBaseType == declaredNode && TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor ctor: if ((object)declaredSymbol.GetSymbol() == (object)ctor) @@ -2474,10 +2442,6 @@ internal override Func GetSyntaxNodesToAnalyzeFilter(SyntaxNod case ParameterSyntax param when declaredSymbol.Kind == SymbolKind.Property && param.Parent?.Parent is RecordDeclarationSyntax recordDeclaration && recordDeclaration.ParameterList == param.Parent: Debug.Assert(declaredSymbol.GetSymbol() is SynthesizedRecordPropertySymbol); return (node) => false; - - case ParameterSyntax param when declaredSymbol.Kind == SymbolKind.Property && param.Parent?.Parent is RecordStructDeclarationSyntax recordStructDeclaration && recordStructDeclaration.ParameterList == param.Parent: - Debug.Assert(declaredSymbol.GetSymbol() is SynthesizedRecordPropertySymbol); - return (node) => false; } return null; diff --git a/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs b/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs index 223b2acda3f6c..e318b10ad3a13 100644 --- a/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs +++ b/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs @@ -1918,7 +1918,7 @@ internal static BoundExpression BindImplicitConstructorInitializer( NamedTypeSymbol baseType = containingType.BaseTypeNoUseSiteDiagnostics; SourceMemberMethodSymbol sourceConstructor = constructor as SourceMemberMethodSymbol; - Debug.Assert(sourceConstructor?.SyntaxNode is RecordDeclarationSyntax or RecordStructDeclarationSyntax + Debug.Assert(sourceConstructor?.SyntaxNode is RecordDeclarationSyntax || ((ConstructorDeclarationSyntax)sourceConstructor?.SyntaxNode)?.Initializer == null); // The common case is that the type inherits directly from object. diff --git a/src/Compilers/CSharp/Portable/Declarations/DeclarationTreeBuilder.cs b/src/Compilers/CSharp/Portable/Declarations/DeclarationTreeBuilder.cs index a40633d9772e7..6454e260981af 100644 --- a/src/Compilers/CSharp/Portable/Declarations/DeclarationTreeBuilder.cs +++ b/src/Compilers/CSharp/Portable/Declarations/DeclarationTreeBuilder.cs @@ -380,10 +380,16 @@ public override SingleNamespaceOrTypeDeclaration VisitInterfaceDeclaration(Inter } public override SingleNamespaceOrTypeDeclaration VisitRecordDeclaration(RecordDeclarationSyntax node) - => VisitTypeDeclaration(node, DeclarationKind.Record); + { + var declarationKind = node.Kind() switch + { + SyntaxKind.RecordDeclaration => DeclarationKind.Record, + SyntaxKind.RecordStructDeclaration => DeclarationKind.RecordStruct, + _ => throw ExceptionUtilities.UnexpectedValue(node.Kind()) + }; - public override SingleNamespaceOrTypeDeclaration VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) - => VisitTypeDeclaration(node, DeclarationKind.RecordStruct); + return VisitTypeDeclaration(node, declarationKind); + } private SingleNamespaceOrTypeDeclaration VisitTypeDeclaration(TypeDeclarationSyntax node, DeclarationKind kind) { @@ -407,7 +413,7 @@ private SingleNamespaceOrTypeDeclaration VisitTypeDeclaration(TypeDeclarationSyn // A record with parameters at least has a primary constructor if (((declFlags & SingleTypeDeclaration.TypeDeclarationFlags.HasAnyNontypeMembers) == 0) && - node is RecordDeclarationSyntax { ParameterList: { } } or RecordStructDeclarationSyntax { ParameterList: { } }) + node is RecordDeclarationSyntax { ParameterList: { } }) { declFlags |= SingleTypeDeclaration.TypeDeclarationFlags.HasAnyNontypeMembers; } diff --git a/src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4 b/src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4 index d92d663d36292..bb0d6ccfbd3cf 100644 --- a/src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4 +++ b/src/Compilers/CSharp/Portable/Generated/CSharp.Generated.g4 @@ -297,7 +297,6 @@ type_declaration : class_declaration | interface_declaration | record_declaration - | record_struct_declaration | struct_declaration ; @@ -310,11 +309,7 @@ interface_declaration ; record_declaration - : attribute_list* modifier* syntax_token 'class'? identifier_token type_parameter_list? parameter_list? base_list? type_parameter_constraint_clause* '{'? member_declaration* '}'? ';'? - ; - -record_struct_declaration - : attribute_list* modifier* syntax_token 'struct' identifier_token type_parameter_list? parameter_list? base_list? type_parameter_constraint_clause* '{'? member_declaration* '}'? ';'? + : attribute_list* modifier* syntax_token ('class' | 'struct')? identifier_token type_parameter_list? parameter_list? base_list? type_parameter_constraint_clause* '{'? member_declaration* '}'? ';'? ; struct_declaration diff --git a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Internal.Generated.cs b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Internal.Generated.cs index a013559ffe2a4..16342a867dfd9 100644 --- a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Internal.Generated.cs +++ b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Internal.Generated.cs @@ -21547,7 +21547,7 @@ internal sealed partial class RecordDeclarationSyntax : TypeDeclarationSyntax internal readonly GreenNode? attributeLists; internal readonly GreenNode? modifiers; internal readonly SyntaxToken keyword; - internal readonly SyntaxToken? classKeyword; + internal readonly SyntaxToken? classOrStructKeyword; internal readonly SyntaxToken identifier; internal readonly TypeParameterListSyntax? typeParameterList; internal readonly ParameterListSyntax? parameterList; @@ -21558,7 +21558,7 @@ internal sealed partial class RecordDeclarationSyntax : TypeDeclarationSyntax internal readonly SyntaxToken? closeBraceToken; internal readonly SyntaxToken? semicolonToken; - internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, DiagnosticInfo[]? diagnostics, SyntaxAnnotation[]? annotations) + internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, DiagnosticInfo[]? diagnostics, SyntaxAnnotation[]? annotations) : base(kind, diagnostics, annotations) { this.SlotCount = 13; @@ -21574,10 +21574,10 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre } this.AdjustFlagsAndWidth(keyword); this.keyword = keyword; - if (classKeyword != null) + if (classOrStructKeyword != null) { - this.AdjustFlagsAndWidth(classKeyword); - this.classKeyword = classKeyword; + this.AdjustFlagsAndWidth(classOrStructKeyword); + this.classOrStructKeyword = classOrStructKeyword; } this.AdjustFlagsAndWidth(identifier); this.identifier = identifier; @@ -21623,7 +21623,7 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre } } - internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, SyntaxFactoryContext context) + internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, SyntaxFactoryContext context) : base(kind) { this.SetFactoryContext(context); @@ -21640,10 +21640,10 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre } this.AdjustFlagsAndWidth(keyword); this.keyword = keyword; - if (classKeyword != null) + if (classOrStructKeyword != null) { - this.AdjustFlagsAndWidth(classKeyword); - this.classKeyword = classKeyword; + this.AdjustFlagsAndWidth(classOrStructKeyword); + this.classOrStructKeyword = classOrStructKeyword; } this.AdjustFlagsAndWidth(identifier); this.identifier = identifier; @@ -21689,7 +21689,7 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre } } - internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) + internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken? classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) : base(kind) { this.SlotCount = 13; @@ -21705,10 +21705,10 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre } this.AdjustFlagsAndWidth(keyword); this.keyword = keyword; - if (classKeyword != null) + if (classOrStructKeyword != null) { - this.AdjustFlagsAndWidth(classKeyword); - this.classKeyword = classKeyword; + this.AdjustFlagsAndWidth(classOrStructKeyword); + this.classOrStructKeyword = classOrStructKeyword; } this.AdjustFlagsAndWidth(identifier); this.identifier = identifier; @@ -21757,7 +21757,7 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList AttributeLists => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.attributeLists); public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList Modifiers => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.modifiers); public override SyntaxToken Keyword => this.keyword; - public SyntaxToken? ClassKeyword => this.classKeyword; + public SyntaxToken? ClassOrStructKeyword => this.classOrStructKeyword; public override SyntaxToken Identifier => this.identifier; public override TypeParameterListSyntax? TypeParameterList => this.typeParameterList; public ParameterListSyntax? ParameterList => this.parameterList; @@ -21774,7 +21774,7 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre 0 => this.attributeLists, 1 => this.modifiers, 2 => this.keyword, - 3 => this.classKeyword, + 3 => this.classOrStructKeyword, 4 => this.identifier, 5 => this.typeParameterList, 6 => this.parameterList, @@ -21792,11 +21792,11 @@ internal RecordDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, Gre public override void Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordDeclaration(this); public override TResult Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordDeclaration(this); - public RecordDeclarationSyntax Update(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken classKeyword, SyntaxToken identifier, TypeParameterListSyntax typeParameterList, ParameterListSyntax parameterList, BaseListSyntax baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) + public RecordDeclarationSyntax Update(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax typeParameterList, ParameterListSyntax parameterList, BaseListSyntax baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) { - if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || classKeyword != this.ClassKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) + if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || classOrStructKeyword != this.ClassOrStructKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) { - var newNode = SyntaxFactory.RecordDeclaration(attributeLists, modifiers, keyword, classKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + var newNode = SyntaxFactory.RecordDeclaration(this.Kind, attributeLists, modifiers, keyword, classOrStructKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); var diags = GetDiagnostics(); if (diags?.Length > 0) newNode = newNode.WithDiagnosticsGreen(diags); @@ -21810,10 +21810,10 @@ public RecordDeclarationSyntax Update(Microsoft.CodeAnalysis.Syntax.InternalSynt } internal override GreenNode SetDiagnostics(DiagnosticInfo[]? diagnostics) - => new RecordDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.classKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, diagnostics, GetAnnotations()); + => new RecordDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.classOrStructKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, diagnostics, GetAnnotations()); internal override GreenNode SetAnnotations(SyntaxAnnotation[]? annotations) - => new RecordDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.classKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, GetDiagnostics(), annotations); + => new RecordDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.classOrStructKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, GetDiagnostics(), annotations); internal RecordDeclarationSyntax(ObjectReader reader) : base(reader) @@ -21834,11 +21834,11 @@ internal RecordDeclarationSyntax(ObjectReader reader) var keyword = (SyntaxToken)reader.ReadValue(); AdjustFlagsAndWidth(keyword); this.keyword = keyword; - var classKeyword = (SyntaxToken?)reader.ReadValue(); - if (classKeyword != null) + var classOrStructKeyword = (SyntaxToken?)reader.ReadValue(); + if (classOrStructKeyword != null) { - AdjustFlagsAndWidth(classKeyword); - this.classKeyword = classKeyword; + AdjustFlagsAndWidth(classOrStructKeyword); + this.classOrStructKeyword = classOrStructKeyword; } var identifier = (SyntaxToken)reader.ReadValue(); AdjustFlagsAndWidth(identifier); @@ -21899,7 +21899,7 @@ internal override void WriteTo(ObjectWriter writer) writer.WriteValue(this.attributeLists); writer.WriteValue(this.modifiers); writer.WriteValue(this.keyword); - writer.WriteValue(this.classKeyword); + writer.WriteValue(this.classOrStructKeyword); writer.WriteValue(this.identifier); writer.WriteValue(this.typeParameterList); writer.WriteValue(this.parameterList); @@ -21917,369 +21917,6 @@ static RecordDeclarationSyntax() } } - internal sealed partial class RecordStructDeclarationSyntax : TypeDeclarationSyntax - { - internal readonly GreenNode? attributeLists; - internal readonly GreenNode? modifiers; - internal readonly SyntaxToken keyword; - internal readonly SyntaxToken structKeyword; - internal readonly SyntaxToken identifier; - internal readonly TypeParameterListSyntax? typeParameterList; - internal readonly ParameterListSyntax? parameterList; - internal readonly BaseListSyntax? baseList; - internal readonly GreenNode? constraintClauses; - internal readonly SyntaxToken? openBraceToken; - internal readonly GreenNode? members; - internal readonly SyntaxToken? closeBraceToken; - internal readonly SyntaxToken? semicolonToken; - - internal RecordStructDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, DiagnosticInfo[]? diagnostics, SyntaxAnnotation[]? annotations) - : base(kind, diagnostics, annotations) - { - this.SlotCount = 13; - if (attributeLists != null) - { - this.AdjustFlagsAndWidth(attributeLists); - this.attributeLists = attributeLists; - } - if (modifiers != null) - { - this.AdjustFlagsAndWidth(modifiers); - this.modifiers = modifiers; - } - this.AdjustFlagsAndWidth(keyword); - this.keyword = keyword; - this.AdjustFlagsAndWidth(structKeyword); - this.structKeyword = structKeyword; - this.AdjustFlagsAndWidth(identifier); - this.identifier = identifier; - if (typeParameterList != null) - { - this.AdjustFlagsAndWidth(typeParameterList); - this.typeParameterList = typeParameterList; - } - if (parameterList != null) - { - this.AdjustFlagsAndWidth(parameterList); - this.parameterList = parameterList; - } - if (baseList != null) - { - this.AdjustFlagsAndWidth(baseList); - this.baseList = baseList; - } - if (constraintClauses != null) - { - this.AdjustFlagsAndWidth(constraintClauses); - this.constraintClauses = constraintClauses; - } - if (openBraceToken != null) - { - this.AdjustFlagsAndWidth(openBraceToken); - this.openBraceToken = openBraceToken; - } - if (members != null) - { - this.AdjustFlagsAndWidth(members); - this.members = members; - } - if (closeBraceToken != null) - { - this.AdjustFlagsAndWidth(closeBraceToken); - this.closeBraceToken = closeBraceToken; - } - if (semicolonToken != null) - { - this.AdjustFlagsAndWidth(semicolonToken); - this.semicolonToken = semicolonToken; - } - } - - internal RecordStructDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken, SyntaxFactoryContext context) - : base(kind) - { - this.SetFactoryContext(context); - this.SlotCount = 13; - if (attributeLists != null) - { - this.AdjustFlagsAndWidth(attributeLists); - this.attributeLists = attributeLists; - } - if (modifiers != null) - { - this.AdjustFlagsAndWidth(modifiers); - this.modifiers = modifiers; - } - this.AdjustFlagsAndWidth(keyword); - this.keyword = keyword; - this.AdjustFlagsAndWidth(structKeyword); - this.structKeyword = structKeyword; - this.AdjustFlagsAndWidth(identifier); - this.identifier = identifier; - if (typeParameterList != null) - { - this.AdjustFlagsAndWidth(typeParameterList); - this.typeParameterList = typeParameterList; - } - if (parameterList != null) - { - this.AdjustFlagsAndWidth(parameterList); - this.parameterList = parameterList; - } - if (baseList != null) - { - this.AdjustFlagsAndWidth(baseList); - this.baseList = baseList; - } - if (constraintClauses != null) - { - this.AdjustFlagsAndWidth(constraintClauses); - this.constraintClauses = constraintClauses; - } - if (openBraceToken != null) - { - this.AdjustFlagsAndWidth(openBraceToken); - this.openBraceToken = openBraceToken; - } - if (members != null) - { - this.AdjustFlagsAndWidth(members); - this.members = members; - } - if (closeBraceToken != null) - { - this.AdjustFlagsAndWidth(closeBraceToken); - this.closeBraceToken = closeBraceToken; - } - if (semicolonToken != null) - { - this.AdjustFlagsAndWidth(semicolonToken); - this.semicolonToken = semicolonToken; - } - } - - internal RecordStructDeclarationSyntax(SyntaxKind kind, GreenNode? attributeLists, GreenNode? modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, GreenNode? constraintClauses, SyntaxToken? openBraceToken, GreenNode? members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) - : base(kind) - { - this.SlotCount = 13; - if (attributeLists != null) - { - this.AdjustFlagsAndWidth(attributeLists); - this.attributeLists = attributeLists; - } - if (modifiers != null) - { - this.AdjustFlagsAndWidth(modifiers); - this.modifiers = modifiers; - } - this.AdjustFlagsAndWidth(keyword); - this.keyword = keyword; - this.AdjustFlagsAndWidth(structKeyword); - this.structKeyword = structKeyword; - this.AdjustFlagsAndWidth(identifier); - this.identifier = identifier; - if (typeParameterList != null) - { - this.AdjustFlagsAndWidth(typeParameterList); - this.typeParameterList = typeParameterList; - } - if (parameterList != null) - { - this.AdjustFlagsAndWidth(parameterList); - this.parameterList = parameterList; - } - if (baseList != null) - { - this.AdjustFlagsAndWidth(baseList); - this.baseList = baseList; - } - if (constraintClauses != null) - { - this.AdjustFlagsAndWidth(constraintClauses); - this.constraintClauses = constraintClauses; - } - if (openBraceToken != null) - { - this.AdjustFlagsAndWidth(openBraceToken); - this.openBraceToken = openBraceToken; - } - if (members != null) - { - this.AdjustFlagsAndWidth(members); - this.members = members; - } - if (closeBraceToken != null) - { - this.AdjustFlagsAndWidth(closeBraceToken); - this.closeBraceToken = closeBraceToken; - } - if (semicolonToken != null) - { - this.AdjustFlagsAndWidth(semicolonToken); - this.semicolonToken = semicolonToken; - } - } - - public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList AttributeLists => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.attributeLists); - public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList Modifiers => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.modifiers); - public override SyntaxToken Keyword => this.keyword; - public SyntaxToken StructKeyword => this.structKeyword; - public override SyntaxToken Identifier => this.identifier; - public override TypeParameterListSyntax? TypeParameterList => this.typeParameterList; - public ParameterListSyntax? ParameterList => this.parameterList; - public override BaseListSyntax? BaseList => this.baseList; - public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList ConstraintClauses => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.constraintClauses); - public override SyntaxToken? OpenBraceToken => this.openBraceToken; - public override Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList Members => new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(this.members); - public override SyntaxToken? CloseBraceToken => this.closeBraceToken; - public override SyntaxToken? SemicolonToken => this.semicolonToken; - - internal override GreenNode? GetSlot(int index) - => index switch - { - 0 => this.attributeLists, - 1 => this.modifiers, - 2 => this.keyword, - 3 => this.structKeyword, - 4 => this.identifier, - 5 => this.typeParameterList, - 6 => this.parameterList, - 7 => this.baseList, - 8 => this.constraintClauses, - 9 => this.openBraceToken, - 10 => this.members, - 11 => this.closeBraceToken, - 12 => this.semicolonToken, - _ => null, - }; - - internal override SyntaxNode CreateRed(SyntaxNode? parent, int position) => new CSharp.Syntax.RecordStructDeclarationSyntax(this, parent, position); - - public override void Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordStructDeclaration(this); - public override TResult Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordStructDeclaration(this); - - public RecordStructDeclarationSyntax Update(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax typeParameterList, ParameterListSyntax parameterList, BaseListSyntax baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) - { - if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || structKeyword != this.StructKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) - { - var newNode = SyntaxFactory.RecordStructDeclaration(attributeLists, modifiers, keyword, structKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); - var diags = GetDiagnostics(); - if (diags?.Length > 0) - newNode = newNode.WithDiagnosticsGreen(diags); - var annotations = GetAnnotations(); - if (annotations?.Length > 0) - newNode = newNode.WithAnnotationsGreen(annotations); - return newNode; - } - - return this; - } - - internal override GreenNode SetDiagnostics(DiagnosticInfo[]? diagnostics) - => new RecordStructDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.structKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, diagnostics, GetAnnotations()); - - internal override GreenNode SetAnnotations(SyntaxAnnotation[]? annotations) - => new RecordStructDeclarationSyntax(this.Kind, this.attributeLists, this.modifiers, this.keyword, this.structKeyword, this.identifier, this.typeParameterList, this.parameterList, this.baseList, this.constraintClauses, this.openBraceToken, this.members, this.closeBraceToken, this.semicolonToken, GetDiagnostics(), annotations); - - internal RecordStructDeclarationSyntax(ObjectReader reader) - : base(reader) - { - this.SlotCount = 13; - var attributeLists = (GreenNode?)reader.ReadValue(); - if (attributeLists != null) - { - AdjustFlagsAndWidth(attributeLists); - this.attributeLists = attributeLists; - } - var modifiers = (GreenNode?)reader.ReadValue(); - if (modifiers != null) - { - AdjustFlagsAndWidth(modifiers); - this.modifiers = modifiers; - } - var keyword = (SyntaxToken)reader.ReadValue(); - AdjustFlagsAndWidth(keyword); - this.keyword = keyword; - var structKeyword = (SyntaxToken)reader.ReadValue(); - AdjustFlagsAndWidth(structKeyword); - this.structKeyword = structKeyword; - var identifier = (SyntaxToken)reader.ReadValue(); - AdjustFlagsAndWidth(identifier); - this.identifier = identifier; - var typeParameterList = (TypeParameterListSyntax?)reader.ReadValue(); - if (typeParameterList != null) - { - AdjustFlagsAndWidth(typeParameterList); - this.typeParameterList = typeParameterList; - } - var parameterList = (ParameterListSyntax?)reader.ReadValue(); - if (parameterList != null) - { - AdjustFlagsAndWidth(parameterList); - this.parameterList = parameterList; - } - var baseList = (BaseListSyntax?)reader.ReadValue(); - if (baseList != null) - { - AdjustFlagsAndWidth(baseList); - this.baseList = baseList; - } - var constraintClauses = (GreenNode?)reader.ReadValue(); - if (constraintClauses != null) - { - AdjustFlagsAndWidth(constraintClauses); - this.constraintClauses = constraintClauses; - } - var openBraceToken = (SyntaxToken?)reader.ReadValue(); - if (openBraceToken != null) - { - AdjustFlagsAndWidth(openBraceToken); - this.openBraceToken = openBraceToken; - } - var members = (GreenNode?)reader.ReadValue(); - if (members != null) - { - AdjustFlagsAndWidth(members); - this.members = members; - } - var closeBraceToken = (SyntaxToken?)reader.ReadValue(); - if (closeBraceToken != null) - { - AdjustFlagsAndWidth(closeBraceToken); - this.closeBraceToken = closeBraceToken; - } - var semicolonToken = (SyntaxToken?)reader.ReadValue(); - if (semicolonToken != null) - { - AdjustFlagsAndWidth(semicolonToken); - this.semicolonToken = semicolonToken; - } - } - - internal override void WriteTo(ObjectWriter writer) - { - base.WriteTo(writer); - writer.WriteValue(this.attributeLists); - writer.WriteValue(this.modifiers); - writer.WriteValue(this.keyword); - writer.WriteValue(this.structKeyword); - writer.WriteValue(this.identifier); - writer.WriteValue(this.typeParameterList); - writer.WriteValue(this.parameterList); - writer.WriteValue(this.baseList); - writer.WriteValue(this.constraintClauses); - writer.WriteValue(this.openBraceToken); - writer.WriteValue(this.members); - writer.WriteValue(this.closeBraceToken); - writer.WriteValue(this.semicolonToken); - } - - static RecordStructDeclarationSyntax() - { - ObjectBinder.RegisterTypeReader(typeof(RecordStructDeclarationSyntax), r => new RecordStructDeclarationSyntax(r)); - } - } - /// Enum type declaration syntax. internal sealed partial class EnumDeclarationSyntax : BaseTypeDeclarationSyntax { @@ -33502,7 +33139,6 @@ internal partial class CSharpSyntaxVisitor public virtual TResult VisitStructDeclaration(StructDeclarationSyntax node) => this.DefaultVisit(node); public virtual TResult VisitInterfaceDeclaration(InterfaceDeclarationSyntax node) => this.DefaultVisit(node); public virtual TResult VisitRecordDeclaration(RecordDeclarationSyntax node) => this.DefaultVisit(node); - public virtual TResult VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) => this.DefaultVisit(node); public virtual TResult VisitEnumDeclaration(EnumDeclarationSyntax node) => this.DefaultVisit(node); public virtual TResult VisitDelegateDeclaration(DelegateDeclarationSyntax node) => this.DefaultVisit(node); public virtual TResult VisitEnumMemberDeclaration(EnumMemberDeclarationSyntax node) => this.DefaultVisit(node); @@ -33738,7 +33374,6 @@ internal partial class CSharpSyntaxVisitor public virtual void VisitStructDeclaration(StructDeclarationSyntax node) => this.DefaultVisit(node); public virtual void VisitInterfaceDeclaration(InterfaceDeclarationSyntax node) => this.DefaultVisit(node); public virtual void VisitRecordDeclaration(RecordDeclarationSyntax node) => this.DefaultVisit(node); - public virtual void VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) => this.DefaultVisit(node); public virtual void VisitEnumDeclaration(EnumDeclarationSyntax node) => this.DefaultVisit(node); public virtual void VisitDelegateDeclaration(DelegateDeclarationSyntax node) => this.DefaultVisit(node); public virtual void VisitEnumMemberDeclaration(EnumMemberDeclarationSyntax node) => this.DefaultVisit(node); @@ -34288,10 +33923,7 @@ public override CSharpSyntaxNode VisitInterfaceDeclaration(InterfaceDeclarationS => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), (SyntaxToken)Visit(node.Keyword), (SyntaxToken)Visit(node.Identifier), (TypeParameterListSyntax)Visit(node.TypeParameterList), (BaseListSyntax)Visit(node.BaseList), VisitList(node.ConstraintClauses), (SyntaxToken)Visit(node.OpenBraceToken), VisitList(node.Members), (SyntaxToken)Visit(node.CloseBraceToken), (SyntaxToken)Visit(node.SemicolonToken)); public override CSharpSyntaxNode VisitRecordDeclaration(RecordDeclarationSyntax node) - => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), (SyntaxToken)Visit(node.Keyword), (SyntaxToken)Visit(node.ClassKeyword), (SyntaxToken)Visit(node.Identifier), (TypeParameterListSyntax)Visit(node.TypeParameterList), (ParameterListSyntax)Visit(node.ParameterList), (BaseListSyntax)Visit(node.BaseList), VisitList(node.ConstraintClauses), (SyntaxToken)Visit(node.OpenBraceToken), VisitList(node.Members), (SyntaxToken)Visit(node.CloseBraceToken), (SyntaxToken)Visit(node.SemicolonToken)); - - public override CSharpSyntaxNode VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) - => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), (SyntaxToken)Visit(node.Keyword), (SyntaxToken)Visit(node.StructKeyword), (SyntaxToken)Visit(node.Identifier), (TypeParameterListSyntax)Visit(node.TypeParameterList), (ParameterListSyntax)Visit(node.ParameterList), (BaseListSyntax)Visit(node.BaseList), VisitList(node.ConstraintClauses), (SyntaxToken)Visit(node.OpenBraceToken), VisitList(node.Members), (SyntaxToken)Visit(node.CloseBraceToken), (SyntaxToken)Visit(node.SemicolonToken)); + => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), (SyntaxToken)Visit(node.Keyword), (SyntaxToken)Visit(node.ClassOrStructKeyword), (SyntaxToken)Visit(node.Identifier), (TypeParameterListSyntax)Visit(node.TypeParameterList), (ParameterListSyntax)Visit(node.ParameterList), (BaseListSyntax)Visit(node.BaseList), VisitList(node.ConstraintClauses), (SyntaxToken)Visit(node.OpenBraceToken), VisitList(node.Members), (SyntaxToken)Visit(node.CloseBraceToken), (SyntaxToken)Visit(node.SemicolonToken)); public override CSharpSyntaxNode VisitEnumDeclaration(EnumDeclarationSyntax node) => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), (SyntaxToken)Visit(node.EnumKeyword), (SyntaxToken)Visit(node.Identifier), (BaseListSyntax)Visit(node.BaseList), (SyntaxToken)Visit(node.OpenBraceToken), VisitList(node.Members), (SyntaxToken)Visit(node.CloseBraceToken), (SyntaxToken)Visit(node.SemicolonToken)); @@ -37854,59 +37486,26 @@ public InterfaceDeclarationSyntax InterfaceDeclaration(Microsoft.CodeAnalysis.Sy return new InterfaceDeclarationSyntax(SyntaxKind.InterfaceDeclaration, attributeLists.Node, modifiers.Node, keyword, identifier, typeParameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken, this.context); } - public RecordDeclarationSyntax RecordDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken? classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) + public RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken? classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) { + switch (kind) + { + case SyntaxKind.RecordDeclaration: + case SyntaxKind.RecordStructDeclaration: break; + default: throw new ArgumentException(nameof(kind)); + } #if DEBUG if (keyword == null) throw new ArgumentNullException(nameof(keyword)); - if (classKeyword != null) + if (classOrStructKeyword != null) { - switch (classKeyword.Kind) + switch (classOrStructKeyword.Kind) { case SyntaxKind.ClassKeyword: + case SyntaxKind.StructKeyword: case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(classKeyword)); - } - } - if (identifier == null) throw new ArgumentNullException(nameof(identifier)); - if (identifier.Kind != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); - if (openBraceToken != null) - { - switch (openBraceToken.Kind) - { - case SyntaxKind.OpenBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(openBraceToken)); - } - } - if (closeBraceToken != null) - { - switch (closeBraceToken.Kind) - { - case SyntaxKind.CloseBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(closeBraceToken)); - } - } - if (semicolonToken != null) - { - switch (semicolonToken.Kind) - { - case SyntaxKind.SemicolonToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(semicolonToken)); + default: throw new ArgumentException(nameof(classOrStructKeyword)); } } -#endif - - return new RecordDeclarationSyntax(SyntaxKind.RecordDeclaration, attributeLists.Node, modifiers.Node, keyword, classKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken, this.context); - } - - public RecordStructDeclarationSyntax RecordStructDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) - { -#if DEBUG - if (keyword == null) throw new ArgumentNullException(nameof(keyword)); - if (structKeyword == null) throw new ArgumentNullException(nameof(structKeyword)); - if (structKeyword.Kind != SyntaxKind.StructKeyword) throw new ArgumentException(nameof(structKeyword)); if (identifier == null) throw new ArgumentNullException(nameof(identifier)); if (identifier.Kind != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); if (openBraceToken != null) @@ -37938,7 +37537,7 @@ public RecordStructDeclarationSyntax RecordStructDeclaration(Microsoft.CodeAnaly } #endif - return new RecordStructDeclarationSyntax(SyntaxKind.RecordStructDeclaration, attributeLists.Node, modifiers.Node, keyword, structKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken, this.context); + return new RecordDeclarationSyntax(kind, attributeLists.Node, modifiers.Node, keyword, classOrStructKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken, this.context); } public EnumDeclarationSyntax EnumDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken enumKeyword, SyntaxToken identifier, BaseListSyntax? baseList, SyntaxToken openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SeparatedSyntaxList members, SyntaxToken closeBraceToken, SyntaxToken? semicolonToken) @@ -42772,59 +42371,26 @@ public static InterfaceDeclarationSyntax InterfaceDeclaration(Microsoft.CodeAnal return new InterfaceDeclarationSyntax(SyntaxKind.InterfaceDeclaration, attributeLists.Node, modifiers.Node, keyword, identifier, typeParameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken); } - public static RecordDeclarationSyntax RecordDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken? classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) + public static RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken? classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) { + switch (kind) + { + case SyntaxKind.RecordDeclaration: + case SyntaxKind.RecordStructDeclaration: break; + default: throw new ArgumentException(nameof(kind)); + } #if DEBUG if (keyword == null) throw new ArgumentNullException(nameof(keyword)); - if (classKeyword != null) + if (classOrStructKeyword != null) { - switch (classKeyword.Kind) + switch (classOrStructKeyword.Kind) { case SyntaxKind.ClassKeyword: + case SyntaxKind.StructKeyword: case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(classKeyword)); - } - } - if (identifier == null) throw new ArgumentNullException(nameof(identifier)); - if (identifier.Kind != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); - if (openBraceToken != null) - { - switch (openBraceToken.Kind) - { - case SyntaxKind.OpenBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(openBraceToken)); - } - } - if (closeBraceToken != null) - { - switch (closeBraceToken.Kind) - { - case SyntaxKind.CloseBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(closeBraceToken)); - } - } - if (semicolonToken != null) - { - switch (semicolonToken.Kind) - { - case SyntaxKind.SemicolonToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(semicolonToken)); + default: throw new ArgumentException(nameof(classOrStructKeyword)); } } -#endif - - return new RecordDeclarationSyntax(SyntaxKind.RecordDeclaration, attributeLists.Node, modifiers.Node, keyword, classKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken); - } - - public static RecordStructDeclarationSyntax RecordStructDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList constraintClauses, SyntaxToken? openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList members, SyntaxToken? closeBraceToken, SyntaxToken? semicolonToken) - { -#if DEBUG - if (keyword == null) throw new ArgumentNullException(nameof(keyword)); - if (structKeyword == null) throw new ArgumentNullException(nameof(structKeyword)); - if (structKeyword.Kind != SyntaxKind.StructKeyword) throw new ArgumentException(nameof(structKeyword)); if (identifier == null) throw new ArgumentNullException(nameof(identifier)); if (identifier.Kind != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); if (openBraceToken != null) @@ -42856,7 +42422,7 @@ public static RecordStructDeclarationSyntax RecordStructDeclaration(Microsoft.Co } #endif - return new RecordStructDeclarationSyntax(SyntaxKind.RecordStructDeclaration, attributeLists.Node, modifiers.Node, keyword, structKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken); + return new RecordDeclarationSyntax(kind, attributeLists.Node, modifiers.Node, keyword, classOrStructKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses.Node, openBraceToken, members.Node, closeBraceToken, semicolonToken); } public static EnumDeclarationSyntax EnumDeclaration(Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList attributeLists, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList modifiers, SyntaxToken enumKeyword, SyntaxToken identifier, BaseListSyntax? baseList, SyntaxToken openBraceToken, Microsoft.CodeAnalysis.Syntax.InternalSyntax.SeparatedSyntaxList members, SyntaxToken closeBraceToken, SyntaxToken? semicolonToken) @@ -44514,7 +44080,6 @@ internal static IEnumerable GetNodeTypes() typeof(StructDeclarationSyntax), typeof(InterfaceDeclarationSyntax), typeof(RecordDeclarationSyntax), - typeof(RecordStructDeclarationSyntax), typeof(EnumDeclarationSyntax), typeof(DelegateDeclarationSyntax), typeof(EnumMemberDeclarationSyntax), diff --git a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Main.Generated.cs b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Main.Generated.cs index f35fc60a2da0d..fae9394308011 100644 --- a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Main.Generated.cs +++ b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Main.Generated.cs @@ -489,9 +489,6 @@ public partial class CSharpSyntaxVisitor /// Called when the visitor visits a RecordDeclarationSyntax node. public virtual TResult? VisitRecordDeclaration(RecordDeclarationSyntax node) => this.DefaultVisit(node); - /// Called when the visitor visits a RecordStructDeclarationSyntax node. - public virtual TResult? VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) => this.DefaultVisit(node); - /// Called when the visitor visits a EnumDeclarationSyntax node. public virtual TResult? VisitEnumDeclaration(EnumDeclarationSyntax node) => this.DefaultVisit(node); @@ -1188,9 +1185,6 @@ public partial class CSharpSyntaxVisitor /// Called when the visitor visits a RecordDeclarationSyntax node. public virtual void VisitRecordDeclaration(RecordDeclarationSyntax node) => this.DefaultVisit(node); - /// Called when the visitor visits a RecordStructDeclarationSyntax node. - public virtual void VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) => this.DefaultVisit(node); - /// Called when the visitor visits a EnumDeclarationSyntax node. public virtual void VisitEnumDeclaration(EnumDeclarationSyntax node) => this.DefaultVisit(node); @@ -1885,10 +1879,7 @@ public partial class CSharpSyntaxRewriter : CSharpSyntaxVisitor => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), VisitToken(node.Keyword), VisitToken(node.Identifier), (TypeParameterListSyntax?)Visit(node.TypeParameterList), (BaseListSyntax?)Visit(node.BaseList), VisitList(node.ConstraintClauses), VisitToken(node.OpenBraceToken), VisitList(node.Members), VisitToken(node.CloseBraceToken), VisitToken(node.SemicolonToken)); public override SyntaxNode? VisitRecordDeclaration(RecordDeclarationSyntax node) - => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), VisitToken(node.Keyword), VisitToken(node.ClassKeyword), VisitToken(node.Identifier), (TypeParameterListSyntax?)Visit(node.TypeParameterList), (ParameterListSyntax?)Visit(node.ParameterList), (BaseListSyntax?)Visit(node.BaseList), VisitList(node.ConstraintClauses), VisitToken(node.OpenBraceToken), VisitList(node.Members), VisitToken(node.CloseBraceToken), VisitToken(node.SemicolonToken)); - - public override SyntaxNode? VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) - => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), VisitToken(node.Keyword), VisitToken(node.StructKeyword), VisitToken(node.Identifier), (TypeParameterListSyntax?)Visit(node.TypeParameterList), (ParameterListSyntax?)Visit(node.ParameterList), (BaseListSyntax?)Visit(node.BaseList), VisitList(node.ConstraintClauses), VisitToken(node.OpenBraceToken), VisitList(node.Members), VisitToken(node.CloseBraceToken), VisitToken(node.SemicolonToken)); + => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), VisitToken(node.Keyword), VisitToken(node.ClassOrStructKeyword), VisitToken(node.Identifier), (TypeParameterListSyntax?)Visit(node.TypeParameterList), (ParameterListSyntax?)Visit(node.ParameterList), (BaseListSyntax?)Visit(node.BaseList), VisitList(node.ConstraintClauses), VisitToken(node.OpenBraceToken), VisitList(node.Members), VisitToken(node.CloseBraceToken), VisitToken(node.SemicolonToken)); public override SyntaxNode? VisitEnumDeclaration(EnumDeclarationSyntax node) => node.Update(VisitList(node.AttributeLists), VisitList(node.Modifiers), VisitToken(node.EnumKeyword), VisitToken(node.Identifier), (BaseListSyntax?)Visit(node.BaseList), VisitToken(node.OpenBraceToken), VisitList(node.Members), VisitToken(node.CloseBraceToken), VisitToken(node.SemicolonToken)); @@ -4807,13 +4798,20 @@ public static InterfaceDeclarationSyntax InterfaceDeclaration(string identifier) => SyntaxFactory.InterfaceDeclaration(default, default(SyntaxTokenList), SyntaxFactory.Token(SyntaxKind.InterfaceKeyword), SyntaxFactory.Identifier(identifier), default, default, default, SyntaxFactory.Token(SyntaxKind.OpenBraceToken), default, SyntaxFactory.Token(SyntaxKind.CloseBraceToken), default); /// Creates a new RecordDeclarationSyntax instance. - public static RecordDeclarationSyntax RecordDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) + public static RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) { - switch (classKeyword.Kind()) + switch (kind) + { + case SyntaxKind.RecordDeclaration: + case SyntaxKind.RecordStructDeclaration: break; + default: throw new ArgumentException(nameof(kind)); + } + switch (classOrStructKeyword.Kind()) { case SyntaxKind.ClassKeyword: + case SyntaxKind.StructKeyword: case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(classKeyword)); + default: throw new ArgumentException(nameof(classOrStructKeyword)); } if (identifier.Kind() != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); switch (openBraceToken.Kind()) @@ -4834,58 +4832,28 @@ public static RecordDeclarationSyntax RecordDeclaration(SyntaxList(), modifiers.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken)keyword.Node!, (Syntax.InternalSyntax.SyntaxToken?)classKeyword.Node, (Syntax.InternalSyntax.SyntaxToken)identifier.Node!, typeParameterList == null ? null : (Syntax.InternalSyntax.TypeParameterListSyntax)typeParameterList.Green, parameterList == null ? null : (Syntax.InternalSyntax.ParameterListSyntax)parameterList.Green, baseList == null ? null : (Syntax.InternalSyntax.BaseListSyntax)baseList.Green, constraintClauses.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)openBraceToken.Node, members.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)closeBraceToken.Node, (Syntax.InternalSyntax.SyntaxToken?)semicolonToken.Node).CreateRed(); + return (RecordDeclarationSyntax)Syntax.InternalSyntax.SyntaxFactory.RecordDeclaration(kind, attributeLists.Node.ToGreenList(), modifiers.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken)keyword.Node!, (Syntax.InternalSyntax.SyntaxToken?)classOrStructKeyword.Node, (Syntax.InternalSyntax.SyntaxToken)identifier.Node!, typeParameterList == null ? null : (Syntax.InternalSyntax.TypeParameterListSyntax)typeParameterList.Green, parameterList == null ? null : (Syntax.InternalSyntax.ParameterListSyntax)parameterList.Green, baseList == null ? null : (Syntax.InternalSyntax.BaseListSyntax)baseList.Green, constraintClauses.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)openBraceToken.Node, members.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)closeBraceToken.Node, (Syntax.InternalSyntax.SyntaxToken?)semicolonToken.Node).CreateRed(); } /// Creates a new RecordDeclarationSyntax instance. - public static RecordDeclarationSyntax RecordDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxList members) - => SyntaxFactory.RecordDeclaration(attributeLists, modifiers, keyword, default, identifier, typeParameterList, parameterList, baseList, constraintClauses, default, members, default, default); + public static RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxList members) + => SyntaxFactory.RecordDeclaration(kind, attributeLists, modifiers, keyword, default, identifier, typeParameterList, parameterList, baseList, constraintClauses, default, members, default, default); /// Creates a new RecordDeclarationSyntax instance. - public static RecordDeclarationSyntax RecordDeclaration(SyntaxToken keyword, SyntaxToken identifier) - => SyntaxFactory.RecordDeclaration(default, default(SyntaxTokenList), keyword, default, identifier, default, default, default, default, default, default, default, default); + public static RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, SyntaxToken keyword, SyntaxToken identifier) + => SyntaxFactory.RecordDeclaration(kind, default, default(SyntaxTokenList), keyword, default, identifier, default, default, default, default, default, default, default, default); /// Creates a new RecordDeclarationSyntax instance. - public static RecordDeclarationSyntax RecordDeclaration(SyntaxToken keyword, string identifier) - => SyntaxFactory.RecordDeclaration(default, default(SyntaxTokenList), keyword, default, SyntaxFactory.Identifier(identifier), default, default, default, default, default, default, default, default); + public static RecordDeclarationSyntax RecordDeclaration(SyntaxKind kind, SyntaxToken keyword, string identifier) + => SyntaxFactory.RecordDeclaration(kind, default, default(SyntaxTokenList), keyword, default, SyntaxFactory.Identifier(identifier), default, default, default, default, default, default, default, default); - /// Creates a new RecordStructDeclarationSyntax instance. - public static RecordStructDeclarationSyntax RecordStructDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) - { - if (structKeyword.Kind() != SyntaxKind.StructKeyword) throw new ArgumentException(nameof(structKeyword)); - if (identifier.Kind() != SyntaxKind.IdentifierToken) throw new ArgumentException(nameof(identifier)); - switch (openBraceToken.Kind()) - { - case SyntaxKind.OpenBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(openBraceToken)); - } - switch (closeBraceToken.Kind()) - { - case SyntaxKind.CloseBraceToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(closeBraceToken)); - } - switch (semicolonToken.Kind()) + private static SyntaxKind GetRecordDeclarationClassOrStructKeywordKind(SyntaxKind kind) + => kind switch { - case SyntaxKind.SemicolonToken: - case SyntaxKind.None: break; - default: throw new ArgumentException(nameof(semicolonToken)); - } - return (RecordStructDeclarationSyntax)Syntax.InternalSyntax.SyntaxFactory.RecordStructDeclaration(attributeLists.Node.ToGreenList(), modifiers.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken)keyword.Node!, (Syntax.InternalSyntax.SyntaxToken)structKeyword.Node!, (Syntax.InternalSyntax.SyntaxToken)identifier.Node!, typeParameterList == null ? null : (Syntax.InternalSyntax.TypeParameterListSyntax)typeParameterList.Green, parameterList == null ? null : (Syntax.InternalSyntax.ParameterListSyntax)parameterList.Green, baseList == null ? null : (Syntax.InternalSyntax.BaseListSyntax)baseList.Green, constraintClauses.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)openBraceToken.Node, members.Node.ToGreenList(), (Syntax.InternalSyntax.SyntaxToken?)closeBraceToken.Node, (Syntax.InternalSyntax.SyntaxToken?)semicolonToken.Node).CreateRed(); - } - - /// Creates a new RecordStructDeclarationSyntax instance. - public static RecordStructDeclarationSyntax RecordStructDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxList members) - => SyntaxFactory.RecordStructDeclaration(attributeLists, modifiers, keyword, SyntaxFactory.Token(SyntaxKind.StructKeyword), identifier, typeParameterList, parameterList, baseList, constraintClauses, default, members, default, default); - - /// Creates a new RecordStructDeclarationSyntax instance. - public static RecordStructDeclarationSyntax RecordStructDeclaration(SyntaxToken keyword, SyntaxToken identifier) - => SyntaxFactory.RecordStructDeclaration(default, default(SyntaxTokenList), keyword, SyntaxFactory.Token(SyntaxKind.StructKeyword), identifier, default, default, default, default, default, default, default, default); - - /// Creates a new RecordStructDeclarationSyntax instance. - public static RecordStructDeclarationSyntax RecordStructDeclaration(SyntaxToken keyword, string identifier) - => SyntaxFactory.RecordStructDeclaration(default, default(SyntaxTokenList), keyword, SyntaxFactory.Token(SyntaxKind.StructKeyword), SyntaxFactory.Identifier(identifier), default, default, default, default, default, default, default, default); + SyntaxKind.RecordDeclaration => SyntaxKind.ClassKeyword, + SyntaxKind.RecordStructDeclaration => SyntaxKind.StructKeyword, + _ => throw new ArgumentOutOfRangeException(), + }; /// Creates a new EnumDeclarationSyntax instance. public static EnumDeclarationSyntax EnumDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken enumKeyword, SyntaxToken identifier, BaseListSyntax? baseList, SyntaxToken openBraceToken, SeparatedSyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) diff --git a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Syntax.Generated.cs b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Syntax.Generated.cs index 6bb6a0e055f64..7afd4b4cddb24 100644 --- a/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Syntax.Generated.cs +++ b/src/Compilers/CSharp/Portable/Generated/CSharpSyntaxGenerator/CSharpSyntaxGenerator.SourceGenerator/Syntax.xml.Syntax.Generated.cs @@ -10111,6 +10111,7 @@ public InterfaceDeclarationSyntax Update(SyntaxList attribu /// This node is associated with the following syntax kinds: /// /// + /// /// /// public sealed partial class RecordDeclarationSyntax : TypeDeclarationSyntax @@ -10140,11 +10141,11 @@ public override SyntaxTokenList Modifiers public override SyntaxToken Keyword => new SyntaxToken(this, ((Syntax.InternalSyntax.RecordDeclarationSyntax)this.Green).keyword, GetChildPosition(2), GetChildIndex(2)); - public SyntaxToken ClassKeyword + public SyntaxToken ClassOrStructKeyword { get { - var slot = ((Syntax.InternalSyntax.RecordDeclarationSyntax)this.Green).classKeyword; + var slot = ((Syntax.InternalSyntax.RecordDeclarationSyntax)this.Green).classOrStructKeyword; return slot != null ? new SyntaxToken(this, slot, GetChildPosition(3), GetChildIndex(3)) : default; } } @@ -10215,11 +10216,11 @@ public override SyntaxToken SemicolonToken public override void Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordDeclaration(this); public override TResult? Accept(CSharpSyntaxVisitor visitor) where TResult : default => visitor.VisitRecordDeclaration(this); - public RecordDeclarationSyntax Update(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken classKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) + public RecordDeclarationSyntax Update(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken classOrStructKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) { - if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || classKeyword != this.ClassKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) + if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || classOrStructKeyword != this.ClassOrStructKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) { - var newNode = SyntaxFactory.RecordDeclaration(attributeLists, modifiers, keyword, classKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + var newNode = SyntaxFactory.RecordDeclaration(this.Kind(), attributeLists, modifiers, keyword, classOrStructKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); var annotations = GetAnnotations(); return annotations?.Length > 0 ? newNode.WithAnnotations(annotations) : newNode; } @@ -10228,29 +10229,29 @@ public RecordDeclarationSyntax Update(SyntaxList attributeL } internal override MemberDeclarationSyntax WithAttributeListsCore(SyntaxList attributeLists) => WithAttributeLists(attributeLists); - public new RecordDeclarationSyntax WithAttributeLists(SyntaxList attributeLists) => Update(attributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithAttributeLists(SyntaxList attributeLists) => Update(attributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override MemberDeclarationSyntax WithModifiersCore(SyntaxTokenList modifiers) => WithModifiers(modifiers); - public new RecordDeclarationSyntax WithModifiers(SyntaxTokenList modifiers) => Update(this.AttributeLists, modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithModifiers(SyntaxTokenList modifiers) => Update(this.AttributeLists, modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override TypeDeclarationSyntax WithKeywordCore(SyntaxToken keyword) => WithKeyword(keyword); - public new RecordDeclarationSyntax WithKeyword(SyntaxToken keyword) => Update(this.AttributeLists, this.Modifiers, keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - public RecordDeclarationSyntax WithClassKeyword(SyntaxToken classKeyword) => Update(this.AttributeLists, this.Modifiers, this.Keyword, classKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithKeyword(SyntaxToken keyword) => Update(this.AttributeLists, this.Modifiers, keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public RecordDeclarationSyntax WithClassOrStructKeyword(SyntaxToken classOrStructKeyword) => Update(this.AttributeLists, this.Modifiers, this.Keyword, classOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override BaseTypeDeclarationSyntax WithIdentifierCore(SyntaxToken identifier) => WithIdentifier(identifier); - public new RecordDeclarationSyntax WithIdentifier(SyntaxToken identifier) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithIdentifier(SyntaxToken identifier) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override TypeDeclarationSyntax WithTypeParameterListCore(TypeParameterListSyntax? typeParameterList) => WithTypeParameterList(typeParameterList); - public new RecordDeclarationSyntax WithTypeParameterList(TypeParameterListSyntax? typeParameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, typeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - public RecordDeclarationSyntax WithParameterList(ParameterListSyntax? parameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, parameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithTypeParameterList(TypeParameterListSyntax? typeParameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, typeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public RecordDeclarationSyntax WithParameterList(ParameterListSyntax? parameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, parameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override BaseTypeDeclarationSyntax WithBaseListCore(BaseListSyntax? baseList) => WithBaseList(baseList); - public new RecordDeclarationSyntax WithBaseList(BaseListSyntax? baseList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, baseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithBaseList(BaseListSyntax? baseList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, baseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override TypeDeclarationSyntax WithConstraintClausesCore(SyntaxList constraintClauses) => WithConstraintClauses(constraintClauses); - public new RecordDeclarationSyntax WithConstraintClauses(SyntaxList constraintClauses) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, constraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithConstraintClauses(SyntaxList constraintClauses) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, constraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override BaseTypeDeclarationSyntax WithOpenBraceTokenCore(SyntaxToken openBraceToken) => WithOpenBraceToken(openBraceToken); - public new RecordDeclarationSyntax WithOpenBraceToken(SyntaxToken openBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, openBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithOpenBraceToken(SyntaxToken openBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, openBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); internal override TypeDeclarationSyntax WithMembersCore(SyntaxList members) => WithMembers(members); - public new RecordDeclarationSyntax WithMembers(SyntaxList members) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, members, this.CloseBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithMembers(SyntaxList members) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, members, this.CloseBraceToken, this.SemicolonToken); internal override BaseTypeDeclarationSyntax WithCloseBraceTokenCore(SyntaxToken closeBraceToken) => WithCloseBraceToken(closeBraceToken); - public new RecordDeclarationSyntax WithCloseBraceToken(SyntaxToken closeBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, closeBraceToken, this.SemicolonToken); + public new RecordDeclarationSyntax WithCloseBraceToken(SyntaxToken closeBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, closeBraceToken, this.SemicolonToken); internal override BaseTypeDeclarationSyntax WithSemicolonTokenCore(SyntaxToken semicolonToken) => WithSemicolonToken(semicolonToken); - public new RecordDeclarationSyntax WithSemicolonToken(SyntaxToken semicolonToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, semicolonToken); + public new RecordDeclarationSyntax WithSemicolonToken(SyntaxToken semicolonToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.ClassOrStructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, semicolonToken); internal override MemberDeclarationSyntax AddAttributeListsCore(params AttributeListSyntax[] items) => AddAttributeLists(items); public new RecordDeclarationSyntax AddAttributeLists(params AttributeListSyntax[] items) => WithAttributeLists(this.AttributeLists.AddRange(items)); @@ -10279,171 +10280,6 @@ public RecordDeclarationSyntax AddParameterListParameters(params ParameterSyntax public new RecordDeclarationSyntax AddMembers(params MemberDeclarationSyntax[] items) => WithMembers(this.Members.AddRange(items)); } - /// - /// This node is associated with the following syntax kinds: - /// - /// - /// - /// - public sealed partial class RecordStructDeclarationSyntax : TypeDeclarationSyntax - { - private SyntaxNode? attributeLists; - private TypeParameterListSyntax? typeParameterList; - private ParameterListSyntax? parameterList; - private BaseListSyntax? baseList; - private SyntaxNode? constraintClauses; - private SyntaxNode? members; - - internal RecordStructDeclarationSyntax(InternalSyntax.CSharpSyntaxNode green, SyntaxNode? parent, int position) - : base(green, parent, position) - { - } - - public override SyntaxList AttributeLists => new SyntaxList(GetRed(ref this.attributeLists, 0)); - - public override SyntaxTokenList Modifiers - { - get - { - var slot = this.Green.GetSlot(1); - return slot != null ? new SyntaxTokenList(this, slot, GetChildPosition(1), GetChildIndex(1)) : default; - } - } - - public override SyntaxToken Keyword => new SyntaxToken(this, ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).keyword, GetChildPosition(2), GetChildIndex(2)); - - public SyntaxToken StructKeyword => new SyntaxToken(this, ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).structKeyword, GetChildPosition(3), GetChildIndex(3)); - - public override SyntaxToken Identifier => new SyntaxToken(this, ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).identifier, GetChildPosition(4), GetChildIndex(4)); - - public override TypeParameterListSyntax? TypeParameterList => GetRed(ref this.typeParameterList, 5); - - public ParameterListSyntax? ParameterList => GetRed(ref this.parameterList, 6); - - public override BaseListSyntax? BaseList => GetRed(ref this.baseList, 7); - - public override SyntaxList ConstraintClauses => new SyntaxList(GetRed(ref this.constraintClauses, 8)); - - public override SyntaxToken OpenBraceToken - { - get - { - var slot = ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).openBraceToken; - return slot != null ? new SyntaxToken(this, slot, GetChildPosition(9), GetChildIndex(9)) : default; - } - } - - public override SyntaxList Members => new SyntaxList(GetRed(ref this.members, 10)); - - public override SyntaxToken CloseBraceToken - { - get - { - var slot = ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).closeBraceToken; - return slot != null ? new SyntaxToken(this, slot, GetChildPosition(11), GetChildIndex(11)) : default; - } - } - - public override SyntaxToken SemicolonToken - { - get - { - var slot = ((Syntax.InternalSyntax.RecordStructDeclarationSyntax)this.Green).semicolonToken; - return slot != null ? new SyntaxToken(this, slot, GetChildPosition(12), GetChildIndex(12)) : default; - } - } - - internal override SyntaxNode? GetNodeSlot(int index) - => index switch - { - 0 => GetRedAtZero(ref this.attributeLists)!, - 5 => GetRed(ref this.typeParameterList, 5), - 6 => GetRed(ref this.parameterList, 6), - 7 => GetRed(ref this.baseList, 7), - 8 => GetRed(ref this.constraintClauses, 8)!, - 10 => GetRed(ref this.members, 10)!, - _ => null, - }; - - internal override SyntaxNode? GetCachedSlot(int index) - => index switch - { - 0 => this.attributeLists, - 5 => this.typeParameterList, - 6 => this.parameterList, - 7 => this.baseList, - 8 => this.constraintClauses, - 10 => this.members, - _ => null, - }; - - public override void Accept(CSharpSyntaxVisitor visitor) => visitor.VisitRecordStructDeclaration(this); - public override TResult? Accept(CSharpSyntaxVisitor visitor) where TResult : default => visitor.VisitRecordStructDeclaration(this); - - public RecordStructDeclarationSyntax Update(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken structKeyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) - { - if (attributeLists != this.AttributeLists || modifiers != this.Modifiers || keyword != this.Keyword || structKeyword != this.StructKeyword || identifier != this.Identifier || typeParameterList != this.TypeParameterList || parameterList != this.ParameterList || baseList != this.BaseList || constraintClauses != this.ConstraintClauses || openBraceToken != this.OpenBraceToken || members != this.Members || closeBraceToken != this.CloseBraceToken || semicolonToken != this.SemicolonToken) - { - var newNode = SyntaxFactory.RecordStructDeclaration(attributeLists, modifiers, keyword, structKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); - var annotations = GetAnnotations(); - return annotations?.Length > 0 ? newNode.WithAnnotations(annotations) : newNode; - } - - return this; - } - - internal override MemberDeclarationSyntax WithAttributeListsCore(SyntaxList attributeLists) => WithAttributeLists(attributeLists); - public new RecordStructDeclarationSyntax WithAttributeLists(SyntaxList attributeLists) => Update(attributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override MemberDeclarationSyntax WithModifiersCore(SyntaxTokenList modifiers) => WithModifiers(modifiers); - public new RecordStructDeclarationSyntax WithModifiers(SyntaxTokenList modifiers) => Update(this.AttributeLists, modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override TypeDeclarationSyntax WithKeywordCore(SyntaxToken keyword) => WithKeyword(keyword); - public new RecordStructDeclarationSyntax WithKeyword(SyntaxToken keyword) => Update(this.AttributeLists, this.Modifiers, keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - public RecordStructDeclarationSyntax WithStructKeyword(SyntaxToken structKeyword) => Update(this.AttributeLists, this.Modifiers, this.Keyword, structKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override BaseTypeDeclarationSyntax WithIdentifierCore(SyntaxToken identifier) => WithIdentifier(identifier); - public new RecordStructDeclarationSyntax WithIdentifier(SyntaxToken identifier) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override TypeDeclarationSyntax WithTypeParameterListCore(TypeParameterListSyntax? typeParameterList) => WithTypeParameterList(typeParameterList); - public new RecordStructDeclarationSyntax WithTypeParameterList(TypeParameterListSyntax? typeParameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, typeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - public RecordStructDeclarationSyntax WithParameterList(ParameterListSyntax? parameterList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, parameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override BaseTypeDeclarationSyntax WithBaseListCore(BaseListSyntax? baseList) => WithBaseList(baseList); - public new RecordStructDeclarationSyntax WithBaseList(BaseListSyntax? baseList) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, baseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override TypeDeclarationSyntax WithConstraintClausesCore(SyntaxList constraintClauses) => WithConstraintClauses(constraintClauses); - public new RecordStructDeclarationSyntax WithConstraintClauses(SyntaxList constraintClauses) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, constraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override BaseTypeDeclarationSyntax WithOpenBraceTokenCore(SyntaxToken openBraceToken) => WithOpenBraceToken(openBraceToken); - public new RecordStructDeclarationSyntax WithOpenBraceToken(SyntaxToken openBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, openBraceToken, this.Members, this.CloseBraceToken, this.SemicolonToken); - internal override TypeDeclarationSyntax WithMembersCore(SyntaxList members) => WithMembers(members); - public new RecordStructDeclarationSyntax WithMembers(SyntaxList members) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, members, this.CloseBraceToken, this.SemicolonToken); - internal override BaseTypeDeclarationSyntax WithCloseBraceTokenCore(SyntaxToken closeBraceToken) => WithCloseBraceToken(closeBraceToken); - public new RecordStructDeclarationSyntax WithCloseBraceToken(SyntaxToken closeBraceToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, closeBraceToken, this.SemicolonToken); - internal override BaseTypeDeclarationSyntax WithSemicolonTokenCore(SyntaxToken semicolonToken) => WithSemicolonToken(semicolonToken); - public new RecordStructDeclarationSyntax WithSemicolonToken(SyntaxToken semicolonToken) => Update(this.AttributeLists, this.Modifiers, this.Keyword, this.StructKeyword, this.Identifier, this.TypeParameterList, this.ParameterList, this.BaseList, this.ConstraintClauses, this.OpenBraceToken, this.Members, this.CloseBraceToken, semicolonToken); - - internal override MemberDeclarationSyntax AddAttributeListsCore(params AttributeListSyntax[] items) => AddAttributeLists(items); - public new RecordStructDeclarationSyntax AddAttributeLists(params AttributeListSyntax[] items) => WithAttributeLists(this.AttributeLists.AddRange(items)); - internal override MemberDeclarationSyntax AddModifiersCore(params SyntaxToken[] items) => AddModifiers(items); - public new RecordStructDeclarationSyntax AddModifiers(params SyntaxToken[] items) => WithModifiers(this.Modifiers.AddRange(items)); - internal override TypeDeclarationSyntax AddTypeParameterListParametersCore(params TypeParameterSyntax[] items) => AddTypeParameterListParameters(items); - public new RecordStructDeclarationSyntax AddTypeParameterListParameters(params TypeParameterSyntax[] items) - { - var typeParameterList = this.TypeParameterList ?? SyntaxFactory.TypeParameterList(); - return WithTypeParameterList(typeParameterList.WithParameters(typeParameterList.Parameters.AddRange(items))); - } - public RecordStructDeclarationSyntax AddParameterListParameters(params ParameterSyntax[] items) - { - var parameterList = this.ParameterList ?? SyntaxFactory.ParameterList(); - return WithParameterList(parameterList.WithParameters(parameterList.Parameters.AddRange(items))); - } - internal override BaseTypeDeclarationSyntax AddBaseListTypesCore(params BaseTypeSyntax[] items) => AddBaseListTypes(items); - public new RecordStructDeclarationSyntax AddBaseListTypes(params BaseTypeSyntax[] items) - { - var baseList = this.BaseList ?? SyntaxFactory.BaseList(); - return WithBaseList(baseList.WithTypes(baseList.Types.AddRange(items))); - } - internal override TypeDeclarationSyntax AddConstraintClausesCore(params TypeParameterConstraintClauseSyntax[] items) => AddConstraintClauses(items); - public new RecordStructDeclarationSyntax AddConstraintClauses(params TypeParameterConstraintClauseSyntax[] items) => WithConstraintClauses(this.ConstraintClauses.AddRange(items)); - internal override TypeDeclarationSyntax AddMembersCore(params MemberDeclarationSyntax[] items) => AddMembers(items); - public new RecordStructDeclarationSyntax AddMembers(params MemberDeclarationSyntax[] items) => WithMembers(this.Members.AddRange(items)); - } - /// Enum type declaration syntax. /// /// This node is associated with the following syntax kinds: diff --git a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs index 3e18fe14d24be..df36ddc05d2f6 100644 --- a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs +++ b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs @@ -1681,43 +1681,25 @@ static TypeDeclarationSyntax constructTypeDeclaration(ContextAwareSyntax syntaxF semicolon); case SyntaxKind.RecordKeyword: - if (recordModifier?.Kind == SyntaxKind.StructKeyword) - { - // record struct ... - return syntaxFactory.RecordStructDeclaration( - attributes, - modifiers.ToList(), - keyword, - structKeyword: recordModifier, - name, - typeParameters, - paramList, - baseList, - constraints, - openBrace, - members, - closeBrace, - semicolon); - } - else - { - // record ... - // record class ... - return syntaxFactory.RecordDeclaration( - attributes, - modifiers.ToList(), - keyword, - classKeyword: recordModifier, - name, - typeParameters, - paramList, - baseList, - constraints, - openBrace, - members, - closeBrace, - semicolon); - } + // record struct ... + // record ... + // record class ... + SyntaxKind declarationKind = recordModifier?.Kind == SyntaxKind.StructKeyword ? SyntaxKind.RecordStructDeclaration : SyntaxKind.RecordDeclaration; + return syntaxFactory.RecordDeclaration( + declarationKind, + attributes, + modifiers.ToList(), + keyword, + classOrStructKeyword: recordModifier, + name, + typeParameters, + paramList, + baseList, + constraints, + openBrace, + members, + closeBrace, + semicolon); default: throw ExceptionUtilities.UnexpectedValue(keyword.Kind); diff --git a/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt b/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt index e8073b6464237..1d94f0e65da7b 100644 --- a/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt +++ b/src/Compilers/CSharp/Portable/PublicAPI.Unshipped.txt @@ -1,50 +1,9 @@ Microsoft.CodeAnalysis.CSharp.SyntaxKind.RecordStructDeclaration = 9068 -> Microsoft.CodeAnalysis.CSharp.SyntaxKind override Microsoft.CodeAnalysis.CSharp.CSharpCompilation.GetUsedAssemblyReferences(System.Threading.CancellationToken cancellationToken = default(System.Threading.CancellationToken)) -> System.Collections.Immutable.ImmutableArray -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddAttributeLists(params Microsoft.CodeAnalysis.CSharp.Syntax.AttributeListSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddBaseListTypes(params Microsoft.CodeAnalysis.CSharp.Syntax.BaseTypeSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddConstraintClauses(params Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterConstraintClauseSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddMembers(params Microsoft.CodeAnalysis.CSharp.Syntax.MemberDeclarationSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddModifiers(params Microsoft.CodeAnalysis.SyntaxToken[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddParameterListParameters(params Microsoft.CodeAnalysis.CSharp.Syntax.ParameterSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AddTypeParameterListParameters(params Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterSyntax[] items) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.ParameterList.get -> Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.Update(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken classKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Update(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken structKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithAttributeLists(Microsoft.CodeAnalysis.SyntaxList attributeLists) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithBaseList(Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithCloseBraceToken(Microsoft.CodeAnalysis.SyntaxToken closeBraceToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithConstraintClauses(Microsoft.CodeAnalysis.SyntaxList constraintClauses) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.WithClassKeyword(Microsoft.CodeAnalysis.SyntaxToken classKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithStructKeyword(Microsoft.CodeAnalysis.SyntaxToken structKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithIdentifier(Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithKeyword(Microsoft.CodeAnalysis.SyntaxToken keyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithMembers(Microsoft.CodeAnalysis.SyntaxList members) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithModifiers(Microsoft.CodeAnalysis.SyntaxTokenList modifiers) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithOpenBraceToken(Microsoft.CodeAnalysis.SyntaxToken openBraceToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithParameterList(Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithSemicolonToken(Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.WithTypeParameterList(Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -override Microsoft.CodeAnalysis.CSharp.CSharpSyntaxRewriter.VisitRecordStructDeclaration(Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax node) -> Microsoft.CodeAnalysis.SyntaxNode -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Accept(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor visitor) -> void -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Accept(Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor visitor) -> TResult -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.AttributeLists.get -> Microsoft.CodeAnalysis.SyntaxList -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.BaseList.get -> Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.CloseBraceToken.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.ConstraintClauses.get -> Microsoft.CodeAnalysis.SyntaxList -Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.ClassKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken -Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.StructKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Identifier.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Keyword.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Members.get -> Microsoft.CodeAnalysis.SyntaxList -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.Modifiers.get -> Microsoft.CodeAnalysis.SyntaxTokenList -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.OpenBraceToken.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.SemicolonToken.get -> Microsoft.CodeAnalysis.SyntaxToken -override Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax.TypeParameterList.get -> Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax -static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordDeclaration(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken classKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax -static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordStructDeclaration(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxList members) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordStructDeclaration(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken structKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordStructDeclaration(Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordStructDeclaration(Microsoft.CodeAnalysis.SyntaxToken keyword, string identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax -virtual Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor.VisitRecordStructDeclaration(Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax node) -> void -virtual Microsoft.CodeAnalysis.CSharp.CSharpSyntaxVisitor.VisitRecordStructDeclaration(Microsoft.CodeAnalysis.CSharp.Syntax.RecordStructDeclarationSyntax node) -> TResult +Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.WithClassOrStructKeyword(Microsoft.CodeAnalysis.SyntaxToken classOrStructKeyword) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax +Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.Update(Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken classOrStructKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax +static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordDeclaration(Microsoft.CodeAnalysis.CSharp.SyntaxKind kind, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax +static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordDeclaration(Microsoft.CodeAnalysis.CSharp.SyntaxKind kind, Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken classOrStructKeyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxToken openBraceToken, Microsoft.CodeAnalysis.SyntaxList members, Microsoft.CodeAnalysis.SyntaxToken closeBraceToken, Microsoft.CodeAnalysis.SyntaxToken semicolonToken) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax +Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax.ClassOrStructKeyword.get -> Microsoft.CodeAnalysis.SyntaxToken +static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordDeclaration(Microsoft.CodeAnalysis.CSharp.SyntaxKind kind, Microsoft.CodeAnalysis.SyntaxList attributeLists, Microsoft.CodeAnalysis.SyntaxTokenList modifiers, Microsoft.CodeAnalysis.SyntaxToken keyword, Microsoft.CodeAnalysis.SyntaxToken identifier, Microsoft.CodeAnalysis.CSharp.Syntax.TypeParameterListSyntax typeParameterList, Microsoft.CodeAnalysis.CSharp.Syntax.ParameterListSyntax parameterList, Microsoft.CodeAnalysis.CSharp.Syntax.BaseListSyntax baseList, Microsoft.CodeAnalysis.SyntaxList constraintClauses, Microsoft.CodeAnalysis.SyntaxList members) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax +static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.RecordDeclaration(Microsoft.CodeAnalysis.CSharp.SyntaxKind kind, Microsoft.CodeAnalysis.SyntaxToken keyword, string identifier) -> Microsoft.CodeAnalysis.CSharp.Syntax.RecordDeclarationSyntax diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index df156fa0c5dc7..6a82bcbca6139 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2491,7 +2491,7 @@ public TypeDeclarationSyntax? RecordDeclarationWithParameters get { return _recordDeclarationWithParameters; } set { - Debug.Assert(value is RecordDeclarationSyntax or RecordStructDeclarationSyntax); + Debug.Assert(value is RecordDeclarationSyntax); _recordDeclarationWithParameters = value; } } @@ -2588,7 +2588,7 @@ public DeclaredMembersAndInitializers( Debug.Assert(!nonTypeMembers.Any(s => s is TypeSymbol)); Debug.Assert(recordDeclarationWithParameters is object == recordPrimaryConstructor is object); - Debug.Assert(recordDeclarationWithParameters is null or RecordDeclarationSyntax or RecordStructDeclarationSyntax); + Debug.Assert(recordDeclarationWithParameters is null or RecordDeclarationSyntax); this.NonTypeMembers = nonTypeMembers; this.StaticInitializers = staticInitializers; @@ -2956,20 +2956,15 @@ private void AddDeclaredNontypeMembers(DeclaredMembersAndInitializersBuilder bui break; case SyntaxKind.RecordDeclaration: + case SyntaxKind.RecordStructDeclaration: var recordDecl = (RecordDeclarationSyntax)syntax; noteRecordParameters(recordDecl, recordDecl.ParameterList, builder, diagnostics); AddNonTypeMembers(builder, recordDecl.Members, diagnostics); - break; - - case SyntaxKind.RecordStructDeclaration: - var recordStructDecl = (RecordStructDeclarationSyntax)syntax; - var parameterList = recordStructDecl.ParameterList; - noteRecordParameters(recordStructDecl, parameterList, builder, diagnostics); - AddNonTypeMembers(builder, recordStructDecl.Members, diagnostics); // We will allow declaring parameterless constructors // Tracking issue https://github.com/dotnet/roslyn/issues/52240 - if (parameterList?.ParameterCount == 0) + var parameterList = recordDecl.ParameterList; + if (syntax.Kind() == SyntaxKind.RecordStructDeclaration && parameterList?.ParameterCount == 0) { diagnostics.Add(ErrorCode.ERR_StructsCantContainDefaultConstructor, parameterList.Location); } @@ -3431,7 +3426,8 @@ private void CheckForStructBadInitializers(DeclaredMembersAndInitializersBuilder if (builder.RecordDeclarationWithParameters is not null) { - Debug.Assert(builder.RecordDeclarationWithParameters is RecordStructDeclarationSyntax { ParameterList: not null }); + Debug.Assert(builder.RecordDeclarationWithParameters is RecordDeclarationSyntax { ParameterList: not null } record + && record.Kind() == SyntaxKind.RecordStructDeclaration); return; } @@ -3452,12 +3448,9 @@ private void AddSynthesizedRecordMembersIfNecessary(MembersAndInitializersBuilde return; } - ParameterListSyntax? paramList = declaredMembersAndInitializers.RecordDeclarationWithParameters switch - { - RecordDeclarationSyntax recordDecl => recordDecl.ParameterList, - RecordStructDeclarationSyntax recordStructDecl => recordStructDecl.ParameterList, - _ => null - }; + ParameterListSyntax? paramList = declaredMembersAndInitializers.RecordDeclarationWithParameters is RecordDeclarationSyntax recordDecl + ? recordDecl.ParameterList + : null; var memberSignatures = s_duplicateRecordMemberSignatureDictionary.Allocate(); var fieldsByName = PooledDictionary.GetInstance(); diff --git a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs index 056489677259c..c85209dbbb3ac 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs @@ -33,22 +33,15 @@ internal TypeDeclarationSyntax GetSyntax() protected override ParameterListSyntax GetParameterList() { - return GetSyntax() switch - { - RecordDeclarationSyntax record => record.ParameterList!, - RecordStructDeclarationSyntax recordStruct => recordStruct.ParameterList!, - _ => throw ExceptionUtilities.Unreachable - }; + var record = (RecordDeclarationSyntax)GetSyntax(); + return record.ParameterList!; } protected override CSharpSyntaxNode? GetInitializer() { - return GetSyntax() switch - { - RecordDeclarationSyntax record => record.PrimaryConstructorBaseType, - RecordStructDeclarationSyntax => null, - _ => throw ExceptionUtilities.Unreachable - }; + var record = (RecordDeclarationSyntax)GetSyntax(); + Debug.Assert(record.Kind() == SyntaxKind.RecordDeclaration || record.PrimaryConstructorBaseType is null); + return record.PrimaryConstructorBaseType; } protected override bool AllowRefOrOut => false; diff --git a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs index 90f4e5073b55c..b0a561ec1e0d7 100644 --- a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs +++ b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs @@ -20,7 +20,7 @@ public RecordDeclarationSyntax Update(SyntaxList attributeL TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) { - return Update(attributeLists, modifiers, keyword, this.ClassKeyword, identifier, + return Update(attributeLists, modifiers, keyword, this.ClassOrStructKeyword, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); } } @@ -30,7 +30,30 @@ namespace Microsoft.CodeAnalysis.CSharp { public partial class SyntaxFactory { - public static RecordDeclarationSyntax RecordDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) - => RecordDeclaration(attributeLists, modifiers, keyword, classKeyword: default, identifier, typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + public static RecordDeclarationSyntax RecordDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, + TypeParameterListSyntax? typeParameterList, ParameterListSyntax? parameterList, BaseListSyntax? baseList, SyntaxList constraintClauses, + SyntaxToken openBraceToken, SyntaxList members, SyntaxToken closeBraceToken, SyntaxToken semicolonToken) + { + return RecordDeclaration(SyntaxKind.RecordDeclaration, attributeLists, modifiers, keyword, classOrStructKeyword: default, identifier, + typeParameterList, parameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + } + + public static RecordDeclarationSyntax RecordDeclaration(SyntaxList attributeLists, SyntaxTokenList modifiers, SyntaxToken keyword, SyntaxToken identifier, + TypeParameterListSyntax typeParameterList, ParameterListSyntax parameterList, BaseListSyntax baseList, SyntaxList constraintClauses, SyntaxList members) + { + return RecordDeclaration(SyntaxKind.RecordDeclaration, attributeLists, modifiers, keyword, classOrStructKeyword: default, identifier, + typeParameterList, parameterList, baseList, constraintClauses, openBraceToken: default, members, closeBraceToken: default, semicolonToken: default); + } + + public static RecordDeclarationSyntax RecordDeclaration(SyntaxToken keyword, string identifier) + { + return RecordDeclaration(keyword, SyntaxFactory.Identifier(identifier)); + } + + public static RecordDeclarationSyntax RecordDeclaration(SyntaxToken keyword, SyntaxToken identifier) + { + return RecordDeclaration(SyntaxKind.RecordDeclaration, attributeLists: default, modifiers: default, keyword, classOrStructKeyword: default, identifier, + typeParameterList: null, parameterList: null, baseList: null, constraintClauses: default, openBraceToken: default, members: default, closeBraceToken: default, semicolonToken: default); + } } } diff --git a/src/Compilers/CSharp/Portable/Syntax/Syntax.xml b/src/Compilers/CSharp/Portable/Syntax/Syntax.xml index f5897ebd52615..5aad719d5167b 100644 --- a/src/Compilers/CSharp/Portable/Syntax/Syntax.xml +++ b/src/Compilers/CSharp/Portable/Syntax/Syntax.xml @@ -3352,40 +3352,14 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/src/Compilers/CSharp/Portable/Syntax/TypeDeclarationSyntax.cs b/src/Compilers/CSharp/Portable/Syntax/TypeDeclarationSyntax.cs index f6c8ff3bf4fb0..314d4b8b09bda 100644 --- a/src/Compilers/CSharp/Portable/Syntax/TypeDeclarationSyntax.cs +++ b/src/Compilers/CSharp/Portable/Syntax/TypeDeclarationSyntax.cs @@ -114,9 +114,9 @@ public static TypeDeclarationSyntax TypeDeclaration( case SyntaxKind.InterfaceDeclaration: return SyntaxFactory.InterfaceDeclaration(attributes, modifiers, keyword, identifier, typeParameterList, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); case SyntaxKind.RecordDeclaration: - return SyntaxFactory.RecordDeclaration(attributes, modifiers, keyword, classKeyword: default, identifier, typeParameterList, parameterList: null, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + return SyntaxFactory.RecordDeclaration(SyntaxKind.RecordDeclaration, attributes, modifiers, keyword, classOrStructKeyword: default, identifier, typeParameterList, parameterList: null, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); case SyntaxKind.RecordStructDeclaration: - return SyntaxFactory.RecordStructDeclaration(attributes, modifiers, keyword, structKeyword: SyntaxFactory.Token(SyntaxKind.StructKeyword), identifier, typeParameterList, parameterList: null, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); + return SyntaxFactory.RecordDeclaration(SyntaxKind.RecordStructDeclaration, attributes, modifiers, keyword, classOrStructKeyword: SyntaxFactory.Token(SyntaxKind.StructKeyword), identifier, typeParameterList, parameterList: null, baseList, constraintClauses, openBraceToken, members, closeBraceToken, semicolonToken); default: throw ExceptionUtilities.UnexpectedValue(kind); } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs index 0fd3d4cb0ea79..54e175d7de325 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs @@ -2384,7 +2384,7 @@ public static void Main() Assert.Contains(symbol, model.LookupSymbols(x.SpanStart, name: "X")); Assert.Contains("X", model.LookupNames(x.SpanStart)); - var recordDeclaration = tree.GetRoot().DescendantNodes().OfType().Single(); + var recordDeclaration = tree.GetRoot().DescendantNodes().OfType().Single(); Assert.Equal("C", recordDeclaration.Identifier.ValueText); Assert.Null(model.GetOperation(recordDeclaration)); } @@ -5587,7 +5587,8 @@ protected void Fail(SyntaxNodeAnalysisContext context) protected void Handle6(SyntaxNodeAnalysisContext context) { - var record = (RecordStructDeclarationSyntax)context.Node; + var record = (RecordDeclarationSyntax)context.Node; + Assert.Equal(SyntaxKind.RecordStructDeclaration, record.Kind()); switch (context.ContainingSymbol.ToTestDisplayString()) { @@ -6121,7 +6122,7 @@ private void Handle(CodeBlockAnalysisContext context) switch (context.CodeBlock) { - case RecordStructDeclarationSyntax { Identifier: { ValueText: "A" } }: + case RecordDeclarationSyntax { Identifier: { ValueText: "A" } }: Interlocked.Increment(ref FireCount1); break; default: @@ -6214,7 +6215,7 @@ private void Handle(CodeBlockStartAnalysisContext context) case "A..ctor([System.Int32 X = 0])": switch (context.CodeBlock) { - case RecordStructDeclarationSyntax { Identifier: { ValueText: "A" } }: + case RecordDeclarationSyntax { Identifier: { ValueText: "A" } }: Interlocked.Increment(ref FireCount100); break; default: @@ -6272,7 +6273,7 @@ private void Handle11(CodeBlockAnalysisContext context) switch (context.CodeBlock) { - case RecordStructDeclarationSyntax { Identifier: { ValueText: "A" } }: + case RecordDeclarationSyntax { Identifier: { ValueText: "A" } }: Interlocked.Increment(ref FireCount1000); break; default: diff --git a/src/Compilers/CSharp/Test/Syntax/Generated/Syntax.Test.xml.Generated.cs b/src/Compilers/CSharp/Test/Syntax/Generated/Syntax.Test.xml.Generated.cs index 16cdb23ff46bc..72fb1d6aec7c8 100644 --- a/src/Compilers/CSharp/Test/Syntax/Generated/Syntax.Test.xml.Generated.cs +++ b/src/Compilers/CSharp/Test/Syntax/Generated/Syntax.Test.xml.Generated.cs @@ -482,10 +482,7 @@ private static Syntax.InternalSyntax.InterfaceDeclarationSyntax GenerateInterfac => InternalSyntaxFactory.InterfaceDeclaration(new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Token(SyntaxKind.InterfaceKeyword), InternalSyntaxFactory.Identifier("Identifier"), null, null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Token(SyntaxKind.OpenBraceToken), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Token(SyntaxKind.CloseBraceToken), null); private static Syntax.InternalSyntax.RecordDeclarationSyntax GenerateRecordDeclaration() - => InternalSyntaxFactory.RecordDeclaration(new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Identifier("Keyword"), null, InternalSyntaxFactory.Identifier("Identifier"), null, null, null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, null); - - private static Syntax.InternalSyntax.RecordStructDeclarationSyntax GenerateRecordStructDeclaration() - => InternalSyntaxFactory.RecordStructDeclaration(new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Identifier("Keyword"), InternalSyntaxFactory.Token(SyntaxKind.StructKeyword), InternalSyntaxFactory.Identifier("Identifier"), null, null, null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, null); + => InternalSyntaxFactory.RecordDeclaration(SyntaxKind.RecordDeclaration, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Identifier("Keyword"), null, InternalSyntaxFactory.Identifier("Identifier"), null, null, null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), null, null); private static Syntax.InternalSyntax.EnumDeclarationSyntax GenerateEnumDeclaration() => InternalSyntaxFactory.EnumDeclaration(new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SyntaxList(), InternalSyntaxFactory.Token(SyntaxKind.EnumKeyword), InternalSyntaxFactory.Identifier("Identifier"), null, InternalSyntaxFactory.Token(SyntaxKind.OpenBraceToken), new Microsoft.CodeAnalysis.Syntax.InternalSyntax.SeparatedSyntaxList(), InternalSyntaxFactory.Token(SyntaxKind.CloseBraceToken), null); @@ -2678,29 +2675,7 @@ public void TestRecordDeclarationFactoryAndProperties() Assert.Equal(default, node.AttributeLists); Assert.Equal(default, node.Modifiers); Assert.Equal(SyntaxKind.IdentifierToken, node.Keyword.Kind); - Assert.Null(node.ClassKeyword); - Assert.Equal(SyntaxKind.IdentifierToken, node.Identifier.Kind); - Assert.Null(node.TypeParameterList); - Assert.Null(node.ParameterList); - Assert.Null(node.BaseList); - Assert.Equal(default, node.ConstraintClauses); - Assert.Null(node.OpenBraceToken); - Assert.Equal(default, node.Members); - Assert.Null(node.CloseBraceToken); - Assert.Null(node.SemicolonToken); - - AttachAndCheckDiagnostics(node); - } - - [Fact] - public void TestRecordStructDeclarationFactoryAndProperties() - { - var node = GenerateRecordStructDeclaration(); - - Assert.Equal(default, node.AttributeLists); - Assert.Equal(default, node.Modifiers); - Assert.Equal(SyntaxKind.IdentifierToken, node.Keyword.Kind); - Assert.Equal(SyntaxKind.StructKeyword, node.StructKeyword.Kind); + Assert.Null(node.ClassOrStructKeyword); Assert.Equal(SyntaxKind.IdentifierToken, node.Identifier.Kind); Assert.Null(node.TypeParameterList); Assert.Null(node.ParameterList); @@ -7796,32 +7771,6 @@ public void TestRecordDeclarationIdentityRewriter() Assert.Same(oldNode, newNode); } - [Fact] - public void TestRecordStructDeclarationTokenDeleteRewriter() - { - var oldNode = GenerateRecordStructDeclaration(); - var rewriter = new TokenDeleteRewriter(); - var newNode = rewriter.Visit(oldNode); - - if(!oldNode.IsMissing) - { - Assert.NotEqual(oldNode, newNode); - } - - Assert.NotNull(newNode); - Assert.True(newNode.IsMissing, "No tokens => missing"); - } - - [Fact] - public void TestRecordStructDeclarationIdentityRewriter() - { - var oldNode = GenerateRecordStructDeclaration(); - var rewriter = new IdentityRewriter(); - var newNode = rewriter.Visit(oldNode); - - Assert.Same(oldNode, newNode); - } - [Fact] public void TestEnumDeclarationTokenDeleteRewriter() { @@ -10197,10 +10146,7 @@ private static InterfaceDeclarationSyntax GenerateInterfaceDeclaration() => SyntaxFactory.InterfaceDeclaration(new SyntaxList(), new SyntaxTokenList(), SyntaxFactory.Token(SyntaxKind.InterfaceKeyword), SyntaxFactory.Identifier("Identifier"), default(TypeParameterListSyntax), default(BaseListSyntax), new SyntaxList(), SyntaxFactory.Token(SyntaxKind.OpenBraceToken), new SyntaxList(), SyntaxFactory.Token(SyntaxKind.CloseBraceToken), default(SyntaxToken)); private static RecordDeclarationSyntax GenerateRecordDeclaration() - => SyntaxFactory.RecordDeclaration(new SyntaxList(), new SyntaxTokenList(), SyntaxFactory.Identifier("Keyword"), default(SyntaxToken), SyntaxFactory.Identifier("Identifier"), default(TypeParameterListSyntax), default(ParameterListSyntax), default(BaseListSyntax), new SyntaxList(), default(SyntaxToken), new SyntaxList(), default(SyntaxToken), default(SyntaxToken)); - - private static RecordStructDeclarationSyntax GenerateRecordStructDeclaration() - => SyntaxFactory.RecordStructDeclaration(new SyntaxList(), new SyntaxTokenList(), SyntaxFactory.Identifier("Keyword"), SyntaxFactory.Token(SyntaxKind.StructKeyword), SyntaxFactory.Identifier("Identifier"), default(TypeParameterListSyntax), default(ParameterListSyntax), default(BaseListSyntax), new SyntaxList(), default(SyntaxToken), new SyntaxList(), default(SyntaxToken), default(SyntaxToken)); + => SyntaxFactory.RecordDeclaration(SyntaxKind.RecordDeclaration, new SyntaxList(), new SyntaxTokenList(), SyntaxFactory.Identifier("Keyword"), default(SyntaxToken), SyntaxFactory.Identifier("Identifier"), default(TypeParameterListSyntax), default(ParameterListSyntax), default(BaseListSyntax), new SyntaxList(), default(SyntaxToken), new SyntaxList(), default(SyntaxToken), default(SyntaxToken)); private static EnumDeclarationSyntax GenerateEnumDeclaration() => SyntaxFactory.EnumDeclaration(new SyntaxList(), new SyntaxTokenList(), SyntaxFactory.Token(SyntaxKind.EnumKeyword), SyntaxFactory.Identifier("Identifier"), default(BaseListSyntax), SyntaxFactory.Token(SyntaxKind.OpenBraceToken), new SeparatedSyntaxList(), SyntaxFactory.Token(SyntaxKind.CloseBraceToken), default(SyntaxToken)); @@ -12393,7 +12339,7 @@ public void TestRecordDeclarationFactoryAndProperties() Assert.Equal(default, node.AttributeLists); Assert.Equal(default, node.Modifiers); Assert.Equal(SyntaxKind.IdentifierToken, node.Keyword.Kind()); - Assert.Equal(SyntaxKind.None, node.ClassKeyword.Kind()); + Assert.Equal(SyntaxKind.None, node.ClassOrStructKeyword.Kind()); Assert.Equal(SyntaxKind.IdentifierToken, node.Identifier.Kind()); Assert.Null(node.TypeParameterList); Assert.Null(node.ParameterList); @@ -12403,29 +12349,7 @@ public void TestRecordDeclarationFactoryAndProperties() Assert.Equal(default, node.Members); Assert.Equal(SyntaxKind.None, node.CloseBraceToken.Kind()); Assert.Equal(SyntaxKind.None, node.SemicolonToken.Kind()); - var newNode = node.WithAttributeLists(node.AttributeLists).WithModifiers(node.Modifiers).WithKeyword(node.Keyword).WithClassKeyword(node.ClassKeyword).WithIdentifier(node.Identifier).WithTypeParameterList(node.TypeParameterList).WithParameterList(node.ParameterList).WithBaseList(node.BaseList).WithConstraintClauses(node.ConstraintClauses).WithOpenBraceToken(node.OpenBraceToken).WithMembers(node.Members).WithCloseBraceToken(node.CloseBraceToken).WithSemicolonToken(node.SemicolonToken); - Assert.Equal(node, newNode); - } - - [Fact] - public void TestRecordStructDeclarationFactoryAndProperties() - { - var node = GenerateRecordStructDeclaration(); - - Assert.Equal(default, node.AttributeLists); - Assert.Equal(default, node.Modifiers); - Assert.Equal(SyntaxKind.IdentifierToken, node.Keyword.Kind()); - Assert.Equal(SyntaxKind.StructKeyword, node.StructKeyword.Kind()); - Assert.Equal(SyntaxKind.IdentifierToken, node.Identifier.Kind()); - Assert.Null(node.TypeParameterList); - Assert.Null(node.ParameterList); - Assert.Null(node.BaseList); - Assert.Equal(default, node.ConstraintClauses); - Assert.Equal(SyntaxKind.None, node.OpenBraceToken.Kind()); - Assert.Equal(default, node.Members); - Assert.Equal(SyntaxKind.None, node.CloseBraceToken.Kind()); - Assert.Equal(SyntaxKind.None, node.SemicolonToken.Kind()); - var newNode = node.WithAttributeLists(node.AttributeLists).WithModifiers(node.Modifiers).WithKeyword(node.Keyword).WithStructKeyword(node.StructKeyword).WithIdentifier(node.Identifier).WithTypeParameterList(node.TypeParameterList).WithParameterList(node.ParameterList).WithBaseList(node.BaseList).WithConstraintClauses(node.ConstraintClauses).WithOpenBraceToken(node.OpenBraceToken).WithMembers(node.Members).WithCloseBraceToken(node.CloseBraceToken).WithSemicolonToken(node.SemicolonToken); + var newNode = node.WithAttributeLists(node.AttributeLists).WithModifiers(node.Modifiers).WithKeyword(node.Keyword).WithClassOrStructKeyword(node.ClassOrStructKeyword).WithIdentifier(node.Identifier).WithTypeParameterList(node.TypeParameterList).WithParameterList(node.ParameterList).WithBaseList(node.BaseList).WithConstraintClauses(node.ConstraintClauses).WithOpenBraceToken(node.OpenBraceToken).WithMembers(node.Members).WithCloseBraceToken(node.CloseBraceToken).WithSemicolonToken(node.SemicolonToken); Assert.Equal(node, newNode); } @@ -17511,32 +17435,6 @@ public void TestRecordDeclarationIdentityRewriter() Assert.Same(oldNode, newNode); } - [Fact] - public void TestRecordStructDeclarationTokenDeleteRewriter() - { - var oldNode = GenerateRecordStructDeclaration(); - var rewriter = new TokenDeleteRewriter(); - var newNode = rewriter.Visit(oldNode); - - if(!oldNode.IsMissing) - { - Assert.NotEqual(oldNode, newNode); - } - - Assert.NotNull(newNode); - Assert.True(newNode.IsMissing, "No tokens => missing"); - } - - [Fact] - public void TestRecordStructDeclarationIdentityRewriter() - { - var oldNode = GenerateRecordStructDeclaration(); - var rewriter = new IdentityRewriter(); - var newNode = rewriter.Visit(oldNode); - - Assert.Same(oldNode, newNode); - } - [Fact] public void TestEnumDeclarationTokenDeleteRewriter() { diff --git a/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.CSharpCodeGenerator.CallSiteContainerRewriter.cs b/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.CSharpCodeGenerator.CallSiteContainerRewriter.cs index 56739f2c2e9c7..ae496e28361cf 100644 --- a/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.CSharpCodeGenerator.CallSiteContainerRewriter.cs +++ b/src/Features/CSharp/Portable/ExtractMethod/CSharpMethodExtractor.CSharpCodeGenerator.CallSiteContainerRewriter.cs @@ -386,16 +386,6 @@ public override SyntaxNode VisitRecordDeclaration(RecordDeclarationSyntax node) return GetUpdatedTypeDeclaration(node); } - public override SyntaxNode VisitRecordStructDeclaration(RecordStructDeclarationSyntax node) - { - if (node != ContainerOfStatementsOrFieldToReplace) - { - return base.VisitRecordStructDeclaration(node); - } - - return GetUpdatedTypeDeclaration(node); - } - public override SyntaxNode VisitStructDeclaration(StructDeclarationSyntax node) { if (node != ContainerOfStatementsOrFieldToReplace) diff --git a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs index 89dfa3f31afc5..17df538625576 100644 --- a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs +++ b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs @@ -671,7 +671,7 @@ internal override bool TryGetBaseList(ExpressionSyntax expression, out TypeKindO { if (node is BaseListSyntax) { - if (node.Parent is InterfaceDeclarationSyntax or StructDeclarationSyntax or RecordStructDeclarationSyntax) + if (node.Parent is InterfaceDeclarationSyntax or StructDeclarationSyntax) { typeKindValue = TypeKindOptions.Interface; return true; diff --git a/src/Features/CSharp/Portable/Organizing/Organizers/RecordDeclarationOrganizer.cs b/src/Features/CSharp/Portable/Organizing/Organizers/RecordDeclarationOrganizer.cs index b8775103c79fe..c839d9b8bd3ca 100644 --- a/src/Features/CSharp/Portable/Organizing/Organizers/RecordDeclarationOrganizer.cs +++ b/src/Features/CSharp/Portable/Organizing/Organizers/RecordDeclarationOrganizer.cs @@ -28,7 +28,7 @@ protected override RecordDeclarationSyntax Organize( syntax.AttributeLists, ModifiersOrganizer.Organize(syntax.Modifiers), syntax.Keyword, - syntax.ClassKeyword, + syntax.ClassOrStructKeyword, syntax.Identifier, syntax.TypeParameterList, syntax.ParameterList, diff --git a/src/Features/CSharp/Portable/Organizing/Organizers/RecordStructDeclarationOrganizer.cs b/src/Features/CSharp/Portable/Organizing/Organizers/RecordStructDeclarationOrganizer.cs deleted file mode 100644 index f8527cb732bae..0000000000000 --- a/src/Features/CSharp/Portable/Organizing/Organizers/RecordStructDeclarationOrganizer.cs +++ /dev/null @@ -1,43 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Composition; -using System.Threading; -using Microsoft.CodeAnalysis.CSharp.Syntax; -using Microsoft.CodeAnalysis.Host.Mef; -using Microsoft.CodeAnalysis.Organizing.Organizers; - -namespace Microsoft.CodeAnalysis.CSharp.Organizing.Organizers -{ - [ExportSyntaxNodeOrganizer(LanguageNames.CSharp), Shared] - internal class RecordStructDeclarationOrganizer : AbstractSyntaxNodeOrganizer - { - [ImportingConstructor] - [Obsolete(MefConstruction.ImportingConstructorMessage, error: true)] - public RecordStructDeclarationOrganizer() - { - } - - protected override RecordStructDeclarationSyntax Organize( - RecordStructDeclarationSyntax syntax, - CancellationToken cancellationToken) - { - return syntax.Update( - syntax.AttributeLists, - ModifiersOrganizer.Organize(syntax.Modifiers), - syntax.Keyword, - syntax.StructKeyword, - syntax.Identifier, - syntax.TypeParameterList, - syntax.ParameterList, - syntax.BaseList, - syntax.ConstraintClauses, - syntax.OpenBraceToken, - MemberDeclarationsOrganizer.Organize(syntax.Members, cancellationToken), - syntax.CloseBraceToken, - syntax.SemicolonToken); - } - } -} diff --git a/src/Features/CSharp/Portable/Structure/CSharpBlockStructureProvider.cs b/src/Features/CSharp/Portable/Structure/CSharpBlockStructureProvider.cs index 9b168d5d91d46..241a13e5e895c 100644 --- a/src/Features/CSharp/Portable/Structure/CSharpBlockStructureProvider.cs +++ b/src/Features/CSharp/Portable/Structure/CSharpBlockStructureProvider.cs @@ -42,7 +42,6 @@ private static ImmutableDictionary(); builder.Add(); builder.Add(); - builder.Add(); builder.Add(); builder.Add(); builder.Add(); diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs index b397349d6d43f..f816d0153d848 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/CSharpSyntaxGenerator.cs @@ -1283,13 +1283,6 @@ private static SyntaxNode EnsureRecordDeclarationHasBody(SyntaxNode declaration) .WithOpenBraceToken(recordDeclaration.OpenBraceToken == default ? SyntaxFactory.Token(SyntaxKind.OpenBraceToken) : recordDeclaration.OpenBraceToken) .WithCloseBraceToken(recordDeclaration.CloseBraceToken == default ? SyntaxFactory.Token(SyntaxKind.CloseBraceToken) : recordDeclaration.CloseBraceToken); } - else if (declaration is RecordStructDeclarationSyntax recordStructDeclaration) - { - return recordStructDeclaration - .WithSemicolonToken(default) - .WithOpenBraceToken(recordStructDeclaration.OpenBraceToken == default ? SyntaxFactory.Token(SyntaxKind.OpenBraceToken) : recordStructDeclaration.OpenBraceToken) - .WithCloseBraceToken(recordStructDeclaration.CloseBraceToken == default ? SyntaxFactory.Token(SyntaxKind.CloseBraceToken) : recordStructDeclaration.CloseBraceToken); - } return declaration; } diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs index 38dcd702b90ff..0ad384bde6017 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs @@ -198,9 +198,8 @@ private static MemberDeclarationSyntax GetDeclarationSyntaxWithoutMembersWorker( TypeDeclarationSyntax typeDeclaration; if (namedType.IsRecord) { - typeDeclaration = namedType.TypeKind is TypeKind.Class - ? SyntaxFactory.RecordDeclaration(SyntaxFactory.Token(SyntaxKind.RecordKeyword), namedType.Name.ToIdentifierToken()) - : SyntaxFactory.RecordStructDeclaration(SyntaxFactory.Token(SyntaxKind.RecordKeyword), namedType.Name.ToIdentifierToken()); + var declarationKind = namedType.TypeKind is TypeKind.Class ? SyntaxKind.RecordDeclaration : SyntaxKind.RecordStructDeclaration; + typeDeclaration = SyntaxFactory.RecordDeclaration(declarationKind, SyntaxFactory.Token(SyntaxKind.RecordKeyword), namedType.Name.ToIdentifierToken()); } else { diff --git a/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs b/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs index 1ef817b7d4b65..013e0dd620b23 100644 --- a/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs +++ b/src/Workspaces/CSharpTest/CodeGeneration/SyntaxGeneratorTests.cs @@ -3056,7 +3056,7 @@ public void TestInsertMembersOnRecordStruct_SemiColon() var symbolC = (INamedTypeSymbol)comp.GlobalNamespace.GetMembers("C").First(); var declC = Generator.GetDeclaration(symbolC.DeclaringSyntaxReferences.Select(x => x.GetSyntax()).First()); - VerifySyntax( + VerifySyntax( Generator.InsertMembers(declC, 0, Generator.FieldDeclaration("A", Generator.IdentifierName("T"))), @"public record struct C { diff --git a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs index b245786d4db86..e4e594c1b5a4a 100644 --- a/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs +++ b/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Services/SyntaxFacts/CSharpSyntaxFacts.cs @@ -1136,9 +1136,6 @@ private void AppendConstructors(SyntaxList members, Lis case StructDeclarationSyntax @struct: AppendConstructors(@struct.Members, constructors, cancellationToken); break; - case RecordStructDeclarationSyntax recordStruct: - AppendConstructors(recordStruct.Members, constructors, cancellationToken); - break; } } } From d6599036bad495d17b168ffede14c7448f87c502 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Sat, 17 Apr 2021 17:49:38 -0700 Subject: [PATCH 02/12] Address feedback --- .../Portable/GenerateType/CSharpGenerateTypeService.cs | 3 ++- .../Portable/CodeGeneration/NamedTypeGenerator.cs | 10 ++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs index 17df538625576..5277ceab5e0dd 100644 --- a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs +++ b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs @@ -671,7 +671,8 @@ internal override bool TryGetBaseList(ExpressionSyntax expression, out TypeKindO { if (node is BaseListSyntax) { - if (node.Parent is InterfaceDeclarationSyntax or StructDeclarationSyntax) + if (node.Parent is InterfaceDeclarationSyntax or StructDeclarationSyntax + || node.Parent.Kind() == SyntaxKind.RecordStructDeclaration) { typeKindValue = TypeKindOptions.Interface; return true; diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs index 0ad384bde6017..8263e592132c2 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs @@ -198,8 +198,14 @@ private static MemberDeclarationSyntax GetDeclarationSyntaxWithoutMembersWorker( TypeDeclarationSyntax typeDeclaration; if (namedType.IsRecord) { - var declarationKind = namedType.TypeKind is TypeKind.Class ? SyntaxKind.RecordDeclaration : SyntaxKind.RecordStructDeclaration; - typeDeclaration = SyntaxFactory.RecordDeclaration(declarationKind, SyntaxFactory.Token(SyntaxKind.RecordKeyword), namedType.Name.ToIdentifierToken()); + var isRecordClass = namedType.TypeKind is TypeKind.Class; + var declarationKind = isRecordClass ? SyntaxKind.RecordDeclaration : SyntaxKind.RecordStructDeclaration; + var classOrStructKeyword = SyntaxFactory.Token(isRecordClass ? default : SyntaxKind.ClassKeyword); + + typeDeclaration = SyntaxFactory.RecordDeclaration(kind: declarationKind, attributeLists: default, modifiers: default, + SyntaxFactory.Token(SyntaxKind.RecordKeyword), classOrStructKeyword, namedType.Name.ToIdentifierToken(), + typeParameterList: null, parameterList: null, baseList: null, constraintClauses: default, openBraceToken: default, members: default, closeBraceToken: default, + SyntaxFactory.Token(SyntaxKind.SemicolonToken)); } else { From 9c48dd6c0e0d1d891ad46a8f4957758dd5fd9d31 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Sun, 18 Apr 2021 18:08:35 -0700 Subject: [PATCH 03/12] Use StructKeyword --- .../CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs index 8263e592132c2..04323149b9e02 100644 --- a/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs +++ b/src/Workspaces/CSharp/Portable/CodeGeneration/NamedTypeGenerator.cs @@ -200,7 +200,7 @@ private static MemberDeclarationSyntax GetDeclarationSyntaxWithoutMembersWorker( { var isRecordClass = namedType.TypeKind is TypeKind.Class; var declarationKind = isRecordClass ? SyntaxKind.RecordDeclaration : SyntaxKind.RecordStructDeclaration; - var classOrStructKeyword = SyntaxFactory.Token(isRecordClass ? default : SyntaxKind.ClassKeyword); + var classOrStructKeyword = SyntaxFactory.Token(isRecordClass ? default : SyntaxKind.StructKeyword); typeDeclaration = SyntaxFactory.RecordDeclaration(kind: declarationKind, attributeLists: default, modifiers: default, SyntaxFactory.Token(SyntaxKind.RecordKeyword), classOrStructKeyword, namedType.Name.ToIdentifierToken(), From 1c89f88a400e6f199ba00860f7d4cf392b65543f Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Tue, 20 Apr 2021 10:54:19 -0700 Subject: [PATCH 04/12] Address feedback --- .../CSharp/Portable/Binder/BinderFactory.cs | 10 +- .../Portable/Binder/Binder_Statements.cs | 3 +- .../Binder/ExpressionVariableFinder.cs | 3 +- .../Portable/Binder/LocalBinderFactory.cs | 3 +- .../Compilation/MethodBodySemanticModel.cs | 2 +- .../Compilation/SyntaxTreeSemanticModel.cs | 98 ++++++++++++------- .../Portable/Compiler/MethodCompiler.cs | 4 +- .../Source/SourceMemberContainerSymbol.cs | 30 ++---- .../SourceMethodSymbolWithAttributes.cs | 1 + .../Records/SynthesizedRecordConstructor.cs | 3 +- .../Syntax/RecordDeclarationSyntax.cs | 8 +- .../GenerateType/CSharpGenerateTypeService.cs | 3 +- 12 files changed, 96 insertions(+), 72 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs b/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs index 7f6f7810c221c..170e4a51e5d9f 100644 --- a/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs +++ b/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs @@ -140,17 +140,17 @@ internal Binder GetBinder(SyntaxNode node, int position, CSharpSyntaxNode member internal InMethodBinder GetRecordConstructorInMethodBinder(SynthesizedRecordConstructor constructor) { - TypeDeclarationSyntax typeDecl = constructor.GetSyntax(); - Debug.Assert(typeDecl is RecordDeclarationSyntax); + var recordDecl = (RecordDeclarationSyntax)constructor.GetSyntax(); + Debug.Assert(recordDecl.IsKind(SyntaxKind.RecordDeclaration)); var extraInfo = NodeUsage.ConstructorBodyOrInitializer; - var key = BinderFactoryVisitor.CreateBinderCacheKey(typeDecl, extraInfo); + var key = BinderFactoryVisitor.CreateBinderCacheKey(recordDecl, extraInfo); if (!_binderCache.TryGetValue(key, out Binder resultBinder)) { // Ctors cannot be generic Debug.Assert(constructor.Arity == 0, "Generic Ctor, What to do?"); - resultBinder = new InMethodBinder(constructor, GetInRecordBodyBinder(typeDecl)); + resultBinder = new InMethodBinder(constructor, GetInRecordBodyBinder(recordDecl)); _binderCache.TryAdd(key, resultBinder); } @@ -158,7 +158,7 @@ internal InMethodBinder GetRecordConstructorInMethodBinder(SynthesizedRecordCons return (InMethodBinder)resultBinder; } - internal Binder GetInRecordBodyBinder(TypeDeclarationSyntax typeDecl) + internal Binder GetInRecordBodyBinder(RecordDeclarationSyntax typeDecl) { Debug.Assert(typeDecl.Kind() is SyntaxKind.RecordDeclaration); diff --git a/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs b/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs index 61c74b3b5bb33..6aa47fd26aa3c 100644 --- a/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs +++ b/src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs @@ -3338,12 +3338,13 @@ private BoundNode BindSimpleProgramCompilationUnit(CompilationUnitSyntax compila private BoundNode BindRecordConstructorBody(RecordDeclarationSyntax recordDecl, BindingDiagnosticBag diagnostics) { Debug.Assert(recordDecl.ParameterList is object); + Debug.Assert(recordDecl.IsKind(SyntaxKind.RecordDeclaration)); Binder bodyBinder = this.GetBinder(recordDecl); Debug.Assert(bodyBinder != null); BoundExpressionStatement initializer = null; - if (recordDecl.PrimaryConstructorBaseType is PrimaryConstructorBaseTypeSyntax baseWithArguments) + if (recordDecl.PrimaryConstructorBaseTypeIfClass is PrimaryConstructorBaseTypeSyntax baseWithArguments) { initializer = bodyBinder.BindConstructorInitializer(baseWithArguments, diagnostics); } diff --git a/src/Compilers/CSharp/Portable/Binder/ExpressionVariableFinder.cs b/src/Compilers/CSharp/Portable/Binder/ExpressionVariableFinder.cs index 048543be96a21..1e1f691e5c28c 100644 --- a/src/Compilers/CSharp/Portable/Binder/ExpressionVariableFinder.cs +++ b/src/Compilers/CSharp/Portable/Binder/ExpressionVariableFinder.cs @@ -398,8 +398,9 @@ public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax no public override void VisitRecordDeclaration(RecordDeclarationSyntax node) { Debug.Assert(node.ParameterList is object); + Debug.Assert(node.IsKind(SyntaxKind.RecordDeclaration)); - if (node.PrimaryConstructorBaseType is PrimaryConstructorBaseTypeSyntax baseWithArguments) + if (node.PrimaryConstructorBaseTypeIfClass is PrimaryConstructorBaseTypeSyntax baseWithArguments) { VisitNodeToBind(baseWithArguments); } diff --git a/src/Compilers/CSharp/Portable/Binder/LocalBinderFactory.cs b/src/Compilers/CSharp/Portable/Binder/LocalBinderFactory.cs index 07c5b16e74263..d2a83280e672e 100644 --- a/src/Compilers/CSharp/Portable/Binder/LocalBinderFactory.cs +++ b/src/Compilers/CSharp/Portable/Binder/LocalBinderFactory.cs @@ -161,10 +161,11 @@ public override void VisitConstructorDeclaration(ConstructorDeclarationSyntax no public override void VisitRecordDeclaration(RecordDeclarationSyntax node) { Debug.Assert(node.ParameterList is object); + Debug.Assert(node.IsKind(SyntaxKind.RecordDeclaration)); Binder enclosing = new ExpressionVariableBinder(node, _enclosing); AddToMap(node, enclosing); - Visit(node.PrimaryConstructorBaseType, enclosing); + Visit(node.PrimaryConstructorBaseTypeIfClass, enclosing); } public override void VisitPrimaryConstructorBaseType(PrimaryConstructorBaseTypeSyntax node) diff --git a/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs index 9d780ecf96de5..7a3df84b422fb 100644 --- a/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs @@ -271,7 +271,7 @@ internal override bool TryGetSpeculativeSemanticModelCore(SyntaxTreeSemanticMode { if (MemberSymbol is SynthesizedRecordConstructor primaryCtor && primaryCtor.GetSyntax() is RecordDeclarationSyntax recordDecl && - Root.FindToken(position).Parent?.AncestorsAndSelf().OfType().FirstOrDefault() == recordDecl.PrimaryConstructorBaseType) + Root.FindToken(position).Parent?.AncestorsAndSelf().OfType().FirstOrDefault() == recordDecl.PrimaryConstructorBaseTypeIfClass) { var binder = this.GetEnclosingBinder(position); if (binder != null) diff --git a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs index 61f0a48e49946..e6ec328033bcd 100644 --- a/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/SyntaxTreeSemanticModel.cs @@ -181,7 +181,7 @@ internal override IOperation GetOperationWorker(CSharpSyntaxNode node, Cancellat case AccessorDeclarationSyntax accessor: model = (accessor.Body != null || accessor.ExpressionBody != null) ? GetOrAddModel(node) : null; break; - case RecordDeclarationSyntax { ParameterList: { }, PrimaryConstructorBaseType: { } } recordDeclaration when TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor: + case RecordDeclarationSyntax { ParameterList: { }, PrimaryConstructorBaseTypeIfClass: { } } recordDeclaration when TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor: model = GetOrAddModel(recordDeclaration); break; default: @@ -814,7 +814,7 @@ private MemberSemanticModel GetMemberModel(int position) } else { - var argumentList = recordDecl.PrimaryConstructorBaseType?.ArgumentList; + var argumentList = recordDecl.PrimaryConstructorBaseTypeIfClass?.ArgumentList; outsideMemberDecl = argumentList is null || !LookupPosition.IsBetweenTokens(position, argumentList.OpenParenToken, argumentList.CloseParenToken); } } @@ -877,7 +877,7 @@ internal override MemberSemanticModel GetMemberModel(SyntaxNode node) { var recordDecl = (RecordDeclarationSyntax)memberDecl; return recordDecl.ParameterList is object && - recordDecl.PrimaryConstructorBaseType is PrimaryConstructorBaseTypeSyntax baseWithArguments && + recordDecl.PrimaryConstructorBaseTypeIfClass is PrimaryConstructorBaseTypeSyntax baseWithArguments && (node == baseWithArguments || baseWithArguments.ArgumentList.FullSpan.Contains(span)) ? GetOrAddModel(memberDecl) : null; } @@ -2395,43 +2395,73 @@ internal override Func GetSyntaxNodesToAnalyzeFilter(SyntaxNod break; case RecordDeclarationSyntax recordDeclaration when TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor ctor: - switch (declaredSymbol.Kind) + if (recordDeclaration.IsKind(SyntaxKind.RecordDeclaration)) { - case SymbolKind.Method: - Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor); - return (node) => - { - // Accept only nodes that either match, or above/below of a 'parameter list'/'base arguments list'. - if (node.Parent == recordDeclaration) - { - return node == recordDeclaration.ParameterList || node == recordDeclaration.BaseList; - } - else if (node.Parent is BaseListSyntax baseList) - { - return node == recordDeclaration.PrimaryConstructorBaseType; - } - else if (node.Parent is PrimaryConstructorBaseTypeSyntax baseType && baseType == recordDeclaration.PrimaryConstructorBaseType) + switch (declaredSymbol.Kind) + { + case SymbolKind.Method: + Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor); + return (node) => { - return node == baseType.ArgumentList; - } - - return true; - }; - - case SymbolKind.NamedType: - Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor.ContainingSymbol); - // Accept nodes that do not match a 'parameter list'/'base arguments list'. - return (node) => node != recordDeclaration.ParameterList && - !(node.Kind() == SyntaxKind.ArgumentList && node == recordDeclaration.PrimaryConstructorBaseType?.ArgumentList); - - default: - ExceptionUtilities.UnexpectedValue(declaredSymbol.Kind); - break; + // Accept only nodes that either match, or above/below of a 'parameter list'/'base arguments list'. + if (node.Parent == recordDeclaration) + { + return node == recordDeclaration.ParameterList || node == recordDeclaration.BaseList; + } + else if (node.Parent is BaseListSyntax baseList) + { + return node == recordDeclaration.PrimaryConstructorBaseTypeIfClass; + } + else if (node.Parent is PrimaryConstructorBaseTypeSyntax baseType && baseType == recordDeclaration.PrimaryConstructorBaseTypeIfClass) + { + return node == baseType.ArgumentList; + } + + return true; + }; + + case SymbolKind.NamedType: + Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor.ContainingSymbol); + // Accept nodes that do not match a 'parameter list'/'base arguments list'. + return (node) => node != recordDeclaration.ParameterList && + !(node.Kind() == SyntaxKind.ArgumentList && node == recordDeclaration.PrimaryConstructorBaseTypeIfClass?.ArgumentList); + + default: + ExceptionUtilities.UnexpectedValue(declaredSymbol.Kind); + break; + } + } + else + { + switch (declaredSymbol.Kind) + { + case SymbolKind.Method: + Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor); + return (node) => + { + // Accept only nodes that either match, or above/below of a 'parameter list'. + if (node.Parent == recordDeclaration) + { + return node == recordDeclaration.ParameterList; + } + + return true; + }; + + case SymbolKind.NamedType: + Debug.Assert((object)declaredSymbol.GetSymbol() == (object)ctor.ContainingSymbol); + // Accept nodes that do not match a 'parameter list'. + return (node) => node != recordDeclaration.ParameterList; + + default: + ExceptionUtilities.UnexpectedValue(declaredSymbol.Kind); + break; + } } break; case PrimaryConstructorBaseTypeSyntax { Parent: BaseListSyntax { Parent: RecordDeclarationSyntax recordDeclaration } } baseType - when recordDeclaration.PrimaryConstructorBaseType == declaredNode && TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor ctor: + when recordDeclaration.PrimaryConstructorBaseTypeIfClass == declaredNode && TryGetSynthesizedRecordConstructor(recordDeclaration) is SynthesizedRecordConstructor ctor: if ((object)declaredSymbol.GetSymbol() == (object)ctor) { // Only 'base arguments list' or nodes below it diff --git a/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs b/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs index e318b10ad3a13..50568274f92c7 100644 --- a/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs +++ b/src/Compilers/CSharp/Portable/Compiler/MethodCompiler.cs @@ -1973,9 +1973,9 @@ internal static BoundExpression BindImplicitConstructorInitializer( CSharpSyntaxNode containerNode = constructor.GetNonNullSyntaxNode(); BinderFactory binderFactory = compilation.GetBinderFactory(containerNode.SyntaxTree); - if (containerNode is RecordDeclarationSyntax) + if (containerNode is RecordDeclarationSyntax recordDecl) { - outerBinder = binderFactory.GetInRecordBodyBinder((TypeDeclarationSyntax)containerNode); + outerBinder = binderFactory.GetInRecordBodyBinder(recordDecl); } else { diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index 6a82bcbca6139..84a28ea12805d 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2484,17 +2484,7 @@ private sealed class DeclaredMembersAndInitializersBuilder public readonly ArrayBuilder> StaticInitializers = ArrayBuilder>.GetInstance(); public readonly ArrayBuilder> InstanceInitializers = ArrayBuilder>.GetInstance(); public bool HaveIndexers; - - private TypeDeclarationSyntax? _recordDeclarationWithParameters; - public TypeDeclarationSyntax? RecordDeclarationWithParameters - { - get { return _recordDeclarationWithParameters; } - set - { - Debug.Assert(value is RecordDeclarationSyntax); - _recordDeclarationWithParameters = value; - } - } + public RecordDeclarationSyntax? RecordDeclarationWithParameters; public SynthesizedRecordConstructor? RecordPrimaryConstructor; public bool IsNullableEnabledForInstanceConstructorsAndFields; @@ -2560,7 +2550,7 @@ protected sealed class DeclaredMembersAndInitializers public readonly ImmutableArray> StaticInitializers; public readonly ImmutableArray> InstanceInitializers; public readonly bool HaveIndexers; - public readonly TypeDeclarationSyntax? RecordDeclarationWithParameters; + public readonly RecordDeclarationSyntax? RecordDeclarationWithParameters; public readonly SynthesizedRecordConstructor? RecordPrimaryConstructor; public readonly bool IsNullableEnabledForInstanceConstructorsAndFields; public readonly bool IsNullableEnabledForStaticConstructorsAndFields; @@ -2576,7 +2566,7 @@ public DeclaredMembersAndInitializers( ImmutableArray> staticInitializers, ImmutableArray> instanceInitializers, bool haveIndexers, - TypeDeclarationSyntax? recordDeclarationWithParameters, + RecordDeclarationSyntax? recordDeclarationWithParameters, SynthesizedRecordConstructor? recordPrimaryConstructor, bool isNullableEnabledForInstanceConstructorsAndFields, bool isNullableEnabledForStaticConstructorsAndFields, @@ -2588,7 +2578,6 @@ public DeclaredMembersAndInitializers( Debug.Assert(!nonTypeMembers.Any(s => s is TypeSymbol)); Debug.Assert(recordDeclarationWithParameters is object == recordPrimaryConstructor is object); - Debug.Assert(recordDeclarationWithParameters is null or RecordDeclarationSyntax); this.NonTypeMembers = nonTypeMembers; this.StaticInitializers = staticInitializers; @@ -2958,12 +2947,12 @@ private void AddDeclaredNontypeMembers(DeclaredMembersAndInitializersBuilder bui case SyntaxKind.RecordDeclaration: case SyntaxKind.RecordStructDeclaration: var recordDecl = (RecordDeclarationSyntax)syntax; - noteRecordParameters(recordDecl, recordDecl.ParameterList, builder, diagnostics); + var parameterList = recordDecl.ParameterList; + noteRecordParameters(recordDecl, parameterList, builder, diagnostics); AddNonTypeMembers(builder, recordDecl.Members, diagnostics); // We will allow declaring parameterless constructors // Tracking issue https://github.com/dotnet/roslyn/issues/52240 - var parameterList = recordDecl.ParameterList; if (syntax.Kind() == SyntaxKind.RecordStructDeclaration && parameterList?.ParameterCount == 0) { diagnostics.Add(ErrorCode.ERR_StructsCantContainDefaultConstructor, parameterList.Location); @@ -2976,7 +2965,7 @@ private void AddDeclaredNontypeMembers(DeclaredMembersAndInitializersBuilder bui } } - void noteRecordParameters(TypeDeclarationSyntax syntax, ParameterListSyntax? parameterList, DeclaredMembersAndInitializersBuilder builder, BindingDiagnosticBag diagnostics) + void noteRecordParameters(RecordDeclarationSyntax syntax, ParameterListSyntax? parameterList, DeclaredMembersAndInitializersBuilder builder, BindingDiagnosticBag diagnostics) { if (parameterList is null) { @@ -2991,7 +2980,7 @@ void noteRecordParameters(TypeDeclarationSyntax syntax, ParameterListSyntax? par var compilation = DeclaringCompilation; builder.UpdateIsNullableEnabledForConstructorsAndFields(ctor.IsStatic, compilation, parameterList); - if (syntax is RecordDeclarationSyntax { PrimaryConstructorBaseType: { ArgumentList: { } baseParamList } }) + if (syntax is RecordDeclarationSyntax { PrimaryConstructorBaseTypeIfClass: { ArgumentList: { } baseParamList } }) { builder.UpdateIsNullableEnabledForConstructorsAndFields(ctor.IsStatic, compilation, baseParamList); } @@ -3448,10 +3437,7 @@ private void AddSynthesizedRecordMembersIfNecessary(MembersAndInitializersBuilde return; } - ParameterListSyntax? paramList = declaredMembersAndInitializers.RecordDeclarationWithParameters is RecordDeclarationSyntax recordDecl - ? recordDecl.ParameterList - : null; - + ParameterListSyntax? paramList = declaredMembersAndInitializers.RecordDeclarationWithParameters?.ParameterList; var memberSignatures = s_duplicateRecordMemberSignatureDictionary.Allocate(); var fieldsByName = PooledDictionary.GetInstance(); var membersSoFar = builder.GetNonTypeMembers(declaredMembersAndInitializers); diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMethodSymbolWithAttributes.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMethodSymbolWithAttributes.cs index cd7e8f403a2a0..3c9106c9e8724 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMethodSymbolWithAttributes.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMethodSymbolWithAttributes.cs @@ -56,6 +56,7 @@ protected SourceMethodSymbolWithAttributes(SyntaxReference syntaxReferenceOpt) case CompilationUnitSyntax _ when this is SynthesizedSimpleProgramEntryPointSymbol entryPoint: return (CSharpSyntaxNode)entryPoint.ReturnTypeSyntax; case RecordDeclarationSyntax recordDecl: + Debug.Assert(recordDecl.IsKind(SyntaxKind.RecordDeclaration)); return recordDecl; default: return null; diff --git a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs index c85209dbbb3ac..90e0fe9dac24d 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs @@ -40,8 +40,7 @@ protected override ParameterListSyntax GetParameterList() protected override CSharpSyntaxNode? GetInitializer() { var record = (RecordDeclarationSyntax)GetSyntax(); - Debug.Assert(record.Kind() == SyntaxKind.RecordDeclaration || record.PrimaryConstructorBaseType is null); - return record.PrimaryConstructorBaseType; + return record.PrimaryConstructorBaseTypeIfClass; } protected override bool AllowRefOrOut => false; diff --git a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs index b0a561ec1e0d7..71b907e484dbf 100644 --- a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs +++ b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs @@ -2,16 +2,22 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. +using System.Diagnostics; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace Microsoft.CodeAnalysis.CSharp.Syntax { public partial class RecordDeclarationSyntax { - internal PrimaryConstructorBaseTypeSyntax? PrimaryConstructorBaseType + internal PrimaryConstructorBaseTypeSyntax? PrimaryConstructorBaseTypeIfClass { get { + if (ClassOrStructKeyword.Kind() is SyntaxKind.StructKeyword) + { + return null; + } + return BaseList?.Types.FirstOrDefault() as PrimaryConstructorBaseTypeSyntax; } } diff --git a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs index 5277ceab5e0dd..34766918196a9 100644 --- a/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs +++ b/src/Features/CSharp/Portable/GenerateType/CSharpGenerateTypeService.cs @@ -671,8 +671,7 @@ internal override bool TryGetBaseList(ExpressionSyntax expression, out TypeKindO { if (node is BaseListSyntax) { - if (node.Parent is InterfaceDeclarationSyntax or StructDeclarationSyntax - || node.Parent.Kind() == SyntaxKind.RecordStructDeclaration) + if (node.Parent.IsKind(SyntaxKind.InterfaceDeclaration, SyntaxKind.StructDeclaration, SyntaxKind.RecordStructDeclaration)) { typeKindValue = TypeKindOptions.Interface; return true; From 3ef4083572565558248d14b66bf882b0dc082186 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Tue, 20 Apr 2021 12:40:16 -0700 Subject: [PATCH 05/12] Further simplifications --- src/Compilers/CSharp/Portable/Binder/BinderFactory.cs | 2 +- .../Symbols/Source/SourceMemberContainerSymbol.cs | 2 +- .../Synthesized/Records/SynthesizedRecordConstructor.cs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs b/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs index 170e4a51e5d9f..ffcf45ca4ce70 100644 --- a/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs +++ b/src/Compilers/CSharp/Portable/Binder/BinderFactory.cs @@ -140,7 +140,7 @@ internal Binder GetBinder(SyntaxNode node, int position, CSharpSyntaxNode member internal InMethodBinder GetRecordConstructorInMethodBinder(SynthesizedRecordConstructor constructor) { - var recordDecl = (RecordDeclarationSyntax)constructor.GetSyntax(); + var recordDecl = constructor.GetSyntax(); Debug.Assert(recordDecl.IsKind(SyntaxKind.RecordDeclaration)); var extraInfo = NodeUsage.ConstructorBodyOrInitializer; diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs index 84a28ea12805d..6b381ae445677 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceMemberContainerSymbol.cs @@ -2980,7 +2980,7 @@ void noteRecordParameters(RecordDeclarationSyntax syntax, ParameterListSyntax? p var compilation = DeclaringCompilation; builder.UpdateIsNullableEnabledForConstructorsAndFields(ctor.IsStatic, compilation, parameterList); - if (syntax is RecordDeclarationSyntax { PrimaryConstructorBaseTypeIfClass: { ArgumentList: { } baseParamList } }) + if (syntax is { PrimaryConstructorBaseTypeIfClass: { ArgumentList: { } baseParamList } }) { builder.UpdateIsNullableEnabledForConstructorsAndFields(ctor.IsStatic, compilation, baseParamList); } diff --git a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs index 90e0fe9dac24d..baece16bb7dac 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Synthesized/Records/SynthesizedRecordConstructor.cs @@ -25,21 +25,21 @@ public SynthesizedRecordConstructor( isNullableAnalysisEnabled: false); // IsNullableAnalysisEnabled uses containing type instead. } - internal TypeDeclarationSyntax GetSyntax() + internal RecordDeclarationSyntax GetSyntax() { Debug.Assert(syntaxReferenceOpt != null); - return (TypeDeclarationSyntax)syntaxReferenceOpt.GetSyntax(); + return (RecordDeclarationSyntax)syntaxReferenceOpt.GetSyntax(); } protected override ParameterListSyntax GetParameterList() { - var record = (RecordDeclarationSyntax)GetSyntax(); + var record = GetSyntax(); return record.ParameterList!; } protected override CSharpSyntaxNode? GetInitializer() { - var record = (RecordDeclarationSyntax)GetSyntax(); + var record = GetSyntax(); return record.PrimaryConstructorBaseTypeIfClass; } From 8618ce531366c92285692a39f7d0cc1a3d03be7b Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Tue, 20 Apr 2021 14:32:16 -0700 Subject: [PATCH 06/12] tweak --- src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs index 71b907e484dbf..7521bc038c6fc 100644 --- a/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs +++ b/src/Compilers/CSharp/Portable/Syntax/RecordDeclarationSyntax.cs @@ -13,7 +13,7 @@ internal PrimaryConstructorBaseTypeSyntax? PrimaryConstructorBaseTypeIfClass { get { - if (ClassOrStructKeyword.Kind() is SyntaxKind.StructKeyword) + if (Kind() == SyntaxKind.RecordStructDeclaration) { return null; } From f8977721f4f9c349fda86eac8c9b71c0abc6fd92 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Tue, 20 Apr 2021 16:04:02 -0700 Subject: [PATCH 07/12] Fix bug with parameter lists on implemented interface --- .../CSharp/Portable/Parser/LanguageParser.cs | 9 +- .../Source/SourceNamedTypeSymbol_Bases.cs | 12 ++ .../Semantic/Semantics/RecordStructTests.cs | 81 +++++++++++ .../Test/Semantic/Semantics/RecordTests.cs | 134 ++++++++++++++++-- .../Test/Syntax/Parsing/RecordParsing.cs | 15 +- 5 files changed, 221 insertions(+), 30 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs index df36ddc05d2f6..b6821e0c202a0 100644 --- a/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs +++ b/src/Compilers/CSharp/Portable/Parser/LanguageParser.cs @@ -1501,7 +1501,7 @@ private TypeDeclarationSyntax ParseClassOrStructOrInterfaceDeclaration(SyntaxLis var paramList = keyword.Kind == SyntaxKind.RecordKeyword && CurrentToken.Kind == SyntaxKind.OpenParenToken ? ParseParenthesizedParameterList() : null; - var baseList = this.ParseBaseList(keyword, paramList is object); + var baseList = this.ParseBaseList(); _termState = saveTerm; // Parse class body @@ -1801,7 +1801,7 @@ private bool IsPossibleAggregateClauseStartOrStop() || this.IsCurrentTokenWhereOfConstraintClause(); } - private BaseListSyntax ParseBaseList(SyntaxToken typeKeyword, bool haveParameters) + private BaseListSyntax ParseBaseList() { if (this.CurrentToken.Kind != SyntaxKind.ColonToken) { @@ -1819,11 +1819,6 @@ private BaseListSyntax ParseBaseList(SyntaxToken typeKeyword, bool haveParameter if (this.CurrentToken.Kind == SyntaxKind.OpenParenToken) { argumentList = this.ParseParenthesizedArgumentList(); - - if (typeKeyword.Kind != SyntaxKind.RecordKeyword || !haveParameters) - { - argumentList = this.AddErrorToFirstToken(argumentList, ErrorCode.ERR_UnexpectedArgumentList); - } } list.Add(argumentList is object ? _syntaxFactory.PrimaryConstructorBaseType(firstType, argumentList) : (BaseTypeSyntax)_syntaxFactory.SimpleBaseType(firstType)); diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs index 985687c269754..41400d1824139 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs @@ -492,6 +492,7 @@ private Tuple> MakeOneDeclaredB var info = diagnostics.Add(ErrorCode.ERR_StaticDerivedFromNonObject, location, this, localBase); localBase = new ExtendedErrorTypeSymbol(localBase, LookupResultKind.NotReferencable, info); } + checkPrimaryConstructorBaseType(baseTypeSyntax, localBase); continue; } } @@ -500,6 +501,8 @@ private Tuple> MakeOneDeclaredB baseType = baseBinder.BindType(typeSyntax, diagnostics, newBasesBeingResolved).Type; } + checkPrimaryConstructorBaseType(baseTypeSyntax, baseType); + switch (baseType.TypeKind) { case TypeKind.Interface: @@ -582,6 +585,15 @@ private Tuple> MakeOneDeclaredB } return new Tuple>(localBase, localInterfaces.ToImmutableAndFree()); + + void checkPrimaryConstructorBaseType(BaseTypeSyntax baseTypeSyntax, TypeSymbol baseType) + { + if (baseTypeSyntax is PrimaryConstructorBaseTypeSyntax primaryConstructorBaseType && + (!IsRecord || TypeKind == TypeKind.Struct || baseType.TypeKind == TypeKind.Interface || ((RecordDeclarationSyntax)decl.SyntaxReference.GetSyntax()).ParameterList is null)) + { + diagnostics.Add(ErrorCode.ERR_UnexpectedArgumentList, primaryConstructorBaseType.ArgumentList.Location); + } + } } /// diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs index 54e175d7de325..74d1bc6110183 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs @@ -7395,5 +7395,86 @@ public void SyntaxFactory_TypeDeclaration() }"; AssertEx.AssertEqualToleratingWhitespaceDifferences(expected, SyntaxFactory.TypeDeclaration(SyntaxKind.RecordStructDeclaration, "Point").NormalizeWhitespace().ToString()); } + + [Fact] + public void InterfaceWithParameters() + { + var src = @" +public interface I +{ +} + +record struct R(int X) : I() +{ +} + +record struct R2(int X) : I(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,27): error CS8861: Unexpected argument list. + // record struct R(int X) : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 27), + // (10,28): error CS8861: Unexpected argument list. + // record struct R2(int X) : I(X) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(10, 28) + ); + } + + [Fact] + public void InterfaceWithParameters_NoPrimaryConstructor() + { + var src = @" +public interface I +{ +} + +record struct R : I() +{ +} + +record struct R2 : I(0) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,20): error CS8861: Unexpected argument list. + // record struct R : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 20), + // (10,21): error CS8861: Unexpected argument list. + // record struct R2 : I(0) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0)").WithLocation(10, 21) + ); + } + + [Fact] + public void InterfaceWithParameters_Struct() + { + var src = @" +public interface I +{ +} + +struct C : I() +{ +} + +struct C2 : I(0) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,13): error CS8861: Unexpected argument list. + // struct C : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 13), + // (10,14): error CS8861: Unexpected argument list. + // struct C2 : I(0) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0)").WithLocation(10, 14) + ); + } } } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs index 2e1fb1f4dc9c7..61334feb1c363 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs @@ -21434,7 +21434,7 @@ record C : Base(X, Y) comp.VerifyEmitDiagnostics( // (13,16): error CS8861: Unexpected argument list. // record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(13, 16) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(13, 16) ); var tree = comp.SyntaxTrees.First(); @@ -21480,7 +21480,7 @@ partial record C : Base(X, Y) comp.VerifyEmitDiagnostics( // (17,24): error CS8861: Unexpected argument list. // partial record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(17, 24) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(17, 24) ); var tree = comp.SyntaxTrees.First(); @@ -21533,10 +21533,10 @@ partial record C : Base(X, Y) comp.VerifyEmitDiagnostics( // (13,24): error CS8861: Unexpected argument list. // partial record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(13, 24), + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(13, 24), // (17,24): error CS8861: Unexpected argument list. // partial record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(17, 24) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(17, 24) ); var tree = comp.SyntaxTrees.First(); @@ -21595,7 +21595,7 @@ partial record C : Base(X, Y) comp.VerifyEmitDiagnostics( // (17,24): error CS8861: Unexpected argument list. // partial record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(17, 24) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(17, 24) ); var tree = comp.SyntaxTrees.First(); @@ -21684,7 +21684,7 @@ partial record C(int X, int Y) : Base(X, Y) comp.VerifyEmitDiagnostics( // (13,24): error CS8861: Unexpected argument list. // partial record C : Base(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(13, 24) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X, Y)").WithLocation(13, 24) ); var tree = comp.SyntaxTrees.First(); @@ -21883,7 +21883,7 @@ class C : Base(X) Diagnostic(ErrorCode.ERR_NoCorrespondingArgument, "C").WithArguments("X", "Base.Base(int)").WithLocation(11, 7), // (11,15): error CS8861: Unexpected argument list. // class C : Base(X) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(11, 15) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(11, 15) ); var tree = comp.SyntaxTrees.First(); @@ -21920,7 +21920,7 @@ struct C : Base(X) comp.VerifyEmitDiagnostics( // (8,16): error CS8861: Unexpected argument list. // struct C : Base(X) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(8, 16) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(8, 16) ); var tree = comp.SyntaxTrees.First(); @@ -21957,7 +21957,7 @@ interface C : Base(X) comp.VerifyEmitDiagnostics( // (8,19): error CS8861: Unexpected argument list. // interface C : Base(X) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(8, 19) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(8, 19) ); var tree = comp.SyntaxTrees.First(); @@ -22360,7 +22360,7 @@ interface I {} comp.VerifyDiagnostics( // (11,15): error CS8861: Unexpected argument list. // class C : Base(GetInt(X, out var xx) + xx, Y), I - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(11, 15), + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(GetInt(X, out var xx) + xx, Y)").WithLocation(11, 15), // (13,30): error CS1729: 'Base' does not contain a constructor that takes 4 arguments // C(int X, int Y, int Z) : base(X, Y, Z, 1) { return; } Diagnostic(ErrorCode.ERR_BadCtorArgCount, "base").WithArguments("Base", "4").WithLocation(13, 30) @@ -29353,5 +29353,119 @@ record C(int P) Diagnostic(ErrorCode.ERR_BadRecordMemberForPositionalParameter, "P").WithArguments("C.P", "int", "P").WithLocation(2, 14) ); } + + [Fact] + public void InterfaceWithParameters() + { + var src = @" +public interface I +{ +} + +record R(int X) : I() +{ +} + +record R2(int X) : I(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,20): error CS8861: Unexpected argument list. + // record R(int X) : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 20), + // (10,21): error CS8861: Unexpected argument list. + // record R2(int X) : I(X) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(10, 21), + // (10,21): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record R2(int X) : I(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(10, 21) + ); + } + + [Fact] + public void InterfaceWithParameters_RecordClass() + { + var src = @" +public interface I +{ +} + +record class R(int X) : I() +{ +} + +record class R2(int X) : I(X) +{ +} +"; + var comp = CreateCompilation(new[] { src, IsExternalInitTypeDefinition }, parseOptions: TestOptions.RegularPreview); + comp.VerifyEmitDiagnostics( + // (6,26): error CS8861: Unexpected argument list. + // record class R(int X) : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 26), + // (10,27): error CS8861: Unexpected argument list. + // record class R2(int X) : I(X) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(X)").WithLocation(10, 27), + // (10,27): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record class R2(int X) : I(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(10, 27) + ); + } + + [Fact] + public void InterfaceWithParameters_NoPrimaryConstructor() + { + var src = @" +public interface I +{ +} + +record R : I() +{ +} + +record R2 : I(0) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,13): error CS8861: Unexpected argument list. + // record R : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 13), + // (10,14): error CS8861: Unexpected argument list. + // record R2 : I(0) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0)").WithLocation(10, 14) + ); + } + + [Fact] + public void InterfaceWithParameters_Class() + { + var src = @" +public interface I +{ +} + +class C : I() +{ +} + +class C2 : I(0) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (6,12): error CS8861: Unexpected argument list. + // class C : I() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(6, 12), + // (10,13): error CS8861: Unexpected argument list. + // class C2 : I(0) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0)").WithLocation(10, 13) + ); + } } } diff --git a/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs b/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs index 5e9081dd8c219..3c690d5702b79 100644 --- a/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs +++ b/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs @@ -2224,11 +2224,7 @@ public void Base_01( if (!withParameters && withBaseArguments) { - UsingTree(text, - // (2,4): error CS8861: Unexpected argument list. - // : B(X, Y) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(2, 4) - ); + UsingTree(text); } else { @@ -2550,9 +2546,6 @@ public void Base_05() { var text = "interface C : B(X, Y);"; UsingTree(text, - // (1,16): error CS8861: Unexpected argument list. - // interface C : B(X, Y); - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(1, 16), // (1,22): error CS1003: Syntax error, ',' expected // interface C : B(X, Y); Diagnostic(ErrorCode.ERR_SyntaxError, ";").WithArguments(",", ";").WithLocation(1, 22), @@ -3897,11 +3890,7 @@ public void RecordStructParsing_Fixed() public void RecordStructParsing_BaseListWithParens() { var text = "record struct S : Base(1);"; - UsingTree(text, options: TestOptions.RegularPreview, - // (1,23): error CS8861: Unexpected argument list. - // record struct S : Base(1); - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(").WithLocation(1, 23) - ); + UsingTree(text, options: TestOptions.RegularPreview); N(SyntaxKind.CompilationUnit); { From 02326be07d2f5d621733dff1710427b5fec0101b Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 21 Apr 2021 09:29:20 -0700 Subject: [PATCH 08/12] test cleanup --- .../CSharp/Test/Syntax/Parsing/RecordParsing.cs | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs b/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs index 3c690d5702b79..8a41b481ea4bf 100644 --- a/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs +++ b/src/Compilers/CSharp/Test/Syntax/Parsing/RecordParsing.cs @@ -2222,14 +2222,7 @@ public void Base_01( : B" + (withBaseArguments ? "(X, Y)" : "") + @" " + (withBody ? "{ }" : ";"); - if (!withParameters && withBaseArguments) - { - UsingTree(text); - } - else - { - UsingTree(text); - } + UsingTree(text); N(SyntaxKind.CompilationUnit); { From 778b84384500862014ccc871ad99a68cc33355da Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 21 Apr 2021 09:38:24 -0700 Subject: [PATCH 09/12] Add extra check for first item --- .../Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs index 41400d1824139..0d9cd1a3e227e 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs @@ -501,7 +501,10 @@ private Tuple> MakeOneDeclaredB baseType = baseBinder.BindType(typeSyntax, diagnostics, newBasesBeingResolved).Type; } - checkPrimaryConstructorBaseType(baseTypeSyntax, baseType); + if (i == 0) + { + checkPrimaryConstructorBaseType(baseTypeSyntax, baseType); + } switch (baseType.TypeKind) { From 57bb24561805be199e3ecf46b5ed105bf5e5a232 Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 21 Apr 2021 10:26:55 -0700 Subject: [PATCH 10/12] nit --- .../Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs index 0d9cd1a3e227e..e52b2615acfcc 100644 --- a/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs +++ b/src/Compilers/CSharp/Portable/Symbols/Source/SourceNamedTypeSymbol_Bases.cs @@ -502,7 +502,7 @@ private Tuple> MakeOneDeclaredB } if (i == 0) - { + { checkPrimaryConstructorBaseType(baseTypeSyntax, baseType); } @@ -592,7 +592,7 @@ private Tuple> MakeOneDeclaredB void checkPrimaryConstructorBaseType(BaseTypeSyntax baseTypeSyntax, TypeSymbol baseType) { if (baseTypeSyntax is PrimaryConstructorBaseTypeSyntax primaryConstructorBaseType && - (!IsRecord || TypeKind == TypeKind.Struct || baseType.TypeKind == TypeKind.Interface || ((RecordDeclarationSyntax)decl.SyntaxReference.GetSyntax()).ParameterList is null)) + (!IsRecord || TypeKind != TypeKind.Class || baseType.TypeKind == TypeKind.Interface || ((RecordDeclarationSyntax)decl.SyntaxReference.GetSyntax()).ParameterList is null)) { diagnostics.Add(ErrorCode.ERR_UnexpectedArgumentList, primaryConstructorBaseType.ArgumentList.Location); } From f4c4d0c772f268ffd30198780c9183e54a85538d Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 21 Apr 2021 12:55:38 -0700 Subject: [PATCH 11/12] More tests --- .../Semantic/Semantics/RecordStructTests.cs | 47 ++++++++ .../Test/Semantic/Semantics/RecordTests.cs | 112 +++++++++++++++++- 2 files changed, 158 insertions(+), 1 deletion(-) diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs index 74d1bc6110183..617931b8a2691 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs @@ -7476,5 +7476,52 @@ struct C2 : I(0) Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0)").WithLocation(10, 14) ); } + + [Fact] + public void BaseArguments_Speculation() + { + var src = @" +record struct R1(int X) : Error(0, 1) +{ +} +record struct R2(int X) : Error() +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyDiagnostics( + // (2,27): error CS0246: The type or namespace name 'Error' could not be found (are you missing a using directive or an assembly reference?) + // record struct R1(int X) : Error(0, 1) + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error").WithArguments("Error").WithLocation(2, 27), + // (2,32): error CS8861: Unexpected argument list. + // record struct R1(int X) : Error(0, 1) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0, 1)").WithLocation(2, 32), + // (5,27): error CS0246: The type or namespace name 'Error' could not be found (are you missing a using directive or an assembly reference?) + // record struct R2(int X) : Error() + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error").WithArguments("Error").WithLocation(5, 27), + // (5,32): error CS8861: Unexpected argument list. + // record struct R2(int X) : Error() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(5, 32) + ); + + var tree = comp.SyntaxTrees.First(); + var model = comp.GetSemanticModel(tree); + + var baseWithargs = + tree.GetRoot().DescendantNodes().OfType().First(); + Assert.Equal("Error(0, 1)", baseWithargs.ToString()); + + var speculativeBase = + baseWithargs.WithArgumentList(baseWithargs.ArgumentList.WithArguments(baseWithargs.ArgumentList.Arguments.RemoveAt(1))); + Assert.Equal("Error(0)", speculativeBase.ToString()); + + Assert.False(model.TryGetSpeculativeSemanticModel(baseWithargs.ArgumentList.OpenParenToken.SpanStart, speculativeBase, out _)); + + var baseWithoutargs = + tree.GetRoot().DescendantNodes().OfType().Last(); + Assert.Equal("Error()", baseWithoutargs.ToString()); + + Assert.False(model.TryGetSpeculativeSemanticModel(baseWithoutargs.ArgumentList.OpenParenToken.SpanStart, speculativeBase, out _)); + } } } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs index 5dccfd47c2d26..9d48894caf363 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordTests.cs @@ -29741,7 +29741,7 @@ record class R2(int X) : I(X) { } "; - var comp = CreateCompilation(new[] { src, IsExternalInitTypeDefinition }, parseOptions: TestOptions.RegularPreview); + var comp = CreateCompilation(src); comp.VerifyEmitDiagnostics( // (6,26): error CS8861: Unexpected argument list. // record class R(int X) : I() @@ -29755,6 +29755,116 @@ record class R2(int X) : I(X) ); } + [Fact] + public void BaseErrorTypeWithParameters() + { + var src = @" +record R2(int X) : Error(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (2,8): error CS0115: 'R2.ToString()': no suitable method found to override + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_OverrideNotExpected, "R2").WithArguments("R2.ToString()").WithLocation(2, 8), + // (2,8): error CS0115: 'R2.EqualityContract': no suitable method found to override + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_OverrideNotExpected, "R2").WithArguments("R2.EqualityContract").WithLocation(2, 8), + // (2,8): error CS0115: 'R2.Equals(object?)': no suitable method found to override + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_OverrideNotExpected, "R2").WithArguments("R2.Equals(object?)").WithLocation(2, 8), + // (2,8): error CS0115: 'R2.GetHashCode()': no suitable method found to override + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_OverrideNotExpected, "R2").WithArguments("R2.GetHashCode()").WithLocation(2, 8), + // (2,8): error CS0115: 'R2.PrintMembers(StringBuilder)': no suitable method found to override + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_OverrideNotExpected, "R2").WithArguments("R2.PrintMembers(System.Text.StringBuilder)").WithLocation(2, 8), + // (2,20): error CS0246: The type or namespace name 'Error' could not be found (are you missing a using directive or an assembly reference?) + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error").WithArguments("Error").WithLocation(2, 20), + // (2,25): error CS1729: 'Error' does not contain a constructor that takes 1 arguments + // record R2(int X) : Error(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("Error", "1").WithLocation(2, 25) + ); + } + + [Fact] + public void BaseDynamicTypeWithParameters() + { + var src = @" +record R(int X) : dynamic(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (2,19): error CS1965: 'R': cannot derive from the dynamic type + // record R(int X) : dynamic(X) + Diagnostic(ErrorCode.ERR_DeriveFromDynamic, "dynamic").WithArguments("R").WithLocation(2, 19), + // (2,26): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record R(int X) : dynamic(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(2, 26) + ); + } + + [Fact] + public void BaseTypeParameterTypeWithParameters() + { + var src = @" +class C +{ + record R(int X) : T(X) + { + } +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (4,23): error CS0689: Cannot derive from 'T' because it is a type parameter + // record R(int X) : T(X) + Diagnostic(ErrorCode.ERR_DerivingFromATyVar, "T").WithArguments("T").WithLocation(4, 23), + // (4,24): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record R(int X) : T(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(4, 24) + ); + } + + [Fact] + public void BaseObjectTypeWithParameters() + { + var src = @" +record R(int X) : object(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (2,25): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record R(int X) : object(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(2, 25) + ); + } + + [Fact] + public void BaseValueTypeTypeWithParameters() + { + var src = @" +record R(int X) : System.ValueType(X) +{ +} +"; + var comp = CreateCompilation(src); + comp.VerifyEmitDiagnostics( + // (2,19): error CS0644: 'R' cannot derive from special class 'ValueType' + // record R(int X) : System.ValueType(X) + Diagnostic(ErrorCode.ERR_DeriveFromEnumOrValueType, "System.ValueType").WithArguments("R", "System.ValueType").WithLocation(2, 19), + // (2,35): error CS1729: 'object' does not contain a constructor that takes 1 arguments + // record R(int X) : System.ValueType(X) + Diagnostic(ErrorCode.ERR_BadCtorArgCount, "(X)").WithArguments("object", "1").WithLocation(2, 35) + ); + } + [Fact] public void InterfaceWithParameters_NoPrimaryConstructor() { From 5c551d2de04198c05680b81671dcc806554bed7f Mon Sep 17 00:00:00 2001 From: Julien Couvreur Date: Wed, 21 Apr 2021 17:14:36 -0700 Subject: [PATCH 12/12] Add assertion and speculation on SimpleBaseType --- .../Compilation/MethodBodySemanticModel.cs | 19 ++++---- .../Semantic/Semantics/RecordStructTests.cs | 47 ++++++++++++------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs b/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs index 7a3df84b422fb..7d6df06e584b2 100644 --- a/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs +++ b/src/Compilers/CSharp/Portable/Compilation/MethodBodySemanticModel.cs @@ -270,16 +270,19 @@ internal override bool TryGetSpeculativeSemanticModelCore(SyntaxTreeSemanticMode internal override bool TryGetSpeculativeSemanticModelCore(SyntaxTreeSemanticModel parentModel, int position, PrimaryConstructorBaseTypeSyntax constructorInitializer, out SemanticModel speculativeModel) { if (MemberSymbol is SynthesizedRecordConstructor primaryCtor && - primaryCtor.GetSyntax() is RecordDeclarationSyntax recordDecl && - Root.FindToken(position).Parent?.AncestorsAndSelf().OfType().FirstOrDefault() == recordDecl.PrimaryConstructorBaseTypeIfClass) + primaryCtor.GetSyntax() is RecordDeclarationSyntax recordDecl) { - var binder = this.GetEnclosingBinder(position); - if (binder != null) + Debug.Assert(recordDecl.Kind() == SyntaxKind.RecordDeclaration); + if (Root.FindToken(position).Parent?.AncestorsAndSelf().OfType().FirstOrDefault() == recordDecl.PrimaryConstructorBaseTypeIfClass) { - binder = new WithNullableContextBinder(SyntaxTree, position, binder); - binder = new ExecutableCodeBinder(constructorInitializer, primaryCtor, binder); - speculativeModel = CreateSpeculative(parentModel, primaryCtor, constructorInitializer, binder, position); - return true; + var binder = this.GetEnclosingBinder(position); + if (binder != null) + { + binder = new WithNullableContextBinder(SyntaxTree, position, binder); + binder = new ExecutableCodeBinder(constructorInitializer, primaryCtor, binder); + speculativeModel = CreateSpeculative(parentModel, primaryCtor, constructorInitializer, binder, position); + return true; + } } } diff --git a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs index 617931b8a2691..4247015c26a1d 100644 --- a/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs +++ b/src/Compilers/CSharp/Test/Semantic/Semantics/RecordStructTests.cs @@ -7481,27 +7481,33 @@ struct C2 : I(0) public void BaseArguments_Speculation() { var src = @" -record struct R1(int X) : Error(0, 1) +record struct R1(int X) : Error1(0, 1) { } -record struct R2(int X) : Error() +record struct R2(int X) : Error2() +{ +} +record struct R3(int X) : Error3 { } "; var comp = CreateCompilation(src); comp.VerifyDiagnostics( - // (2,27): error CS0246: The type or namespace name 'Error' could not be found (are you missing a using directive or an assembly reference?) - // record struct R1(int X) : Error(0, 1) - Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error").WithArguments("Error").WithLocation(2, 27), - // (2,32): error CS8861: Unexpected argument list. - // record struct R1(int X) : Error(0, 1) - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0, 1)").WithLocation(2, 32), - // (5,27): error CS0246: The type or namespace name 'Error' could not be found (are you missing a using directive or an assembly reference?) - // record struct R2(int X) : Error() - Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error").WithArguments("Error").WithLocation(5, 27), - // (5,32): error CS8861: Unexpected argument list. - // record struct R2(int X) : Error() - Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(5, 32) + // (2,27): error CS0246: The type or namespace name 'Error1' could not be found (are you missing a using directive or an assembly reference?) + // record struct R1(int X) : Error1(0, 1) + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error1").WithArguments("Error1").WithLocation(2, 27), + // (2,33): error CS8861: Unexpected argument list. + // record struct R1(int X) : Error1(0, 1) + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "(0, 1)").WithLocation(2, 33), + // (5,27): error CS0246: The type or namespace name 'Error2' could not be found (are you missing a using directive or an assembly reference?) + // record struct R2(int X) : Error2() + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error2").WithArguments("Error2").WithLocation(5, 27), + // (5,33): error CS8861: Unexpected argument list. + // record struct R2(int X) : Error2() + Diagnostic(ErrorCode.ERR_UnexpectedArgumentList, "()").WithLocation(5, 33), + // (8,27): error CS0246: The type or namespace name 'Error3' could not be found (are you missing a using directive or an assembly reference?) + // record struct R3(int X) : Error3 + Diagnostic(ErrorCode.ERR_SingleTypeNameNotFound, "Error3").WithArguments("Error3").WithLocation(8, 27) ); var tree = comp.SyntaxTrees.First(); @@ -7509,19 +7515,24 @@ record struct R2(int X) : Error() var baseWithargs = tree.GetRoot().DescendantNodes().OfType().First(); - Assert.Equal("Error(0, 1)", baseWithargs.ToString()); + Assert.Equal("Error1(0, 1)", baseWithargs.ToString()); var speculativeBase = baseWithargs.WithArgumentList(baseWithargs.ArgumentList.WithArguments(baseWithargs.ArgumentList.Arguments.RemoveAt(1))); - Assert.Equal("Error(0)", speculativeBase.ToString()); + Assert.Equal("Error1(0)", speculativeBase.ToString()); Assert.False(model.TryGetSpeculativeSemanticModel(baseWithargs.ArgumentList.OpenParenToken.SpanStart, speculativeBase, out _)); var baseWithoutargs = - tree.GetRoot().DescendantNodes().OfType().Last(); - Assert.Equal("Error()", baseWithoutargs.ToString()); + tree.GetRoot().DescendantNodes().OfType().Skip(1).First(); + Assert.Equal("Error2()", baseWithoutargs.ToString()); Assert.False(model.TryGetSpeculativeSemanticModel(baseWithoutargs.ArgumentList.OpenParenToken.SpanStart, speculativeBase, out _)); + + var baseWithoutParens = tree.GetRoot().DescendantNodes().OfType().Single(); + Assert.Equal("Error3", baseWithoutParens.ToString()); + + Assert.False(model.TryGetSpeculativeSemanticModel(baseWithoutParens.SpanStart + 2, speculativeBase, out _)); } } }