diff options
-rw-r--r-- | Directory.Build.props | 1 | ||||
m--------- | external/cecil | 0 | ||||
-rw-r--r-- | global.json | 2 | ||||
-rw-r--r-- | src/ILLink.CodeFix/RequiresAssemblyFilesCodeFixProvider.cs | 2 | ||||
-rw-r--r-- | src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs | 11 | ||||
-rw-r--r-- | src/ILLink.RoslynAnalyzer/RequiresAssemblyFilesAnalyzer.cs | 17 | ||||
-rw-r--r-- | src/linker/Linker.Steps/MarkStep.cs | 4 | ||||
-rw-r--r-- | src/linker/Linker/Driver.cs | 4 | ||||
-rw-r--r-- | src/linker/Linker/MethodReferenceExtensions.cs | 3 | ||||
-rw-r--r-- | src/linker/Linker/TypeReferenceExtensions.cs | 2 | ||||
-rw-r--r-- | src/linker/Linker/UnconditionalSuppressMessageAttributeState.cs | 5 | ||||
-rw-r--r-- | src/tlens/TLens.Analyzers/LargeStaticArraysAnalyzer.cs | 2 | ||||
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs | 48 | ||||
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs | 2 | ||||
-rw-r--r-- | test/ILLink.RoslynAnalyzer.Tests/UnconditionalSuppressMessageCodeFixTests.cs | 25 |
15 files changed, 60 insertions, 68 deletions
diff --git a/Directory.Build.props b/Directory.Build.props index d07c1d081..5d480a85c 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,7 @@ <Project> <PropertyGroup> <IsReferenceAssembly Condition="'$(IsReferenceAssembly)' == '' and '$([System.IO.Path]::GetFileName($(MSBuildProjectDirectory)))' == 'ref'">true</IsReferenceAssembly> + <DisableImplicitNamespaceImports_DotNet>true</DisableImplicitNamespaceImports_DotNet> </PropertyGroup> <PropertyGroup Condition=" '$(IsReferenceAssembly)' == 'true' "> <!-- Since .NET 5 reference assemblies are always produced --> diff --git a/external/cecil b/external/cecil -Subproject a27b1fb8b08d412fbed56a053a5c0872ed9dba2 +Subproject 3bef7fc7b7910f826790ebfeccb381b76a65057 diff --git a/global.json b/global.json index df66dcd08..21becbdf6 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "tools": { - "dotnet": "6.0.100-preview.5.21225.11", + "dotnet": "6.0.100-preview.7.21369.8", "runtimes": { "dotnet": [ "5.0.0" diff --git a/src/ILLink.CodeFix/RequiresAssemblyFilesCodeFixProvider.cs b/src/ILLink.CodeFix/RequiresAssemblyFilesCodeFixProvider.cs index 7837c183c..b172b7e51 100644 --- a/src/ILLink.CodeFix/RequiresAssemblyFilesCodeFixProvider.cs +++ b/src/ILLink.CodeFix/RequiresAssemblyFilesCodeFixProvider.cs @@ -36,7 +36,7 @@ namespace ILLink.CodeFix if (string.IsNullOrEmpty (name) || HasPublicAccessibility (containingSymbol!)) { return Array.Empty<SyntaxNode> (); } else { - return new[] { generator.AttributeArgument ("Message", generator.LiteralExpression ($"Calls {name}")) }; + return new[] { generator.AttributeArgument (generator.LiteralExpression ($"Calls {name}")) }; } } } diff --git a/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs b/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs index 6c9498a30..7f1967028 100644 --- a/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs +++ b/src/ILLink.RoslynAnalyzer/RequiresAnalyzerBase.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; using System.Linq; using ILLink.Shared; using Microsoft.CodeAnalysis; @@ -116,7 +117,7 @@ namespace ILLink.RoslynAnalyzer ImmutableArray<IMethodSymbol> staticConstructors) { foreach (var staticConstructor in staticConstructors) { - if (staticConstructor.HasAttribute (RequiresAttributeName) && TryGetRequiresAttribute (staticConstructor, out AttributeData? requiresAttribute)) + if (staticConstructor.HasAttribute (RequiresAttributeName) && TryGetRequiresAttribute (staticConstructor, out var requiresAttribute)) ReportRequiresDiagnostic (operationContext, staticConstructor, requiresAttribute); } } @@ -149,7 +150,7 @@ namespace ILLink.RoslynAnalyzer while (member is IMethodSymbol method && method.OverriddenMethod != null && SymbolEqualityComparer.Default.Equals (method.ReturnType, method.OverriddenMethod.ReturnType)) member = method.OverriddenMethod; - if (TryGetRequiresAttribute (member, out AttributeData? requiresAttribute)) { + if (TryGetRequiresAttribute (member, out var requiresAttribute)) { ReportRequiresDiagnostic (operationContext, member, requiresAttribute); } } @@ -227,7 +228,7 @@ namespace ILLink.RoslynAnalyzer /// <param name="operationContext">Analyzer operation context to be able to report the diagnostic.</param> /// <param name="member">Information about the member that generated the diagnostic.</param> /// <param name="requiresAttribute">Requires attribute data to print attribute arguments.</param> - private void ReportRequiresDiagnostic (OperationAnalysisContext operationContext, ISymbol member, AttributeData? requiresAttribute) + private void ReportRequiresDiagnostic (OperationAnalysisContext operationContext, ISymbol member, AttributeData requiresAttribute) { var message = GetMessageFromAttribute (requiresAttribute); var url = GetUrlFromAttribute (requiresAttribute); @@ -250,7 +251,7 @@ namespace ILLink.RoslynAnalyzer private bool HasMismatchingAttributes (ISymbol member1, ISymbol member2) => member1.HasAttribute (RequiresAttributeName) ^ member2.HasAttribute (RequiresAttributeName); - protected abstract string GetMessageFromAttribute (AttributeData? requiresAttribute); + protected abstract string GetMessageFromAttribute (AttributeData requiresAttribute); private string GetUrlFromAttribute (AttributeData? requiresAttribute) { @@ -264,7 +265,7 @@ namespace ILLink.RoslynAnalyzer /// <param name="member">Symbol of the member to search attribute.</param> /// <param name="requiresAttribute">Output variable in case of matching Requires attribute.</param> /// <returns>True if the member contains a Requires attribute; otherwise, returns false.</returns> - private bool TryGetRequiresAttribute (ISymbol member, out AttributeData? requiresAttribute) + private bool TryGetRequiresAttribute (ISymbol member, [NotNullWhen (returnValue: true)] out AttributeData? requiresAttribute) { requiresAttribute = null; foreach (var _attribute in member.GetAttributes ()) { diff --git a/src/ILLink.RoslynAnalyzer/RequiresAssemblyFilesAnalyzer.cs b/src/ILLink.RoslynAnalyzer/RequiresAssemblyFilesAnalyzer.cs index a0a6aa9de..dbce10d38 100644 --- a/src/ILLink.RoslynAnalyzer/RequiresAssemblyFilesAnalyzer.cs +++ b/src/ILLink.RoslynAnalyzer/RequiresAssemblyFilesAnalyzer.cs @@ -123,15 +123,18 @@ namespace ILLink.RoslynAnalyzer return false; } - protected override bool VerifyAttributeArguments (AttributeData attribute) => attribute.ConstructorArguments.Length == 0; + protected override bool VerifyAttributeArguments (AttributeData attribute) => attribute.ConstructorArguments.Length == 0 || + attribute.ConstructorArguments.Length >= 1 && attribute.ConstructorArguments[0] is { Type: { SpecialType: SpecialType.System_String } } ctorArg; - protected override string GetMessageFromAttribute (AttributeData? requiresAttribute) + protected override string GetMessageFromAttribute (AttributeData requiresAttribute) { - var message = requiresAttribute?.NamedArguments.FirstOrDefault (na => na.Key == "Message").Value.Value?.ToString (); - if (!string.IsNullOrEmpty (message)) - message = $" {message}{(message!.TrimEnd ().EndsWith (".") ? "" : ".")}"; - - return message!; + string message = ""; + if (requiresAttribute.ConstructorArguments.Length >= 1) { + message = requiresAttribute.ConstructorArguments[0].Value?.ToString () ?? ""; + if (!string.IsNullOrEmpty (message)) + message = $" {message}{(message!.TrimEnd ().EndsWith (".") ? "" : ".")}"; + } + return message; } } } diff --git a/src/linker/Linker.Steps/MarkStep.cs b/src/linker/Linker.Steps/MarkStep.cs index 39f70f622..bd4c0e61c 100644 --- a/src/linker/Linker.Steps/MarkStep.cs +++ b/src/linker/Linker.Steps/MarkStep.cs @@ -1052,7 +1052,7 @@ namespace Mono.Linker.Steps bool marked = false; int arity_marker = name.IndexOf ('`'); - if (arity_marker < 1 || !int.TryParse (name.Substring (arity_marker + 1), out int arity)) { + if (arity_marker < 1 || !int.TryParse (name.AsSpan (arity_marker + 1), out int arity)) { arity = 0; } else { name = name.Substring (0, arity_marker); @@ -2035,7 +2035,7 @@ namespace Mono.Linker.Steps // // We could implement support for this at some point, but for now it's important to make sure at least we don't crash trying to find some // method on the current type when it exists on some other type - if (methodName.Contains (".")) + if (methodName.Contains ('.')) continue; MethodDefinition method = GetMethodWithNoParameters (type, methodName); diff --git a/src/linker/Linker/Driver.cs b/src/linker/Linker/Driver.cs index 0674f479a..f65749ad6 100644 --- a/src/linker/Linker/Driver.cs +++ b/src/linker/Linker/Driver.cs @@ -805,7 +805,7 @@ namespace Mono.Linker string[] values = value.Split (new char[] { ',', ';', ' ' }, StringSplitOptions.RemoveEmptyEntries); foreach (string v in values) { var id = v.Trim (); - if (!id.StartsWith ("IL", StringComparison.Ordinal) || !ushort.TryParse (id.Substring (2), out ushort code)) + if (!id.StartsWith ("IL", StringComparison.Ordinal) || !ushort.TryParse (id.AsSpan (2), out ushort code)) continue; yield return code; @@ -884,7 +884,7 @@ namespace Mono.Linker string customStepName; string targetName = null; bool before = false; - if (!arg.Contains (":")) { + if (!arg.Contains (':')) { customStepName = arg; } else { string[] parts = arg.Split (':'); diff --git a/src/linker/Linker/MethodReferenceExtensions.cs b/src/linker/Linker/MethodReferenceExtensions.cs index 695ab2043..2aff0ce28 100644 --- a/src/linker/Linker/MethodReferenceExtensions.cs +++ b/src/linker/Linker/MethodReferenceExtensions.cs @@ -2,6 +2,7 @@ // 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 Mono.Cecil; namespace Mono.Linker @@ -16,7 +17,7 @@ namespace Mono.Linker var methodDefinition = method.Resolve (); if (methodDefinition != null && (methodDefinition.IsSetter || methodDefinition.IsGetter)) { // Append property name - string name = methodDefinition.IsSetter ? methodDefinition.Name.Substring (4) + ".set" : methodDefinition.Name.Substring (4) + ".get"; + string name = methodDefinition.IsSetter ? string.Concat (methodDefinition.Name.AsSpan (4), ".set") : string.Concat (methodDefinition.Name.AsSpan (4), ".get"); sb.Append (name); // Insert declaring type name and namespace sb.Insert (0, '.').Insert (0, method.DeclaringType.GetDisplayName ()); diff --git a/src/linker/Linker/TypeReferenceExtensions.cs b/src/linker/Linker/TypeReferenceExtensions.cs index 5ebc3d2ae..3cec02422 100644 --- a/src/linker/Linker/TypeReferenceExtensions.cs +++ b/src/linker/Linker/TypeReferenceExtensions.cs @@ -100,7 +100,7 @@ namespace Mono.Linker sb.Append (']'); } - sb.Append (arrayType.Name.Substring (0, arrayType.Name.IndexOf ('['))); + sb.Append (arrayType.Name.AsSpan (0, arrayType.Name.IndexOf ('['))); parseArrayDimensions (arrayType); var element = arrayType.ElementType as ArrayType; while (element != null) { diff --git a/src/linker/Linker/UnconditionalSuppressMessageAttributeState.cs b/src/linker/Linker/UnconditionalSuppressMessageAttributeState.cs index 33e51a028..79a462bd3 100644 --- a/src/linker/Linker/UnconditionalSuppressMessageAttributeState.cs +++ b/src/linker/Linker/UnconditionalSuppressMessageAttributeState.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using Mono.Cecil; @@ -109,7 +110,7 @@ namespace Mono.Linker if (!(attribute.ConstructorArguments[1].Value is string warningId) || warningId.Length < 6 || !warningId.StartsWith ("IL") || - !int.TryParse (warningId.Substring (2, 4), out info.Id)) { + !int.TryParse (warningId.AsSpan (2, 4), out info.Id)) { return false; } diff --git a/src/tlens/TLens.Analyzers/LargeStaticArraysAnalyzer.cs b/src/tlens/TLens.Analyzers/LargeStaticArraysAnalyzer.cs index 28bb9e586..c46fcc2c6 100644 --- a/src/tlens/TLens.Analyzers/LargeStaticArraysAnalyzer.cs +++ b/src/tlens/TLens.Analyzers/LargeStaticArraysAnalyzer.cs @@ -27,7 +27,7 @@ namespace TLens.Analyzers if (!name.StartsWith ("__StaticArrayInitTypeSize=")) continue; - if (!int.TryParse (name.Substring (26), out int size)) + if (!int.TryParse (name.AsSpan (26), out int size)) throw new NotImplementedException (name); methods.Add ((size, method)); diff --git a/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs b/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs index 4f66348ba..cf09be77e 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/RequiresAssemblyFilesAnalyzerTests.cs @@ -166,7 +166,7 @@ using System.Diagnostics.CodeAnalysis; class C { - [RequiresAssemblyFiles (Message = ""Message from attribute"", Url = ""https://helpurl"")] + [RequiresAssemblyFiles (""Message from attribute"", Url = ""https://helpurl"")] void M1() { } @@ -231,13 +231,13 @@ class C M2(); } - [RequiresAssemblyFiles (Message = ""Warn from M2"")] + [RequiresAssemblyFiles (""Warn from M2"")] void M2() { M3(); } - [RequiresAssemblyFiles (Message = ""Warn from M3"")] + [RequiresAssemblyFiles (""Warn from M3"")] void M3() { } @@ -321,6 +321,8 @@ class C } }"; return VerifyRequiresAssemblyFilesAnalyzer (src, + // (8,13): warning IL3002: Using member 'System.Reflection.AssemblyName.CodeBase.get' which has 'RequiresAssemblyFilesAttribute' can break functionality when embedded in a single-file app. The code will return an empty string for assemblies embedded in a single-file app. + VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3002).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.AssemblyName.CodeBase.get", " The code will return an empty string for assemblies embedded in a single-file app.", ""), // (8,13): warning IL3000: 'System.Reflection.AssemblyName.CodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'. VerifyCS.Diagnostic (RequiresAssemblyFilesAnalyzer.IL3000).WithSpan (8, 13, 8, 23).WithArguments ("System.Reflection.AssemblyName.CodeBase"), // (9,13): warning IL3000: 'System.Reflection.AssemblyName.EscapedCodeBase' always returns an empty string for assemblies embedded in a single-file app. If the path to the app directory is needed, consider calling 'System.AppContext.BaseDirectory'. @@ -445,7 +447,7 @@ class C using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; int M2() => M1(); } @@ -469,18 +471,18 @@ public class E using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; - [RequiresAssemblyFiles(Message = ""Calls M1"")] + [RequiresAssemblyFiles(""Calls M1"")] int M2() => M1(); } class D { - [RequiresAssemblyFiles(Message = ""Calls M1"")] + [RequiresAssemblyFiles(""Calls M1"")] public int M3(C c) => c.M1(); public class E { - [RequiresAssemblyFiles(Message = ""Calls M1"")] + [RequiresAssemblyFiles(""Calls M1"")] public int M4(C c) => c.M1(); } } @@ -561,7 +563,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; int M2 => M1(); @@ -572,10 +574,10 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; - [RequiresAssemblyFiles(Message = ""Calls M1"")] + [RequiresAssemblyFiles(""Calls M1"")] int M2 => M1(); }"; return VerifyRequiresAssemblyFilesCodeFix ( @@ -642,7 +644,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; Action M2() @@ -657,13 +659,13 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; - [RequiresAssemblyFiles(Message = ""Calls Wrapper"")] + [RequiresAssemblyFiles(""Calls Wrapper"")] Action M2() { - [global::System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute(Message = ""Calls M1"")] void Wrapper () => M1(); + [global::System.Diagnostics.CodeAnalysis.RequiresAssemblyFilesAttribute(""Calls M1"")] void Wrapper () => M1(); return Wrapper; } }"; @@ -688,7 +690,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; public C () => M1(); @@ -699,7 +701,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; [RequiresAssemblyFiles()] @@ -724,7 +726,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; public event EventHandler E1 @@ -742,7 +744,7 @@ using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; [RequiresAssemblyFiles()] @@ -773,7 +775,7 @@ using System.Diagnostics.CodeAnalysis; class StaticCtor { - [RequiresAssemblyFiles (Message = ""Message for --TestStaticCtor--"")] + [RequiresAssemblyFiles (""Message for --TestStaticCtor--"")] static StaticCtor () { } @@ -799,7 +801,7 @@ class StaticCtorTriggeredByFieldAccess { public static int field; - [RequiresAssemblyFiles (Message = ""Message for --StaticCtorTriggeredByFieldAccess.Cctor--"")] + [RequiresAssemblyFiles (""Message for --StaticCtorTriggeredByFieldAccess.Cctor--"")] static StaticCtorTriggeredByFieldAccess () { field = 0; @@ -826,12 +828,12 @@ using System.Diagnostics.CodeAnalysis; class StaticCtorTriggeredByMethodCall { - [RequiresAssemblyFiles (Message = ""Message for --StaticCtorTriggeredByMethodCall.Cctor--"")] + [RequiresAssemblyFiles (""Message for --StaticCtorTriggeredByMethodCall.Cctor--"")] static StaticCtorTriggeredByMethodCall () { } - [RequiresAssemblyFiles (Message = ""Message for --StaticCtorTriggeredByMethodCall.TriggerStaticCtorMarking--"")] + [RequiresAssemblyFiles (""Message for --StaticCtorTriggeredByMethodCall.TriggerStaticCtorMarking--"")] public void TriggerStaticCtorMarking () { } diff --git a/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs b/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs index 6022d9a29..60da38b14 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/TestCaseUtils.cs @@ -22,7 +22,7 @@ namespace ILLink.RoslynAnalyzer.Tests public static readonly ReferenceAssemblies Net6PreviewAssemblies = new ReferenceAssemblies ( "net6.0", - new PackageIdentity ("Microsoft.NETCore.App.Ref", "6.0.0-preview.5.21224.4"), + new PackageIdentity ("Microsoft.NETCore.App.Ref", "6.0.0-preview.7.21368.2"), Path.Combine ("ref", "net6.0")) .WithNuGetConfigFilePath (Path.Combine (TestCaseUtils.GetRepoRoot (), "NuGet.config")); diff --git a/test/ILLink.RoslynAnalyzer.Tests/UnconditionalSuppressMessageCodeFixTests.cs b/test/ILLink.RoslynAnalyzer.Tests/UnconditionalSuppressMessageCodeFixTests.cs index 38249eb3e..05fe2ba10 100644 --- a/test/ILLink.RoslynAnalyzer.Tests/UnconditionalSuppressMessageCodeFixTests.cs +++ b/test/ILLink.RoslynAnalyzer.Tests/UnconditionalSuppressMessageCodeFixTests.cs @@ -49,26 +49,9 @@ build_property.{MSBuildPropertyOptionNames.EnableTrimAnalyzer} = true"))); DiagnosticResult[] baselineExpected, DiagnosticResult[] fixedExpected) { - var attributeDefinition = @" -namespace System.Diagnostics.CodeAnalysis -{ -#nullable enable - [AttributeUsage(AttributeTargets.Constructor | - AttributeTargets.Event | - AttributeTargets.Method | - AttributeTargets.Property, - Inherited = false, - AllowMultiple = false)] - public sealed class RequiresAssemblyFilesAttribute : Attribute - { - public RequiresAssemblyFilesAttribute() { } - public string? Message { get; set; } - public string? Url { get; set; } - } -}"; var test = new VerifyCSUSMwithRAF.Test { - TestCode = source + attributeDefinition, - FixedCode = fixedSource + attributeDefinition, + TestCode = source, + FixedCode = fixedSource, ReferenceAssemblies = TestCaseUtils.Net6PreviewAssemblies }; test.ExpectedDiagnostics.AddRange (baselineExpected); @@ -117,7 +100,7 @@ public class C using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; int M2() => M1(); }"; @@ -125,7 +108,7 @@ public class C using System.Diagnostics.CodeAnalysis; public class C { - [RequiresAssemblyFiles(Message = ""message"")] + [RequiresAssemblyFiles(""message"")] public int M1() => 0; [UnconditionalSuppressMessage(""SingleFile"", ""IL3002:Avoid calling members marked with 'RequiresAssemblyFilesAttribute' when publishing as a single-file"", Justification = ""<Pending>"")] int M2() => M1(); |