KT-871 Add main function to generated code

This commit is contained in:
ignatov
2011-12-26 14:05:46 +04:00
parent 2706eaef7d
commit 4f9011509c
8 changed files with 107 additions and 10 deletions
+10 -5
View File
@@ -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");
}
}
+4 -2
View File
@@ -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 +
+7
View File
@@ -0,0 +1,7 @@
package demo;
class Program {
public static void main(String[] args) {
System.out.println("Halo!");
}
}
+9
View File
@@ -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)
+2 -1
View File
@@ -15,4 +15,5 @@ monthString = "Invalid month"
System.out?.println(monthString)
}
}
}
}
fun main(args : Array<String?>?) = SwitchDemo.main(args)
+2 -1
View File
@@ -48,4 +48,5 @@ monthString = "Invalid month"
System.out?.println(monthString)
}
}
}
}
fun main(args : Array<String?>?) = SwitchDemo.main(args)