Refactor GenerateFunctions

Extract some methods && constants, inline some useless methods, replace
PrintStream with PrintWriter, make some methods non-static
This commit is contained in:
Alexander Udalov
2013-03-26 17:50:20 +04:00
parent dac0d77e90
commit b343e94ea5
@@ -22,25 +22,37 @@ import org.jetbrains.jet.utils.ExceptionUtils;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintWriter;
public class GenerateFunctions { public class GenerateFunctions {
private static final int MAX_PARAM_COUNT = 22; public static final int MAX_PARAM_COUNT = 22;
public static final File JET_SRC_DIR = new File("compiler/frontend/src/jet/");
public static final File RUNTIME_SRC_DIR = new File("runtime/src/jet/");
private final PrintWriter out;
private final FunctionKind kind;
private GenerateFunctions(PrintWriter out, FunctionKind kind) {
this.out = out;
this.kind = kind;
}
private enum FunctionKind { private enum FunctionKind {
FUNCTION("Functions.jet", "Function", false), FUNCTION("Function", false),
EXTENSION_FUNCTION("ExtensionFunctions.jet", "ExtensionFunction", true); EXTENSION_FUNCTION("ExtensionFunction", true);
private final String fileName;
private final String classNamePrefix; private final String classNamePrefix;
private final boolean hasReceiverParameter; private final boolean hasReceiverParameter;
private FunctionKind(String fileName, String classNamePrefix, boolean hasReceiverParameter) { private FunctionKind(String classNamePrefix, boolean hasReceiverParameter) {
this.fileName = fileName;
this.classNamePrefix = classNamePrefix; this.classNamePrefix = classNamePrefix;
this.hasReceiverParameter = hasReceiverParameter; this.hasReceiverParameter = hasReceiverParameter;
} }
public String getJetFileName() {
return classNamePrefix + "s.jet";
}
public String getClassName(int i) { public String getClassName(int i) {
return classNamePrefix + i; return classNamePrefix + i;
} }
@@ -50,42 +62,43 @@ public class GenerateFunctions {
} }
} }
private static void generateBuiltInFunctions(PrintStream out, int count, FunctionKind kind) { private void generateBuiltInFunctions() {
generated(out); generated();
for (int i = 0; i <= count; i++) { for (int i = 0; i <= MAX_PARAM_COUNT; i++) {
out.print("public trait " + kind.getClassName(i)); out.print("public trait " + kind.getClassName(i));
out.print("<"); generateTypeParameters(i, true);
if (kind.hasReceiverParameter) { out.println(" {");
out.print("in T, "); generateKotlinInvokeSignature(i);
}
for (int j = 1; j <= i; j++) {
out.print("in P" + j + ", ");
}
out.print("out R> {");
out.println();
out.print(" public fun " + (kind.hasReceiverParameter ? "T." : "") + "invoke(");
for (int j = 1; j <= i; j++) {
out.print("p" + j + ": " + "P" + j);
if (j < i) {
out.print(", ");
}
}
out.print(") : R");
out.println();
out.println("}"); out.println("}");
} }
} }
private static void generateRuntimeFunction(PrintStream out, int i, FunctionKind kind) { private void generateKotlinInvokeSignature(int i) {
generateRuntimeClassHeader(out); out.print(" public fun " + (kind.hasReceiverParameter ? "T." : "") + "invoke(");
for (int j = 1; j <= i; j++) {
out.print("p" + j + ": " + "P" + j);
if (j < i) {
out.print(", ");
}
}
out.println(") : R");
}
private void generateRuntimeFunction(int i) {
generateRuntimeClassHeader();
out.println("import org.jetbrains.jet.rt.annotation.AssertInvisibleInResolver;"); out.println("import org.jetbrains.jet.rt.annotation.AssertInvisibleInResolver;");
out.println(); out.println();
out.println("@AssertInvisibleInResolver"); out.println("@AssertInvisibleInResolver");
out.print("public interface " + kind.getClassName(i)); out.print("public interface " + kind.getClassName(i));
generateTypeParameters(out, i, kind); generateTypeParameters(i, false);
out.println(" {"); out.println(" {");
generateJavaInvokeSignature(i);
out.println("}");
}
private void generateJavaInvokeSignature(int i) {
out.print(" R invoke("); out.print(" R invoke(");
if (kind.hasReceiverParameter) { if (kind.hasReceiverParameter) {
out.print("T receiver"); out.print("T receiver");
@@ -100,41 +113,43 @@ public class GenerateFunctions {
} }
} }
out.println(");"); out.println(");");
out.println("}");
} }
private static void generateTypeParameters(PrintStream out, int i, FunctionKind kind) { private void generateTypeParameters(int i, boolean kotlinVariance) {
out.print("<"); out.print("<");
if (kind.hasReceiverParameter) { if (kind.hasReceiverParameter) {
if (kotlinVariance) out.print("in ");
out.print("T, "); out.print("T, ");
} }
for (int j = 1; j <= i; j++) { for (int j = 1; j <= i; j++) {
if (kotlinVariance) out.print("in ");
out.print("P" + j + ", "); out.print("P" + j + ", ");
} }
if (kotlinVariance) out.print("out ");
out.print("R>"); out.print("R>");
} }
private static void generateRuntimeFunctionImpl(PrintStream out, int i, FunctionKind kind) { private void generateRuntimeFunctionImpl(int i) {
generateRuntimeClassHeader(out); generateRuntimeClassHeader();
out.print("public abstract class " + kind.getImplClassName(i)); out.print("public abstract class " + kind.getImplClassName(i));
generateTypeParameters(out, i, kind); generateTypeParameters(i, false);
out.print(" extends DefaultJetObject"); out.print(" extends DefaultJetObject");
out.print(" implements " + kind.getClassName(i)); out.print(" implements " + kind.getClassName(i));
generateTypeParameters(out, i, kind); generateTypeParameters(i, false);
out.println(" {"); out.println(" {");
generateToStringForFunctionImpl(out); generateToStringForFunctionImpl();
out.println("}"); out.println("}");
} }
private static void generateToStringForFunctionImpl(PrintStream out) { private void generateToStringForFunctionImpl() {
out.println(" @Override"); out.println(" @Override");
out.println(" public String toString() {"); out.println(" public String toString() {");
out.println(" return getClass().getGenericSuperclass().toString();"); out.println(" return getClass().getGenericSuperclass().toString();");
out.println(" }"); out.println(" }");
} }
private static void generateRuntimeClassHeader(PrintStream out) { private void generateRuntimeClassHeader() {
try { try {
out.println(FileUtil.loadFile(new File("injector-generator/copyright.txt"))); out.println(FileUtil.loadFile(new File("injector-generator/copyright.txt")));
} }
@@ -145,46 +160,31 @@ public class GenerateFunctions {
out.println(); out.println();
} }
private static void generated(PrintStream out) { private void generated() {
out.println("// Generated by " + GenerateFunctions.class.getName()); out.println("// Generated by " + GenerateFunctions.class.getName());
out.println(); out.println();
out.println("package jet"); out.println("package jet");
out.println(); out.println();
} }
private static void generateBuiltInClasses() throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
File baseDir = new File("compiler/frontend/src/jet/"); assert JET_SRC_DIR.exists() : "jet.* src dir does not exist: " + JET_SRC_DIR.getAbsolutePath();
assert baseDir.exists() : "Base dir does not exist: " + baseDir.getAbsolutePath(); assert RUNTIME_SRC_DIR.exists() : "Runtime src dir does not exist: " + RUNTIME_SRC_DIR.getAbsolutePath();
for (FunctionKind kind : FunctionKind.values()) { for (FunctionKind kind : FunctionKind.values()) {
PrintStream functions = new PrintStream(new File(baseDir, kind.fileName)); PrintWriter functions = new PrintWriter(new File(JET_SRC_DIR, kind.getJetFileName()));
generateBuiltInFunctions(functions, MAX_PARAM_COUNT, kind); new GenerateFunctions(functions, kind).generateBuiltInFunctions();
functions.close(); functions.close();
}
}
private static void generateRuntimeClasses() throws FileNotFoundException {
File baseDir = new File("runtime/src/jet/");
assert baseDir.exists() : "Base dir does not exist: " + baseDir.getAbsolutePath();
for (FunctionKind kind : FunctionKind.values()) {
for (int i = 0; i <= MAX_PARAM_COUNT; i++) { for (int i = 0; i <= MAX_PARAM_COUNT; i++) {
PrintStream function = new PrintStream(new File(baseDir, kind.getClassName(i) + ".java")); PrintWriter function = new PrintWriter(new File(RUNTIME_SRC_DIR, kind.getClassName(i) + ".java"));
generateRuntimeFunction(function, i, kind); new GenerateFunctions(function, kind).generateRuntimeFunction(i);
function.close(); function.close();
PrintStream functionImpl = new PrintStream(new File(baseDir, kind.getImplClassName(i) + ".java")); PrintWriter functionImpl = new PrintWriter(new File(RUNTIME_SRC_DIR, kind.getImplClassName(i) + ".java"));
generateRuntimeFunctionImpl(functionImpl, i, kind); new GenerateFunctions(functionImpl, kind).generateRuntimeFunctionImpl(i);
functionImpl.close(); functionImpl.close();
} }
} }
} }
public static void main(String[] args) throws FileNotFoundException {
generateBuiltInClasses();
generateRuntimeClasses();
}
private GenerateFunctions() {
}
} }