未验证 提交 e2ed2589 编写于 作者: A AlekseyTs 提交者: GitHub

Ensure consistent scheme for unspeakable names. (#45930)

Closes #45564.
Related to #45110.
上级 fad977f9
......@@ -696,7 +696,8 @@ private bool IsCandidateSymbol(ISymbol memberSymbol)
}
private bool IsEntryPoint(IMethodSymbol methodSymbol)
=> (methodSymbol.Name == WellKnownMemberNames.EntryPointMethodName || methodSymbol.Name == "$Main") &&
=> (methodSymbol.Name == WellKnownMemberNames.EntryPointMethodName || methodSymbol.Name == "<Main>$") && // https://github.com/dotnet/roslyn/issues/45110 Switch to using WellKnownMemberNames.TopLevelStatementsEntryPointMethodName
// once src\CodeStyle\Core\Analyzers\Microsoft.CodeAnalysis.CodeStyle.csproj is able to use the latest version of the type.
methodSymbol.IsStatic &&
(methodSymbol.ReturnsVoid ||
methodSymbol.ReturnType.SpecialType == SpecialType.System_Int32 ||
......
......@@ -131,7 +131,7 @@ private static SingleNamespaceOrTypeDeclaration CreateSimpleProgram(GlobalStatem
{
return new SingleTypeDeclaration(
kind: DeclarationKind.SimpleProgram,
name: SimpleProgramNamedTypeSymbol.UnspeakableName,
name: WellKnownMemberNames.TopLevelStatementsEntryPointTypeName,
arity: 0,
modifiers: DeclarationModifiers.Internal | DeclarationModifiers.Partial | DeclarationModifiers.Static,
declFlags: (hasAwaitExpressions ? SingleTypeDeclaration.TypeDeclarationFlags.HasAwaitExpressions : SingleTypeDeclaration.TypeDeclarationFlags.None) |
......
......@@ -23,14 +23,12 @@ namespace Microsoft.CodeAnalysis.CSharp.Symbols
/// </summary>
internal sealed class SimpleProgramNamedTypeSymbol : SourceMemberContainerTypeSymbol
{
internal const string UnspeakableName = "$Program";
internal SimpleProgramNamedTypeSymbol(NamespaceSymbol globalNamespace, MergedTypeDeclaration declaration, DiagnosticBag diagnostics)
: base(globalNamespace, declaration, diagnostics)
{
Debug.Assert(globalNamespace.IsGlobalNamespace);
Debug.Assert(declaration.Kind == DeclarationKind.SimpleProgram);
Debug.Assert(declaration.Name == UnspeakableName);
Debug.Assert(declaration.Name == WellKnownMemberNames.TopLevelStatementsEntryPointTypeName);
state.NotePartComplete(CompletionPart.EnumUnderlyingType); // No work to do for this.
}
......@@ -42,7 +40,7 @@ internal SimpleProgramNamedTypeSymbol(NamespaceSymbol globalNamespace, MergedTyp
private static SimpleProgramNamedTypeSymbol? GetSimpleProgramNamedTypeSymbol(CSharpCompilation compilation)
{
return compilation.SourceModule.GlobalNamespace.GetTypeMembers(UnspeakableName).OfType<SimpleProgramNamedTypeSymbol>().SingleOrDefault();
return compilation.SourceModule.GlobalNamespace.GetTypeMembers(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName).OfType<SimpleProgramNamedTypeSymbol>().SingleOrDefault();
}
internal static SynthesizedSimpleProgramEntryPointSymbol? GetSimpleProgramEntryPoint(CSharpCompilation compilation, CompilationUnitSyntax compilationUnit, bool fallbackToMainEntryPoint)
......
......@@ -18,8 +18,6 @@ namespace Microsoft.CodeAnalysis.CSharp.Symbols
{
internal sealed class SynthesizedSimpleProgramEntryPointSymbol : SourceMemberMethodSymbol
{
internal const string UnspeakableName = "$Main";
/// <summary>
/// The corresponding <see cref="SingleTypeDeclaration"/>.
/// </summary>
......@@ -73,7 +71,7 @@ public override string Name
{
get
{
return UnspeakableName;
return WellKnownMemberNames.TopLevelStatementsEntryPointMethodName;
}
}
......
......@@ -1241,7 +1241,7 @@ void local(Func<nint, nint> fn)
{
Console.WriteLine(fn(0));
}";
VerifyInPreview(source, expectedOutput: "1", metadataName: "$Program.<>c.<$Main>b__0_0", expectedIL: @"
VerifyInPreview(source, expectedOutput: "1", metadataName: WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + ".<>c.<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">b__0_0", expectedIL: @"
{
// Code size 5 (0x5)
.maxstack 2
......
......@@ -2173,7 +2173,7 @@ public record C(int i)
var cMembers = comp.GlobalNamespace.GetMember<NamedTypeSymbol>("C").GetMembers();
AssertEx.SetEqual(new[] {
"C C.<>Clone()",
"C C." + WellKnownMemberNames.CloneMethodName + "()",
"System.Type C.EqualityContract.get",
"System.Type C.EqualityContract { get; }",
"C..ctor(System.Int32 i)",
......
......@@ -39,6 +39,8 @@ public void Simple_01()
Assert.Same(entryPoint, comp.GetEntryPoint(default));
Assert.False(entryPoint.CanBeReferencedByName);
Assert.False(entryPoint.ContainingType.CanBeReferencedByName);
Assert.Equal("<Main>$", entryPoint.Name);
Assert.Equal("<Program>$", entryPoint.ContainingType.Name);
}
private static void AssertEntryPointParameter(SynthesizedSimpleProgramEntryPointSymbol entryPoint)
......@@ -6053,13 +6055,13 @@ void validateAssembly(PEAssembly assembly)
var methodName = peReader.GetString(methodDef.Name);
var expectedFlags = methodName switch
{
"<$Main>g__forwardRef|0_0" => MethodImplAttributes.ForwardRef,
"<$Main>g__noInlining|0_1" => MethodImplAttributes.NoInlining,
"<$Main>g__noOptimization|0_2" => MethodImplAttributes.NoOptimization,
"<$Main>g__synchronized|0_3" => MethodImplAttributes.Synchronized,
"<$Main>g__internalCallStatic|0_4" => MethodImplAttributes.InternalCall,
"<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__forwardRef|0_0" => MethodImplAttributes.ForwardRef,
"<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__noInlining|0_1" => MethodImplAttributes.NoInlining,
"<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__noOptimization|0_2" => MethodImplAttributes.NoOptimization,
"<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__synchronized|0_3" => MethodImplAttributes.Synchronized,
"<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__internalCallStatic|0_4" => MethodImplAttributes.InternalCall,
".ctor" => MethodImplAttributes.IL,
"$Main" => MethodImplAttributes.IL,
WellKnownMemberNames.TopLevelStatementsEntryPointMethodName => MethodImplAttributes.IL,
_ => throw TestExceptionUtilities.UnexpectedValue(methodName)
};
......@@ -6108,12 +6110,12 @@ public void Attributes_03()
void validate(ModuleSymbol module)
{
var cClass = module.GlobalNamespace.GetMember<NamedTypeSymbol>(SimpleProgramNamedTypeSymbol.UnspeakableName);
var cClass = module.GlobalNamespace.GetMember<NamedTypeSymbol>(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName);
Assert.Equal(new[] { "CompilerGeneratedAttribute" }, GetAttributeNames(cClass.GetAttributes().As<CSharpAttributeData>()));
Assert.Empty(cClass.GetMethod(SynthesizedSimpleProgramEntryPointSymbol.UnspeakableName).GetAttributes());
Assert.Empty(cClass.GetMethod(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName).GetAttributes());
var localFn1 = cClass.GetMethod("<$Main>g__local1|0_0");
var localFn1 = cClass.GetMethod("<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">g__local1|0_0");
Assert.Empty(localFn1.GetAttributes());
validateLocalFunction(localFn1);
......@@ -6572,7 +6574,7 @@ private void Handle1(SymbolStartAnalysisContext context)
private void Handle2(SymbolStartAnalysisContext context)
{
Assert.Equal(SimpleProgramNamedTypeSymbol.UnspeakableName, context.Symbol.ToTestDisplayString());
Assert.Equal(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName, context.Symbol.ToTestDisplayString());
Interlocked.Increment(ref FireCount3);
context.RegisterSymbolEndAction(Handle5);
......@@ -6609,7 +6611,7 @@ private void Handle4(SymbolAnalysisContext context)
private void Handle5(SymbolAnalysisContext context)
{
Assert.Equal(SimpleProgramNamedTypeSymbol.UnspeakableName, context.Symbol.ToTestDisplayString());
Assert.Equal(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName, context.Symbol.ToTestDisplayString());
Interlocked.Increment(ref FireCount8);
}
}
......@@ -7256,7 +7258,7 @@ private void Handle3(SymbolAnalysisContext context)
case "C1":
Interlocked.Increment(ref FireCount3);
break;
case SimpleProgramNamedTypeSymbol.UnspeakableName:
case WellKnownMemberNames.TopLevelStatementsEntryPointTypeName:
Interlocked.Increment(ref FireCount4);
break;
default:
......@@ -7593,14 +7595,14 @@ public void Return_01()
{
_ = ConditionalSkipReason.NativePdbRequiresDesktop;
comp.VerifyPdb("$Program.$Main",
@"<symbols>
comp.VerifyPdb(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "." + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName,
@$"<symbols>
<files>
<file id=""1"" name="""" language=""C#"" />
</files>
<entryPoint declaringType=""$Program"" methodName=""$Main"" parameterNames=""args"" />
<entryPoint declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"" />
<methods>
<method containingType=""$Program"" name=""$Main"" parameterNames=""args"">
<method containingType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" name=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"">
<customDebugInfo>
<using>
<namespace usingCount=""0"" />
......@@ -7616,6 +7618,11 @@ public void Return_01()
}
}
private static string EscapeForXML(string toEscape)
{
return toEscape.Replace("<", "&lt;").Replace(">", "&gt;");
}
[Fact]
public void Return_02()
{
......@@ -7635,14 +7642,14 @@ public void Return_02()
{
_ = ConditionalSkipReason.NativePdbRequiresDesktop;
comp.VerifyPdb("$Program.$Main",
@"<symbols>
comp.VerifyPdb(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "." + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName,
@$"<symbols>
<files>
<file id=""1"" name="""" language=""C#"" />
</files>
<entryPoint declaringType=""$Program"" methodName=""$Main"" parameterNames=""args"" />
<entryPoint declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"" />
<methods>
<method containingType=""$Program"" name=""$Main"" parameterNames=""args"">
<method containingType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" name=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"">
<customDebugInfo>
<using>
<namespace usingCount=""0"" />
......@@ -7682,16 +7689,16 @@ public void Return_03()
{
_ = ConditionalSkipReason.NativePdbRequiresDesktop;
comp.VerifyPdb("$Program+<$Main>d__0.MoveNext",
@"<symbols>
comp.VerifyPdb(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "+<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">d__0.MoveNext",
@$"<symbols>
<files>
<file id=""1"" name="""" language=""C#"" />
</files>
<entryPoint declaringType=""$Program"" methodName=""&lt;Main&gt;"" parameterNames=""args"" />
<entryPoint declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""&lt;Main&gt;"" parameterNames=""args"" />
<methods>
<method containingType=""$Program+&lt;$Main&gt;d__0"" name=""MoveNext"">
<method containingType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;d__0"" name=""MoveNext"">
<customDebugInfo>
<forward declaringType=""$Program+&lt;&gt;c"" methodName=""&lt;$Main&gt;b__0_0"" />
<forward declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;&gt;c"" methodName=""&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;b__0_0"" />
<encLocalSlotMap>
<slot kind=""27"" offset=""2"" />
<slot kind=""33"" offset=""76"" />
......@@ -7712,8 +7719,8 @@ public void Return_03()
</sequencePoints>
<asyncInfo>
<catchHandler offset=""0xa9"" />
<kickoffMethod declaringType=""$Program"" methodName=""$Main"" parameterNames=""args"" />
<await yield=""0x5a"" resume=""0x75"" declaringType=""$Program+&lt;$Main&gt;d__0"" methodName=""MoveNext"" />
<kickoffMethod declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"" />
<await yield=""0x5a"" resume=""0x75"" declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;d__0"" methodName=""MoveNext"" />
</asyncInfo>
</method>
</methods>
......@@ -7745,16 +7752,16 @@ public void Return_04()
{
_ = ConditionalSkipReason.NativePdbRequiresDesktop;
comp.VerifyPdb("$Program+<$Main>d__0.MoveNext",
@"<symbols>
comp.VerifyPdb(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "+<" + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName + ">d__0.MoveNext",
@$"<symbols>
<files>
<file id=""1"" name="""" language=""C#"" />
</files>
<entryPoint declaringType=""$Program"" methodName=""&lt;Main&gt;"" parameterNames=""args"" />
<entryPoint declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""&lt;Main&gt;"" parameterNames=""args"" />
<methods>
<method containingType=""$Program+&lt;$Main&gt;d__0"" name=""MoveNext"">
<method containingType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;d__0"" name=""MoveNext"">
<customDebugInfo>
<forward declaringType=""$Program+&lt;&gt;c"" methodName=""&lt;$Main&gt;b__0_0"" />
<forward declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;&gt;c"" methodName=""&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;b__0_0"" />
<encLocalSlotMap>
<slot kind=""27"" offset=""2"" />
<slot kind=""20"" offset=""2"" />
......@@ -7776,8 +7783,8 @@ public void Return_04()
</sequencePoints>
<asyncInfo>
<catchHandler offset=""0xac"" />
<kickoffMethod declaringType=""$Program"" methodName=""$Main"" parameterNames=""args"" />
<await yield=""0x5a"" resume=""0x75"" declaringType=""$Program+&lt;$Main&gt;d__0"" methodName=""MoveNext"" />
<kickoffMethod declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }"" methodName=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }"" parameterNames=""args"" />
<await yield=""0x5a"" resume=""0x75"" declaringType=""{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName) }+&lt;{ EscapeForXML(WellKnownMemberNames.TopLevelStatementsEntryPointMethodName) }&gt;d__0"" methodName=""MoveNext"" />
</asyncInfo>
</method>
</methods>
......@@ -8214,7 +8221,7 @@ public void ThrowStatement_02()
var comp = CreateCompilation(text, options: TestOptions.DebugExe, parseOptions: DefaultParseOptions);
comp.VerifyEmitDiagnostics();
CompileAndVerify(comp).VerifyIL("<top-level-statements-entry-point>", sequencePoints: "$Program.$Main", source: text, expectedIL:
CompileAndVerify(comp).VerifyIL("<top-level-statements-entry-point>", sequencePoints: WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "." + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName, source: text, expectedIL:
@"
{
// Code size 2 (0x2)
......@@ -8292,7 +8299,7 @@ public void CheckedStatement_01()
";
var comp = CreateCompilation(text, options: TestOptions.DebugExe, parseOptions: DefaultParseOptions);
comp.VerifyEmitDiagnostics();
CompileAndVerify(comp, expectedOutput: "3").VerifyIL("<top-level-statements-entry-point>", sequencePoints: "$Program.$Main", source: text, expectedIL:
CompileAndVerify(comp, expectedOutput: "3").VerifyIL("<top-level-statements-entry-point>", sequencePoints: WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "." + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName, source: text, expectedIL:
@"
{
// Code size 20 (0x14)
......@@ -8339,7 +8346,7 @@ public void UncheckedStatement_01()
";
var comp = CreateCompilation(text, options: TestOptions.DebugExe.WithOverflowChecks(true), parseOptions: DefaultParseOptions);
comp.VerifyEmitDiagnostics();
CompileAndVerify(comp, expectedOutput: "3").VerifyIL("<top-level-statements-entry-point>", sequencePoints: "$Program.$Main", source: text, expectedIL:
CompileAndVerify(comp, expectedOutput: "3").VerifyIL("<top-level-statements-entry-point>", sequencePoints: WellKnownMemberNames.TopLevelStatementsEntryPointTypeName + "." + WellKnownMemberNames.TopLevelStatementsEntryPointMethodName, source: text, expectedIL:
@"
{
// Code size 20 (0x14)
......
......@@ -813,7 +813,7 @@ public class A
var typeA = mems.Where(s => s.Name == "A").Select(s => s);
Assert.Equal(1, typeA.Count());
var invalid = mems.Where(s => s.Name == SimpleProgramNamedTypeSymbol.UnspeakableName).Select(s => s);
var invalid = mems.Where(s => s.Name == WellKnownMemberNames.TopLevelStatementsEntryPointTypeName).Select(s => s);
Assert.Equal(1, invalid.Count());
}
......
......@@ -1056,7 +1056,7 @@ record C
}");
var members = comp.GlobalNamespace.GetTypeMember("C").GetMembers();
AssertEx.Equal(new[] {
"C! C.<>Clone()",
"C! C." + WellKnownMemberNames.CloneMethodName + "()",
"System.Type! C.EqualityContract.get",
"System.Type! C.EqualityContract { get; }",
"System.Int32 C.<X>k__BackingField",
......@@ -1429,7 +1429,7 @@ public static void Main()
Assert.True(clone.IsAbstract);
Assert.Equal(0, clone.ParameterCount);
Assert.Equal(0, clone.Arity);
Assert.Equal("R R.<>Clone()", clone.ToTestDisplayString());
Assert.Equal("R R." + WellKnownMemberNames.CloneMethodName + "()", clone.ToTestDisplayString());
var r2 = comp.GlobalNamespace.GetTypeMember("R2");
var clone2 = (MethodSymbol)r2.GetMembers(WellKnownMemberNames.CloneMethodName).Single();
......@@ -1439,7 +1439,7 @@ public static void Main()
Assert.Equal(0, clone2.ParameterCount);
Assert.Equal(0, clone2.Arity);
Assert.True(clone2.OverriddenMethod.Equals(clone, TypeCompareKind.ConsiderEverything));
Assert.Equal("R R2.<>Clone()", clone2.ToTestDisplayString());
Assert.Equal("R R2." + WellKnownMemberNames.CloneMethodName + "()", clone2.ToTestDisplayString());
var r3 = comp.GlobalNamespace.GetTypeMember("R3");
var clone3 = (MethodSymbol)r3.GetMembers(WellKnownMemberNames.CloneMethodName).Single();
......@@ -1449,7 +1449,7 @@ public static void Main()
Assert.Equal(0, clone3.ParameterCount);
Assert.Equal(0, clone3.Arity);
Assert.True(clone3.OverriddenMethod.Equals(clone2, TypeCompareKind.ConsiderEverything));
Assert.Equal("R R3.<>Clone()", clone3.ToTestDisplayString());
Assert.Equal("R R3." + WellKnownMemberNames.CloneMethodName + "()", clone3.ToTestDisplayString());
var r4 = comp.GlobalNamespace.GetTypeMember("R4");
var clone4 = (MethodSymbol)r4.GetMembers(WellKnownMemberNames.CloneMethodName).Single();
......@@ -1459,7 +1459,7 @@ public static void Main()
Assert.Equal(0, clone4.ParameterCount);
Assert.Equal(0, clone4.Arity);
Assert.True(clone4.OverriddenMethod.Equals(clone3, TypeCompareKind.ConsiderEverything));
Assert.Equal("R R4.<>Clone()", clone4.ToTestDisplayString());
Assert.Equal("R R4." + WellKnownMemberNames.CloneMethodName + "()", clone4.ToTestDisplayString());
var r5 = comp.GlobalNamespace.GetTypeMember("R5");
var clone5 = (MethodSymbol)r5.GetMembers(WellKnownMemberNames.CloneMethodName).Single();
......@@ -1469,7 +1469,7 @@ public static void Main()
Assert.Equal(0, clone5.ParameterCount);
Assert.Equal(0, clone5.Arity);
Assert.True(clone5.OverriddenMethod.Equals(clone4, TypeCompareKind.ConsiderEverything));
Assert.Equal("R R5.<>Clone()", clone5.ToTestDisplayString());
Assert.Equal("R R5." + WellKnownMemberNames.CloneMethodName + "()", clone5.ToTestDisplayString());
var verifier = CompileAndVerify(comp, expectedOutput: "", verify: Verification.Passes);
verifier.VerifyIL("C.Main", @"
......@@ -1477,10 +1477,10 @@ public static void Main()
// Code size 28 (0x1c)
.maxstack 1
IL_0000: newobj ""R3..ctor()""
IL_0005: callvirt ""R R.<>Clone()""
IL_0005: callvirt ""R R." + WellKnownMemberNames.CloneMethodName + @"()""
IL_000a: pop
IL_000b: newobj ""R5..ctor()""
IL_0010: callvirt ""R R.<>Clone()""
IL_0010: callvirt ""R R." + WellKnownMemberNames.CloneMethodName + @"()""
IL_0015: castclass ""R4""
IL_001a: pop
IL_001b: ret
......
......@@ -1450,7 +1450,7 @@ public void ErrorTypeTest01()
var errSymbol = comp.SourceModule.GlobalNamespace.GetMembers().FirstOrDefault() as NamedTypeSymbol;
Assert.NotNull(errSymbol);
Assert.Equal(SimpleProgramNamedTypeSymbol.UnspeakableName, errSymbol.Name);
Assert.Equal(WellKnownMemberNames.TopLevelStatementsEntryPointTypeName, errSymbol.Name);
Assert.False(errSymbol.IsErrorType(), "ErrorType");
Assert.False(errSymbol.IsImplicitClass, "ImplicitClass");
}
......
const Microsoft.CodeAnalysis.WellKnownMemberNames.TopLevelStatementsEntryPointMethodName = "<Main>$" -> string
const Microsoft.CodeAnalysis.WellKnownMemberNames.TopLevelStatementsEntryPointTypeName = "<Program>$" -> string
Microsoft.CodeAnalysis.Operations.IPatternOperation.NarrowedType.get -> Microsoft.CodeAnalysis.ITypeSymbol
\ No newline at end of file
......@@ -344,6 +344,16 @@ public static class WellKnownMemberNames
public const string SliceMethodName = "Slice";
// internal until we settle on this long-term
internal const string CloneMethodName = "<>Clone";
internal const string CloneMethodName = "<Clone>$";
/// <summary>
/// The name of an entry point method synthesized for top-level statements.
/// </summary>
public const string TopLevelStatementsEntryPointMethodName = "<Main>$";
/// <summary>
/// The name of a type synthesized for a top-level statements entry point method.
/// </summary>
public const string TopLevelStatementsEntryPointTypeName = "<Program>$";
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册