private void OrganizeImports(JCompilationUnit unit) { var imports = new HashSet <ITypeDefinition>(); foreach (var ce in unit.Declarations) { foreach (var node in unit.Descendants <JMemberExpression>().ToList()) { var prevMember = node.PreviousMember as JMemberExpression; if (prevMember != null && prevMember.TypeRef != null) { //cleanup type name when invoking static method on same type if (node.TypeRef != null) { continue; } var typeDef2 = ((JMemberExpression)node.PreviousMember).TypeRef.GetDefinition(); if (typeDef2 == null) { continue; } if (typeDef2 == ce.TypeDefinition) { node.PreviousMember = null; } continue; } else if (node.TypeRef != null) { //cleanup type name and add to import var typeDef = node.TypeRef.GetDefinition(); if (typeDef == null) { continue; } node.PreviousMember = null; if (typeDef.IsKnownType(KnownTypeCode.Object) || typeDef.Namespace == "java.lang") { continue; } imports.Add(typeDef); } } } var x = imports.Select(t => t.JAccessStatic()).Where(t => !t.IsWildcardArg()).ToList(); var xx = x.Select(t => new { Type = t, Code = t.ToJs() }).ToList(); xx = xx.OrderBy(t => t.Code).Distinct(t => t.Code).ToList(); foreach (var node in xx) { unit.Imports.Add(new JImport { Type = node.Type }); } }
void ConvertCsToJs() { TriggerEvent(BeforeConvertCsToJs); JsModelImporter = new JModelImporter { Compiler = this, Project = Project, Log = Log, ExternalMetadata = CsExternalMetadata, AssemblyName = Args.AssemblyName, BeforeExportTypes = byFile => { var list = new List <ITypeDefinition>(); foreach (var list2 in byFile.Values) { list.AddRange(list2); } var skFiles = Project.GetNFiles(list); Project.ApplyNavigator(skFiles); } }; JsModelImporter.ConfigureJsTypeImporter += new Action <JTypeImporter>(JsModelImporter_ConfigureJsTypeImporter); var att = JMeta.GetJsExportAttribute(Project.Compilation.MainAssembly); if (att != null) { JsModelImporter.ExportComments = att.ExportComments; } JsModelImporter.Process(); SkJsFiles = new List <JFileWrapper>(); foreach (var group in JsModelImporter.ExportedTypes.GroupBy(t => GetJFilename(t.Type))) { var file = new JFileWrapper { JsFile = new JFile { Filename = group.Key }, Compiler = this, }; foreach (var et in group) { var unit = new JCompilationUnit { PackageName = et.Type.GetPackageName(), Declarations = { et.ClassDeclaration } }; file.JsFile.Units.Add(unit); SkJsFiles.Add(file); } } TriggerEvent(AfterConvertCsToJs); }
private void FixMultiStatements(JCompilationUnit unit) { JNode parent = unit; FixMultiStatements(parent); }
private void Cleanup(JCompilationUnit unit) { FixMultiStatements(unit); OrganizeImports(unit); }