/
githubmirror
/
roslyn
Обзор
Документация
Войти
/
githubmirror
/
roslyn
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/AccessibilityTests.vb
228 строк
7 KB
Jonathon Marolf
update headers
23 янв 2020, 04:01
Не верифицирован
23 янв 2020, 04:01
91571a3
Код
Авторство
О чём код?
' 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. Imports System.Collections.Immutable Imports Microsoft.CodeAnalysis.CodeGen Imports Microsoft.CodeAnalysis.ExpressionEvaluator Imports Microsoft.CodeAnalysis.ExpressionEvaluator.UnitTests Imports Microsoft.CodeAnalysis.VisualBasic.UnitTests Imports Microsoft.VisualStudio.Debugger.Evaluation Imports Roslyn.Test.Utilities Imports Xunit Namespace Microsoft.CodeAnalysis.VisualBasic.ExpressionEvaluator.UnitTests Public Class AccessibilityTests Inherits ExpressionCompilerTestBase ''' <summary> ''' Do not allow calling accessors directly. ''' (This Is consistent with the native EE.) ''' </summary> <Fact> Public Sub NotReferencable() Const source = " Class C ReadOnly Property P As Object Get Return Nothing End Get End Property Sub M() End Sub End Class " Dim comp = CreateCompilationWithMscorlib40({source}, options:=TestOptions.DebugDll) WithRuntimeInstance(comp, Sub(runtime) Dim context = CreateMethodContext(runtime, "C.M") Dim resultProperties As ResultProperties = Nothing Dim errorMessage As String = Nothing Dim missingAssemblyIdentities As ImmutableArray(Of AssemblyIdentity) = Nothing context.CompileExpression( "Me.get_P()", DkmEvaluationFlags.TreatAsExpression, NoAliases, DebuggerDiagnosticFormatter.Instance, resultProperties, errorMessage, missingAssemblyIdentities, EnsureEnglishUICulture.PreferredOrNull, testData:=Nothing) Assert.Equal("error BC30456: 'get_P' is not a member of 'C'.", errorMessage) End Sub) End Sub <Fact> Public Sub ParametersAndReturnType_PrivateType() Const source = " Class A Private Structure S End Structure End Class Class B Shared Function F(Of T)(t1 As T) As T Return t1 End Function Shared Sub M() End Sub End Class " Dim testData = Evaluate( source, OutputKind.DynamicallyLinkedLibrary, methodName:="B.M", expr:="F(New A.S())") testData.GetMethodData("<>x.<>m0").VerifyIL(" { // Code size 15 (0xf) .maxstack 1 .locals init (A.S V_0) IL_0000: ldloca.s V_0 IL_0002: initobj ""A.S"" IL_0008: ldloc.0 IL_0009: call ""Function B.F(Of A.S)(A.S) As A.S"" IL_000e: ret } ") End Sub <Fact> Public Sub ParametersAndReturnType_DifferentCompilation() Const source = " Class A Private Structure S End Structure End Class Class B Shared Function F(Of T)(t1 As T) As T Return t1 End Function Shared Sub M() End Sub End Class " Dim testData = Evaluate( source, OutputKind.DynamicallyLinkedLibrary, methodName:="B.M", expr:="F(New With { .P = 1 })") testData.GetMethodData("<>x.<>m0").VerifyIL(" { // Code size 12 (0xc) .maxstack 1 IL_0000: ldc.i4.1 IL_0001: newobj ""Sub VB$AnonymousType_0(Of Integer)..ctor(Integer)"" IL_0006: call ""Function B.F(Of <anonymous type: P As Integer>)(<anonymous type: P As Integer>) As <anonymous type: P As Integer>"" IL_000b: ret } ") End Sub ''' <summary> ''' As during regular compilation, we emit calls to the most-derived method. ''' (In contrast, regular C# compilation emits calls to the least-derived method.) ''' </summary> <Fact> Public Sub ProtectedAndFriendVirtualCalls() Const source = " Friend Class A Protected Overridable Function M(o As Integer) As Integer Return o End Function Friend Overridable ReadOnly Property P As Integer Get Return 0 End Get End Property End Class Friend Class B Inherits A Protected Overrides Function M(o As Integer) As Integer Return o End Function End Class Friend Class C Inherits B Friend Overrides ReadOnly Property P As Integer Get Return 0 End Get End Property Public Function Test() As Integer Return Me.M(Me.P) End Function End Class " Dim comp = CreateCompilationWithMscorlib40({source}, options:=TestOptions.DebugDll) WithRuntimeInstance(comp, Sub(runtime) Dim context = CreateMethodContext(runtime, "C.Test") Dim errorMessage As String = Nothing Dim testData = New CompilationTestData() context.CompileExpression("Me.M(Me.P)", errorMessage, testData) testData.GetMethodData("<>x.<>m0").VerifyIL( "{ // Code size 13 (0xd) .maxstack 2 .locals init (Integer V_0) //Test IL_0000: ldarg.0 IL_0001: ldarg.0 IL_0002: callvirt ""Function C.get_P() As Integer"" IL_0007: callvirt ""Function B.M(Integer) As Integer"" IL_000c: ret }") End Sub) End Sub <Fact> Public Sub InferredTypeArguments_DifferentCompilation() Const source = " Class C Shared Function F(Of T, U)(t1 As T, u1 As U) As Object Return t1 End Function Shared x As Object = New With { .A = 1 } Shared Sub M() End Sub End Class " Dim testData = Evaluate( source, OutputKind.DynamicallyLinkedLibrary, methodName:="C.M", expr:="F(New With { .A = 2 }, New With { .B = 3 })") ' New and existing types testData.GetMethodData("<>x.<>m0").VerifyIL(" { // Code size 18 (0x12) .maxstack 2 IL_0000: ldc.i4.2 IL_0001: newobj ""Sub VB$AnonymousType_0(Of Integer)..ctor(Integer)"" IL_0006: ldc.i4.3 IL_0007: newobj ""Sub VB$AnonymousType_1(Of Integer)..ctor(Integer)"" IL_000c: call ""Function C.F(Of <anonymous type: A As Integer>, <anonymous type: B As Integer>)(<anonymous type: A As Integer>, <anonymous type: B As Integer>) As Object"" IL_0011: ret } ") End Sub End Class End Namespace