Ejemplo n.º 1
0
        protected void ModuleTranslation(string module, Translator translator)
        {
            if (module == null)
            {
                throw new ArgumentNullException("module");
            }
            if (translator == null)
            {
                throw new ArgumentNullException("translator");
            }

            string expectedCode, translatedCode, shortFilename;

            {
                //  translator = PrepareTranslator();
                Console.WriteLine("We have module " + translator.Modules.First().Name.Name);
                PhpCodeModule mod = translator.Modules.First(i => i.Name.Name == module);
                // var cl = mod.Classes[0];
                // var method = cl.Methods.First(i => i.Name == methodName);
                translatedCode = GetCode(mod);
            }

            {
                shortFilename = string.Format("module-{0}.txt", module);
                expectedCode  = GetExpectedCode(shortFilename, translatedCode);
            }

            if (expectedCode != translatedCode)
            {
                Save(translatedCode, shortFilename);
            }

            Assert.True(expectedCode == translatedCode, "Invalid translation");
        }
Ejemplo n.º 2
0
        // Private Methods 

        /// <summary>
        ///     Gets existing or creates code module for given name
        /// </summary>
        /// <param name="requiredModuleName"></param>
        /// <returns></returns>
        private PhpCodeModule GetOrMakeModuleByName(PhpCodeModuleName requiredModuleName)
        {
            var mod = Modules.FirstOrDefault(i => i.Name == requiredModuleName);

            if (mod != null)
            {
                return(mod);
            }
            mod = new PhpCodeModule(requiredModuleName);
            Modules.Add(mod);
            return(mod);
        }
Ejemplo n.º 3
0
        public void BeforeEmit(PhpCodeModule module, TranslationInfo info)
        {
            //var a = info.CurrentAssembly.GetCustomAttributes(false);
            var assemblyTI = info.GetOrMakeTranslationInfo(info.CurrentAssembly);
            // var c = info.ClassTranslations.Values.Where(u => u.ModuleName != null && u.ModuleName.Library == assemblyTI.LibraryName).ToArray();
            var typesInThisModule  = info.ClassTranslations.Values.Where(u => u.ModuleName != null && u.ModuleName == module.Name).ToArray();
            var typesWithAttribute = from i in typesInThisModule
                                     let attribute = i.Type.GetCustomAttribute <MainPluginModuleAttribute>(false)
                                                     where attribute != null
                                                     select i;

            if (typesWithAttribute.Any())
            {
                var PluginName = "Please fill AssemblyTrademark attribute";
                {
                    var a = info.CurrentAssembly.GetCustomAttribute <AssemblyTrademarkAttribute>();
                    if (a != null && !string.IsNullOrEmpty(a.Trademark))
                    {
                        PluginName = a.Trademark;
                    }
                }
                var Author = "";
                {
                    var a = info.CurrentAssembly.GetCustomAttribute <AssemblyCompanyAttribute>();
                    if (a != null && !string.IsNullOrEmpty(a.Company))
                    {
                        Author = a.Company;
                    }
                }
                var Description = "";
                {
                    var a = info.CurrentAssembly.GetCustomAttribute <AssemblyDescriptionAttribute>();
                    if (a != null && !string.IsNullOrEmpty(a.Description))
                    {
                        Description = a.Description;
                    }
                }
                List <string> l = new List <string>();
                l.Add("Plugin Name: " + PluginName);
                l.Add("Author: " + Author);
                l.Add("Author URI: " + "???");
                l.Add("Description: " + Description);
                module.TopComments = string.Join("\r\n", l) + "\r\n" + module.TopComments;
            }
            // throw new NotImplementedException();
        }
Ejemplo n.º 4
0
        private void TranslateField(PhpCodeModule module, PhpClassDefinition phpClass, FieldDeclaration field)
        {
            PhpValueTranslator phpValueTranslator = null;

            foreach (var item in field.Items)
            {
                if (item.OptionalFieldInfo == null)
                {
                    continue;
                }
                var fti = Info.GetOrMakeTranslationInfo(item.OptionalFieldInfo);
                switch (fti.Destination)
                {
                case FieldTranslationDestionations.DefinedConst:
                    if (item.Value == null)
                    {
                        throw new NotSupportedException();
                    }
                    if (phpValueTranslator == null)
                    {
                        phpValueTranslator = new PhpValueTranslator(_state);
                    }
                    var definedValue = phpValueTranslator.TransValue(item.Value);
                    {
                        if (fti.IncludeModule != module.Name)
                        {
                            module = GetOrMakeModuleByName(fti.IncludeModule);
                        }
                    }
                    module.DefinedConsts.Add(new KeyValuePair <string, IPhpValue>(fti.ScriptName, definedValue));
                    break;

                case FieldTranslationDestionations.GlobalVariable:
                    if (item.Value != null)
                    {
                        IPhpValue value;
                        // muszę na chwilę wyłączyć current type, bo to jes poza klasą generowane
                        {
                            var saveCurrentType = _state.Principles.CurrentType;
                            _state.Principles.CurrentType = null;
                            try
                            {
                                if (phpValueTranslator == null)
                                {
                                    phpValueTranslator = new PhpValueTranslator(_state);
                                }
                                value = phpValueTranslator.TransValue(item.Value);
                            }
                            finally
                            {
                                _state.Principles.CurrentType = saveCurrentType;
                            }
                        }

                        var assign = new PhpAssignExpression(PhpVariableExpression.MakeGlobal(fti.ScriptName),
                                                             value);
                        module.TopCode.Statements.Add(new PhpExpressionStatement(assign));
                    }

                    break;

                case FieldTranslationDestionations.JustValue:
                    continue;     // don't define

                case FieldTranslationDestionations.NormalField:
                case FieldTranslationDestionations.ClassConst:
                {
                    var def = new PhpClassFieldDefinition();
                    var cti = _state.Principles.GetTi(_state.Principles.CurrentType, true);
                    if (cti.IsArray)
                    {
                        continue;
                    }
                    if (field.Modifiers.Has("const") ^
                        (fti.Destination == FieldTranslationDestionations.ClassConst))
                    {
                        throw new Exception("beige lion");
                    }

                    def.IsConst =
                        fti.Destination ==
                        FieldTranslationDestionations.ClassConst;     // field.Modifiers.Has("const");
                    def.Name = fti.ScriptName;

                    def.IsStatic = def.IsConst || field.Modifiers.Has("static");
                    if (field.Modifiers.Has("public"))
                    {
                        def.Visibility = Visibility.Public;
                    }
                    else if (field.Modifiers.Has("protected"))
                    {
                        def.Visibility = Visibility.Protected;
                    }
                    else
                    {
                        def.Visibility = Visibility.Private;
                    }

                    if (item.Value != null)
                    {
                        if (phpValueTranslator == null)
                        {
                            phpValueTranslator = new PhpValueTranslator(_state);
                        }
                        def.ConstValue = phpValueTranslator.TransValue(item.Value);
                    }

                    phpClass.Fields.Add(def);
                    break;
                }

                default:
                    throw new NotSupportedException();
                }
            }
        }
Ejemplo n.º 5
0
        private void AppendCodeReq(PhpCodeModuleName req, PhpCodeModule current)
        {
            if (req == current.Name)
            {
                return;
            }
            if (req.Name == PhpCodeModuleName.CS2PHP_CONFIG_MODULE_NAME)
            {
                var phpModule = CurrentConfigModule();
                req = phpModule.Name;
            }

            if (req.AssemblyInfo != null && !string.IsNullOrEmpty(req.AssemblyInfo.IncludePathConstOrVarName))
            {
                var isCurrentAssembly = Info.CurrentAssembly == req.AssemblyInfo.Assembly;
                if (!isCurrentAssembly)
                {
                    var tmp = req.AssemblyInfo.IncludePathConstOrVarName;
                    if (tmp.StartsWith("$"))
                    {
                        throw new NotSupportedException();
                    }
                    // leading slash is not necessary -> config is in global namespace
                    // but full name is a key in dictionary
                    var phpModule = CurrentConfigModule();
                    if (phpModule.DefinedConsts.All(i => i.Key != tmp))
                    {
                        KnownConstInfo value;
                        if (Info.KnownConstsValues.TryGetValue(tmp, out value))
                        {
                            if (!value.UseFixedValue)
                            {
                                var expression = PathUtil.MakePathValueRelatedToFile(value, Info);
                                phpModule.DefinedConsts.Add(new KeyValuePair <string, IPhpValue>(tmp, expression));
                            }
                            else
                            {
                                throw new NotImplementedException();
                            }
                        }
                        else
                        {
                            Info.Log(MessageLevels.Error,
                                     string.Format("const {0} defined in {1} has no known value", tmp, phpModule.Name));
                            phpModule.DefinedConsts.Add(
                                new KeyValuePair <string, IPhpValue>(tmp, new PhpConstValue("UNKNOWN")));
                        }
                    }
                }
            }

            var fileNameExpression = req.MakeIncludePath(current.Name);

            if (fileNameExpression == null)
            {
                return;
            }
            if (current.RequiredFiles.Any())
            {
                var s    = new PhpEmitStyle();
                var code = fileNameExpression.GetPhpCode(s);
                var a    = current.RequiredFiles.Select(i => i.GetPhpCode(s)).ToArray();
                if (a.Any(i => i == code))
                {
                    return;
                }
            }

            // if (fileNameExpression1 !=null)
            {
                var fileNameExpressionICodeRelated = fileNameExpression as ICodeRelated;
                // scan nested requests
                var nestedCodeRequests = fileNameExpressionICodeRelated.GetCodeRequests().ToArray();
                if (nestedCodeRequests.Any())
                {
                    var nestedModuleCodeRequests = nestedCodeRequests.OfType <ModuleCodeRequest>();
                    foreach (var nested in nestedModuleCodeRequests)
                    {
                        AppendCodeReq(nested.ModuleName, current);
                    }
                }
            }
            current.RequiredFiles.Add(fileNameExpression);
        }