提交 8b596f4a 编写于 作者: C Charles Stoner

Add IgnoreAccessibility to PEModuleBuilder

上级 c8e8ad36
......@@ -581,6 +581,7 @@ private void CompileSynthesizedMethods(ImmutableArray<NamedTypeSymbol> additiona
private void CompileSynthesizedMethods(TypeCompilationState compilationState)
{
Debug.Assert(_moduleBeingBuiltOpt != null);
Debug.Assert(compilationState.ModuleBuilderOpt == _moduleBeingBuiltOpt);
if (!compilationState.HasSynthesizedMethods)
{
......
......@@ -324,6 +324,15 @@ private Location GetSmallestSourceLocationOrNull(Symbol symbol)
return result;
}
/// <summary>
/// Ignore accessibility when resolving well-known type
/// members, in particular for generic type arguments.
/// </summary>
internal virtual bool IgnoreAccessibility
{
get { return false; }
}
internal virtual VariableSlotAllocator TryCreateVariableSlotAllocator(MethodSymbol method)
{
return null;
......
......@@ -13,6 +13,7 @@ internal partial class AsyncRewriter : StateMachineRewriter
private readonly AsyncMethodBuilderMemberCollection _asyncMethodBuilderMemberCollection;
private readonly bool _constructedSuccessfully;
private readonly int _methodOrdinal;
private readonly bool _ignoreAccessibility;
private FieldSymbol _builderField;
......@@ -37,6 +38,7 @@ internal partial class AsyncRewriter : StateMachineRewriter
}
_methodOrdinal = methodOrdinal;
_ignoreAccessibility = compilationState.ModuleBuilderOpt.IgnoreAccessibility;
}
/// <summary>
......@@ -166,7 +168,7 @@ protected override BoundStatement GenerateStateMachineCreation(LocalSymbol state
bodyBuilder.Add(
F.Assignment(
F.Field(F.Local(stateMachineVariable), _builderField.AsMember(frameType)),
F.StaticCall(BinderFlags.IgnoreAccessibility, methodScopeAsyncMethodBuilderMemberCollection.BuilderType, "Create", ImmutableArray<TypeSymbol>.Empty)));
F.StaticCall(_ignoreAccessibility ? BinderFlags.IgnoreAccessibility : BinderFlags.None, methodScopeAsyncMethodBuilderMemberCollection.BuilderType, "Create", ImmutableArray<TypeSymbol>.Empty)));
// local.$stateField = NotStartedStateMachine
bodyBuilder.Add(
......
......@@ -181,6 +181,7 @@
<Compile Include="Binding\ForOrForEachBlockBinder.vb" />
<Compile Include="Binding\ForEachEnumeratorInfo.vb" />
<Compile Include="Binding\GetTypeBinder.vb" />
<Compile Include="Binding\IgnoreAccessibilityBinder.vb" />
<Compile Include="Binding\IgnoreBaseClassesBinder.vb" />
<Compile Include="Binding\ImplicitVariableBinder.vb" />
<Compile Include="Binding\ImportAliasesBinder.vb" />
......
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator
Imports System.Runtime.InteropServices
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Namespace Microsoft.CodeAnalysis.VisualBasic
Friend NotInheritable Class IgnoreAccessibilityBinder
Inherits Binder
......@@ -11,5 +14,9 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator
Friend Overrides Function BinderSpecificLookupOptions(options As LookupOptions) As LookupOptions
Return ContainingBinder.BinderSpecificLookupOptions(options) Or LookupOptions.IgnoreAccessibility
End Function
Public Overrides Function CheckAccessibility(sym As Symbol, <[In]> <Out> ByRef useSiteDiagnostics As HashSet(Of DiagnosticInfo), Optional accessThroughType As TypeSymbol = Nothing, Optional basesBeingResolved As ConsList(Of Symbol) = Nothing) As AccessCheckResult
Return AccessCheckResult.Accessible
End Function
End Class
End Namespace
......@@ -300,6 +300,16 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Emit
Return result
End Function
''' <summary>
''' Ignore accessibility when resolving well-known type
''' members, in particular for generic type arguments.
''' </summary>
Friend Overridable ReadOnly Property IgnoreAccessibility As Boolean
Get
Return False
End Get
End Property
Friend Overridable Function TryCreateVariableSlotAllocator(method As MethodSymbol) As VariableSlotAllocator
Return Nothing
End Function
......
......@@ -2,14 +2,9 @@
Imports System.Collections.Generic
Imports System.Collections.Immutable
Imports System.Runtime.CompilerServices
Imports System.Runtime.InteropServices
Imports System.Threading
Imports Microsoft.Cci
Imports Microsoft.CodeAnalysis
Imports Microsoft.CodeAnalysis.CodeGen
Imports Microsoft.CodeAnalysis.Collections
Imports Microsoft.CodeAnalysis.Text
Imports Microsoft.CodeAnalysis.VisualBasic.Symbols
Imports Microsoft.CodeAnalysis.VisualBasic.Syntax
......@@ -19,6 +14,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
Inherits StateMachineRewriter(Of CapturedSymbolOrExpression)
Private ReadOnly _binder As Binder
Private ReadOnly _lookupOptions As LookupOptions
Private ReadOnly _asyncMethodKind As AsyncMethodKind
Private ReadOnly _builderType As NamedTypeSymbol
Private ReadOnly _resultType As TypeSymbol
......@@ -37,6 +33,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
MyBase.New(body, method, stateMachineType, slotAllocatorOpt, compilationState, diagnostics)
Me._binder = CreateMethodBinder(method)
Me._lookupOptions = LookupOptions.AllMethodsOfAnyArity Or LookupOptions.IgnoreExtensionMethods Or LookupOptions.NoBaseClassLookup
If compilationState.ModuleBuilderOpt.IgnoreAccessibility Then
Me._binder = New IgnoreAccessibilityBinder(Me._binder)
Me._lookupOptions = Me._lookupOptions Or LookupOptions.IgnoreAccessibility
End If
Debug.Assert(asyncKind <> AsyncMethodKind.None)
Debug.Assert(asyncKind = GetAsyncMethodKind(method))
......@@ -498,19 +500,12 @@ lCaptureRValue:
typeArgs As ImmutableArray(Of TypeSymbol),
ParamArray arguments As BoundExpression()) As BoundExpression
Dim anyArgumentsWithErrors = False
' Check if we have any bad arguments.
For Each a In arguments
If a.HasErrors Then
anyArgumentsWithErrors = True
End If
Next
' Get the method group
Dim methodGroup = FindMethodAndReturnMethodGroup(receiver, type, methodName, typeArgs)
If methodGroup Is Nothing OrElse anyArgumentsWithErrors OrElse (receiver IsNot Nothing AndAlso receiver.HasErrors) Then
If methodGroup Is Nothing OrElse
arguments.Any(Function(a) a.HasErrors) OrElse
(receiver IsNot Nothing AndAlso receiver.HasErrors) Then
Return Me.F.BadExpression(arguments)
End If
......@@ -534,9 +529,8 @@ lCaptureRValue:
Dim group As BoundMethodGroup = Nothing
Dim result = LookupResult.GetInstance()
Dim options As LookupOptions = LookupOptions.AllMethodsOfAnyArity Or LookupOptions.IgnoreExtensionMethods Or LookupOptions.NoBaseClassLookup
Dim useSiteDiagnostics As HashSet(Of DiagnosticInfo) = Nothing
Me._binder.LookupMember(result, type, methodName, arity:=0, options:=options, useSiteDiagnostics:=useSiteDiagnostics)
Me._binder.LookupMember(result, type, methodName, arity:=0, options:=_lookupOptions, useSiteDiagnostics:=useSiteDiagnostics)
Me.Diagnostics.Add(Me.F.Syntax, useSiteDiagnostics)
If result.IsGood Then
......@@ -594,9 +588,8 @@ lCaptureRValue:
Dim group As BoundPropertyGroup = Nothing
Dim result = LookupResult.GetInstance()
Dim options As LookupOptions = LookupOptions.AllMethodsOfAnyArity Or LookupOptions.IgnoreExtensionMethods Or LookupOptions.NoBaseClassLookup
Dim useSiteDiagnostics As HashSet(Of DiagnosticInfo) = Nothing
Me._binder.LookupMember(result, type, propertyName, arity:=0, options:=options, useSiteDiagnostics:=useSiteDiagnostics)
Me._binder.LookupMember(result, type, propertyName, arity:=0, options:=_lookupOptions, useSiteDiagnostics:=useSiteDiagnostics)
Me.Diagnostics.Add(Me.F.Syntax, useSiteDiagnostics)
If result.IsGood Then
......
......@@ -24,6 +24,7 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
isBodySynthesized As Boolean) As BoundBlock
Debug.Assert(Not body.HasErrors)
Debug.Assert(compilationState.ModuleBuilderOpt IsNot Nothing)
' performs node-specific lowering.
Dim sawLambdas As Boolean
......@@ -89,6 +90,8 @@ Namespace Microsoft.CodeAnalysis.VisualBasic
slotAllocatorOpt As VariableSlotAllocator,
<Out> ByRef stateMachineTypeOpt As StateMachineTypeSymbol) As BoundBlock
Debug.Assert(compilationState.ModuleBuilderOpt IsNot Nothing)
Dim iteratorStateMachine As IteratorStateMachine = Nothing
Dim bodyWithoutIterators = IteratorRewriter.Rewrite(bodyWithoutLambdas,
method,
......
......@@ -61,6 +61,11 @@ protected override IModuleReference TranslateModule(ModuleSymbol symbol, Diagnos
return base.TranslateModule(symbol, diagnostics);
}
internal override bool IgnoreAccessibility
{
get { return true; }
}
public override int CurrentGenerationOrdinal => 0;
internal override VariableSlotAllocator TryCreateVariableSlotAllocator(MethodSymbol symbol)
......
......@@ -74,7 +74,6 @@
</ItemGroup>
<ItemGroup>
<Compile Include="Binders\EENamedTypeBinder.vb" />
<Compile Include="Binders\IgnoreAccessibilityBinder.vb" />
<Compile Include="Binders\ParametersAndLocalsBinder.vb" />
<Compile Include="Binders\SuppressObsoleteDiagnosticsBinder.vb" />
<Compile Include="CompilationContext.vb" />
......
......@@ -60,6 +60,12 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator
Return MyBase.TranslateModule(symbol, diagnostics)
End Function
Friend Overrides ReadOnly Property IgnoreAccessibility As Boolean
Get
Return True
End Get
End Property
Public Overrides ReadOnly Property CurrentGenerationOrdinal As Integer
Get
Return 0
......
......@@ -4154,7 +4154,7 @@ End Class"
''' Ignore accessibility in async rewriter.
''' </summary>
<WorkItem(1813, "https://github.com/dotnet/roslyn/issues/1813")>
<Fact(Skip:="1813")>
<Fact>
Public Sub AsyncRewriterIgnoreAccessibility()
Const source =
"Imports System
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册