Ejemplo n.º 1
0
        // Public Methods 


        public static PyMethodCallExpression MakeConstructor(string constructedClassName,
                                                             MethodTranslationInfo translationInfo, params IPyValue[] args)
        {
            var methodCallExpression = new PyMethodCallExpression(ConstructorMethodName, args);

            methodCallExpression.SetClassName((PyQualifiedName)constructedClassName, translationInfo);
            return(methodCallExpression);
        }
Ejemplo n.º 2
0
 public void SetClassName(PhpQualifiedName className, MethodTranslationInfo translationInfo)
 {
     _className = className.MakeAbsolute();
     _translationInfo = translationInfo;
 }
Ejemplo n.º 3
0
        // Public Methods 


        public static PhpMethodCallExpression MakeConstructor(string constructedClassName, MethodTranslationInfo translationInfo, params IPhpValue[] args)
        {
            var methodCallExpression = new PhpMethodCallExpression(ConstructorMethodName, args);
            methodCallExpression.SetClassName((PhpQualifiedName)constructedClassName, translationInfo);
            return methodCallExpression;
        }
Ejemplo n.º 4
0
        // Private Methods 

        /*
         *      static IPhpStatement[] MkArray(IPhpStatement x)
         *      {
         *          return new IPhpStatement[] { x };
         *      }
         */

        // Public Methods 


        public void Translate(AssemblySandbox sandbox)
        {
            var classes            = Info.GetClasses();
            var classesToTranslate = Info.ClassTranslations.Values
                                     .Where(u => u.Type.Assembly.FullName == Info.CurrentAssembly.FullName).ToArray();
            //            classesToTranslate = (from i in _info.ClassTranslations.Values
            //                                      where i.Type.Assembly.FullName == _info.CurrentAssembly.FullName
            //                                      select this.ge.ToArray();
            var interfaces = Info.GetInterfaces();

            //     var interfacesToTranslate = info.ClassTranslations.Values.Where(u => u.Type.Assembly == info.CurrentAssembly).ToArray();
            foreach (var classTranslationInfo in classesToTranslate)
            {
                if (classTranslationInfo.Skip)
                {
                    Debug.Write("");
                }
                PhpClassDefinition phpClass;
                var phpModule = GetOrMakeModuleByName(classTranslationInfo.ModuleName);
                // var assemblyTI = _info.GetOrMakeTranslationInfo(_info.CurrentAssembly);

                {
                    PhpQualifiedName phpBaseClassName;
                    {
                        var netBaseType = classTranslationInfo.Type.BaseType;
                        if ((object)netBaseType == null || netBaseType == typeof(object))
                        {
                            phpBaseClassName = PhpQualifiedName.Empty;
                        }
                        else
                        {
                            // _state.Principles.CurrentTyp is null so we will obtain absolute name
                            phpBaseClassName =
                                _state.Principles.GetPhpType(netBaseType, true, null); // absolute name
                            var baseTypeTranslationInfo = _state.Principles.GetOrMakeTranslationInfo(netBaseType);
                            if (baseTypeTranslationInfo.Skip)
                            {
                                phpBaseClassName = PhpQualifiedName.Empty;
                            }
                        }
                    }
                    phpClass = phpModule.FindOrCreateClass(classTranslationInfo.ScriptName, phpBaseClassName);
                }
                _state.Principles.CurrentType     = classTranslationInfo.Type;
                _state.Principles.CurrentAssembly = _state.Principles.CurrentType.Assembly;
                Console.WriteLine(classTranslationInfo.ModuleName);

                IClassMember[] members;

                if (classTranslationInfo.Type.IsInterface)
                {
                    var sources = interfaces.Where(i => i.FullName == classTranslationInfo.Type.FullName).ToArray();
                    members = (from i in sources
                               from j in i.ClassDeclaration.Members
                               select j).ToArray();
                    {
                        var fileNames = classTranslationInfo.Type.GetCustomAttributes <RequireOnceAttribute>()
                                        .Select(i => i.Filename).Distinct().ToArray();
                        if (fileNames.Any())
                        {
                            var b = fileNames.Select(u => new PhpConstValue(u)).ToArray();
                            phpModule.RequiredFiles.AddRange(b);
                        }
                    }
                }
                else
                {
                    var sources = classes.Where(i => i.FullName == classTranslationInfo.Type.FullName).ToArray();
                    members = (from i in sources
                               from j in i.ClassDeclaration.Members
                               select j).ToArray();
                    {
                        var fileNames = classTranslationInfo.Type.GetCustomAttributes <RequireOnceAttribute>()
                                        .Select(i => i.Filename).Distinct().ToArray();
                        if (fileNames.Any())
                        {
                            var b = fileNames.Select(u => new PhpConstValue(u)).ToArray();
                            phpModule.RequiredFiles.AddRange(b);
                        }
                    }
                }

                {
                    var c = members.OfType <ConstructorDeclaration>().ToArray();
                    if (c.Length > 1)
                    {
                        throw new Exception("PHP supports only one constructor per class");
                    }
                    if (c.Any())
                    {
                        TranslateConstructor(phpClass, c.First());
                    }
                }

                {
                    foreach (var methodDeclaration in members.OfType <MethodDeclaration>())
                    {
                        TranslateMethod(phpClass, methodDeclaration);
                    }
                }

                {
                    foreach (var pDeclaration in members.OfType <CsharpPropertyDeclaration>())
                    {
                        TranslateProperty(phpClass, pDeclaration);
                    }
                }

                {
                    foreach (var constDeclaration in members.OfType <FieldDeclaration>())
                    {
                        TranslateField(phpModule, phpClass, constDeclaration);
                    }
                }

                _state.Principles.CurrentType = null;
                {
                    if (classTranslationInfo.IsPage)
                    {
                        {
                            var ati = Info.GetOrMakeTranslationInfo(Info.CurrentAssembly);
                            if (ati.DefaultTimezone.HasValue)
                            {
                                // date_default_timezone_set('America/Los_Angeles');
                                var a  = new PhpValueTranslator(_state);
                                var aa = a.Visit(new ConstValue(ati.DefaultTimezone.Value));
                                var dateDefaultTimezoneSet =
                                    new PhpMethodCallExpression("date_default_timezone_set", aa);
                                phpModule.BottomCode.Statements.Add(new PhpExpressionStatement(dateDefaultTimezoneSet));
                            }
                        }

                        {
                            var mti = MethodTranslationInfo.FromMethodInfo(classTranslationInfo.PageMethod,
                                                                           classTranslationInfo);
                            var callMain = new PhpMethodCallExpression(mti.ScriptName);
                            callMain.SetClassName(
                                classTranslationInfo.ScriptName,
                                mti
                                );
                            phpModule.BottomCode.Statements.Add(new PhpExpressionStatement(callMain));
                        }
                    }
                }

                {
                    var moduleCodeRequests = new List <ModuleCodeRequest>();
                    var codeRequests       = (phpModule as ICodeRelated).GetCodeRequests().ToArray();
                    {
                        var classCodeRequests = (from request in codeRequests.OfType <ClassCodeRequest>()
                                                 where request.ClassName != null
                                                 select request.ClassName.FullName)
                                                .Distinct()
                                                .ToArray();

                        foreach (var req in classCodeRequests)
                        {
                            var m = Info.ClassTranslations.Values.Where(i => i.ScriptName.FullName == req).ToArray();
                            if (m.Length != 1)
                            {
                                throw new NotSupportedException();
                            }
                            var mm = m[0];
                            if (mm.DontIncludeModuleForClassMembers)
                            {
                                continue;
                            }
                            var includeModule = mm.IncludeModule;
                            if (includeModule == null || mm.ModuleName == phpModule.Name)
                            {
                                continue;
                            }
                            var h = new ModuleCodeRequest(includeModule, "class request: " + req);
                            moduleCodeRequests.Add(h);
                        }
                    }
                    {
                        var moduleRequests = (from i in codeRequests.OfType <ModuleCodeRequest>()
                                              where i.ModuleName != null
                                              select i).Union(moduleCodeRequests).ToArray();
                        var moduleNames = (from mReq in moduleRequests
                                           where mReq.ModuleName != phpModule.Name
                                           let mName = mReq.ModuleName
                                                       where mName != null
                                                       select mName
                                           ).Distinct().ToArray();
                        foreach (var i in moduleNames.Where(x => !PhpCodeModuleName.IsFrameworkName(x)))
                        {
                            AppendCodeReq(i, phpModule);
                        }
                    }
                }
            }

            {
                var emptyModules = Modules.Where(a => a.IsEmpty).ToArray();
                foreach (var module in Modules)
                {
                    // if (module.IsEmpty)
                }
            }
        }
Ejemplo n.º 5
0
 public void SetClassName(PyQualifiedName className, MethodTranslationInfo translationInfo)
 {
     _className      = className.MakeAbsolute();
     TranslationInfo = translationInfo;
 }
Ejemplo n.º 6
0
        private void TranslateClass(
            ClassTranslationInfo classTranslationInfo,
            FullInterfaceDeclaration[] interfaces,
            FullClassDeclaration[]     classes)
        {
            if (classTranslationInfo.Skip)
            {
                Debug.Write("");
            }
            var pyModule = GetOrMakeModuleByName(classTranslationInfo.ModuleName);

            // var assemblyTI = _info.GetOrMakeTranslationInfo(_info.CurrentAssembly);
            PyQualifiedName GetBaseClassName()
            {
                var netBaseType = classTranslationInfo.Type.BaseType;

                if ((object)netBaseType == null || netBaseType == typeof(object))
                {
                    return(PyQualifiedName.Empty);
                }
                var baseTypeTranslationInfo = _state.Principles.GetOrMakeTranslationInfo(netBaseType);

                if (baseTypeTranslationInfo.Skip)
                {
                    return(PyQualifiedName.Empty);
                }
                return(_state.Principles.GetPyType(netBaseType, true, null));
            }

            var pyClass = classTranslationInfo.ExportAsModule
                ? null
                : pyModule.FindOrCreateClass(classTranslationInfo.PyName, GetBaseClassName());

            Console.WriteLine(classTranslationInfo.ModuleName);
            _state.Principles.CurrentType = classTranslationInfo.Type;
            try
            {
                _state.Principles.CurrentAssembly = _state.Principles.CurrentType.Assembly;
                var fullname = classTranslationInfo.Type.FullName;
                var srcs     = classTranslationInfo.Type.IsInterface
                    ? interfaces
                               .Where(q => q.FullName == fullname)
                               .Select(q => q.ClassDeclaration)
                               .OfType <IClassOrInterface>().ToArray()
                    : classes
                               .Where(q => q.FullName == fullname)
                               .Select(q => q.ClassDeclaration)
                               .OfType <IClassOrInterface>().ToArray();
                var members = srcs.SelectMany(i => i.Members).ToArray();

                {
                    var constructors = members.OfType <ConstructorDeclaration>().ToArray();
                    if (pyClass == null && constructors.Length > 0)
                    {
                        throw new Exception("Class exported as module cannot have constructors");
                    }
                    if (constructors.Length > 1)
                    {
                        throw new Exception("Python supports only one constructor per class");
                    }
                    if (constructors.Any())
                    {
                        TranslateConstructor(pyClass, constructors.First());
                    }
                }

                foreach (var methodDeclaration in members.OfType <MethodDeclaration>())
                {
                    TranslateMethod(pyModule, pyClass, methodDeclaration);
                }
                foreach (var pDeclaration in members.OfType <CsharpPropertyDeclaration>())
                {
                    TranslateProperty(pyModule, pyClass, pDeclaration);
                }
                foreach (var constDeclaration in members.OfType <FieldDeclaration>())
                {
                    TranslateField(pyModule, pyClass, constDeclaration);
                }
            }
            finally
            {
                _state.Principles.CurrentType = null;
            }

            {
                if (classTranslationInfo.IsPage)
                {
                    var mti = MethodTranslationInfo.FromMethodInfo(classTranslationInfo.PageMethod,
                                                                   classTranslationInfo);
                    var callMain = new PyMethodCallExpression(mti.ScriptName);
                    callMain.SetClassName(
                        classTranslationInfo.PyName,
                        mti
                        );
                    pyModule.BottomCode.Statements.Add(new PyExpressionStatement(callMain));
                }
            }
            TranslateClass_AddModuleRequests(classTranslationInfo, pyModule);
        }