KT-871 Add main function to generated code
This commit is contained in:
@@ -14,6 +14,7 @@ import org.jetbrains.jet.j2k.visitors.*;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
import static org.jetbrains.jet.j2k.ConverterUtil.createMainFunction;
|
||||
import static org.jetbrains.jet.j2k.visitors.TypeVisitor.*;
|
||||
|
||||
/**
|
||||
@@ -58,17 +59,21 @@ public class Converter {
|
||||
|
||||
@NotNull
|
||||
public static File fileToFile(@NotNull PsiJavaFile javaFile) {
|
||||
final PsiImportList importList = javaFile.getImportList();
|
||||
List<Import> imports = importList == null ? Collections.<Import>emptyList() : importsToImportList(importList.getAllImportStatements());
|
||||
return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()));
|
||||
return fileToFile(javaFile, Collections.<String>emptyList());
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static File fileToFileWithCompatibilityImport(@NotNull PsiJavaFile javaFile) {
|
||||
return fileToFile(javaFile, Collections.singletonList("std.compatibility.*"));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static File fileToFile(PsiJavaFile javaFile, List<String> additionalImports) {
|
||||
final PsiImportList importList = javaFile.getImportList();
|
||||
List<Import> imports = importList == null ? Collections.<Import>emptyList() : importsToImportList(importList.getAllImportStatements());
|
||||
imports.add(new Import("std.compatibility.*"));
|
||||
return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()));
|
||||
for (String i : additionalImports)
|
||||
imports.add(new Import(i));
|
||||
return new File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()), createMainFunction(javaFile));
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
package org.jetbrains.jet.j2k;
|
||||
|
||||
import com.intellij.openapi.util.Pair;
|
||||
import com.intellij.psi.*;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.text.MessageFormat;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* @author ignatov
|
||||
*/
|
||||
public class ConverterUtil {
|
||||
private ConverterUtil() {
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public static String createMainFunction(@NotNull PsiFile file) {
|
||||
List<Pair<String, PsiMethod>> classNamesWithMains = new LinkedList<Pair<String, PsiMethod>>();
|
||||
|
||||
for (PsiClass c : ((PsiJavaFile) file).getClasses()) {
|
||||
PsiMethod main = findMainMethod(c);
|
||||
if (main != null) {
|
||||
classNamesWithMains.add(new Pair<String, PsiMethod>(c.getName(), main));
|
||||
}
|
||||
}
|
||||
if (classNamesWithMains.size() > 0) {
|
||||
String className = classNamesWithMains.get(0).getFirst();
|
||||
return MessageFormat.format("fun main(args : Array<String?>?) = {0}.main(args)", className);
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiMethod findMainMethod(@NotNull PsiClass aClass) {
|
||||
if (isMainClass(aClass)) {
|
||||
final PsiMethod[] mainMethods = aClass.findMethodsByName("main", false);
|
||||
return findMainMethod(mainMethods);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiMethod findMainMethod(@NotNull PsiMethod[] mainMethods) {
|
||||
for (PsiMethod mainMethod : mainMethods) {
|
||||
if (isMainMethod(mainMethod)) return mainMethod;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static boolean isMainClass(@NotNull PsiClass psiClass) {
|
||||
if (psiClass instanceof PsiAnonymousClass) return false;
|
||||
if (psiClass.isInterface()) return false;
|
||||
return psiClass.getContainingClass() == null || psiClass.hasModifierProperty(PsiModifier.STATIC);
|
||||
}
|
||||
|
||||
public static boolean isMainMethod(@Nullable PsiMethod method) {
|
||||
if (method == null || method.getContainingClass() == null) return false;
|
||||
if (PsiType.VOID != method.getReturnType()) return false;
|
||||
if (!method.hasModifierProperty(PsiModifier.STATIC)) return false;
|
||||
if (!method.hasModifierProperty(PsiModifier.PUBLIC)) return false;
|
||||
final PsiParameter[] parameters = method.getParameterList().getParameters();
|
||||
if (parameters.length != 1) return false;
|
||||
final PsiType type = parameters[0].getType();
|
||||
if (!(type instanceof PsiArrayType)) return false;
|
||||
final PsiType componentType = ((PsiArrayType) type).getComponentType();
|
||||
return componentType.equalsToText("java.lang.String");
|
||||
}
|
||||
}
|
||||
@@ -12,17 +12,19 @@ public class File extends Node {
|
||||
private final String myPackageName;
|
||||
private final List<Import> myImports;
|
||||
private final List<Class> myClasses;
|
||||
private final String myMainFunction;
|
||||
|
||||
public File(String packageName, List<Import> imports, List<Class> classes) {
|
||||
public File(String packageName, List<Import> imports, List<Class> classes, String mainFunction) {
|
||||
myPackageName = packageName;
|
||||
myImports = imports;
|
||||
myClasses = classes;
|
||||
myMainFunction = mainFunction;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public String toKotlin() {
|
||||
final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N;
|
||||
final String common = AstUtil.joinNodes(myImports, N) + N2 + AstUtil.joinNodes(myClasses, N) + N + myMainFunction;
|
||||
if (myPackageName.isEmpty())
|
||||
return common;
|
||||
return "package" + SPACE + myPackageName + N +
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package demo;
|
||||
|
||||
class Program {
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Halo!");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package demo
|
||||
open class Program() {
|
||||
class object {
|
||||
open public fun main(args : Array<String?>?) : Unit {
|
||||
System.out?.println("Halo!")
|
||||
}
|
||||
}
|
||||
}
|
||||
fun main(args : Array<String?>?) = Program.main(args)
|
||||
@@ -84,4 +84,5 @@ open public fun main(args : Array<String?>?) : Unit {
|
||||
for (i in 1..12) test(i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fun main(args : Array<String?>?) = SwitchDemo.main(args)
|
||||
@@ -15,4 +15,5 @@ monthString = "Invalid month"
|
||||
System.out?.println(monthString)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fun main(args : Array<String?>?) = SwitchDemo.main(args)
|
||||
@@ -48,4 +48,5 @@ monthString = "Invalid month"
|
||||
System.out?.println(monthString)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
fun main(args : Array<String?>?) = SwitchDemo.main(args)
|
||||
Reference in New Issue
Block a user