예제 #1
0
        public void GetFriendlyName_ShouldNotReturnNamespaceForNestedTypes()
        {
            CSharpCompilation compilation = CreateCompilation
                                                (@"
                namespace Cica.Mica
                {
                    public class GenericParent<T>
                    {
                        public class GenericChild<TT>
                        {
                        }
                    }
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            INamedTypeSymbol
                parent = visitor.AllTypeSymbols.Single(m => m.Name == "GenericParent"),
                child  = visitor.AllTypeSymbols.Single(m => m.Name == "GenericChild");

            Assert.That(parent.GetFriendlyName(), Is.EqualTo("Cica.Mica.GenericParent"));
            Assert.That(child.GetFriendlyName(), Is.EqualTo("GenericChild"));
        }
예제 #2
0
        public void IsSpecial_ShouldReturnTrueForSpecialMethods(string name, bool isSpecial)
        {
            CSharpCompilation compilation = CreateCompilation
                                                (@"
                interface IInterface 
                {
                    int Prop1 { get; }
                    int Prop2 { get; }
                }

                class MyClass: IInterface
                {
                    public void Foo() {}
                    int IInterface.Prop1 => 0;
                    public int Prop2 => 2;
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            IMethodSymbol[] methods = visitor
                                      .AllTypeSymbols
                                      .Single(t => t.Name == "MyClass")
                                      .GetMembers()
                                      .OfType <IMethodSymbol>()
                                      .ToArray();

            Assert.That(methods.Single(m => m.StrippedName() == name).IsSpecial(), Is.EqualTo(isSpecial));
        }
예제 #3
0
        public void GetAccessModifiers_ShouldReturnTheCorrectAccessModifier(string name, int am)
        {
            AccessModifiers accessModifiers = (AccessModifiers)am;

            CSharpCompilation compilation = CreateCompilation
                                                (@"
                interface IInterface 
                {
                    void Foo();
                    void Bar();
                }

                class MyClass: IInterface
                {
                    public void Foo() {}
                    void IInterface.Bar() {}
                    public void Baz() {}
                    internal void FooBar() {}
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            IMethodSymbol[] methods = visitor
                                      .AllTypeSymbols
                                      .Single(t => t.Name == "MyClass")
                                      .GetMembers()
                                      .OfType <IMethodSymbol>()
                                      .ToArray();

            Assert.That(methods.Single(m => m.StrippedName() == name).GetAccessModifiers(), Is.EqualTo(accessModifiers));
        }
예제 #4
0
        public void GetElementType_ShouldReturnTheProperElementType(string src, string element)
        {
            CSharpCompilation compilation = CreateCompilation(src);

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            ITypeSymbol ga = visitor.AllTypeSymbols.Single(t => t.Name == "MyList").BaseType.TypeArguments.Single();

            Assert.That(ga.GetElementType(recurse: true)?.GetFriendlyName(), Is.EqualTo(element));
        }
예제 #5
0
        public void IsGenericParameter_ShouldReturnTrueIfTheTypeIsGenericParameter(string src, bool isGP)
        {
            CSharpCompilation compilation = CreateCompilation(src);

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            ITypeSymbol ga = visitor.AllTypeSymbols.Single(t => t.Name == "MyClass").BaseType.TypeArguments.Single();

            Assert.That(ga.IsGenericParameter(), Is.EqualTo(isGP));
        }
예제 #6
0
        public void ListMethods_ShouldReturnMethodsFromTheWholeHierarchy(string src, string cls)
        {
            CSharpCompilation compilation = CreateCompilation(src);

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            INamedTypeSymbol bar = visitor.AllTypeSymbols.Single(t => t.Name == cls);

            IMethodSymbol[] methods = bar.ListMethods().ToArray();

            Assert.That(methods.Count(m => m.Name == "Foo"), Is.EqualTo(1));
            Assert.That(methods.Count(m => m.Name == "Bar"), Is.EqualTo(1));
        }
        public void GenericParameterAndItsDeclaringGeneric_ShouldBeConsideredEqual()
        {
            Compilation compilation = CreateCompilation // mondjuk ez kibaszott perverz :D
                                          (@"
                interface IGeneric<T> 
                {
                    void Foo(IGeneric<T> a, T b);
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            ITypeSymbol
                a = visitor.AllTypeSymbols.Single(t => t.Name == "IGeneric").ListMethods().Single(m => m.Name == "Foo").Parameters[0].Type,
                b = visitor.AllTypeSymbols.Single(t => t.Name == "IGeneric").ListMethods().Single(m => m.Name == "Foo").Parameters[1].Type;

            Assert.AreEqual(a.GetHashCode(), b.GetHashCode());
            Assert.AreEqual(SymbolEqualityComparer.Default.GetHashCode(a), SymbolEqualityComparer.Default.GetHashCode(b));
        }
예제 #8
0
        public void PassingByReference_ShouldNotAffectTheParameterType() // TODO: Ne ide
        {
            CSharpCompilation compilation = CreateCompilation
                                                (@"
                public class MyClass 
                {
                    void Foo(int a, ref int b) {}
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            IMethodSymbol foo = (IMethodSymbol)visitor.AllTypeSymbols.Single(t => t.Name == "MyClass").GetMembers("Foo").Single();

            ITypeSymbol
                a = foo.Parameters[0].Type,
                b = foo.Parameters[0].Type;

            Assert.That(SymbolEqualityComparer.Default.Equals(a, b));
        }
예제 #9
0
        public void IsNested_ShouldReturnTrueIfTheTypeIsNested()
        {
            CSharpCompilation compilation = CreateCompilation
                                                (@"
                public class MyClass<T>
                {
                    private class Nested {}
                }
            ");

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            ITypeSymbol ga = visitor.AllTypeSymbols.Single(t => t.Name == "MyClass").TypeArguments.Single();

            Assert.IsFalse(ga.IsNested());

            ITypeSymbol nested = visitor.AllTypeSymbols.Single(t => t.Name == "Nested");

            Assert.That(nested.IsNested());
        }
예제 #10
0
        public void EqualsTo_ShouldCompare(string src, bool equals)
        {
            Assembly asm = Compile(src, customConfig: comp => comp.WithOptions(((CSharpCompilationOptions)comp.Options).WithAllowUnsafe(true)));

            ITypeInfo
                a1 = MetadataTypeInfo.CreateFrom(asm.GetTypes().Single(t => t.Name.Contains("ClassA")).ListMethods().Single(m => m.Name == "Foo").GetParameters().Single().ParameterType),
                b1 = MetadataTypeInfo.CreateFrom(asm.GetTypes().Single(t => t.Name.Contains("ClassB")).ListMethods().Single(m => m.Name == "Foo").GetParameters().Single().ParameterType);

            CSharpCompilation compilation = CreateCompilation(src);

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            ITypeInfo
                a2 = SymbolTypeInfo.CreateFrom(visitor.AllTypeSymbols.Single(t => t.Name == "ClassA").ListMethods().Single(m => m.Name == "Foo").Parameters.Single().Type, compilation),
                b2 = SymbolTypeInfo.CreateFrom(visitor.AllTypeSymbols.Single(t => t.Name == "ClassB").ListMethods().Single(m => m.Name == "Foo").Parameters.Single().Type, compilation);

            Assert.That(a1.EqualsTo(b1), Is.EqualTo(equals));
            Assert.That(a2.EqualsTo(b2), Is.EqualTo(equals));
            Assert.That(a1.EqualsTo(b2), Is.EqualTo(equals));
            Assert.That(a2.EqualsTo(b1), Is.EqualTo(equals));
        }
예제 #11
0
        public void SignatureEquals_ShouldReturnTrueOnSignatureEquality(string src, bool equals)
        {
            Assembly asm = Compile(src);

            IMethodInfo
                a1 = MetadataMethodInfo.CreateFrom(asm.GetTypes().Single(t => t.Name.Contains("ClassA")).ListMethods().Single(m => m.Name == "Foo")),
                b1 = MetadataMethodInfo.CreateFrom(asm.GetTypes().Single(t => t.Name.Contains("ClassB")).ListMethods().Single(m => m.Name == "Foo"));

            CSharpCompilation compilation = CreateCompilation(src);

            var visitor = new FindAllTypesVisitor();

            visitor.VisitNamespace(compilation.GlobalNamespace);

            IMethodInfo
                a2 = SymbolMethodInfo.CreateFrom(visitor.AllTypeSymbols.Single(t => t.Name == "ClassA").ListMethods().Single(m => m.Name == "Foo"), compilation),
                b2 = SymbolMethodInfo.CreateFrom(visitor.AllTypeSymbols.Single(t => t.Name == "ClassB").ListMethods().Single(m => m.Name == "Foo"), compilation);

            Assert.That(a1.SignatureEquals(b1), Is.EqualTo(equals));
            Assert.That(a2.SignatureEquals(b2), Is.EqualTo(equals));
            Assert.That(a1.SignatureEquals(b2), Is.EqualTo(equals));
            Assert.That(a2.SignatureEquals(b1), Is.EqualTo(equals));
        }