// 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); }
public void SetClassName(PhpQualifiedName className, MethodTranslationInfo translationInfo) { _className = className.MakeAbsolute(); _translationInfo = translationInfo; }
// 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; }
// 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) } } }
public void SetClassName(PyQualifiedName className, MethodTranslationInfo translationInfo) { _className = className.MakeAbsolute(); TranslationInfo = translationInfo; }
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); }