Ejemplo n.º 1
0
        public void RetargetMissingBaseType_Interface()
        {
            var source = @"
public interface Test : short { }
";

            var comp = CreateEmptyCompilation(source);

            comp.VerifyDiagnostics(
                // (2,25): error CS0518: Predefined type 'System.Int16' is not defined or imported
                // public interface Test : short { }
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "short").WithArguments("System.Int16"),
                // (2,18): error CS0518: Predefined type 'System.Int16' is not defined or imported
                // public interface Test : short { }
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "Test").WithArguments("System.Int16"));

            var sourceAssembly = (SourceAssemblySymbol)comp.Assembly;
            var sourceType     = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(TypeKind.Error, sourceType.Interfaces().Single().TypeKind);
            Assert.Equal(SpecialType.System_Int16, sourceType.Interfaces().Single().SpecialType);
            Assert.Null(sourceType.BaseType());

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);
            var retargetingType     = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(TypeKind.Error, retargetingType.Interfaces().Single().TypeKind);
            Assert.Equal(SpecialType.System_Int16, retargetingType.Interfaces().Single().SpecialType);
            Assert.Null(retargetingType.BaseType());
        }
Ejemplo n.º 2
0
        public void RetargetInvalidConstraint()
        {
            var source = @"
public class C<T> where T : int
{
}
";

            var comp = CreateCompilation(source);

            comp.VerifyDiagnostics(
                // (2,29): error CS0701: 'int' is not a valid constraint. A type used as a constraint must be an interface, a non-sealed class or a type parameter.
                // public class C<T> where T : int
                Diagnostic(ErrorCode.ERR_BadBoundType, "int").WithArguments("int"));

            var sourceAssembly      = (SourceAssemblySymbol)comp.Assembly;
            var sourceType          = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("C");
            var sourceTypeParameter = sourceType.TypeParameters.Single();

            Assert.Equal(0, sourceTypeParameter.ConstraintTypes().Length);

            var retargetingAssembly      = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);
            var retargetingType          = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("C");
            var retargetingTypeParameter = retargetingType.TypeParameters.Single();

            Assert.Equal(0, retargetingTypeParameter.ConstraintTypes().Length);
        }
Ejemplo n.º 3
0
        public void RetargetGenericConstraints()
        {
            var source =
                @"interface I<T> { }
class C<T> where T : I<T>, new() { }
struct S<T> where T : struct
{
    void M<U, V>()
        where U : class, I<V>
    {
    }
}
delegate T D<T>() where T : I<T>;";

            var compilation = CreateCompilation(source);

            var sourceModule    = compilation.SourceModule;
            var sourceAssembly  = (SourceAssemblySymbol)sourceModule.ContainingAssembly;
            var sourceNamespace = sourceModule.GlobalNamespace;

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);
            var retargetingModule    = retargetingAssembly.Modules[0];
            var retargetingNamespace = retargetingModule.GlobalNamespace;

            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("I"), retargetingNamespace.GetMember <NamedTypeSymbol>("I"));
            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("C"), retargetingNamespace.GetMember <NamedTypeSymbol>("C"));
            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("S"), retargetingNamespace.GetMember <NamedTypeSymbol>("S"));
            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("D"), retargetingNamespace.GetMember <NamedTypeSymbol>("D"));
        }
Ejemplo n.º 4
0
        public void RetargetInvalidBaseType_Interface()
        {
            var source = @"
public interface Test : short { }
";

            var comp = CreateCompilation(source);

            comp.VerifyDiagnostics(
                // (2,25): error CS0527: Type 'short' in interface list is not an interface
                // public interface Test : short { }
                Diagnostic(ErrorCode.ERR_NonInterfaceInInterfaceList, "short").WithArguments("short"));

            var sourceAssembly = (SourceAssemblySymbol)comp.Assembly;
            var sourceType     = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(0, sourceType.Interfaces().Length);
            Assert.Null(sourceType.BaseType());

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);
            var retargetingType     = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(0, retargetingType.Interfaces().Length);
            Assert.Null(retargetingType.BaseType());
        }
Ejemplo n.º 5
0
        public void RetargetInvalidBaseType_Class()
        {
            var source = @"
public class Test : short { }
";

            var comp = CreateCompilation(source);

            comp.VerifyDiagnostics(
                // (2,21): error CS0509: 'Test': cannot derive from sealed type 'short'
                // public class Test : short { }
                Diagnostic(ErrorCode.ERR_CantDeriveFromSealedType, "short").WithArguments("Test", "short"));

            var sourceAssembly = (SourceAssemblySymbol)comp.Assembly;
            var sourceType     = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(0, sourceType.Interfaces().Length);
            Assert.Equal(SpecialType.System_Object, sourceType.BaseType().SpecialType);

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);
            var retargetingType     = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.Equal(0, retargetingType.Interfaces().Length);
            Assert.Equal(SpecialType.System_Object, retargetingType.BaseType().SpecialType);
        }
Ejemplo n.º 6
0
        public void RetargetFields()
        {
            var source      = @"
using System.Runtime.InteropServices;

class D
{
}

class C
{
    internal D F1;

    [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_DISPATCH, SafeArrayUserDefinedSubType = typeof(D))]
    internal int F2;
}";
            var compilation = CreateCompilation(source);

            var sourceModule    = compilation.SourceModule;
            var sourceAssembly  = (SourceAssemblySymbol)sourceModule.ContainingAssembly;
            var sourceNamespace = sourceModule.GlobalNamespace;

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);
            var retargetingModule    = retargetingAssembly.Modules[0];
            var retargetingNamespace = retargetingModule.GlobalNamespace;

            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("C"), retargetingNamespace.GetMember <NamedTypeSymbol>("C"));

            Assert.IsType <RetargetingNamedTypeSymbol>(
                retargetingNamespace.GetMember <NamedTypeSymbol>("C").GetMember <RetargetingFieldSymbol>("F2").MarshallingInformation.TryGetSafeArrayElementUserDefinedSubtype());
        }
Ejemplo n.º 7
0
 internal PEModuleSymbol(
     RetargetingAssemblySymbol assemblySymbol,
     PEModule module,
     MetadataImportOptions importOptions,
     int ordinal
     ) : this((AssemblySymbol)assemblySymbol, module, importOptions, ordinal)
 {
     Debug.Assert(ordinal > 0);
 }
Ejemplo n.º 8
0
        public void RetargetingUnmanagedTypeParameters(string code, bool isUnmanaged)
        {
            var compilation    = CreateCompilation(code).VerifyDiagnostics();
            var sourceAssembly = (SourceAssemblySymbol)compilation.Assembly;

            SourceTypeParameterSymbol sourceTypeParameter = (SourceTypeParameterSymbol)sourceAssembly.GlobalNamespace.GetTypeMember("Test").TypeParameters.Single();

            Assert.Equal(isUnmanaged, sourceTypeParameter.HasUnmanagedTypeConstraint);

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);

            RetargetingTypeParameterSymbol retargetingTypeParameter = (RetargetingTypeParameterSymbol)retargetingAssembly.GlobalNamespace.GetTypeMember("Test").TypeParameters.Single();

            Assert.Equal(isUnmanaged, retargetingTypeParameter.HasUnmanagedTypeConstraint);
        }
Ejemplo n.º 9
0
        public void RetargetMissingConstraint()
        {
            var source = @"
public class C<T> where T : int
{
}
";

            var comp = CreateEmptyCompilation(source);

            comp.VerifyDiagnostics(
                // (2,14): error CS0518: Predefined type 'System.Object' is not defined or imported
                // public class C<T> where T : int
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "C").WithArguments("System.Object"),
                // (2,29): error CS0518: Predefined type 'System.Int32' is not defined or imported
                // public class C<T> where T : int
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "int").WithArguments("System.Int32"),
                // (2,16): error CS0518: Predefined type 'System.Int32' is not defined or imported
                // public class C<T> where T : int
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "T").WithArguments("System.Int32"),
                // (2,14): error CS1729: 'object' does not contain a constructor that takes 0 arguments
                // public class C<T> where T : int
                Diagnostic(ErrorCode.ERR_BadCtorArgCount, "C").WithArguments("object", "0"));

            var sourceAssembly                = (SourceAssemblySymbol)comp.Assembly;
            var sourceType                    = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("C");
            var sourceTypeParameter           = sourceType.TypeParameters.Single();
            var sourceTypeParameterConstraint = sourceTypeParameter.ConstraintTypes().Single();

            Assert.Equal(TypeKind.Error, sourceTypeParameterConstraint.TypeKind);
            Assert.Equal(SpecialType.System_Int32, sourceTypeParameterConstraint.SpecialType);

            var retargetingAssembly                = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);
            var retargetingType                    = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("C");
            var retargetingTypeParameter           = retargetingType.TypeParameters.Single();
            var retargetingTypeParameterConstraint = retargetingTypeParameter.ConstraintTypes().Single();

            Assert.Equal(TypeKind.Error, retargetingTypeParameterConstraint.TypeKind);
            Assert.Equal(SpecialType.System_Int32, retargetingTypeParameterConstraint.SpecialType);
        }
Ejemplo n.º 10
0
        public void RetargetMissingEnumUnderlyingType_Explicit()
        {
            var source = @"
public enum E : short
{
}
";

            var comp = CreateEmptyCompilation(source);

            comp.VerifyDiagnostics(
                // (2,13): error CS0518: Predefined type 'System.Enum' is not defined or imported
                // public enum E : short
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "E").WithArguments("System.Enum"),
                // (2,17): error CS0518: Predefined type 'System.Int16' is not defined or imported
                // public enum E : short
                Diagnostic(ErrorCode.ERR_PredefinedTypeNotFound, "short").WithArguments("System.Int16"));

            var sourceAssembly = (SourceAssemblySymbol)comp.Assembly;
            var sourceType     = sourceAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("E");

            Assert.Equal(0, sourceType.Interfaces().Length); // Always returns an empty list for enums.
            Assert.Equal(TypeKind.Error, sourceType.BaseType().TypeKind);
            Assert.Equal(SpecialType.System_Enum, sourceType.BaseType().SpecialType);
            Assert.Equal(TypeKind.Error, sourceType.EnumUnderlyingType.TypeKind);
            Assert.Equal(SpecialType.System_Int16, sourceType.EnumUnderlyingType.SpecialType);

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(MissingCorLibrarySymbol.Instance); // Need to do this explicitly since our retargeting assembly wasn't constructed using the real mechanism.
            var retargetingType = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("E");

            Assert.Equal(0, retargetingType.Interfaces().Length);
            Assert.Equal(TypeKind.Error, retargetingType.BaseType().TypeKind);
            Assert.Equal(SpecialType.System_Enum, retargetingType.BaseType().SpecialType);
            Assert.Equal(TypeKind.Error, retargetingType.EnumUnderlyingType.TypeKind);
            Assert.Equal(SpecialType.System_Int16, retargetingType.EnumUnderlyingType.SpecialType);
        }
Ejemplo n.º 11
0
        public void Retarget_IsSerializable()
        {
            var source = @"
public class Test { }
[System.Serializable]
public class TestS { }
";

            var comp = CreateCompilation(source);

            comp.VerifyDiagnostics();

            var retargetingAssembly = new RetargetingAssemblySymbol((SourceAssemblySymbol)comp.Assembly, isLinked: false);
            var retargetingType     = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("Test");

            Assert.IsType <RetargetingNamedTypeSymbol>(retargetingType);
            Assert.False(((INamedTypeSymbol)retargetingType).IsSerializable);

            var retargetingTypeS = retargetingAssembly.GlobalNamespace.GetMember <NamedTypeSymbol>("TestS");

            Assert.IsType <RetargetingNamedTypeSymbol>(retargetingTypeS);
            Assert.True(((INamedTypeSymbol)retargetingTypeS).IsSerializable);
        }
Ejemplo n.º 12
0
        public void RetargetMethods()
        {
            var source      = @"
using System.Runtime.InteropServices;

class C
{
    [return: MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_DISPATCH, SafeArrayUserDefinedSubType = typeof(C))]
    internal int M(
        [MarshalAs(UnmanagedType.SafeArray, SafeArraySubType = VarEnum.VT_DISPATCH, SafeArrayUserDefinedSubType = typeof(C))]
        int arg
    ) 
    {
        return 1;
    }
}";
            var compilation = CreateCompilationWithMscorlib(source);

            var sourceModule    = compilation.SourceModule;
            var sourceAssembly  = (SourceAssemblySymbol)sourceModule.ContainingAssembly;
            var sourceNamespace = sourceModule.GlobalNamespace;

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);
            var retargetingModule    = retargetingAssembly.Modules[0];
            var retargetingNamespace = retargetingModule.GlobalNamespace;

            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("C"), retargetingNamespace.GetMember <NamedTypeSymbol>("C"));

            Assert.IsType <RetargetingNamedTypeSymbol>(
                retargetingNamespace.GetMember <NamedTypeSymbol>("C").GetMember <RetargetingMethodSymbol>("M").ReturnValueMarshallingInformation.TryGetSafeArrayElementUserDefinedSubtype());

            Assert.IsType <RetargetingNamedTypeSymbol>(
                ((RetargetingParameterSymbol)retargetingNamespace.GetMember <NamedTypeSymbol>("C").GetMember <RetargetingMethodSymbol>("M").Parameters[0]).
                MarshallingInformation.TryGetSafeArrayElementUserDefinedSubtype());
        }
Ejemplo n.º 13
0
        public void RetargetProperties()
        {
            var source =
                @"interface I
{
    object this[string x, object y] { get; set; }
}
struct S
{
    I P { get { return null; } }
}
class C
{
    internal I Q { get; private set; }
    object this[I index]
    {
        get { return 0; }
        set { }
    }
}";
            var compilation = CreateCompilation(source);

            var sourceModule    = compilation.SourceModule;
            var sourceAssembly  = (SourceAssemblySymbol)sourceModule.ContainingAssembly;
            var sourceNamespace = sourceModule.GlobalNamespace;

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);
            var retargetingModule    = retargetingAssembly.Modules[0];
            var retargetingNamespace = retargetingModule.GlobalNamespace;

            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("I"), retargetingNamespace.GetMember <NamedTypeSymbol>("I"));
            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("S"), retargetingNamespace.GetMember <NamedTypeSymbol>("S"));
            RetargetingSymbolChecker.CheckSymbols(sourceNamespace.GetMember <NamedTypeSymbol>("C"), retargetingNamespace.GetMember <NamedTypeSymbol>("C"));
        }
Ejemplo n.º 14
0
        public void RetargetExtensionMethods()
        {
            var source =
                @"class C
{
}
static class S1
{
    internal static void E(this object x, object y) { }
}
static class S2
{
    internal static void E<T, U>(this T t, U u) { }
}";
            var compilation = CreateCompilation(source);

            var sourceModule    = compilation.SourceModule;
            var sourceAssembly  = (SourceAssemblySymbol)sourceModule.ContainingAssembly;
            var sourceNamespace = sourceModule.GlobalNamespace;

            var retargetingAssembly = new RetargetingAssemblySymbol(sourceAssembly, isLinked: false);

            retargetingAssembly.SetCorLibrary(sourceAssembly.CorLibrary);
            var retargetingModule    = retargetingAssembly.Modules[0];
            var retargetingNamespace = retargetingModule.GlobalNamespace;

            var sourceMethods = new ArrayBuilder <MethodSymbol>();

            sourceNamespace.GetExtensionMethods(sourceMethods, null, 0, LookupOptions.AllMethodsOnArityZero);
            Utils.CheckSymbols(sourceMethods.ToImmutable(),
                               "void S1.E(object x, object y)",
                               "void S2.E<T, U>(T t, U u)");

            var retargetingMethods = new ArrayBuilder <MethodSymbol>();

            retargetingNamespace.GetExtensionMethods(retargetingMethods, null, 0, LookupOptions.AllMethodsOnArityZero);
            Utils.CheckSymbols(retargetingMethods.ToImmutable(),
                               "void S1.E(object x, object y)",
                               "void S2.E<T, U>(T t, U u)");

            for (int i = 0; i < sourceMethods.Count; i++)
            {
                CheckMethods(sourceMethods[i], retargetingMethods[i]);
            }

            sourceMethods = new ArrayBuilder <MethodSymbol>();
            sourceNamespace.GetExtensionMethods(sourceMethods, "E", 2, LookupOptions.Default);
            Utils.CheckSymbols(sourceMethods.ToImmutable(),
                               "void S2.E<T, U>(T t, U u)");
            var sourceMethod = sourceMethods[0];

            retargetingMethods = new ArrayBuilder <MethodSymbol>();
            retargetingNamespace.GetExtensionMethods(retargetingMethods, "E", 2, LookupOptions.Default);
            Utils.CheckSymbols(retargetingMethods.ToImmutable(),
                               "void S2.E<T, U>(T t, U u)");
            var retargetingMethod = retargetingMethods[0];

            var sourceType      = sourceNamespace.GetMember <NamedTypeSymbol>("C");
            var retargetingType = retargetingNamespace.GetMember <NamedTypeSymbol>("C");

            CheckTypes(sourceType, retargetingType);

            CheckMethods(sourceMethod, retargetingMethod);
            var sourceReduced      = sourceMethod.ReduceExtensionMethod(sourceType);
            var retargetingReduced = retargetingMethod.ReduceExtensionMethod(retargetingType);

            CheckReducedExtensionMethods(sourceReduced, retargetingReduced);
        }