public void TestFunctionPointerSignatures() { var ilModule = _context.GetModuleForSimpleName("ILMetadataAssembly"); Cts.MetadataType typeWithFunctionPointers = ilModule.GetType("SampleMetadata", "TypeWithFunctionPointers"); var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, ilModule }); var typeWithFunctionPointersType = transformResult.GetTransformedTypeDefinition(typeWithFunctionPointers); var objectType = transformResult.GetTransformedTypeDefinition((Cts.MetadataType)_context.GetWellKnownType(Cts.WellKnownType.Object)); Assert.Equal(1, typeWithFunctionPointersType.Fields.Count); var theField = typeWithFunctionPointersType.Fields[0]; Assert.IsType <TypeSpecification>(theField.Signature.Type); var theFieldSignature = (TypeSpecification)theField.Signature.Type; Assert.IsType <FunctionPointerSignature>(theFieldSignature.Signature); var theFieldPointerSignature = (FunctionPointerSignature)theFieldSignature.Signature; Assert.Equal(objectType, theFieldPointerSignature.Signature.ReturnType); Assert.Equal(1, theFieldPointerSignature.Signature.Parameters.Count); Assert.Equal(objectType, theFieldPointerSignature.Signature.Parameters[0]); }
public void TestExplicitScopeAttributesForWinRTSingleFilePolicy() { // Test that custom attributes referring to blocked types don't show up in metadata var sampleMetadataModule = _context.GetModuleForSimpleName("SampleMetadataAssembly"); var sampleWinRTMetadataModule = _context.GetModuleForSimpleName("SampleWinRTMetadataAssembly"); var windowsWinRTMetadataModule = _context.GetModuleForSimpleName("WindowsWinRTMetadataAssembly"); Cts.MetadataType controlType = windowsWinRTMetadataModule.GetType("Windows", "Control"); Cts.MetadataType derivedFromControl = sampleWinRTMetadataModule.GetType("SampleMetadataWinRT", "DerivedFromControl"); Cts.MetadataType derivedFromControlInCustomScope = sampleWinRTMetadataModule.GetType("SampleMetadataWinRT", "DerivedFromControlAndInCustomScope"); var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, sampleMetadataModule, sampleWinRTMetadataModule, windowsWinRTMetadataModule }); var controlTypeMetadata = transformResult.GetTransformedTypeDefinition(controlType); var derivedFromControlMetadata = transformResult.GetTransformedTypeDefinition(derivedFromControl); var derivedFromControlInCustomScopeMetadata = transformResult.GetTransformedTypeDefinition(derivedFromControlInCustomScope); CheckTypeDefinitionForProperWinRTHome(controlTypeMetadata, "Windows"); ScopeDefinition scopeDefOfDerivedFromControlType = GetScopeDefinitionOfType(derivedFromControlMetadata); Assert.Equal("SampleWinRTMetadataAssembly", scopeDefOfDerivedFromControlType.Name.Value); CheckTypeDefinitionForProperWinRTHome(derivedFromControlInCustomScopeMetadata, "SampleMetadataWinRT"); }
public void TestAllTypes() { var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule }); Assert.Equal(1, transformResult.Scopes.Count()); Assert.Equal( _systemModule.GetAllTypes().Count(x => !policy.IsBlocked(x)), transformResult.Scopes.Single().GetAllTypes().Count()); }
public void TestSampleMetadataGeneration() { var policy = new SingleFileMetadataPolicy(); var sampleMetadataModule = _context.GetModuleForSimpleName("SampleMetadataAssembly"); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, sampleMetadataModule }); Assert.Equal(2, transformResult.Scopes.Count); var systemScope = transformResult.Scopes.Single(s => s.Name.Value == "PrimaryMetadataAssembly"); var sampleScope = transformResult.Scopes.Single(s => s.Name.Value == "SampleMetadataAssembly"); Assert.Equal(_systemModule.GetAllTypes().Count(t => !policy.IsBlocked(t)), systemScope.GetAllTypes().Count()); Assert.Equal(sampleMetadataModule.GetAllTypes().Count(t => !policy.IsBlocked(t)), sampleScope.GetAllTypes().Count()); // TODO: check individual types }
public void TestMethodImplMetadata() { // Test that custom attributes referring to blocked types don't show up in metadata var sampleMetadataModule = _context.GetModuleForSimpleName("SampleMetadataAssembly"); Cts.MetadataType iCloneable = sampleMetadataModule.GetType("SampleMetadataMethodImpl", "ICloneable"); Cts.MetadataType implementsICloneable = sampleMetadataModule.GetType("SampleMetadataMethodImpl", "ImplementsICloneable"); Cts.MethodDesc iCloneableDotClone = iCloneable.GetMethod("Clone", null); Cts.MethodDesc iCloneableImplementation = implementsICloneable.GetMethod("SampleMetadataMethodImpl.ICloneable.Clone", null); Cts.MethodDesc iCloneableDotGenericClone = iCloneable.GetMethod("GenericClone", null); Cts.MethodDesc iCloneableGenericImplementation = implementsICloneable.GetMethod("SampleMetadataMethodImpl.ICloneable.GenericClone", null); var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, sampleMetadataModule }); var iCloneableType = transformResult.GetTransformedTypeDefinition(iCloneable); var implementsICloneableType = transformResult.GetTransformedTypeDefinition(implementsICloneable); Assert.Equal(2, implementsICloneableType.MethodImpls.Count); // non-generic MethodImpl Method iCloneableDotCloneMethod = transformResult.GetTransformedMethodDefinition(iCloneableDotClone); Method iCloneableImplementationMethod = transformResult.GetTransformedMethodDefinition(iCloneableImplementation); QualifiedMethod methodImplMethodDecl = (QualifiedMethod)implementsICloneableType.MethodImpls[0].MethodDeclaration; QualifiedMethod methodImplMethodBody = (QualifiedMethod)implementsICloneableType.MethodImpls[0].MethodBody; Assert.Equal(iCloneableDotCloneMethod, methodImplMethodDecl.Method); Assert.Equal(iCloneableType, methodImplMethodDecl.EnclosingType); Assert.Equal(iCloneableImplementationMethod, methodImplMethodBody.Method); Assert.Equal(implementsICloneableType, methodImplMethodBody.EnclosingType); // generic MethodImpl Method iCloneableDotGenericCloneMethod = transformResult.GetTransformedMethodDefinition(iCloneableDotGenericClone); Method iCloneableGenericImplementationMethod = transformResult.GetTransformedMethodDefinition(iCloneableGenericImplementation); QualifiedMethod methodImplGenericMethodDecl = (QualifiedMethod)implementsICloneableType.MethodImpls[1].MethodDeclaration; QualifiedMethod methodImplGenericMethodBody = (QualifiedMethod)implementsICloneableType.MethodImpls[1].MethodBody; Assert.Equal(iCloneableDotGenericCloneMethod, methodImplGenericMethodDecl.Method); Assert.Equal(iCloneableType, methodImplGenericMethodDecl.EnclosingType); Assert.Equal(iCloneableGenericImplementationMethod, methodImplGenericMethodBody.Method); Assert.Equal(implementsICloneableType, methodImplGenericMethodBody.EnclosingType); }
public void TestBlockedInterface() { // __ComObject implements ICastable, which is a metadata blocked type and should not show // up in the __ComObject interface list. var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule }); Cts.MetadataType icastable = _systemModule.GetType("System.Private.CompilerServices", "ICastable"); Cts.MetadataType comObject = _systemModule.GetType("System", "__ComObject"); Assert.Equal(1, comObject.ExplicitlyImplementedInterfaces.Length); Assert.Equal(icastable, comObject.ExplicitlyImplementedInterfaces[0]); Assert.Null(transformResult.GetTransformedTypeDefinition(icastable)); Assert.Null(transformResult.GetTransformedTypeReference(icastable)); TypeDefinition comObjectRecord = transformResult.GetTransformedTypeDefinition(comObject); Assert.NotNull(comObjectRecord); Assert.Equal(comObject.Name, comObjectRecord.Name.Value); Assert.Equal(0, comObjectRecord.Interfaces.Count); }
public void TestBlockedInterface() { // BlockedObject implements IBlockedInterface, which is a metadata blocked type and should not show // up in the BlockedObject interface list. var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule }); Cts.MetadataType iblockedinterface = _systemModule.GetType("System.Private.CompilerServices", "IBlockedInterface"); Cts.MetadataType comObject = _systemModule.GetType("System", "BlockedObject"); Assert.Equal(1, comObject.ExplicitlyImplementedInterfaces.Length); Assert.Equal(iblockedinterface, comObject.ExplicitlyImplementedInterfaces[0]); Assert.Null(transformResult.GetTransformedTypeDefinition(iblockedinterface)); Assert.Null(transformResult.GetTransformedTypeReference(iblockedinterface)); TypeDefinition comObjectRecord = transformResult.GetTransformedTypeDefinition(comObject); Assert.NotNull(comObjectRecord); Assert.Equal(comObject.Name, comObjectRecord.Name.Value); Assert.Equal(0, comObjectRecord.Interfaces.Count); }
public void TestBlockedInterface() { var policy = new SingleFileMetadataPolicy(); var transform = new ILCompiler.Metadata.Transform<SingleFileMetadataPolicy>(policy); int count = 0; foreach (Cts.MetadataType type in _systemModule.GetAllTypes()) { if (!policy.IsBlocked(type)) { transform.HandleType(type); count++; } } Assert.Equal(1, transform.Scopes.Count()); var transformedTypes = transform.Scopes.Single().GetAllTypes().ToList(); Assert.Equal(count, transformedTypes.Count); Assert.Equal(1, _systemModule.GetAllTypes().Cast<Cts.MetadataType>().Single(t => t.Name == "__ComObject").ExplicitlyImplementedInterfaces.Length); Assert.Equal(0, transformedTypes.Single(t => t.Name.Value == "__ComObject").Interfaces.Count); }
public void TestBlockedAttributes() { // Test that custom attributes referring to blocked types don't show up in metadata var sampleMetadataModule = _context.GetModuleForSimpleName("SampleMetadataAssembly"); Cts.MetadataType attributeHolder = sampleMetadataModule.GetType("BlockedMetadata", "AttributeHolder"); var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, sampleMetadataModule }); int blockedCount = 0; int allowedCount = 0; foreach (var field in attributeHolder.GetFields()) { var transformedRecord = transformResult.GetTransformedFieldDefinition(field); Assert.NotNull(transformedRecord); if (field.Name.StartsWith("Blocked")) { blockedCount++; Assert.Equal(0, transformedRecord.CustomAttributes.Count); } else { allowedCount++; Assert.StartsWith("Allowed", field.Name); Assert.Equal(1, transformedRecord.CustomAttributes.Count); } } Assert.Equal(5, allowedCount); Assert.Equal(8, blockedCount); }
public void TestBlockedInterface() { var policy = new SingleFileMetadataPolicy(); var transform = new ILCompiler.Metadata.Transform <SingleFileMetadataPolicy>(policy); int count = 0; foreach (Cts.MetadataType type in _systemModule.GetAllTypes()) { if (!policy.IsBlocked(type)) { transform.HandleType(type); count++; } } Assert.Equal(1, transform.Scopes.Count()); var transformedTypes = transform.Scopes.Single().GetAllTypes().ToList(); Assert.Equal(count, transformedTypes.Count); Assert.Equal(1, _systemModule.GetAllTypes().Cast <Cts.MetadataType>().Single(t => t.Name == "__ComObject").ExplicitlyImplementedInterfaces.Length); Assert.Equal(0, transformedTypes.Single(t => t.Name.Value == "__ComObject").Interfaces.Count); }
public void TestFunctionPointerSignatures() { var ilModule = _context.GetModuleForSimpleName("ILMetadataAssembly"); Cts.MetadataType typeWithFunctionPointers = ilModule.GetType("SampleMetadata", "TypeWithFunctionPointers"); var policy = new SingleFileMetadataPolicy(); var transformResult = MetadataTransform.Run(policy, new[] { _systemModule, ilModule }); var typeWithFunctionPointersType = transformResult.GetTransformedTypeDefinition(typeWithFunctionPointers); var objectType = transformResult.GetTransformedTypeDefinition((Cts.MetadataType)_context.GetWellKnownType(Cts.WellKnownType.Object)); Assert.Equal(1, typeWithFunctionPointersType.Fields.Count); var theField = typeWithFunctionPointersType.Fields[0]; Assert.IsType<TypeSpecification>(theField.Signature.Type); var theFieldSignature = (TypeSpecification)theField.Signature.Type; Assert.IsType<FunctionPointerSignature>(theFieldSignature.Signature); var theFieldPointerSignature = (FunctionPointerSignature)theFieldSignature.Signature; Assert.Equal(objectType, theFieldPointerSignature.Signature.ReturnType); Assert.Equal(1, theFieldPointerSignature.Signature.Parameters.Count); Assert.Equal(objectType, theFieldPointerSignature.Signature.Parameters[0]); }