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

Make CompilationOptions.MetadataImportOptions public. (#24468)

上级 dc3f3730
......@@ -423,14 +423,14 @@ internal CSharpCompilationOptions WithDebugPlusMode(bool debugPlusMode)
return new CSharpCompilationOptions(this) { DebugPlusMode_internal_protected_set = debugPlusMode };
}
internal new CSharpCompilationOptions WithMetadataImportOptions(MetadataImportOptions value)
public new CSharpCompilationOptions WithMetadataImportOptions(MetadataImportOptions value)
{
if (value == this.MetadataImportOptions)
{
return this;
}
return new CSharpCompilationOptions(this) { MetadataImportOptions_internal_protected_set = value };
return new CSharpCompilationOptions(this) { MetadataImportOptions = value };
}
internal CSharpCompilationOptions WithReferencesSupersedeLowerVersions(bool value)
......@@ -521,7 +521,7 @@ public new CSharpCompilationOptions WithStrongNameProvider(StrongNameProvider pr
protected override CompilationOptions CommonWithStrongNameProvider(StrongNameProvider provider) =>
WithStrongNameProvider(provider);
internal override CompilationOptions CommonWithMetadataImportOptions(MetadataImportOptions value) =>
protected override CompilationOptions CommonWithMetadataImportOptions(MetadataImportOptions value) =>
WithMetadataImportOptions(value);
[Obsolete]
......
......@@ -3,6 +3,7 @@
*REMOVED*Microsoft.CodeAnalysis.CSharp.Syntax.CrefParameterSyntax.Update(Microsoft.CodeAnalysis.SyntaxToken refOrOutKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.CrefParameterSyntax
*REMOVED*static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.Argument(Microsoft.CodeAnalysis.CSharp.Syntax.NameColonSyntax nameColon, Microsoft.CodeAnalysis.SyntaxToken refOrOutKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.ExpressionSyntax expression) -> Microsoft.CodeAnalysis.CSharp.Syntax.ArgumentSyntax
*REMOVED*static Microsoft.CodeAnalysis.CSharp.SyntaxFactory.CrefParameter(Microsoft.CodeAnalysis.SyntaxToken refOrOutKeyword, Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax type) -> Microsoft.CodeAnalysis.CSharp.Syntax.CrefParameterSyntax
Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions.WithMetadataImportOptions(Microsoft.CodeAnalysis.MetadataImportOptions value) -> Microsoft.CodeAnalysis.CSharp.CSharpCompilationOptions
Microsoft.CodeAnalysis.CSharp.Conversion.IsStackAlloc.get -> bool
Microsoft.CodeAnalysis.CSharp.Conversion.ToCommonConversion() -> Microsoft.CodeAnalysis.Operations.CommonConversion
Microsoft.CodeAnalysis.CSharp.DeconstructionInfo
......
......@@ -670,5 +670,57 @@ class Test
Assert.True(memberNames2.Contains(m), m);
}
}
[Fact]
public void TestMetadataImportOptions()
{
var options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
Assert.Equal(MetadataImportOptions.Public, options.MetadataImportOptions);
options = options.WithMetadataImportOptions(MetadataImportOptions.Internal);
Assert.Equal(MetadataImportOptions.Internal, options.MetadataImportOptions);
options = options.WithMetadataImportOptions(MetadataImportOptions.All);
Assert.Equal(MetadataImportOptions.All, options.MetadataImportOptions);
options = options.WithMetadataImportOptions(MetadataImportOptions.Public);
Assert.Equal(MetadataImportOptions.Public, options.MetadataImportOptions);
var commonOptions = (CompilationOptions)options;
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.Internal);
Assert.Equal(MetadataImportOptions.Internal, ((CSharpCompilationOptions)commonOptions).MetadataImportOptions);
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.All);
Assert.Equal(MetadataImportOptions.All, ((CSharpCompilationOptions)commonOptions).MetadataImportOptions);
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.Public);
Assert.Equal(MetadataImportOptions.Public, ((CSharpCompilationOptions)commonOptions).MetadataImportOptions);
var source = @"
public class C
{
public int P1 {get; set;}
internal int P2 {get; set;}
private int P3 {get; set;}
}
";
var compilation0 = CreateStandardCompilation(source);
options = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary);
var compilation = CreateStandardCompilation("", options: options, references: new[] { compilation0.EmitToImageReference() });
var c = compilation.GetTypeByMetadataName("C");
Assert.NotEmpty(c.GetMembers("P1"));
Assert.Empty(c.GetMembers("P2"));
Assert.Empty(c.GetMembers("P3"));
compilation = compilation.WithOptions(options.WithMetadataImportOptions(MetadataImportOptions.Internal));
c = compilation.GetTypeByMetadataName("C");
Assert.NotEmpty(c.GetMembers("P1"));
Assert.NotEmpty(c.GetMembers("P2"));
Assert.Empty(c.GetMembers("P3"));
compilation = compilation.WithOptions(options.WithMetadataImportOptions(MetadataImportOptions.All));
c = compilation.GetTypeByMetadataName("C");
Assert.NotEmpty(c.GetMembers("P1"));
Assert.NotEmpty(c.GetMembers("P2"));
Assert.NotEmpty(c.GetMembers("P3"));
}
}
}
......@@ -170,12 +170,13 @@ public abstract class CompilationOptions
internal bool DebugPlusMode_internal_protected_set { set { DebugPlusMode = value; } }
/// <summary>
/// Import internal/private members from all references regardless of "internals-visible-to" relationship.
/// Specifies whether to import members with accessibility other than public or protected by default.
/// Default value is <see cref="MetadataImportOptions.Public"/>. The value specified is not going to
/// affect correctness of analysis performed by compilers because all members needed for correctness
/// are going to be imported regardless. This setting can force compilation to import members that it
/// normally doesn't.
/// </summary>
internal MetadataImportOptions MetadataImportOptions { get; private set; }
// TODO: change visibility of the MetadataImportOptions setter to internal & protected
internal MetadataImportOptions MetadataImportOptions_internal_protected_set { set { MetadataImportOptions = value; } }
public MetadataImportOptions MetadataImportOptions { get; protected set; }
/// <summary>
/// Apply additional disambiguation rules during resolution of referenced assemblies.
......@@ -503,7 +504,7 @@ public CompilationOptions WithOverflowChecks(bool checkOverflow)
return CommonWithCheckOverflow(checkOverflow);
}
internal CompilationOptions WithMetadataImportOptions(MetadataImportOptions value) => CommonWithMetadataImportOptions(value);
public CompilationOptions WithMetadataImportOptions(MetadataImportOptions value) => CommonWithMetadataImportOptions(value);
protected abstract CompilationOptions CommonWithConcurrentBuild(bool concurrent);
protected abstract CompilationOptions CommonWithDeterministic(bool deterministic);
......@@ -528,7 +529,7 @@ public CompilationOptions WithOverflowChecks(bool checkOverflow)
protected abstract CompilationOptions CommonWithCryptoPublicKey(ImmutableArray<byte> cryptoPublicKey);
protected abstract CompilationOptions CommonWithDelaySign(bool? delaySign);
protected abstract CompilationOptions CommonWithCheckOverflow(bool checkOverflow);
internal abstract CompilationOptions CommonWithMetadataImportOptions(MetadataImportOptions value);
protected abstract CompilationOptions CommonWithMetadataImportOptions(MetadataImportOptions value);
[Obsolete]
protected abstract CompilationOptions CommonWithFeatures(ImmutableArray<string> features);
......
......@@ -7,7 +7,7 @@ namespace Microsoft.CodeAnalysis
/// <summary>
/// Specifies what symbols to import from metadata.
/// </summary>
internal enum MetadataImportOptions : byte
public enum MetadataImportOptions : byte
{
/// <summary>
/// Only import public and protected symbols.
......
......@@ -2,6 +2,8 @@
*REMOVED*Microsoft.CodeAnalysis.Emit.EmitOptions.EmitOptions(bool metadataOnly = false, Microsoft.CodeAnalysis.Emit.DebugInformationFormat debugInformationFormat = (Microsoft.CodeAnalysis.Emit.DebugInformationFormat)0, string pdbFilePath = null, string outputNameOverride = null, int fileAlignment = 0, ulong baseAddress = 0, bool highEntropyVirtualAddressSpace = false, Microsoft.CodeAnalysis.SubsystemVersion subsystemVersion = default(Microsoft.CodeAnalysis.SubsystemVersion), string runtimeMetadataVersion = null, bool tolerateErrors = false, bool includePrivateMembers = false, System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Emit.InstrumentationKind> instrumentationKinds = default(System.Collections.Immutable.ImmutableArray<Microsoft.CodeAnalysis.Emit.InstrumentationKind>)) -> void
*REMOVED*Microsoft.CodeAnalysis.IOperation.IsInvalid.get -> bool
Microsoft.CodeAnalysis.CommandLineArguments.DisplayLangVersions.get -> bool
Microsoft.CodeAnalysis.CompilationOptions.MetadataImportOptions.get -> Microsoft.CodeAnalysis.MetadataImportOptions
Microsoft.CodeAnalysis.CompilationOptions.WithMetadataImportOptions(Microsoft.CodeAnalysis.MetadataImportOptions value) -> Microsoft.CodeAnalysis.CompilationOptions
Microsoft.CodeAnalysis.Diagnostics.AnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.OperationKind[] operationKinds) -> void
Microsoft.CodeAnalysis.Diagnostics.CompilationStartAnalysisContext.RegisterOperationAction(System.Action<Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext> action, params Microsoft.CodeAnalysis.OperationKind[] operationKinds) -> void
Microsoft.CodeAnalysis.Diagnostics.OperationAnalysisContext
......@@ -52,6 +54,10 @@ Microsoft.CodeAnalysis.IOperation.Syntax.get -> Microsoft.CodeAnalysis.SyntaxNod
Microsoft.CodeAnalysis.IOperation.Type.get -> Microsoft.CodeAnalysis.ITypeSymbol
Microsoft.CodeAnalysis.IPropertySymbol.RefKind.get -> Microsoft.CodeAnalysis.RefKind
Microsoft.CodeAnalysis.IPropertySymbol.ReturnsByRefReadonly.get -> bool
Microsoft.CodeAnalysis.MetadataImportOptions
Microsoft.CodeAnalysis.MetadataImportOptions.All = 2 -> Microsoft.CodeAnalysis.MetadataImportOptions
Microsoft.CodeAnalysis.MetadataImportOptions.Internal = 1 -> Microsoft.CodeAnalysis.MetadataImportOptions
Microsoft.CodeAnalysis.MetadataImportOptions.Public = 0 -> Microsoft.CodeAnalysis.MetadataImportOptions
Microsoft.CodeAnalysis.ModuleMetadata.IsDisposed.get -> bool
Microsoft.CodeAnalysis.OperationKind
Microsoft.CodeAnalysis.OperationKind.AddressOf = 64 -> Microsoft.CodeAnalysis.OperationKind
......
Microsoft.CodeAnalysis.VisualBasic.Conversion.ToCommonConversion() -> Microsoft.CodeAnalysis.Operations.CommonConversion
Microsoft.CodeAnalysis.VisualBasic.LanguageVersion.VisualBasic15_5 = 1505 -> Microsoft.CodeAnalysis.VisualBasic.LanguageVersion
Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions.WithMetadataImportOptions(value As Microsoft.CodeAnalysis.MetadataImportOptions) -> Microsoft.CodeAnalysis.VisualBasic.VisualBasicCompilationOptions
Microsoft.CodeAnalysis.VisualBasic.VisualBasicExtensions.GetConversion(conversionExpression As Microsoft.CodeAnalysis.Operations.IConversionOperation) -> Microsoft.CodeAnalysis.VisualBasic.Conversion
Microsoft.CodeAnalysis.VisualBasic.VisualBasicExtensions.GetInConversion(argument As Microsoft.CodeAnalysis.Operations.IArgumentOperation) -> Microsoft.CodeAnalysis.VisualBasic.Conversion
Microsoft.CodeAnalysis.VisualBasic.VisualBasicExtensions.GetInConversion(compoundAssignment As Microsoft.CodeAnalysis.Operations.ICompoundAssignmentOperation) -> Microsoft.CodeAnalysis.VisualBasic.Conversion
......
......@@ -739,7 +739,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return Me.WithReportSuppressedDiagnostics(reportSuppressedDiagnostics)
End Function
Friend Overrides Function CommonWithMetadataImportOptions(value As MetadataImportOptions) As CompilationOptions
Protected Overrides Function CommonWithMetadataImportOptions(value As MetadataImportOptions) As CompilationOptions
Return WithMetadataImportOptions(value)
End Function
......@@ -812,12 +812,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Return New VisualBasicCompilationOptions(Me) With {.OptimizationLevel = value}
End Function
Friend Shadows Function WithMetadataImportOptions(value As MetadataImportOptions) As VisualBasicCompilationOptions
''' <summary>
''' Creates a new <see cref="VisualBasicCompilationOptions"/> instance with a specified <see cref="CodeAnalysis.MetadataImportOptions"/>.
''' </summary>
''' <returns>A new instance of <see cref="VisualBasicCompilationOptions"/>, if the value is different; otherwise the current instance.</returns>
Public Shadows Function WithMetadataImportOptions(value As MetadataImportOptions) As VisualBasicCompilationOptions
If value = Me.MetadataImportOptions Then
Return Me
End If
Return New VisualBasicCompilationOptions(Me) With {.MetadataImportOptions_internal_protected_set = value}
Return New VisualBasicCompilationOptions(Me) With {.MetadataImportOptions = value}
End Function
Friend Function WithReferencesSupersedeLowerVersions(value As Boolean) As VisualBasicCompilationOptions
......
......@@ -928,6 +928,58 @@ End Class
Next
End Sub
<Fact>
Public Sub TestMetadataImportOptions()
Dim options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
Assert.Equal(MetadataImportOptions.Public, options.MetadataImportOptions)
options = options.WithMetadataImportOptions(MetadataImportOptions.Internal)
Assert.Equal(MetadataImportOptions.Internal, options.MetadataImportOptions)
options = options.WithMetadataImportOptions(MetadataImportOptions.All)
Assert.Equal(MetadataImportOptions.All, options.MetadataImportOptions)
options = options.WithMetadataImportOptions(MetadataImportOptions.Public)
Assert.Equal(MetadataImportOptions.Public, options.MetadataImportOptions)
Dim commonOptions = DirectCast(options, CompilationOptions)
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.Internal)
Assert.Equal(MetadataImportOptions.Internal, DirectCast(commonOptions, VisualBasicCompilationOptions).MetadataImportOptions)
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.All)
Assert.Equal(MetadataImportOptions.All, DirectCast(commonOptions, VisualBasicCompilationOptions).MetadataImportOptions)
commonOptions = commonOptions.WithMetadataImportOptions(MetadataImportOptions.Public)
Assert.Equal(MetadataImportOptions.Public, DirectCast(commonOptions, VisualBasicCompilationOptions).MetadataImportOptions)
Dim compilation0 = CreateCompilationWithMscorlib(
<compilation>
<file name="a.vb">
Public Class C
Public Property P1 As Integer
Friend Property P2 As Integer
Private Property P3 As Integer
End Class
</file>
</compilation>, options:=TestOptions.DebugDll)
options = New VisualBasicCompilationOptions(OutputKind.DynamicallyLinkedLibrary)
Dim compilation = CreateCompilationWithMscorlib("", options:=options, references:={compilation0.EmitToImageReference()})
Dim c = compilation.GetTypeByMetadataName("C")
Assert.NotEmpty(c.GetMembers("P1"))
Assert.Empty(c.GetMembers("P2"))
Assert.Empty(c.GetMembers("P3"))
compilation = compilation.WithOptions(options.WithMetadataImportOptions(MetadataImportOptions.Internal))
c = compilation.GetTypeByMetadataName("C")
Assert.NotEmpty(c.GetMembers("P1"))
Assert.NotEmpty(c.GetMembers("P2"))
Assert.Empty(c.GetMembers("P3"))
compilation = compilation.WithOptions(options.WithMetadataImportOptions(MetadataImportOptions.All))
c = compilation.GetTypeByMetadataName("C")
Assert.NotEmpty(c.GetMembers("P1"))
Assert.NotEmpty(c.GetMembers("P2"))
Assert.NotEmpty(c.GetMembers("P3"))
End Sub
End Class
End Namespace
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册