未验证 提交 264b33e7 编写于 作者: J Julien Couvreur 提交者: GitHub

Add print methods to records (#46616)

上级 29c5fd83
......@@ -6389,10 +6389,10 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
<data name="ERR_RuntimeDoesNotSupportCovariantPropertiesOfClasses" xml:space="preserve">
<value>'{0}': Target runtime doesn't support covariant types in overrides. Type must be '{2}' to match overridden member '{1}'</value>
</data>
<data name="ERR_SealedGetHashCodeInRecord" xml:space="preserve">
<data name="ERR_SealedAPIInRecord" xml:space="preserve">
<value>'{0}' cannot be sealed because containing record is not sealed.</value>
</data>
<data name="ERR_DoesNotOverrideBaseEquals" xml:space="preserve">
<data name="ERR_DoesNotOverrideBaseMethod" xml:space="preserve">
<value>'{0}' does not override expected method from '{1}'.</value>
</data>
<data name="WRN_ConstOutOfRangeChecked" xml:space="preserve">
......
......@@ -1853,7 +1853,7 @@ internal enum ErrorCode
ERR_InvalidWithReceiverType = 8857,
ERR_NoSingleCloneMethod = 8858,
ERR_CloneDisallowedInRecord = 8859,
// Unused 8860
// available = 8860,
ERR_UnexpectedArgumentList = 8861,
ERR_UnexpectedOrMissingConstructorInitializerInRecord = 8862,
ERR_MultipleRecordParameterLists = 8863,
......@@ -1863,8 +1863,8 @@ internal enum ErrorCode
ERR_NoCopyConstructorInBaseType = 8867,
ERR_CopyConstructorMustInvokeBaseCopyConstructor = 8868,
ERR_DoesNotOverrideMethodFromObject = 8869,
ERR_SealedGetHashCodeInRecord = 8870,
ERR_DoesNotOverrideBaseEquals = 8871,
ERR_SealedAPIInRecord = 8870,
ERR_DoesNotOverrideBaseMethod = 8871,
ERR_NotOverridableAPIInRecord = 8872,
ERR_NonPublicAPIInRecord = 8873,
ERR_SignatureMismatchInRecord = 8874,
......
......@@ -711,6 +711,11 @@ private void AddTypeKind(INamedTypeSymbol symbol)
/// </summary>
private static IMethodSymbol FindValidCloneMethod(ITypeSymbol containingType)
{
if (containingType.SpecialType == SpecialType.System_Object)
{
return null;
}
IMethodSymbol candidate = null;
foreach (var member in containingType.GetMembers(WellKnownMemberNames.CloneMethodName))
......
......@@ -3035,9 +3035,12 @@ private void AddSynthesizedRecordMembersIfNecessary(MembersAndInitializersBuilde
var thisEquals = addThisEquals(equalityContract);
addOtherEquals();
addObjectEquals(thisEquals);
addHashCode(equalityContract);
addGetHashCode(equalityContract);
addEqualityOperators();
var printMembers = addPrintMembersMethod();
addToStringMethod(printMembers);
memberSignatures.Free();
// We put synthesized record members first so that errors about conflicts show up on user-defined members rather than all
......@@ -3140,6 +3143,94 @@ void addCloneMethod()
members.Add(new SynthesizedRecordClone(this, memberOffset: members.Count, diagnostics));
}
MethodSymbol addPrintMembersMethod()
{
var targetMethod = new SignatureOnlyMethodSymbol(
WellKnownMemberNames.PrintMembersMethodName,
this,
MethodKind.Ordinary,
Cci.CallingConvention.HasThis,
ImmutableArray<TypeParameterSymbol>.Empty,
ImmutableArray.Create<ParameterSymbol>(new SignatureOnlyParameterSymbol(
TypeWithAnnotations.Create(compilation.GetWellKnownType(WellKnownType.System_Text_StringBuilder)),
ImmutableArray<CustomModifier>.Empty,
isParams: false,
RefKind.None)),
RefKind.None,
isInitOnly: false,
returnType: TypeWithAnnotations.Create(compilation.GetSpecialType(SpecialType.System_Boolean)),
refCustomModifiers: ImmutableArray<CustomModifier>.Empty,
explicitInterfaceImplementations: ImmutableArray<MethodSymbol>.Empty);
MethodSymbol printMembersMethod;
if (!memberSignatures.TryGetValue(targetMethod, out Symbol? existingPrintMembersMethod))
{
printMembersMethod = new SynthesizedRecordPrintMembers(this, memberOffset: members.Count, diagnostics);
members.Add(printMembersMethod);
}
else
{
printMembersMethod = (MethodSymbol)existingPrintMembersMethod;
if (this.IsSealed && this.BaseTypeNoUseSiteDiagnostics.IsObjectType())
{
if (printMembersMethod.DeclaredAccessibility != Accessibility.Private)
{
diagnostics.Add(ErrorCode.ERR_NonPrivateAPIInRecord, printMembersMethod.Locations[0], printMembersMethod);
}
}
else if (printMembersMethod.DeclaredAccessibility != Accessibility.Protected)
{
diagnostics.Add(ErrorCode.ERR_NonProtectedAPIInRecord, printMembersMethod.Locations[0], printMembersMethod);
}
if (!printMembersMethod.ReturnType.Equals(targetMethod.ReturnType, TypeCompareKind.AllIgnoreOptions))
{
if (!printMembersMethod.ReturnType.IsErrorType())
{
diagnostics.Add(ErrorCode.ERR_SignatureMismatchInRecord, printMembersMethod.Locations[0], printMembersMethod, targetMethod.ReturnType);
}
}
else
{
SynthesizedRecordPrintMembers.VerifyOverridesPrintMembersFromBase(printMembersMethod, diagnostics);
}
reportStaticOrNotOverridableAPIInRecord(printMembersMethod, diagnostics);
}
return printMembersMethod;
}
void addToStringMethod(MethodSymbol printMethod)
{
var targetMethod = new SignatureOnlyMethodSymbol(
WellKnownMemberNames.ObjectToString,
this,
MethodKind.Ordinary,
Cci.CallingConvention.HasThis,
ImmutableArray<TypeParameterSymbol>.Empty,
ImmutableArray<ParameterSymbol>.Empty,
RefKind.None,
isInitOnly: false,
returnType: TypeWithAnnotations.Create(compilation.GetSpecialType(SpecialType.System_String)),
refCustomModifiers: ImmutableArray<CustomModifier>.Empty,
explicitInterfaceImplementations: ImmutableArray<MethodSymbol>.Empty);
if (!memberSignatures.TryGetValue(targetMethod, out Symbol? existingToStringMethod))
{
var toStringMethod = new SynthesizedRecordToString(this, printMethod, memberOffset: members.Count, diagnostics);
members.Add(toStringMethod);
}
else
{
var toStringMethod = (MethodSymbol)existingToStringMethod;
if (!SynthesizedRecordObjectMethod.VerifyOverridesMethodFromObject(toStringMethod, SpecialType.System_String, diagnostics) && toStringMethod.IsSealed && !IsSealed)
{
diagnostics.Add(ErrorCode.ERR_SealedAPIInRecord, toStringMethod.Locations[0], toStringMethod);
}
}
}
ImmutableArray<PropertySymbol> addProperties(ImmutableArray<ParameterSymbol> recordParameters)
{
var existingOrAddedMembers = ArrayBuilder<PropertySymbol>.GetInstance(recordParameters.Length);
......@@ -3219,7 +3310,7 @@ void addObjectEquals(MethodSymbol thisEquals)
members.Add(new SynthesizedRecordObjEquals(this, thisEquals, memberOffset: members.Count, diagnostics));
}
void addHashCode(PropertySymbol equalityContract)
void addGetHashCode(PropertySymbol equalityContract)
{
var targetMethod = new SignatureOnlyMethodSymbol(
WellKnownMemberNames.ObjectGetHashCode,
......@@ -3244,7 +3335,7 @@ void addHashCode(PropertySymbol equalityContract)
var method = (MethodSymbol)existingHashCodeMethod;
if (!SynthesizedRecordObjectMethod.VerifyOverridesMethodFromObject(method, SpecialType.System_Int32, diagnostics) && method.IsSealed && !IsSealed)
{
diagnostics.Add(ErrorCode.ERR_SealedGetHashCodeInRecord, method.Locations[0], method);
diagnostics.Add(ErrorCode.ERR_SealedAPIInRecord, method.Locations[0], method);
}
}
}
......
......@@ -125,7 +125,8 @@ protected override void CheckBase(DiagnosticBag diagnostics)
if (declaration.Kind == DeclarationKind.Record)
{
if (SynthesizedRecordClone.FindValidCloneMethod(localBase, ref useSiteDiagnostics) is null)
if (SynthesizedRecordClone.FindValidCloneMethod(localBase, ref useSiteDiagnostics) is null ||
SynthesizedRecordPrintMembers.FindValidPrintMembersMethod(localBase, DeclaringCompilation) is null)
{
diagnostics.Add(ErrorCode.ERR_BadRecordBase, baseLocation);
}
......
......@@ -54,7 +54,7 @@ protected override void MethodChecks(DiagnosticBag diagnostics)
if (overridden is object &&
!overridden.ContainingType.Equals(ContainingType.BaseTypeNoUseSiteDiagnostics, TypeCompareKind.AllIgnoreOptions))
{
diagnostics.Add(ErrorCode.ERR_DoesNotOverrideBaseEquals, Locations[0], this, ContainingType.BaseTypeNoUseSiteDiagnostics);
diagnostics.Add(ErrorCode.ERR_DoesNotOverrideBaseMethod, Locations[0], this, ContainingType.BaseTypeNoUseSiteDiagnostics);
}
}
......
......@@ -4,12 +4,9 @@
#nullable enable
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics;
using System.Reflection;
using Microsoft.Cci;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Symbols
......@@ -150,6 +147,11 @@ internal override void GenerateMethodBody(TypeCompilationState compilationState,
// Note: this method was replicated in SymbolDisplayVisitor.FindValidCloneMethod
internal static MethodSymbol? FindValidCloneMethod(TypeSymbol containingType, ref HashSet<DiagnosticInfo>? useSiteDiagnostics)
{
if (containingType.IsObjectType())
{
return null;
}
MethodSymbol? candidate = null;
foreach (var member in containingType.GetMembers(WellKnownMemberNames.CloneMethodName))
......
// 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.
#nullable enable
using System.Collections.Immutable;
using System.Diagnostics;
using System.Linq;
using Microsoft.CodeAnalysis.PooledObjects;
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.CSharp.Symbols
{
/// <summary>
/// The `bool PrintMembers(StringBuilder)` method is responsible for printing members declared
/// in the containing type that are "printable" (public fields and properties),
/// and delegating to the base to print inherited printable members. Base members get printed first.
/// It returns true if the record contains some printable members.
/// The method is used to implement `ToString()`.
/// </summary>
internal sealed class SynthesizedRecordPrintMembers : SynthesizedRecordOrdinaryMethod
{
public SynthesizedRecordPrintMembers(
SourceMemberContainerTypeSymbol containingType,
int memberOffset,
DiagnosticBag diagnostics)
: base(containingType, WellKnownMemberNames.PrintMembersMethodName, hasBody: true, memberOffset, diagnostics)
{
}
protected override DeclarationModifiers MakeDeclarationModifiers(DeclarationModifiers allowedModifiers, DiagnosticBag diagnostics)
{
var result = (ContainingType.BaseTypeNoUseSiteDiagnostics.IsObjectType() && ContainingType.IsSealed) ?
DeclarationModifiers.Private :
DeclarationModifiers.Protected;
if (virtualPrintInBase() is object)
{
result |= DeclarationModifiers.Override;
}
else
{
result |= ContainingType.IsSealed ? DeclarationModifiers.None : DeclarationModifiers.Virtual;
}
Debug.Assert((result & ~allowedModifiers) == 0);
#if DEBUG
Debug.Assert(modifiersAreValid(result));
#endif
return result;
MethodSymbol? virtualPrintInBase()
{
NamedTypeSymbol baseType = ContainingType.BaseTypeNoUseSiteDiagnostics;
if (!baseType.IsObjectType())
{
return FindValidPrintMembersMethod(baseType, ContainingType.DeclaringCompilation);
}
return null;
}
#if DEBUG
static bool modifiersAreValid(DeclarationModifiers modifiers)
{
if ((modifiers & DeclarationModifiers.AccessibilityMask) != DeclarationModifiers.Private &&
(modifiers & DeclarationModifiers.AccessibilityMask) != DeclarationModifiers.Protected)
{
return false;
}
modifiers &= ~DeclarationModifiers.AccessibilityMask;
switch (modifiers)
{
case DeclarationModifiers.None:
case DeclarationModifiers.Override:
case DeclarationModifiers.Virtual:
return true;
default:
return false;
}
}
#endif
}
protected override (TypeWithAnnotations ReturnType, ImmutableArray<ParameterSymbol> Parameters, bool IsVararg, ImmutableArray<TypeParameterConstraintClause> DeclaredConstraintsForOverrideOrImplementation) MakeParametersAndBindReturnType(DiagnosticBag diagnostics)
{
var compilation = DeclaringCompilation;
var location = ReturnTypeLocation;
return (ReturnType: TypeWithAnnotations.Create(Binder.GetSpecialType(compilation, SpecialType.System_Boolean, location, diagnostics)),
Parameters: ImmutableArray.Create<ParameterSymbol>(
new SourceSimpleParameterSymbol(owner: this,
TypeWithAnnotations.Create(Binder.GetWellKnownType(compilation, WellKnownType.System_Text_StringBuilder, diagnostics, location), NullableAnnotation.NotAnnotated),
ordinal: 0, RefKind.None, "builder", isDiscard: false, Locations)),
IsVararg: false,
DeclaredConstraintsForOverrideOrImplementation: ImmutableArray<TypeParameterConstraintClause>.Empty);
}
protected override int GetParameterCountFromSyntax() => 1;
internal override void GenerateMethodBody(TypeCompilationState compilationState, DiagnosticBag diagnostics)
{
var F = new SyntheticBoundNodeFactory(this, ContainingType.GetNonNullSyntaxNode(), compilationState, diagnostics);
try
{
ImmutableArray<Symbol> printableMembers = ContainingType.GetMembers()
.WhereAsArray(m => m.DeclaredAccessibility == Accessibility.Public && (m.Kind is SymbolKind.Field or SymbolKind.Property));
if (ReturnType.IsErrorType() ||
printableMembers.Any(m => m.GetTypeOrReturnType().Type.IsErrorType()))
{
F.CloseMethod(F.ThrowNull());
return;
}
ArrayBuilder<BoundStatement>? block = printableMembers.IsEmpty ? null : ArrayBuilder<BoundStatement>.GetInstance();
BoundParameter builder = F.Parameter(this.Parameters[0]);
if (ContainingType.BaseTypeNoUseSiteDiagnostics.IsObjectType())
{
if (printableMembers.IsEmpty)
{
// return false;
F.CloseMethod(F.Return(F.Literal(false)));
return;
}
}
else
{
MethodSymbol? printMethod = FindValidPrintMembersMethod(ContainingType.BaseTypeNoUseSiteDiagnostics, DeclaringCompilation);
if (printMethod is null)
{
F.CloseMethod(F.ThrowNull()); // an error was reported in base checks already
return;
}
var basePrintCall = F.Call(receiver: F.Base(ContainingType.BaseTypeNoUseSiteDiagnostics), printMethod, builder);
if (printableMembers.IsEmpty)
{
// return base.print(builder);
F.CloseMethod(F.Return(basePrintCall));
return;
}
else
{
// if (base.print(builder))
// builder.Append(", ")
block!.Add(F.If(basePrintCall, makeAppendString(F, builder, ", ")));
}
}
Debug.Assert(!printableMembers.IsEmpty && block is object);
for (var i = 0; i < printableMembers.Length; i++)
{
// builder.Append(<name>);
// builder.Append(" = ");
// builder.Append((object)<value>);
// builder.Append(", "); // except for last member
var member = printableMembers[i];
block.Add(makeAppendString(F, builder, member.Name));
block.Add(makeAppendString(F, builder, " = "));
var value = member.Kind switch
{
SymbolKind.Field => F.Field(F.This(), (FieldSymbol)member),
SymbolKind.Property => F.Property(F.This(), (PropertySymbol)member),
_ => throw ExceptionUtilities.UnexpectedValue(member.Kind)
};
block.Add(F.ExpressionStatement(
F.Call(receiver: builder,
F.WellKnownMethod(WellKnownMember.System_Text_StringBuilder__AppendObject),
F.Convert(F.SpecialType(SpecialType.System_Object), value))));
if (i < printableMembers.Length - 1)
{
block.Add(makeAppendString(F, builder, ", "));
}
}
block.Add(F.Return(F.Literal(true)));
F.CloseMethod(F.Block(block.ToImmutableAndFree()));
}
catch (SyntheticBoundNodeFactory.MissingPredefinedMember ex)
{
diagnostics.Add(ex.Diagnostic);
F.CloseMethod(F.ThrowNull());
}
static BoundStatement makeAppendString(SyntheticBoundNodeFactory F, BoundParameter builder, string value)
{
return F.ExpressionStatement(F.Call(receiver: builder, F.WellKnownMethod(WellKnownMember.System_Text_StringBuilder__AppendString), F.StringLiteral(value)));
}
}
internal static MethodSymbol? FindValidPrintMembersMethod(TypeSymbol containingType, CSharpCompilation compilation)
{
if (containingType.IsObjectType())
{
return null;
}
MethodSymbol? candidate = null;
var stringBuilder = TypeWithAnnotations.Create(compilation.GetWellKnownType(WellKnownType.System_Text_StringBuilder));
foreach (var member in containingType.GetMembers(WellKnownMemberNames.PrintMembersMethodName))
{
if (member is MethodSymbol { DeclaredAccessibility: Accessibility.Protected, IsStatic: false, ParameterCount: 1, Arity: 0 } method &&
method.ParameterTypesWithAnnotations[0].Equals(stringBuilder, TypeCompareKind.AllIgnoreOptions))
{
if (candidate is object)
{
// An ambiguity case, can come from metadata, treat as an error for simplicity.
return null;
}
candidate = method;
}
}
if (candidate is null ||
!(containingType.IsSealed || candidate.IsOverride || candidate.IsVirtual) ||
candidate.ReturnType.SpecialType != SpecialType.System_Boolean)
{
return null;
}
return candidate;
}
internal static void VerifyOverridesPrintMembersFromBase(MethodSymbol overriding, DiagnosticBag diagnostics)
{
NamedTypeSymbol baseType = overriding.ContainingType.BaseTypeNoUseSiteDiagnostics;
if (baseType.IsObjectType())
{
return;
}
bool reportAnError = false;
if (!overriding.IsOverride)
{
reportAnError = true;
}
else
{
var overridden = overriding.OverriddenMethod;
if (overridden is object &&
!overridden.ContainingType.Equals(baseType, TypeCompareKind.AllIgnoreOptions))
{
reportAnError = true;
}
}
if (reportAnError)
{
diagnostics.Add(ErrorCode.ERR_DoesNotOverrideBaseMethod, overriding.Locations[0], overriding, baseType);
}
}
}
}
// 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.
#nullable enable
using System.Collections.Immutable;
using System.Diagnostics;
using Microsoft.CodeAnalysis.PooledObjects;
namespace Microsoft.CodeAnalysis.CSharp.Symbols
{
/// <summary>
/// The record includes a synthesized override of object.ToString().
/// For `record R(int I) { public int J; }` it prints `R { I = ..., J = ... }`.
///
/// The method can be declared explicitly. It is an error if the explicit
/// declaration does not match the expected signature or accessibility, or
/// if the explicit declaration doesn't allow overriding it in a derived type and
/// the record type is not sealed.
/// It is an error if either synthesized or explicitly declared method doesn't
/// override `object.ToString()` (for example, due to shadowing in intermediate base types, etc.).
/// </summary>
internal sealed class SynthesizedRecordToString : SynthesizedRecordObjectMethod
{
private readonly MethodSymbol _printMethod;
public SynthesizedRecordToString(SourceMemberContainerTypeSymbol containingType, MethodSymbol printMethod, int memberOffset, DiagnosticBag diagnostics)
: base(containingType, WellKnownMemberNames.ObjectToString, memberOffset, diagnostics)
{
Debug.Assert(printMethod is object);
_printMethod = printMethod;
}
protected override (TypeWithAnnotations ReturnType, ImmutableArray<ParameterSymbol> Parameters, bool IsVararg, ImmutableArray<TypeParameterConstraintClause> DeclaredConstraintsForOverrideOrImplementation) MakeParametersAndBindReturnType(DiagnosticBag diagnostics)
{
var compilation = DeclaringCompilation;
var location = ReturnTypeLocation;
return (ReturnType: TypeWithAnnotations.Create(Binder.GetSpecialType(compilation, SpecialType.System_String, location, diagnostics)),
Parameters: ImmutableArray<ParameterSymbol>.Empty,
IsVararg: false,
DeclaredConstraintsForOverrideOrImplementation: ImmutableArray<TypeParameterConstraintClause>.Empty);
}
protected override int GetParameterCountFromSyntax() => 0;
internal override void GenerateMethodBody(TypeCompilationState compilationState, DiagnosticBag diagnostics)
{
var F = new SyntheticBoundNodeFactory(this, this.SyntaxNode, compilationState, diagnostics);
try
{
CSharpCompilation compilation = ContainingType.DeclaringCompilation;
var stringBuilder = F.WellKnownType(WellKnownType.System_Text_StringBuilder);
var stringBuilderCtor = F.WellKnownMethod(WellKnownMember.System_Text_StringBuilder__ctor);
var builderLocalSymbol = F.SynthesizedLocal(stringBuilder);
BoundLocal builderLocal = F.Local(builderLocalSymbol);
var block = ArrayBuilder<BoundStatement>.GetInstance();
// var builder = new StringBuilder();
block.Add(F.Assignment(builderLocal, F.New(stringBuilderCtor)));
// builder.Append(<name>);
block.Add(makeAppendString(F, builderLocal, ContainingType.Name));
// builder.Append(" { ");
block.Add(makeAppendString(F, builderLocal, " { "));
// this.print(builder);
block.Add(F.ExpressionStatement(F.Call(F.This(), _printMethod, builderLocal)));
// builder.Append(" } ");
block.Add(makeAppendString(F, builderLocal, " } "));
// return builder.ToString();
block.Add(F.Return(F.Call(builderLocal, F.SpecialMethod(SpecialMember.System_Object__ToString))));
F.CloseMethod(F.Block(ImmutableArray.Create(builderLocalSymbol), block.ToImmutableAndFree()));
}
catch (SyntheticBoundNodeFactory.MissingPredefinedMember ex)
{
diagnostics.Add(ex.Diagnostic);
F.CloseMethod(F.ThrowNull());
}
static BoundStatement makeAppendString(SyntheticBoundNodeFactory F, BoundLocal builder, string value)
{
return F.ExpressionStatement(F.Call(receiver: builder, F.WellKnownMethod(WellKnownMember.System_Text_StringBuilder__AppendString), F.StringLiteral(value)));
}
}
}
}
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Pokud chcete odstranit toto varování, můžete místo toho použít /reference
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Um die Warnung zu beheben, können Sie stattdessen /reference verwenden (Einbett
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Para eliminar la advertencia puede usar /reference (establezca la propiedad Embe
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Pour supprimer l'avertissement, vous pouvez utiliser la commande /reference (dé
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Per rimuovere l'avviso, è invece possibile usare /reference (impostare la propr
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Aby usunąć ostrzeżenie, możesz zamiast tego użyć opcji /reference (ustaw w
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10616,4 +10616,4 @@ Para incorporar informações de tipo de interoperabilidade para os dois assembl
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ Uyarıyı kaldırmak için, /reference kullanabilirsiniz (Birlikte Çalışma T
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -267,7 +267,7 @@
<target state="new">'{0}' does not override expected property from '{1}'.</target>
<note />
</trans-unit>
<trans-unit id="ERR_DoesNotOverrideBaseEquals">
<trans-unit id="ERR_DoesNotOverrideBaseMethod">
<source>'{0}' does not override expected method from '{1}'.</source>
<target state="new">'{0}' does not override expected method from '{1}'.</target>
<note />
......@@ -757,7 +757,7 @@
<target state="new">The target runtime doesn't support extensible or runtime-environment default calling conventions.</target>
<note />
</trans-unit>
<trans-unit id="ERR_SealedGetHashCodeInRecord">
<trans-unit id="ERR_SealedAPIInRecord">
<source>'{0}' cannot be sealed because containing record is not sealed.</source>
<target state="new">'{0}' cannot be sealed because containing record is not sealed.</target>
<note />
......@@ -10618,4 +10618,4 @@ To remove the warning, you can use /reference instead (set the Embed Interop Typ
</trans-unit>
</body>
</file>
</xliff>
</xliff>
\ No newline at end of file
......@@ -2182,6 +2182,8 @@ public record C(int i)
"void modreq(System.Runtime.CompilerServices.IsExternalInit) C.i.init",
"System.Int32 C.i { get; init; }",
"void C.M()",
"System.String C.ToString()",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean C.op_Inequality(C? r1, C? r2)",
"System.Boolean C.op_Equality(C? r1, C? r2)",
"System.Int32 C.GetHashCode()",
......
......@@ -37,6 +37,7 @@ record C(int x, int y)
Add( // Members
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -45,6 +46,7 @@ record C(int x, int y)
"System.Int32 C.y { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -73,6 +75,7 @@ public void PositionalRecord2()
"T C<T>.t { get; init; }",
"System.Boolean C<T>.Equals(C<T>? other)",
"System.Boolean C<T>.Equals(System.Object? obj)",
"System.Boolean C<T>." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -81,6 +84,7 @@ public void PositionalRecord2()
"System.Object System.Object.MemberwiseClone()",
"void C<T>.Deconstruct(out System.Int32 x, out T t)",
"void System.Object.Finalize()",
"System.String C<T>.ToString()",
"System.String System.Object.ToString()",
"System.Type C<T>.EqualityContract { get; }",
"System.Type System.Object.GetType()"),
......@@ -104,15 +108,17 @@ public void NominalRecord()
"T C<T>.t { get; }",
"System.Boolean C<T>.Equals(C<T>? other)",
"System.Boolean C<T>.Equals(System.Object? obj)",
"System.Boolean C<T>." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
"System.Int32 C<T>.GetHashCode()",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C<T>.ToString()",
"void System.Object.Finalize()",
"System.String System.Object.ToString()",
"System.Type C<T>.EqualityContract { get; }",
"System.Type C<T>.EqualityContract { get; }",
"System.Type System.Object.GetType()",
};
var expectedNames = MakeExpectedSymbols(
......@@ -1710,6 +1716,7 @@ record C(int X) : Base`(X`)
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1717,6 +1724,7 @@ record C(int X) : Base`(X`)
"System.Int32 System.Object.GetHashCode()",
"System.Int32 X",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1727,6 +1735,7 @@ record C(int X) : Base`(X`)
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1734,6 +1743,7 @@ record C(int X) : Base`(X`)
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1762,12 +1772,14 @@ public void RecordBaseArguments_02()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
"System.Int32 C.GetHashCode()",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1799,6 +1811,7 @@ public void RecordBaseArguments_03()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1806,6 +1819,7 @@ public void RecordBaseArguments_03()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1816,6 +1830,7 @@ public void RecordBaseArguments_03()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1823,6 +1838,7 @@ public void RecordBaseArguments_03()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1856,6 +1872,7 @@ public void RecordBaseArguments_04()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1863,6 +1880,7 @@ public void RecordBaseArguments_04()
"System.Int32 System.Object.GetHashCode()",
"System.Int32 X",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1873,6 +1891,7 @@ public void RecordBaseArguments_04()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1880,6 +1899,7 @@ public void RecordBaseArguments_04()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1890,6 +1910,7 @@ public void RecordBaseArguments_04()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1897,6 +1918,7 @@ public void RecordBaseArguments_04()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1929,6 +1951,7 @@ public void RecordBaseArguments_05()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1936,6 +1959,7 @@ public void RecordBaseArguments_05()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1946,6 +1970,7 @@ public void RecordBaseArguments_05()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1953,6 +1978,7 @@ public void RecordBaseArguments_05()
"System.Int32 System.Object.GetHashCode()",
"System.Int32 X",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -1963,6 +1989,7 @@ public void RecordBaseArguments_05()
"System.Boolean C.Equals(Base? other)",
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -1970,6 +1997,7 @@ public void RecordBaseArguments_05()
"System.Int32 C.X { get; init; }",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -2083,6 +2111,7 @@ record C(int X)
Add( // Members
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -2091,6 +2120,7 @@ record C(int X)
"System.Int32 C.Z",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -2124,6 +2154,7 @@ record C(int X)
Add( // Members
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -2132,6 +2163,7 @@ record C(int X)
"System.Int32 C.Z",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......@@ -2160,6 +2192,7 @@ record C(int X)
Add( // Members
"System.Boolean C.Equals(C? other)",
"System.Boolean C.Equals(System.Object? obj)",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder builder)",
"System.Boolean System.Object.Equals(System.Object obj)",
"System.Boolean System.Object.Equals(System.Object objA, System.Object objB)",
"System.Boolean System.Object.ReferenceEquals(System.Object objA, System.Object objB)",
......@@ -2168,6 +2201,7 @@ record C(int X)
"System.Int32 C.Z",
"System.Int32 System.Object.GetHashCode()",
"System.Object System.Object.MemberwiseClone()",
"System.String C.ToString()",
"System.String System.Object.ToString()",
"System.Type C.EqualityContract { get; }",
"System.Type System.Object.GetType()",
......
......@@ -1076,6 +1076,8 @@ record C
"System.String! C.Y { get; init; }",
"System.String! C.Y.get",
"void C.Y.init",
"System.String C.ToString()",
"System.Boolean C." + WellKnownMemberNames.PrintMembersMethodName + "(System.Text.StringBuilder! builder)",
"System.Boolean C.operator !=(C? r1, C? r2)",
"System.Boolean C.operator ==(C? r1, C? r2)",
"System.Int32 C.GetHashCode()",
......
......@@ -345,6 +345,7 @@ public static class WellKnownMemberNames
// internal until we settle on this long-term
internal const string CloneMethodName = "<Clone>$";
internal const string PrintMembersMethodName = "PrintMembers";
/// <summary>
/// The name of an entry point method synthesized for top-level statements.
......
......@@ -511,6 +511,10 @@ internal enum WellKnownMember
System_Runtime_CompilerServices_PreserveBaseOverridesAttribute__ctor,
System_Text_StringBuilder__AppendString,
System_Text_StringBuilder__AppendObject,
System_Text_StringBuilder__ctor,
Count
// Remember to update the AllWellKnownTypeMembers tests when making changes here
......
......@@ -3490,6 +3490,29 @@ static WellKnownMembers()
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Void, // Return Type
// System_Text_StringBuilder__AppendString
(byte)MemberFlags.Method, // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Text_StringBuilder - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
1, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Text_StringBuilder - WellKnownType.ExtSentinel), // Return Type
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_String,
// System_Text_StringBuilder__AppendObject
(byte)MemberFlags.Method, // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Text_StringBuilder - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
1, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Text_StringBuilder - WellKnownType.ExtSentinel), // Return Type
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Object,
// System_Text_StringBuilder__ctor
(byte)MemberFlags.Constructor, // Flags
(byte)WellKnownType.ExtSentinel, (byte)(WellKnownType.System_Text_StringBuilder - WellKnownType.ExtSentinel), // DeclaringTypeId
0, // Arity
0, // Method Signature
(byte)SignatureTypeCode.TypeHandle, (byte)SpecialType.System_Void, // Return Type
};
string[] allNames = new string[(int)WellKnownMember.Count]
......@@ -3928,6 +3951,9 @@ static WellKnownMembers()
".ctor", // System_Runtime_CompilerServices_NativeIntegerAttribute__ctor
".ctor", // System_Runtime_CompilerServices_NativeIntegerAttribute__ctorTransformFlags
".ctor", // System_Runtime_CompilerServices_PreserveBaseOverridesAttribute__ctor
"Append", // System_Text_StringBuilder__AppendString
"Append", // System_Text_StringBuilder__AppendObject
".ctor", // System_Text_StringBuilder__ctor
};
s_descriptors = MemberDescriptor.InitializeFromStream(new System.IO.MemoryStream(initializationBytes, writable: false), allNames);
......
......@@ -6,7 +6,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using Microsoft.CodeAnalysis.Text;
namespace Microsoft.CodeAnalysis
{
......@@ -315,6 +314,8 @@ internal enum WellKnownType
System_Runtime_InteropServices_OutAttribute,
System_Runtime_CompilerServices_PreserveBaseOverridesAttribute,
System_Text_StringBuilder,
NextAvailable,
// Remember to update the AllWellKnownTypes tests when making changes here
......@@ -621,6 +622,8 @@ internal static class WellKnownTypes
"System.Runtime.CompilerServices.IsExternalInit",
"System.Runtime.InteropServices.OutAttribute",
"System.Runtime.CompilerServices.PreserveBaseOverridesAttribute",
"System.Text.StringBuilder",
};
private readonly static Dictionary<string, WellKnownType> s_nameToTypeIdMap = new Dictionary<string, WellKnownType>((int)Count);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册