/* * Copyright 2013 Guidewire Software, Inc. */ package gw.plugin.ij.util.transform.java; import gw.plugin.ij.util.transform.java.Visitor.GosuVisitor; import com.sun.source.tree.*; import com.sun.tools.javac.api.JavacTaskImpl; import com.sun.tools.javac.api.JavacTool; import javax.tools.JavaCompiler; import javax.tools.StandardJavaFileManager; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; public class JavaToGosu { public static String ConvertString(String JavaSource) { Wrap[] wraps = new Wrap[]{ new Wrap("", "", "", ""), new Wrap("class _JAVA_TO_GOSU_INTERNAL_ {", "\n}", "class _JAVA_TO_GOSU_INTERNAL_ {\n\n", "\n}\n"), new Wrap("class _JAVA_TO_GOSU_INTERNAL_ { void _JAVA_TO_GOSU_INTERNAL_METHOD_() {", "\n}}", "class _JAVA_TO_GOSU_INTERNAL_ {\n\n function _JAVA_TO_GOSU_INTERNAL_METHOD_() : void {\n", "\n }\n\n}\n"), new Wrap("class _JAVA_TO_GOSU_INTERNAL_ { void _JAVA_TO_GOSU_INTERNAL_METHOD_() {", ";\n}}", "class _JAVA_TO_GOSU_INTERNAL_ {\n\n function _JAVA_TO_GOSU_INTERNAL_METHOD_() : void {\n", "\n }\n\n}\n"), new Wrap("class _JAVA_TO_GOSU_INTERNAL_ { void _JAVA_TO_GOSU_INTERNAL_METHOD_() { if(", ");\n}}", "class _JAVA_TO_GOSU_INTERNAL_ {\n\n function _JAVA_TO_GOSU_INTERNAL_METHOD_() : void {\n if (", ") {\n \n }\n }\n\n}\n") }; String JAVA_WRAP_START = ""; String JAVA_WRAP_END = ""; String GOSU_WRAP_START = ""; String GOSU_WRAP_END = ""; List<CompilationUnitTree> trees = null; boolean parsed = false; String output = null; int i = wraps.length - 1; while (i >= 0 && !parsed) { JAVA_WRAP_START = wraps[i].JAVA_WRAP_START; JAVA_WRAP_END = wraps[i].JAVA_WRAP_END; GOSU_WRAP_START = wraps[i].GOSU_WRAP_START; GOSU_WRAP_END = wraps[i].GOSU_WRAP_END; trees = new ArrayList<CompilationUnitTree>(); String src = JAVA_WRAP_START + JavaSource + JAVA_WRAP_END; parsed = parseJava(trees, src); i--; } if (!parsed) { return ""; } GosuVisitor visitor = new GosuVisitor(2); for (CompilationUnitTree tree : trees) { tree.accept(visitor, null); } output = visitor.getOutput().toString(); if (!JAVA_WRAP_START.isEmpty()) { int b = output.indexOf(GOSU_WRAP_START) + GOSU_WRAP_START.length(); int e = output.lastIndexOf(GOSU_WRAP_END); output = unIndent(output.substring(b, e)); } return output; } private static String unIndent(String output) { StringBuilder src = new StringBuilder(); String[] lines = output.split("\n"); int tab = 0; char[] chars = lines[0].toCharArray(); while(tab < chars.length && chars[tab] == ' ') { tab++; } for (String line : lines) { if(!line.trim().isEmpty()) { if(line.length() > tab && line.substring(0, tab).trim().isEmpty()) { src.append(line.substring(tab)); } else { src.append(line); } src.append("\n"); } } return src.toString(); } private static boolean parseJava(List<CompilationUnitTree> trees, String src) { JavaCompiler compiler = JavacTool.create(); StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null); boolean success = true; ArrayList<JavaStringObject> javaStringObjects = new ArrayList<JavaStringObject>(); javaStringObjects.add(new JavaStringObject(src)); StringWriter errors = new StringWriter(); JavaCompiler.CompilationTask task = compiler.getTask(errors, fileManager, null, null, null, javaStringObjects ); JavacTaskImpl javacTask = (JavacTaskImpl) task; try { Iterable<? extends CompilationUnitTree> iterable = javacTask.parse(); for (CompilationUnitTree x : iterable) { trees.add(x); } fileManager.close(); } catch (IOException e) { success = false; } if (!errors.toString().isEmpty()) { success = false; } return success; } }