Refactor GenerateFunctions
Extract some methods && constants, inline some useless methods, replace PrintStream with PrintWriter, make some methods non-static
This commit is contained in:
@@ -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() {
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user