Esempio n. 1
0
        public void WhenFields()
        {
            var code  = @"public class ClassT { public int x, y; }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Empty(types["ClassT"].Interfaces);
        }
Esempio n. 2
0
        public void WhenOutGenericInterfaceInClassBSyncMethod()
        {
            var code     = @"
using Norns.Destiny.Attributes;

    public class B
    {
        [Charon]
        public interface IJitDB<out T> where T : class
        {
            T A();
        }

        public class A
        {
            [Charon]
            public interface IJitDA<out T> where T : class
            {
                T A();
            }
        }
    }";
            var typeName = "IJitDB`1";
            var instance = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(DataBase) });

            Assert.Null(instance.A());

            typeName = "IJitDA`1";
            var instance2 = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(DataBase) });

            Assert.Null(instance2.A());
        }
Esempio n. 3
0
        public void WhenIsAnonymousType()
        {
            var code  = "public static class StaticClass { void A() { var a = new {}; var b = new { A = 9}; } } ";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.False(types["StaticClass"].IsAnonymousType);
        }
Esempio n. 4
0
        public void IsGenericTypeWhenIA()
        {
            var code             = @"public class PublicClass
    { }     public class IA<out T> where T : PublicClass, new()
    {
        public T A() => new IA<PublicClass>();
    }
            ";
            var types            = SkuldTest.SimpleGenerateTypeSymbolInfos(code, false);
            var iaTypeDefinition = types["Norns.Destiny.UT.AOT.Generated.IA<T>"];

            Assert.True(iaTypeDefinition.IsGenericType);
            Assert.Single(iaTypeDefinition.TypeArguments);
            Assert.Single(iaTypeDefinition.TypeParameters);
            var tp = iaTypeDefinition.TypeParameters.First();

            Assert.Equal(0, tp.Ordinal);
            Assert.Equal("T", tp.Name);
            Assert.Equal(RefKindInfo.Out, tp.RefKind);
            Assert.True(tp.HasConstructorConstraint);
            Assert.False(tp.HasReferenceTypeConstraint);
            Assert.False(tp.HasValueTypeConstraint);
            Assert.Single(tp.ConstraintTypes);
            var tpc = tp.ConstraintTypes.First();

            Assert.Equal("PublicClass", tpc.Name);
        }
Esempio n. 5
0
        public void WhenNameAndNamespace()
        {
            var code  = "public class ADD { } ";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Equal("Norns.Destiny.UT.AOT.Generated", types["ADD"].Namespace);
        }
Esempio n. 6
0
        public void AccessibilityWhenNestedClass()
        {
            var code  = @"public abstract class AbstractPublicClass
    {
        private class PrivateClass
        { }

        private protected class ProtectedPrivateClass
        { }

        protected class ProtectedClass
        { }

        internal class InternalClass
        { }

        protected internal class ProtectedInternalClass
        { }

        public class PublicClass
        { }
    }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Equal(AccessibilityInfo.Private, types["PrivateClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.Protected, types["ProtectedClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.Internal, types["InternalClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.ProtectedOrInternal, types["ProtectedInternalClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.ProtectedAndInternal, types["ProtectedPrivateClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.Public, types["PublicClass"].Accessibility);
        }
Esempio n. 7
0
        public void AccessibilityWhenNormalClass()
        {
            var code  = "public class PublicClass {} internal class InternalClass{}";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Equal(AccessibilityInfo.Internal, types["InternalClass"].Accessibility);
            Assert.Equal(AccessibilityInfo.Public, types["PublicClass"].Accessibility);
        }
Esempio n. 8
0
        public void WhenIsSealed()
        {
            var code  = "public sealed class SealedClass { } public class NonSealedClass { }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.True(types["SealedClass"].IsSealed);
            Assert.False(types["NonSealedClass"].IsSealed);
        }
Esempio n. 9
0
        public void WhenIsValueType()
        {
            var code  = "public struct MyStruct { } public class ClassT { }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.True(types["MyStruct"].IsValueType);
            Assert.False(types["ClassT"].IsValueType);
        }
Esempio n. 10
0
        public void WhenIsAbstract()
        {
            var code  = "public abstract class AbstractClass { } public class NonAbstractClass { }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.True(types["AbstractClass"].IsAbstract);
            Assert.False(types["NonAbstractClass"].IsAbstract);
        }
Esempio n. 11
0
        public void WhenIsStatic()
        {
            var code  = "public static class StaticClass {} class NonStaticClass{}";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.True(types["StaticClass"].IsStatic);
            Assert.False(types["NonStaticClass"].IsStatic);
        }
Esempio n. 12
0
        public async Task WhenSimpleInterfaceAndSomeMethods()
        {
            var code     = @"
using System.Collections.Generic;
using System.Threading.Tasks;
using Norns.Destiny.Attributes;
[Charon]
    public interface IJitC
    {
        int AddOne(int v);

        void AddVoid();

        Task AddTask(int v);

        Task<int> AddVTask(int v);

        ValueTask<int> AddValueTask(int v);

        ValueTask<T> AddValueTask<T>(T v);

        ValueTask<Task<T>> AddValueTask<T, V>(T v, V v1) where T : struct where V : class, IJitC;

        IEnumerable<T> AddValue1<T, V>(T v, ref V v1);

        IEnumerable<T> AddValue2<T, V>(T v, in V v1);

        IEnumerable<T> AddValue3<T, V>(T v, out V v1);

        public int A() => 3;

        int PA { get; set; }

        int PD { set; }

        string this[int v, string s] { get; set; }
    }";
            var typeName = "IJitC";
            var instance = SkuldTest.GenerateProxy(code, typeName);

            Assert.Equal(5, instance.AddOne(33));
            instance.AddVoid();
            await instance.AddTask(66);

            Assert.Equal(0, await instance.AddVTask(44));
            Assert.Equal(0, await instance.AddValueTask(11));
            Assert.Null(await instance.AddValueTask(this));
            Assert.Null(await instance.AddValueTask(new A(), instance));
            Assert.Equal(-5, instance.PA);
            instance.PD = 55;
            Assert.Null(instance[3, ""]);
            var c = instance;

            Assert.Null(instance.AddValue1(new A(), ref c));
            //Assert.Null(instance.AddValue2(new A(), in c));
            Assert.Null(instance.AddValue3(new A(), out c));
            Assert.Equal(8, instance.A());
        }
Esempio n. 13
0
        public void WhenBaseType()
        {
            var code  = @"public class ClassT { } public struct A {} interface IB {}
public class C : ClassT {}";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Equal(nameof(Object), types["ClassT"].BaseType.Name);
            Assert.Equal("ClassT", types["C"].BaseType.Name);
            Assert.Equal("ValueType", types["A"].BaseType.Name);
            Assert.Null(types["IB"].BaseType);
        }
Esempio n. 14
0
        public void WhenInterfaces()
        {
            var code  = @"public class ClassT { } public struct A {} interface IB {}
public class C : IB {}";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.Empty(types["ClassT"].Interfaces);
            Assert.Single(types["C"].Interfaces);
            Assert.Equal("IB", types["C"].Interfaces.First().Name);
            Assert.Empty(types["A"].Interfaces);
            Assert.Empty(types["IB"].Interfaces);
            Assert.True(types["IB"].IsInterface);
        }
Esempio n. 15
0
        public void WhenIsGenericType()
        {
            var code  = @"public class ClassT { }

public class GenericClass<T> where T : ClassT, new()
{
    public T A() => default;
}";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);

            Assert.True(types["GenericClass"].IsGenericType);
            Assert.True(types["GenericClass"].IsClass);
            Assert.False(types["ClassT"].IsGenericType);
        }
Esempio n. 16
0
        public void WhenOutGenericInterfaceSyncMethod()
        {
            var code     = @"
using Norns.Destiny.Attributes;
[Charon]
    public interface IJitD<out T> where T : class
    {
        T A();
    }";
            var typeName = "IJitD`1";
            var instance = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(DataBase) });

            Assert.Null(instance.A());
            instance = VerthandiTest.GenerateProxy <IJitD <DataBase> >(typeof(IJitD <>));
            Assert.Null(instance.A());
        }
Esempio n. 17
0
        public void WhenInheritInterface()
        {
            var code     = @"
using Norns.Destiny.Attributes;
public interface ITest
    {
        long GiveFive();
    }

    [Charon]
    public interface IJitD : ITest
    {
    }";
            var typeName = "IJitD";
            var instance = SkuldTest.GenerateProxy(code, typeName);

            Assert.Equal(1, instance.GiveFive());
        }
Esempio n. 18
0
        public void WhenInGenericInterfaceSyncMethod()
        {
            var code     = @"
using Norns.Destiny.Attributes;
using Norns.Skuld.Loom;
using Norns.Skuld.AOP;

    [Charon]
    public interface IJitDIn<in T, V, R> where T : SourceGeneratorBase
    {
        AopSourceGenerator A();
    }
";
            var typeName = "IJitDIn`3";
            var instance = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(SourceGeneratorBase), typeof(int), typeof(long?) });

            Assert.Null(instance.A());
        }
Esempio n. 19
0
        public void WhenAttribute()
        {
            var code  = @"
using Xunit;
[Collection(""a"")]
        public class PublicClass
        { }
    }";
            var attrs = SkuldTest.SimpleGenerateTypeSymbolInfos(code).First().Value.Attributes;

            Assert.Single(attrs);
            var a = attrs.First();

            Assert.Equal(@"Xunit.CollectionAttribute(""a"")", a.FullName);
            Assert.Equal(@"Xunit.CollectionAttribute", a.AttributeType.FullName);
            Assert.Single(a.ConstructorArguments);
            var ca = a.ConstructorArguments.First();

            Assert.Equal("a", ca.Value);
        }
Esempio n. 20
0
        public void WhenNestedAbstractClassSyncMethod()
        {
            var code     = @"
using Norns.Destiny.Attributes;
using Norns.Skuld.Loom;
using Norns.Skuld.AOP;

    public class B
    {
        public class A
        {
            [Charon]
            public abstract class JitCClassA<T, V, R> where T : class
            {
                public abstract (T, V, R) A();
            }
        }

        [Charon]
        public abstract class JitCClassB<T, V, R> where T : class
        {
            public abstract (T, V, R) A();
        }
    }
";
            var typeName = "JitCClassB`3";
            var instance = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(Data), typeof(long), typeof(short) });
            var r        = instance.A();

            Assert.Null(r.Item1);
            Assert.Equal(0L, r.Item2);
            Assert.Equal(0, r.Item3);

            typeName = "JitCClassA`3";
            var instance1 = SkuldTest.GenerateProxy(code, typeName, new Type[] { typeof(Data), typeof(long), typeof(int) });
            var r1        = instance1.A();

            Assert.Null(r1.Item1);
            Assert.Equal(0L, r1.Item2);
            Assert.Equal(0, r1.Item3);
        }
Esempio n. 21
0
        public void MethodWhenHasReturnValue()
        {
            var code  = @"
using System.Threading.Tasks;
    public interface IC
    {
        int AddOne(int v);
        void AddVoid(int v);
        Task AddTask(int v);
Task<int> AddVTask(int v);
ValueTask<int> AddValueTask(int v);
    }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);
            var ms    = types["IC"].Members
                        .Select(i => i as IMethodSymbolInfo)
                        .Where(i => i != null)
                        .ToDictionary(i => i.FullName, i => i);
            var m = ms["Norns.Destiny.UT.AOT.Generated.IC.AddOne(int)"];

            Assert.True(m.HasReturnValue);
            Assert.False(m.IsAsync);

            m = ms["Norns.Destiny.UT.AOT.Generated.IC.AddVoid(int)"];
            Assert.False(m.HasReturnValue);
            Assert.False(m.IsAsync);

            m = ms["Norns.Destiny.UT.AOT.Generated.IC.AddTask(int)"];
            Assert.False(m.HasReturnValue);
            Assert.True(m.IsAsync);

            m = ms["Norns.Destiny.UT.AOT.Generated.IC.AddVTask(int)"];
            Assert.True(m.HasReturnValue);
            Assert.True(m.IsAsync);

            m = ms["Norns.Destiny.UT.AOT.Generated.IC.AddValueTask(int)"];
            Assert.True(m.HasReturnValue);
            Assert.True(m.IsAsync);
        }
Esempio n. 22
0
        public void WhenStructFields()
        {
            var code   = @"public unsafe struct StructFieldTest
        {
            internal fixed char name[30];
        }";
            var types  = SkuldTest.SimpleGenerateTypeSymbolInfos(code);
            var fields = types["StructFieldTest"].Members
                         .Select(i => i as IFieldSymbolInfo)
                         .Where(i => i != null)
                         .ToDictionary(i => i.Name, i => i);

            Assert.Single(fields);
            var f = fields["name"];

            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.True(f.IsFixedSizeBuffer);
            Assert.False(f.IsStatic);
            Assert.Equal(AccessibilityInfo.Internal, f.Accessibility);
        }
Esempio n. 23
0
        private static void CompareType(Type type)
        {
            var aot = SkuldTest.GetTypeByMetadataName(type.FullName);
            var jit = type.GetSymbolInfo();

            Assert.NotEqual(aot.Origin, jit.Origin);
            Assert.Equal(aot.Name, jit.Name);
            Assert.Equal(aot.FullName, jit.FullName);
            Assert.Equal(aot.Namespace, jit.Namespace);
            Assert.Equal(aot.IsAbstract, jit.IsAbstract);
            Assert.Equal(aot.IsSealed, jit.IsSealed);
            Assert.Equal(aot.IsValueType, jit.IsValueType);
            Assert.Equal(aot.IsGenericType, jit.IsGenericType);
            Assert.Equal(aot.IsAnonymousType, jit.IsAnonymousType);
            Assert.Equal(aot.IsClass, jit.IsClass);
            Assert.Equal(aot.IsInterface, jit.IsInterface);
            Assert.Equal(aot.IsStatic, jit.IsStatic);
            Assert.Equal(aot.Accessibility, jit.Accessibility);
            Assert.Equal(aot.GenericDefinitionName, jit.GenericDefinitionName);
            Assert.Equal(aot.TypeArguments.IsEmpty, jit.TypeArguments.IsEmpty);
            Assert.Equal(aot.TypeParameters.IsEmpty, jit.TypeParameters.IsEmpty);
            Assert.Equal(aot.BaseType, jit.BaseType);
            Assert.Equal(aot.Interfaces.Count, jit.Interfaces.Count);
        }
Esempio n. 24
0
        public string Generate(string code)
        {
            var collector = new DefaultImplementNotationGeneratorCollector();

            return(SkuldTest.GenerateCode($"namespace Norns.Destiny.UT.AOT.Generated {{ {code} }}", collector));
        }
Esempio n. 25
0
        public void WhenClassFields()
        {
            var code   = @"public class FieldTest
        {
            public const int A = 3;
            internal static readonly string B = ""3"";
            protected volatile string C;
        protected internal long D;
        private protected long E;
        private long F;
    }";
            var types  = SkuldTest.SimpleGenerateTypeSymbolInfos(code);
            var fields = types["FieldTest"].Members
                         .Select(i => i as IFieldSymbolInfo)
                         .Where(i => i != null)
                         .ToDictionary(i => i.Name, i => i);

            Assert.Equal(6, fields.Count);
            var f = fields["A"];

            Assert.Equal(3, f.ConstantValue);
            Assert.True(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.True(f.HasConstantValue);
            Assert.True(f.IsStatic);
            Assert.Equal(AccessibilityInfo.Public, f.Accessibility);

            f = fields["B"];
            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.True(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.True(f.IsStatic);
            Assert.Equal(AccessibilityInfo.Internal, f.Accessibility);

            f = fields["C"];
            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.True(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.False(f.IsStatic);
            Assert.Equal(AccessibilityInfo.Protected, f.Accessibility);

            f = fields["D"];
            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.False(f.IsStatic);
            Assert.Equal(AccessibilityInfo.ProtectedOrInternal, f.Accessibility);

            f = fields["E"];
            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.False(f.IsStatic);
            Assert.Equal(AccessibilityInfo.ProtectedAndInternal, f.Accessibility);

            f = fields["F"];
            Assert.False(f.HasConstantValue);
            Assert.False(f.IsConst);
            Assert.False(f.IsReadOnly);
            Assert.False(f.IsVolatile);
            Assert.False(f.IsFixedSizeBuffer);
            Assert.False(f.IsStatic);
            Assert.Equal(AccessibilityInfo.Private, f.Accessibility);
        }
Esempio n. 26
0
        public void WhenMethods()
        {
            var code  = @"
    public static class Sta
    {
        public static int A(this int d) => d;
    }
public abstract class A
        {
            private void PrivateM()
            {
            }

            internal int InternalM()
            {
                return default;
            }

            protected virtual (int v, long s) ProtectedM()
            {
                return default;
            }

            protected internal abstract string PIS();

            protected private string PPS()
            {
                return default;
            }

            public T GetT<T>() where T : class
            {
                return default;
            }

            public Task GetTask()
            {
                return default;
            }

            public override string ToString()
            {
                return base.ToString();
            }
        }

        public class B : A
        {
            protected sealed override (int v, long s) ProtectedM()
            {
                return base.ProtectedM();
            }

            protected internal override string PIS()
            {
                return default;
            }

            public new Task GetTask()
            {
                return default;
            }
        }";
            var types = SkuldTest.SimpleGenerateTypeSymbolInfos(code);
            var ms    = types["A"].Members
                        .Select(i => i as IMethodSymbolInfo)
                        .Where(i => i != null)
                        .ToDictionary(i => i.FullName, i => i);
            var m = ms["Norns.Destiny.UT.AOT.Generated.A.PrivateM()"];

            Assert.Equal(AccessibilityInfo.Private, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("void", m.ReturnType.FullName);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.InternalM()"];
            Assert.Equal(AccessibilityInfo.Internal, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("int", m.ReturnType.FullName);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.ProtectedM()"];
            Assert.Equal(AccessibilityInfo.Protected, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.True(m.IsVirtual);
            Assert.Equal("ValueTuple", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.PIS()"];
            Assert.Equal(AccessibilityInfo.ProtectedOrInternal, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.True(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("String", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.PPS()"];
            Assert.Equal(AccessibilityInfo.ProtectedAndInternal, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("String", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.ToString()"];
            Assert.Equal(AccessibilityInfo.Public, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.True(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("String", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.GetTask()"];
            Assert.Equal(AccessibilityInfo.Public, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("Task", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.A.GetT<T>()"];
            Assert.Equal(AccessibilityInfo.Public, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.True(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("T", m.ReturnType.Name);
            Assert.Single(m.TypeParameters);
            Assert.True(m.TypeParameters.First().HasReferenceTypeConstraint);

            ms = types["B"].Members
                 .Select(i => i as IMethodSymbolInfo)
                 .Where(i => i != null)
                 .ToDictionary(i => i.FullName, i => i);
            m = ms["Norns.Destiny.UT.AOT.Generated.B.ProtectedM()"];
            Assert.Equal(AccessibilityInfo.Protected, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.True(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.True(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("ValueTuple", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.B.PIS()"];
            Assert.Equal(AccessibilityInfo.ProtectedOrInternal, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.True(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("String", m.ReturnType.Name);

            m = ms["Norns.Destiny.UT.AOT.Generated.B.GetTask()"];
            Assert.Equal(AccessibilityInfo.Public, m.Accessibility);
            Assert.Empty(m.Parameters);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.False(m.IsExtensionMethod);
            Assert.False(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("Task", m.ReturnType.Name);

            ms = types["Sta"].Members
                 .Select(i => i as IMethodSymbolInfo)
                 .Where(i => i != null)
                 .ToDictionary(i => i.FullName, i => i);
            m = ms["Norns.Destiny.UT.AOT.Generated.Sta.A(int)"];
            Assert.Equal(AccessibilityInfo.Public, m.Accessibility);
            Assert.Empty(m.TypeParameters);
            Assert.False(m.IsGenericMethod);
            Assert.True(m.IsExtensionMethod);
            Assert.True(m.IsStatic);
            Assert.False(m.IsSealed);
            Assert.False(m.IsAbstract);
            Assert.False(m.IsOverride);
            Assert.False(m.IsVirtual);
            Assert.Equal("Int32", m.ReturnType.Name);
            Assert.Single(m.Parameters);
            Assert.Equal("d", m.Parameters.First().Name);
        }
Esempio n. 27
0
        public async Task WhenAbstractClassAndSomeMethods()
        {
            var code     = @"
using System.Collections.Generic;
using System.Threading.Tasks;
using Norns.Destiny.Attributes;
[Charon]
    public abstract class JitCClass
    {
        public abstract int AddOne(int v);

        public abstract void AddVoid();

        public abstract Task AddTask(int v);

        public abstract Task<int> AddVTask(int v);

        public abstract ValueTask<int> AddValueTask(int v);

        public abstract ValueTask<T> AddValueTask<T>(T v);

        public abstract ValueTask<Task<T>> AddValueTask<T, V>(T v, V v1) where T : struct where V : JitCClass;

        public abstract IEnumerable<T> AddValue1<T, V>(T v, ref V v1);

        public abstract IEnumerable<T> AddValue2<T, V>(T v, in V v1);

        public abstract IEnumerable<T> AddValue3<T, V>(T v, out V v1);

        public int A() => 3;

        public virtual int B() => 3;

        public virtual int PA { get; set; }

        public virtual int PD { protected get; set; }

        public abstract string this[int v, string s] { get; set; }
    }
";
            var typeName = "JitCClass";
            var instance = SkuldTest.GenerateProxy(code, typeName);

            Assert.Equal(5, instance.AddOne(33));
            instance.AddVoid();
            await instance.AddTask(66);

            Assert.Equal(0, await instance.AddVTask(44));
            Assert.Equal(0, await instance.AddValueTask(11));
            Assert.Null(await instance.AddValueTask(this));
            Assert.Null(await instance.AddValueTask(new A(), instance));
            Assert.Equal(-5, instance.PA);
            instance.PD = 55;
            Assert.Null(instance[3, ""]);
            var c = instance;

            Assert.Null(instance.AddValue1(new A(), ref c));
            //Assert.Null(instance.AddValue2(new A(), in c));
            Assert.Null(instance.AddValue3(new A(), out c));
            Assert.Equal(3, instance.A());
            Assert.Equal(8, instance.B());
        }