コード例 #1
0
        void CreateInterfaceImplementation(Class @interface)
        {
            var impl = new Class
            {
                Name      = @interface.Name + "Impl",
                Namespace = @interface.Namespace,
                Type      = ClassType.RefType,
                IsFinal   = true,
            };

            var @base = new BaseClassSpecifier {
                Type = new TagType(@interface)
            };

            impl.Bases.Add(@base);

            var methods = @interface.Declarations.Where(d => d is Method).Cast <Method>();

            foreach (var method in methods)
            {
                var methodImpl = new Method(method)
                {
                    IsPure                = false,
                    IsImplicit            = true,
                    IsOverride            = true,
                    SynthKind             = FunctionSynthKind.InterfaceInstance,
                    ExplicitInterfaceImpl = @interface
                };

                impl.Declarations.Add(methodImpl);
            }

            InterfaceImplementations.Add(impl);
        }
コード例 #2
0
        private static T GetInternalImpl <T>(T @class) where T : Class, new()
        {
            var internalImpl = new T
            {
                Name      = @class.Name + "Internal",
                Access    = AccessSpecifier.Private,
                Namespace = @class.Namespace
            };

            if (@class.IsDependent)
            {
                internalImpl.IsDependent = true;
                internalImpl.TemplateParameters.AddRange(@class.TemplateParameters);
                foreach (var specialization in @class.Specializations)
                {
                    var specializationImpl = AddInternalImplementation(specialization);
                    specializationImpl.Arguments.AddRange(specialization.Arguments);
                    specializationImpl.TemplatedDecl = specialization.TemplatedDecl;
                    internalImpl.Specializations.Add(specializationImpl);
                }
            }

            var @base = new BaseClassSpecifier {
                Type = new TagType(@class)
            };

            internalImpl.Bases.Add(@base);

            return(internalImpl);
        }
コード例 #3
0
ファイル: ASTConverter.cs プロジェクト: gpetrou/CppSharp
        AST.BaseClassSpecifier VisitBaseClassSpecifier(BaseClassSpecifier @base)
        {
            var _base = new AST.BaseClassSpecifier
            {
                IsVirtual = @base.IsVirtual,
                Access    = VisitAccessSpecifier(@base.Access),
                Type      = typeConverter.Visit(@base.Type)
            };

            return(_base);
        }
コード例 #4
0
        public void HandleBaseType(IKVM.Reflection.Type type, Class @class)
        {
            if (type.FullName == "System.Object" || type.FullName == "System.ValueType")
            {
                return;
            }

            var baseClass = Visit(type.GetTypeInfo()) as Class;
            var specifier = new BaseClassSpecifier {
                Type = new TagType(baseClass)
            };

            @class.Bases.Add(specifier);
        }
コード例 #5
0
        private static Class GetInternalImpl(Declaration @class)
        {
            var internalImpl = new Class
                                {
                                    Name = @class.Name + "Internal",
                                    Access = AccessSpecifier.Private,
                                    Namespace = @class.Namespace
                                };

            var @base = new BaseClassSpecifier { Type = new TagType(@class) };
            internalImpl.Bases.Add(@base);

            return internalImpl;
        }
コード例 #6
0
ファイル: TSSources.cs プロジェクト: sg2021fighting/CppSharp
        public string GetBaseClassTemplateParameters(BaseClassSpecifier baseClassSpec)
        {
            if (!(baseClassSpec.Type is TemplateSpecializationType templateSpecType))
            {
                throw new NotSupportedException();
            }

            var args = templateSpecType.Arguments.Select(arg =>
            {
                arg.Type.Type.TryGetClass(out var @class);
                return(@class);
            });

            return($"<{string.Join(", ", args.Select(c => c.Name))}>");
        }
コード例 #7
0
        private static Class GetInternalImpl(Declaration @class)
        {
            var internalImpl = new Class
            {
                Name      = @class.Name + "Internal",
                Access    = AccessSpecifier.Private,
                Namespace = @class.Namespace
            };
            var @base = new BaseClassSpecifier {
                Type = new TagType(@class)
            };

            internalImpl.Bases.Add(@base);
            return(internalImpl);
        }
コード例 #8
0
        void CreateInterfaceImplementation(Class @interface)
        {
            var impl = new Class
            {
                Name      = @interface.Name + "Impl",
                Namespace = @interface.Namespace,
                Type      = ClassType.RefType,
                IsFinal   = true,
            };

            var @base = new BaseClassSpecifier {
                Type = new TagType(@interface)
            };

            impl.Bases.Add(@base);

            var methods = new List <Method>(@interface.Declarations.OfType <Method>());

            foreach (var baseInterface in @interface.Bases)
            {
                methods.AddRange(baseInterface.Class.Declarations.OfType <Method>());
            }

            foreach (var method in methods)
            {
                //NOTE: skip methods such as __getObject
                if (method.IsImplicit)
                {
                    continue;
                }

                var methodImpl = new Method(method)
                {
                    IsPure                = false,
                    IsImplicit            = true,
                    IsOverride            = true,
                    SynthKind             = FunctionSynthKind.InterfaceInstance,
                    ExplicitInterfaceImpl = @interface,
                    Namespace             = impl,
                    CompleteDeclaration   = method
                };

                impl.Declarations.Add(methodImpl);
            }

            InterfaceImplementations.Add(impl);
        }
コード例 #9
0
ファイル: AST.cs プロジェクト: CSRedRat/CppSharp
 public static BaseClassSpecifier __CreateInstance(BaseClassSpecifier.Internal native, bool skipVTables = false)
 {
     return new BaseClassSpecifier(native, skipVTables);
 }
コード例 #10
0
 private static void* __CopyValue(BaseClassSpecifier.__Internal native)
 {
     var ret = Marshal.AllocHGlobal(16);
     *(BaseClassSpecifier.__Internal*) ret = native;
     return ret.ToPointer();
 }
コード例 #11
0
ファイル: AST.cs プロジェクト: RainsSoft/CppSharp
 private BaseClassSpecifier(BaseClassSpecifier.Internal native)
     : this(__CopyValue(native))
 {
     __ownsNativeInstance = true;
     NativeToManagedMap[__Instance] = this;
 }
コード例 #12
0
ファイル: AST.cs プロジェクト: RainsSoft/CppSharp
 public static BaseClassSpecifier __CreateInstance(BaseClassSpecifier.Internal native)
 {
     return new BaseClassSpecifier(native);
 }
コード例 #13
0
ファイル: AST.cs プロジェクト: vovkasm/CppSharp
 internal BaseClassSpecifier(BaseClassSpecifier.Internal native)
     : this(__CopyValue(native))
 {
 }
コード例 #14
0
ファイル: AST.cs プロジェクト: vovkasm/CppSharp
 private static global::System.IntPtr __CopyValue(BaseClassSpecifier.Internal native)
 {
     global::System.IntPtr ret = Marshal.AllocHGlobal(12);
     *(BaseClassSpecifier.Internal*) ret = native;
     return ret;
 }
コード例 #15
0
        void CreateInterfaceImplementation(Class @interface)
        {
            var impl = new Class
            {
                Name      = @interface.Name + "Impl",
                Namespace = @interface.Namespace,
                Type      = ClassType.RefType,
                IsFinal   = true,
            };

            var @base = new BaseClassSpecifier {
                Type = new TagType(@interface)
            };

            impl.Bases.Add(@base);

            var methods = new List <Method>(@interface.Declarations.OfType <Method>());

            foreach (var baseInterface in @interface.Bases)
            {
                foreach (var method in baseInterface.Class.Declarations.OfType <Method>())
                {
                    // Skip methods that have been overriden previously in the chain.
                    if (methods.Any(m => MethodIsOverride(method, m)))
                    {
                        continue;
                    }

                    methods.Add(method);
                }
            }

            foreach (var method in methods)
            {
                //NOTE: skip methods such as __getObject
                if (method.IsImplicit)
                {
                    continue;
                }

                if (!method.IsPure || method.IsFinal)
                {
                    continue;
                }

                var methodImpl = CreateMethod(@interface, impl, method);

                impl.Declarations.Add(methodImpl);
            }

            foreach (var property in @interface.Declarations.OfType <Property>())
            {
                if (property.IsImplicit)
                {
                    continue;
                }

                if (!property.IsPure)
                {
                    continue;
                }

                if (property.GetMethod != null)
                {
                    var getMethodImpl = CreateMethod(@interface, impl, property.GetMethod);
                    impl.Declarations.Add(getMethodImpl);
                }

                if (property.SetMethod != null)
                {
                    var setMethodImpl = CreateMethod(@interface, impl, property.SetMethod);
                    impl.Declarations.Add(setMethodImpl);
                }
            }

            InterfaceImplementations.Add(impl);
        }
コード例 #16
0
ファイル: AST.cs プロジェクト: CSRedRat/CppSharp
 private BaseClassSpecifier(BaseClassSpecifier.Internal native, bool skipVTables = false)
     : this(__CopyValue(native), skipVTables)
 {
     __ownsNativeInstance = true;
     NativeToManagedMap[__Instance] = this;
 }
コード例 #17
0
ファイル: AST.cs プロジェクト: CSRedRat/CppSharp
 protected BaseClassSpecifier(BaseClassSpecifier.Internal* native, bool skipVTables = false)
 {
     if (native == null)
         return;
     __Instance = new global::System.IntPtr(native);
 }
コード例 #18
0
ファイル: AST.cs プロジェクト: KonajuGames/CppSharp
 private BaseClassSpecifier(BaseClassSpecifier.Internal native)
     : this(__CopyValue(native))
 {
     __ownsNativeInstance = true;
 }
コード例 #19
0
ファイル: AST.cs プロジェクト: RainsSoft/CppSharp
 private static BaseClassSpecifier.Internal* __CopyValue(BaseClassSpecifier.Internal native)
 {
     var ret = (BaseClassSpecifier.Internal*) Marshal.AllocHGlobal(24);
     *ret = native;
     return ret;
 }
コード例 #20
0
ファイル: AST.cs プロジェクト: kidleon/CppSharp
 internal BaseClassSpecifier(BaseClassSpecifier.Internal* native)
     : this(new global::System.IntPtr(native))
 {
 }
コード例 #21
0
ファイル: AST.cs プロジェクト: RainsSoft/CppSharp
 protected BaseClassSpecifier(BaseClassSpecifier.Internal* native, bool isInternalImpl = false)
 {
     __Instance = new global::System.IntPtr(native);
 }
コード例 #22
0
ファイル: AST.cs プロジェクト: kidleon/CppSharp
 internal BaseClassSpecifier(BaseClassSpecifier.Internal native)
     : this(&native)
 {
 }