diff --git a/src/Compilers/CSharp/Portable/Symbols/AssemblySymbol.cs b/src/Compilers/CSharp/Portable/Symbols/AssemblySymbol.cs index 8033f9d7fb31bf2b03b3ae8c8e725cf056c7fa7f..b8d32d13938e619b8dbdc5758b07ac9b097ce84b 100644 --- a/src/Compilers/CSharp/Portable/Symbols/AssemblySymbol.cs +++ b/src/Compilers/CSharp/Portable/Symbols/AssemblySymbol.cs @@ -535,22 +535,20 @@ public NamedTypeSymbol GetTypeByMetadataName(string fullyQualifiedMetadataName) bool useCLSCompliantNameArityEncoding = false, DiagnosticBag warnings = null) { - NamedTypeSymbol type = null; + NamedTypeSymbol type; MetadataTypeName mdName; if (metadataName.IndexOf('+') >= 0) { var parts = metadataName.Split(s_nestedTypeNameSeparators); - if (parts.Length > 0) + Debug.Assert(parts.Length > 0); + mdName = MetadataTypeName.FromFullName(parts[0], useCLSCompliantNameArityEncoding); + type = GetTopLevelTypeByMetadataName(ref mdName, assemblyOpt: null, includeReferences: includeReferences, isWellKnownType: isWellKnownType, warnings: warnings); + for (int i = 1; (object)type != null && !type.IsErrorType() && i < parts.Length; i++) { - mdName = MetadataTypeName.FromFullName(parts[0], useCLSCompliantNameArityEncoding); - type = GetTopLevelTypeByMetadataName(ref mdName, assemblyOpt: null, includeReferences: includeReferences, isWellKnownType: isWellKnownType, warnings: warnings); - for (int i = 1; (object)type != null && !type.IsErrorType() && i < parts.Length; i++) - { - mdName = MetadataTypeName.FromTypeName(parts[i]); - NamedTypeSymbol temp = type.LookupMetadataType(ref mdName); - type = (!isWellKnownType || IsValidWellKnownType(temp)) ? temp : null; - } + mdName = MetadataTypeName.FromTypeName(parts[i]); + NamedTypeSymbol temp = type.LookupMetadataType(ref mdName); + type = (!isWellKnownType || IsValidWellKnownType(temp)) ? temp : null; } } else diff --git a/src/Compilers/Core/Portable/MetadataReader/MetadataReaderExtensions.cs b/src/Compilers/Core/Portable/MetadataReader/MetadataReaderExtensions.cs index a2656377d3231ca4652cf45e162e6d4b038733d3..35cca4514ef522aea7af8756bafeb5f55c4f43f2 100644 --- a/src/Compilers/Core/Portable/MetadataReader/MetadataReaderExtensions.cs +++ b/src/Compilers/Core/Portable/MetadataReader/MetadataReaderExtensions.cs @@ -159,15 +159,24 @@ internal static Guid GetModuleVersionIdOrThrow(this MetadataReader reader) } internal static bool DeclaresTheObjectClass(this MetadataReader reader) + { + return reader.DeclaresType(IsTheObjectClass); + } + + private static bool IsTheObjectClass(this MetadataReader reader, TypeDefinition typeDef) + { + return typeDef.BaseType.IsNil && + reader.IsPublicNonInterfaceType(typeDef, "System", "Object"); + } + + internal static bool DeclaresType(this MetadataReader reader, Func predicate) { foreach (TypeDefinitionHandle handle in reader.TypeDefinitions) { try { var typeDef = reader.GetTypeDefinition(handle); - if (typeDef.BaseType.IsNil && - (typeDef.Attributes & (TypeAttributes.Public | TypeAttributes.Interface)) == TypeAttributes.Public && - reader.IsSystemObjectOrThrow(typeDef)) + if (predicate(reader, typeDef)) { return true; } @@ -181,10 +190,11 @@ internal static bool DeclaresTheObjectClass(this MetadataReader reader) } /// An exception from metadata reader. - private static bool IsSystemObjectOrThrow(this MetadataReader reader, TypeDefinition typeDef) + internal static bool IsPublicNonInterfaceType(this MetadataReader reader, TypeDefinition typeDef, string namespaceName, string typeName) { - return reader.StringComparer.Equals(typeDef.Name, "Object") && - reader.StringComparer.Equals(typeDef.Namespace, "System"); + return (typeDef.Attributes & (TypeAttributes.Public | TypeAttributes.Interface)) == TypeAttributes.Public && + reader.StringComparer.Equals(typeDef.Name, typeName) && + reader.StringComparer.Equals(typeDef.Namespace, namespaceName); } } } diff --git a/src/Compilers/VisualBasic/Portable/Symbols/AssemblySymbol.vb b/src/Compilers/VisualBasic/Portable/Symbols/AssemblySymbol.vb index fa2d56e29febdc08e152d76d8d7cf5ca38d06f05..743f558c5797e60e28610432fa02f4278d98ca9c 100644 --- a/src/Compilers/VisualBasic/Portable/Symbols/AssemblySymbol.vb +++ b/src/Compilers/VisualBasic/Portable/Symbols/AssemblySymbol.vb @@ -436,26 +436,24 @@ Namespace Microsoft.CodeAnalysis.VisualBasic.Symbols Throw New ArgumentNullException(NameOf(metadataName)) End If - Dim type As NamedTypeSymbol = Nothing + Dim type As NamedTypeSymbol Dim mdName As MetadataTypeName If metadataName.Contains("+"c) Then Dim parts() As String = metadataName.Split(s_nestedTypeNameSeparators) + Debug.Assert(parts.Length > 0) + mdName = MetadataTypeName.FromFullName(parts(0), useCLSCompliantNameArityEncoding) + type = GetTopLevelTypeByMetadataName(mdName, includeReferences, isWellKnownType) - If parts.Length > 0 Then - mdName = MetadataTypeName.FromFullName(parts(0), useCLSCompliantNameArityEncoding) - type = GetTopLevelTypeByMetadataName(mdName, includeReferences, isWellKnownType) - - Dim i As Integer = 1 + Dim i As Integer = 1 - While type IsNot Nothing AndAlso Not type.IsErrorType() AndAlso i < parts.Length - mdName = MetadataTypeName.FromTypeName(parts(i)) - Dim temp = type.LookupMetadataType(mdName) - type = If(Not isWellKnownType OrElse IsValidWellKnownType(temp), temp, Nothing) - i += 1 - End While - End If + While type IsNot Nothing AndAlso Not type.IsErrorType() AndAlso i < parts.Length + mdName = MetadataTypeName.FromTypeName(parts(i)) + Dim temp = type.LookupMetadataType(mdName) + type = If(Not isWellKnownType OrElse IsValidWellKnownType(temp), temp, Nothing) + i += 1 + End While Else mdName = MetadataTypeName.FromFullName(metadataName, useCLSCompliantNameArityEncoding) type = GetTopLevelTypeByMetadataName(mdName, includeReferences, isWellKnownType) diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/MissingAssemblyTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/MissingAssemblyTests.cs index 1de7fbb60933a2d70c1a653837a014d08a8cfed1..f4068f8959ae20b3cb561b1bd78f4ea51ae7b10f 100644 --- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/MissingAssemblyTests.cs +++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/MissingAssemblyTests.cs @@ -694,6 +694,7 @@ class UseLinq var compileResult = ExpressionCompilerTestHelpers.CompileExpressionWithRetry( runtime.Modules.Select(m => m.MetadataBlock).ToImmutableArray(), "args.Where(a => a.Length > 0)", + ImmutableArray.Empty, (_1, _2) => context, // ignore new blocks and just keep using the same failed context... (AssemblyIdentity assemblyIdentity, out uint uSize) => { diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/ReferencedModulesTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/ReferencedModulesTests.cs index 77ef9bb425d6abdb05fac8ad2b2a6cd341c1ef3f..7c5af2fdb7bbb15e678a2ff94b5efb88bb198d2f 100644 --- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/ReferencedModulesTests.cs +++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/ReferencedModulesTests.cs @@ -388,22 +388,22 @@ static void M() var contextFactory = CreateTypeContextFactory(moduleVersionId, typeToken); // Duplicate type in namespace, at type scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new N.C1()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new N.C1()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.True(errorMessage.StartsWith("error CS0433: The type 'C1' exists in both ")); GetContextState(runtime, "B.M", out blocks, out moduleVersionId, out symReader, out methodToken, out localSignatureToken); contextFactory = CreateMethodContextFactory(moduleVersionId, symReader, methodToken, localSignatureToken); // Duplicate type in namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C1()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C1()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.True(errorMessage.StartsWith("error CS0433: The type 'C1' exists in both ")); // Duplicate type in global namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C2()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C2()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.True(errorMessage.StartsWith("error CS0433: The type 'C2' exists in both ")); // Duplicate extension method, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Equal(errorMessage, "(1,3): error CS0121: The call is ambiguous between the following methods or properties: 'N.E.F(A)' and 'N.E.F(A)'"); // Same tests as above but in library that does not directly reference duplicates. @@ -411,7 +411,7 @@ static void M() contextFactory = CreateTypeContextFactory(moduleVersionId, typeToken); // Duplicate type in namespace, at type scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new N.C1()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new N.C1()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); var methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @@ -427,7 +427,7 @@ .maxstack 1 contextFactory = CreateMethodContextFactory(moduleVersionId, symReader, methodToken, localSignatureToken); // Duplicate type in global namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C2()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "new C2()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @@ -442,7 +442,7 @@ .maxstack 1 Assert.Equal(methodData.Method.ReturnType.ContainingAssembly.ToDisplayString(), identityA.GetDisplayName()); // Duplicate extension method, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); methodData = testData.GetMethodData("<>x.<>m0"); methodData.VerifyIL( @@ -544,7 +544,7 @@ class C // Compile: [DebuggerDisplay("{new B()}")] const string expr = "new B()"; - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, expr, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, expr, ImmutableArray.Empty, contextFactory, getMetaDataBytesPtr: null, errorMessage: out errorMessage, testData: out testData); Assert.Null(errorMessage); Assert.Equal(2, attempts); var methodData = testData.GetMethodData("<>x.<>m0"); @@ -656,6 +656,113 @@ .maxstack 1 } } + /// + /// Intrinsic methods assembly should not be dropped. + /// + [WorkItem(4140)] + [Fact] + public void IntrinsicMethods() + { + var sourceA = +@"public class A { }"; + var sourceB = +@"public class A { } +public class B +{ + static void M(A a) + { + } +}"; + var assemblyNameA = ExpressionCompilerUtilities.GenerateUniqueName(); + var compilationA = CreateCompilationWithMscorlibAndSystemCore(sourceA, options: TestOptions.DebugDll, assemblyName: assemblyNameA); + byte[] exeBytesA; + byte[] pdbBytesA; + ImmutableArray referencesA; + compilationA.EmitAndGetReferences(out exeBytesA, out pdbBytesA, out referencesA); + var referenceA = AssemblyMetadata.CreateFromImage(exeBytesA).GetReference(display: assemblyNameA); + var identityA = referenceA.GetAssemblyIdentity(); + var moduleA = referenceA.ToModuleInstance(exeBytesA, new SymReader(pdbBytesA)); + + var assemblyNameB = ExpressionCompilerUtilities.GenerateUniqueName(); + var compilationB = CreateCompilationWithMscorlibAndSystemCore(sourceB, options: TestOptions.DebugDll, assemblyName: assemblyNameB, references: new[] { referenceA }); + byte[] exeBytesB; + byte[] pdbBytesB; + ImmutableArray referencesB; + compilationB.EmitAndGetReferences(out exeBytesB, out pdbBytesB, out referencesB); + var referenceB = AssemblyMetadata.CreateFromImage(exeBytesB).GetReference(display: assemblyNameB); + var moduleB = referenceB.ToModuleInstance(exeBytesB, new SymReader(pdbBytesB)); + + var moduleBuilder = ArrayBuilder.GetInstance(); + moduleBuilder.AddRange(referencesA.Select(r => r.ToModuleInstance(null, null))); + moduleBuilder.Add(moduleA); + moduleBuilder.Add(moduleB); + moduleBuilder.Add(ExpressionCompilerTestHelpers.IntrinsicAssemblyReference.ToModuleInstance(fullImage: null, symReader: null)); + var modules = moduleBuilder.ToImmutableAndFree(); + + using (var runtime = new RuntimeInstance(modules)) + { + ImmutableArray blocks; + Guid moduleVersionId; + ISymUnmanagedReader symReader; + int methodToken; + int localSignatureToken; + GetContextState(runtime, "B.M", out blocks, out moduleVersionId, out symReader, out methodToken, out localSignatureToken); + var aliases = ImmutableArray.Create( + ExceptionAlias(typeof(ArgumentException)), + ReturnValueAlias(2, typeof(string)), + ObjectIdAlias(1, typeof(object))); + int attempts = 0; + ExpressionCompiler.CreateContextDelegate contextFactory = (b, u) => + { + attempts++; + return EvaluationContext.CreateMethodContext( + ToCompilation(b, u, moduleVersionId), + symReader, + moduleVersionId, + methodToken, + methodVersion: 1, + ilOffset: 0, + localSignatureToken: localSignatureToken); + }; + string errorMessage; + CompilationTestData testData; + ExpressionCompilerTestHelpers.CompileExpressionWithRetry( + blocks, + "(object)new A() ?? $exception ?? $1 ?? $ReturnValue2", + aliases, + contextFactory, + getMetaDataBytesPtr: null, + errorMessage: out errorMessage, + testData: out testData); + Assert.Null(errorMessage); + Assert.Equal(2, attempts); + var methodData = testData.GetMethodData("<>x.<>m0"); + methodData.VerifyIL( +@"{ + // Code size 49 (0x31) + .maxstack 2 + IL_0000: newobj ""A..ctor()"" + IL_0005: dup + IL_0006: brtrue.s IL_0030 + IL_0008: pop + IL_0009: call ""System.Exception Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetException()"" + IL_000e: castclass ""System.ArgumentException"" + IL_0013: dup + IL_0014: brtrue.s IL_0030 + IL_0016: pop + IL_0017: ldstr ""$1"" + IL_001c: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetObjectByAlias(string)"" + IL_0021: dup + IL_0022: brtrue.s IL_0030 + IL_0024: pop + IL_0025: ldc.i4.2 + IL_0026: call ""object Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods.GetReturnValue(int)"" + IL_002b: castclass ""string"" + IL_0030: ret +}"); + } + } + private static ExpressionCompiler.CreateContextDelegate CreateTypeContextFactory( Guid moduleVersionId, int typeToken) diff --git a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/WinMdTests.cs b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/WinMdTests.cs index f9d766bbd20f13c5a084421db65dbb5c2bbff46a..5e4420ccc222b5ad3d79e42db03b653867b82ea0 100644 --- a/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/WinMdTests.cs +++ b/src/ExpressionEvaluator/CSharp/Test/ExpressionCompiler/WinMdTests.cs @@ -347,6 +347,7 @@ static void M(C c) ExpressionCompilerTestHelpers.CompileExpressionWithRetry( runtime.Modules.SelectAsArray(m => m.MetadataBlock), "c.Dispatcher", + ImmutableArray.Empty, (metadataBlocks, _) => { return CreateMethodContext(runtime, "C.M"); diff --git a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompilerConstants.cs b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompilerConstants.cs index 2f443ef35f24077978452d96895a0c8a879d2006..0b3ab1e94694df678f0a19cf93e9dd9c63e0ad4e 100644 --- a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompilerConstants.cs +++ b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/ExpressionCompilerConstants.cs @@ -8,7 +8,9 @@ internal static class ExpressionCompilerConstants { internal const string TypeVariablesLocalName = "<>TypeVariables"; internal const string TypeVariablesClassName = "<>c__TypeVariables"; - internal const string IntrinsicAssemblyTypeMetadataName = "Microsoft.VisualStudio.Debugger.Clr.IntrinsicMethods"; + internal const string IntrinsicAssemblyNamespace = "Microsoft.VisualStudio.Debugger.Clr"; + internal const string IntrinsicAssemblyTypeName = "IntrinsicMethods"; + internal const string IntrinsicAssemblyTypeMetadataName = IntrinsicAssemblyNamespace + "." + IntrinsicAssemblyTypeName; internal const string GetExceptionMethodName = "GetException"; internal const string GetStowedExceptionMethodName = "GetStowedException"; internal const string GetObjectAtAddressMethodName = "GetObjectAtAddress"; diff --git a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/MetadataUtilities.cs b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/MetadataUtilities.cs index 09b2eb86246c0a06e618d87cf3942d8b56ca2b74..4ba953e4b4fbfa758cc76ad8a4fd7368140cdf59 100644 --- a/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/MetadataUtilities.cs +++ b/src/ExpressionEvaluator/Core/Source/ExpressionCompiler/MetadataUtilities.cs @@ -87,6 +87,7 @@ internal static class MetadataUtilities var referencesBuilder = ArrayBuilder.GetInstance(); var identitiesBuilder = (identityComparer == null) ? null : ArrayBuilder.GetInstance(); AssemblyIdentity corLibrary = null; + AssemblyIdentity intrinsicsAssembly = null; foreach (var metadata in metadataBuilder) { @@ -107,6 +108,11 @@ internal static class MetadataUtilities { corLibrary = identity; } + else if ((intrinsicsAssembly == null) && + reader.DeclaresType((r, t) => r.IsPublicNonInterfaceType(t, ExpressionCompilerConstants.IntrinsicAssemblyNamespace, ExpressionCompilerConstants.IntrinsicAssemblyTypeName))) + { + intrinsicsAssembly = identity; + } } var reference = MakeAssemblyMetadata(metadata, modulesByName); referencesBuilder.Add(reference); @@ -131,6 +137,11 @@ internal static class MetadataUtilities { referencedModules.Add(corLibrary); } + // Ensure Debugger intrinsic methods assembly is included. + if (intrinsicsAssembly != null) + { + referencedModules.Add(intrinsicsAssembly); + } RemoveUnreferencedModules(referencesBuilder, identitiesBuilder, identityComparer, referencedModules); referencedModules.Free(); } diff --git a/src/ExpressionEvaluator/Core/Test/ExpressionCompiler/ExpressionCompilerTestHelpers.cs b/src/ExpressionEvaluator/Core/Test/ExpressionCompiler/ExpressionCompilerTestHelpers.cs index 1b5e44b2ff2e369d00f20d7779648f29d79db678..a88f22aee270b6eefc5368a52a5c5d157e816b13 100644 --- a/src/ExpressionEvaluator/Core/Test/ExpressionCompiler/ExpressionCompilerTestHelpers.cs +++ b/src/ExpressionEvaluator/Core/Test/ExpressionCompiler/ExpressionCompilerTestHelpers.cs @@ -253,6 +253,7 @@ internal static class ExpressionCompilerTestHelpers internal static CompileResult CompileExpressionWithRetry( ImmutableArray metadataBlocks, string expr, + ImmutableArray aliases, ExpressionCompiler.CreateContextDelegate createContext, DkmUtilities.GetMetadataBytesPtrFunction getMetaDataBytesPtr, out string errorMessage, @@ -269,7 +270,7 @@ internal static class ExpressionCompilerTestHelpers var compileResult = context.CompileExpression( expr, DkmEvaluationFlags.TreatAsExpression, - ImmutableArray.Empty, + aliases, diagnostics, out resultProperties, td); diff --git a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/MissingAssemblyTests.vb b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/MissingAssemblyTests.vb index e8e02ca78cdc8849e84af4904ea779f2b11616b5..21b802fb962f452b94c5eb453ce1bd628d7b875a 100644 --- a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/MissingAssemblyTests.vb +++ b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/MissingAssemblyTests.vb @@ -545,6 +545,7 @@ End Class" Dim compileResult = ExpressionCompilerTestHelpers.CompileExpressionWithRetry( runtime.Modules.Select(Function(m) m.MetadataBlock).ToImmutableArray(), "args.Where(Function(a) a.Length > 0)", + ImmutableArray(Of [Alias]).Empty, Function(_1, _2) context, ' ignore new blocks and just keep using the same failed context... Function(assemblyIdentity As AssemblyIdentity, ByRef uSize As UInteger) retryCount += 1 diff --git a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ReferencedModulesTests.vb b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ReferencedModulesTests.vb index a460a2e51153275d888bc12e8a8691c0cc4d8268..b7f01c3cea3f1a449fd9bfb1239d99f603a96a39 100644 --- a/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ReferencedModulesTests.vb +++ b/src/ExpressionEvaluator/VisualBasic/Test/ExpressionCompiler/ReferencedModulesTests.vb @@ -230,22 +230,22 @@ End Class" ' Duplicate type in namespace, at type scope. Dim testData As CompilationTestData = Nothing Dim errorMessage As String = Nothing - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New N.C1()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New N.C1()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Equal(errorMessage, "(1,6): error BC30560: 'C1' is ambiguous in the namespace 'N'.") GetContextState(runtime, "B.Main", blocks, moduleVersionId, symReader, methodToken, localSignatureToken) contextFactory = CreateMethodContextFactory(moduleVersionId, symReader, methodToken, localSignatureToken) ' Duplicate type in namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C1()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C1()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Equal(errorMessage, "(1,6): error BC30560: 'C1' is ambiguous in the namespace 'N'.") ' Duplicate type in global namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C2()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C2()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Equal(errorMessage, "(1,6): error BC30554: 'C2' is ambiguous.") ' Duplicate extension method, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.True(errorMessage.StartsWith("(1,4): error BC30521: Overload resolution failed because no accessible 'F' is most specific for these arguments:")) ' Same tests as above but in library that does not directly reference duplicates. @@ -253,7 +253,7 @@ End Class" contextFactory = CreateTypeContextFactory(moduleVersionId, typeToken) ' Duplicate type in namespace, at type scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New N.C1()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New N.C1()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Null(errorMessage) Dim methodData = testData.GetMethodData("<>x.<>m0") methodData.VerifyIL( @@ -269,7 +269,7 @@ End Class" contextFactory = CreateMethodContextFactory(moduleVersionId, symReader, methodToken, localSignatureToken) ' Duplicate type in global namespace, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C2()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "New C2()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Null(errorMessage) methodData = testData.GetMethodData("<>x.<>m0") methodData.VerifyIL( @@ -284,7 +284,7 @@ End Class" Assert.Equal(methodData.Method.ReturnType.ContainingAssembly.ToDisplayString(), identityA.GetDisplayName()) ' Duplicate extension method, at method scope. - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "x.F()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Null(errorMessage) methodData = testData.GetMethodData("<>x.<>m0") methodData.VerifyIL( @@ -374,7 +374,7 @@ End Class" Dim testData As New CompilationTestData() Dim contextFactory = CreateMethodContextFactory(moduleVersionId, symReader, methodToken, localSignatureToken) - ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "F()", contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) + ExpressionCompilerTestHelpers.CompileExpressionWithRetry(blocks, "F()", ImmutableArray(Of [Alias]).Empty, contextFactory, getMetaDataBytesPtr:=Nothing, errorMessage:=errorMessage, testData:=testData) Assert.Null(errorMessage) testData.GetMethodData("<>x.<>m0").VerifyIL( "{