From 6d91c8a2923fe70cb2dc84423050a0cd7f1f9ec7 Mon Sep 17 00:00:00 2001 From: Lukas Eder Date: Fri, 15 May 2020 16:08:00 +0200 Subject: [PATCH] [jOOQ/jOOQ#6248] Scratch that In / Out idea. It isn't sound. --- .../org/jooq/codegen/GeneratorWriter.java | 3 + .../java/org/jooq/codegen/JavaGenerator.java | 339 ++++++++---------- .../java/org/jooq/codegen/JavaWriter.java | 2 + 3 files changed, 152 insertions(+), 192 deletions(-) diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorWriter.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorWriter.java index b78f955327..9d83d8fa02 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/GeneratorWriter.java @@ -349,6 +349,9 @@ public abstract class GeneratorWriter> { } protected String beforeClose(String string) { + if (indentTabsAllLines > 0 && !Boolean.getBoolean("mute-indentation-error")) + new IllegalStateException("A formatting error has been produced by https://github.com/jOOQ/jOOQ/issues/10196").printStackTrace(System.err); + return string; } diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java index afcf047254..991106f626 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaGenerator.java @@ -2372,9 +2372,8 @@ public class JavaGenerator extends AbstractGenerator { else { // Static execute() convenience method - if (!routine.isAggregate()) { + if (!routine.isAggregate()) printConvenienceMethodFunction(out, routine, false); - } // Static asField() convenience method printConvenienceMethodFunctionAsField(out, routine, false); @@ -3051,9 +3050,8 @@ public class JavaGenerator extends AbstractGenerator { // Static execute() convenience method // [#457] This doesn't make any sense for user-defined aggregates - if (!routine.isAggregate()) { + if (!routine.isAggregate()) printConvenienceMethodFunction(out, routine, false); - } // Static asField() convenience method printConvenienceMethodFunctionAsField(out, routine, false); @@ -4232,7 +4230,7 @@ public class JavaGenerator extends AbstractGenerator { out.println("child: %s?,", Table.class, Record.class); out.println("path: %s?,", ForeignKey.class, Record.class, recordType); out.println("aliased: %s<%s>?,", Table.class, recordType); - out.println("parameters: %s<%s<*>>?", out.ref("Array"), Field.class); + out.println("parameters: Array<%s<*>?>?", Field.class); out.println("): %s<%s>(", TableImpl.class, recordType); out.println("alias,"); out.println("%s,", schemaId); @@ -4386,14 +4384,19 @@ public class JavaGenerator extends AbstractGenerator { out.println("this(alias, null, null, aliased, null)"); out.println("}"); + + // TODO: Add the private constructor being called from above! } else if (kotlin) { if (table.isTableValuedFunction()) - out.println("private constructor(alias: %s, aliased: %s<%s>?): this(alias, null, null, aliased, %s<%s<*>>(%s)) {", - Name.class, Table.class, recordType, out.ref("Array"), Field.class, table.getParameters().size()); + out.println("private constructor(alias: %s, aliased: %s<%s>?): this(alias, null, null, aliased, Array<%s<*>?>(%s) { null })", + Name.class, Table.class, recordType, Field.class, table.getParameters().size()); else out.println("private constructor(alias: %s, aliased: %s<%s>?): this(alias, null, null, aliased, null)", Name.class, Table.class, recordType); + + out.println("private constructor(alias: %s, aliased: %s<%s>?, parameters: Array<%s<*>?>?): this(alias, null, null, aliased, parameters)", + Name.class, Table.class, recordType, Field.class); } else { out.println("private %s(%s alias, %s<%s> aliased) {", className, Name.class, Table.class, recordType); @@ -5018,8 +5021,8 @@ public class JavaGenerator extends AbstractGenerator { out.javadoc("Call this table-valued function"); if (scala) { - out.print("def call("); - printParameterDeclarations(out, table, parametersAsField); + out.println("def call("); + printParameterDeclarations(out, table.getParameters(), parametersAsField, " "); out.println(") : %s = {", className); out.println("return new %s(%s.name(getName()), null, %s(", className, DSL.class, out.ref("scala.Array")); @@ -5044,11 +5047,30 @@ public class JavaGenerator extends AbstractGenerator { out.println("}"); } else if (kotlin) { - // TODO + out.println("fun call("); + printParameterDeclarations(out, table.getParameters(), parametersAsField, " "); + out.println("): %s = %s(%s.name(name), null, arrayOf(", className, className, DSL.class, Field.class); + + String separator = " "; + for (ParameterDefinition parameter : table.getParameters()) { + final String paramArgName = getStrategy().getJavaMemberName(parameter); + final String paramTypeRef = getJavaTypeReference(parameter.getDatabase(), parameter.getType(resolver())); + final List converter = out.ref(list(parameter.getType(resolver()).getConverter())); + final List binding = out.ref(list(parameter.getType(resolver()).getBinding())); + + if (parametersAsField) + out.println("%s%s", separator, paramArgName); + else + out.println("%s%s.value(%s, %s" + converterTemplateForTableValuedFunction(converter) + converterTemplateForTableValuedFunction(binding) + ")", separator, DSL.class, paramArgName, paramTypeRef, converter, binding); + + separator = ", "; + } + + out.println("))"); } else { - out.print("public %s call(", className); - printParameterDeclarations(out, table, parametersAsField); + out.println("public %s call(", className); + printParameterDeclarations(out, table.getParameters(), parametersAsField, " "); out.println(") {"); out.println("return new %s(%s.name(getName()), null, new %s[] {", className, DSL.class, Field.class); @@ -6072,48 +6094,6 @@ public class JavaGenerator extends AbstractGenerator { out.println("}").println(); } - if (kotlin) { - out.println("class In {"); - out.println("internal val delegate = %s()", className); - - for (ParameterDefinition parameter : routine.getInParameters()) { - final String paramTypeFull = getJavaType(parameter.getType(resolver())); - final String paramType = out.ref(paramTypeFull); - final String paramId = getStrategy().getJavaIdentifier(parameter); - final String paramArgName = getStrategy().getJavaMemberName(parameter); - - out.println(); - out.println("var %s: %s?", paramArgName, paramType); - out.tab(1).println("get() = delegate.get(%s)", paramId); - out.tab(1).println("set(value) { delegate.set(%s, value) }", paramId); - } - - out.println("}"); - out.println(); - - if (routine.getOutParameters().isEmpty()) { - out.println("object Out"); - } - else { - out.println("data class Out ("); - - String separator = " "; - for (ParameterDefinition parameter : routine.getOutParameters()) { - final String paramTypeFull = getJavaType(parameter.getType(resolver())); - final String paramType = out.ref(paramTypeFull); - final String paramArgName = getStrategy().getJavaMemberName(parameter); - - out.println("%sval %s: %s?", separator, paramArgName, paramType); - - separator = ", "; - } - - out.println(")"); - } - - out.println(); - } - if (scala) { out.println("{"); } @@ -6322,53 +6302,30 @@ public class JavaGenerator extends AbstractGenerator { // Do not generate separate convenience methods, if there are no IN // parameters. They would have the same signature and no additional // meaning - if (parametersAsField && function.getInParameters().isEmpty()) { + if (parametersAsField && function.getInParameters().isEmpty()) return; - } final String functionTypeFull = getJavaType(function.getReturnType(resolver())); final String functionType = out.ref(functionTypeFull); final String className = out.ref(getStrategy().getFullJavaClassName(function)); final String localVar = disambiguateJavaMemberName(function.getInParameters(), "f"); + final String methodName = getStrategy().getJavaMethodName(function, Mode.DEFAULT); if (!printDeprecationIfUnknownType(out, functionTypeFull) && !printDeprecationIfUnknownTypes(out, function.getInParameters())) out.javadoc("Get %s as a field.", function.getQualifiedOutputName()); if (scala) - out.print("def %s(", - getStrategy().getJavaMethodName(function, Mode.DEFAULT)); + out.println("def %s(", methodName); + else if (kotlin) + out.println("fun %s(", methodName); else - out.print("public static %s<%s> %s(", + out.println("public static %s<%s> %s(", function.isAggregate() ? AggregateFunction.class : Field.class, functionType, - getStrategy().getJavaMethodName(function, Mode.DEFAULT)); + methodName); - String separator = ""; - for (ParameterDefinition parameter : function.getInParameters()) { - out.print(separator); - - if (scala) { - out.print("%s : ", getStrategy().getJavaMemberName(parameter)); - - if (parametersAsField) { - out.print("%s[%s]", Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); - } else { - out.print(refNumberType(out, parameter.getType(resolver()))); - } - } - else { - if (parametersAsField) { - out.print("%s<%s>", Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); - } else { - out.print(refNumberType(out, parameter.getType(resolver()))); - } - - out.print(" %s", getStrategy().getJavaMemberName(parameter)); - } - - separator = ", "; - } + printParameterDeclarations(out, function.getInParameters(), parametersAsField, " "); if (scala) { out.println(") : %s[%s] = {", @@ -6376,6 +6333,12 @@ public class JavaGenerator extends AbstractGenerator { functionType); out.println("val %s = new %s", localVar, className); } + else if (kotlin) { + out.println("): %s<%s?> {", + function.isAggregate() ? AggregateFunction.class : Field.class, + functionType); + out.println("val %s = %s()", localVar, className); + } else { out.println(") {"); out.println("%s %s = new %s();", className, localVar, className); @@ -6385,7 +6348,7 @@ public class JavaGenerator extends AbstractGenerator { final String paramSetter = getStrategy().getJavaSetterName(parameter, Mode.DEFAULT); final String paramMember = getStrategy().getJavaMemberName(parameter); - if (scala) + if (scala || kotlin) out.println("%s.%s(%s)", localVar, paramSetter, paramMember); else out.println("%s.%s(%s);", localVar, paramSetter, paramMember); @@ -6395,13 +6358,15 @@ public class JavaGenerator extends AbstractGenerator { if (scala) out.println("return %s.as%s", localVar, function.isAggregate() ? "AggregateFunction" : "Field"); + else if (kotlin) + out.println("return %s.as%s()", localVar, function.isAggregate() ? "AggregateFunction" : "Field"); else out.println("return %s.as%s();", localVar, function.isAggregate() ? "AggregateFunction" : "Field"); out.println("}"); } - protected void printConvenienceMethodTableValuedFunctionAsField(JavaWriter out, TableDefinition function, boolean parametersAsField, String javaMethodName) { + protected void printConvenienceMethodTableValuedFunctionAsField(JavaWriter out, TableDefinition function, boolean parametersAsField, String methodName) { // [#281] - Java can't handle more than 255 method parameters if (function.getParameters().size() > 254) { log.warn("Too many parameters", "Function " + function + " has more than 254 in parameters. Skipping generation of convenience method."); @@ -6411,76 +6376,79 @@ public class JavaGenerator extends AbstractGenerator { // Do not generate separate convenience methods, if there are no IN // parameters. They would have the same signature and no additional // meaning - if (parametersAsField && function.getParameters().isEmpty()) { + if (parametersAsField && function.getParameters().isEmpty()) return; - } final String className = out.ref(getStrategy().getFullJavaClassName(function)); + // [#5765] To prevent name clashes, this identifier is not imported + final String functionIdentifier = getStrategy().getFullJavaIdentifier(function); + if (!printDeprecationIfUnknownTypes(out, function.getParameters())) out.javadoc("Get %s as a table.", function.getQualifiedOutputName()); if (scala) - out.print("def %s(", javaMethodName); + out.println("def %s(", methodName); + else if (kotlin) + out.println("fun %s(", methodName); else - out.print("public static %s %s(", className, javaMethodName); + out.println("public static %s %s(", className, methodName); - printParameterDeclarations(out, function, parametersAsField); + printParameterDeclarations(out, function.getParameters(), parametersAsField, " "); if (scala) { out.println(") : %s = {", className); - // [#5765] To prevent name clashes, this identifier is not imported - out.print("%s.call(", getStrategy().getFullJavaIdentifier(function)); + out.println("%s.call(", functionIdentifier); + } + else if (kotlin) { + out.println("): %s = %s.call(", className, functionIdentifier); } else { out.println(") {"); - // [#5765] To prevent name clashes, this identifier is not imported - out.print("return %s.call(", getStrategy().getFullJavaIdentifier(function)); + out.println("return %s.call(", functionIdentifier); } - String separator = ""; + String separator = " "; for (ParameterDefinition parameter : function.getParameters()) { - out.print(separator); - out.print("%s", getStrategy().getJavaMemberName(parameter)); + out.println("%s%s", separator, getStrategy().getJavaMemberName(parameter)); separator = ", "; } - if (scala) + if (scala || kotlin) out.println(")"); else out.println(");"); - out.println("}"); + if (kotlin) {} + else + out.println("}"); } - private void printParameterDeclarations(JavaWriter out, TableDefinition function, boolean parametersAsField) { - String sep1 = ""; - for (ParameterDefinition parameter : function.getParameters()) { - out.print(sep1); + private void printParameterDeclarations(JavaWriter out, List parameters, boolean parametersAsField, String separator) { + for (ParameterDefinition parameter : parameters) { + final String memberName = getStrategy().getJavaMemberName(parameter); if (scala) { - out.print("%s : ", getStrategy().getJavaMemberName(parameter)); - - if (parametersAsField) { - out.print("%s[%s]", Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); - } - else { - out.print(refNumberType(out, parameter.getType(resolver()))); - } + if (parametersAsField) + out.println("%s%s : %s[%s]", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); + else + out.println("%s%s : %s", separator, memberName, refNumberType(out, parameter.getType(resolver()))); + } + else if (kotlin) { + if (parametersAsField) + out.println("%s%s: %s<%s?>", separator, memberName, Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); + else + out.println("%s%s: %s?", separator, memberName, refNumberType(out, parameter.getType(resolver()))); } else { - if (parametersAsField) { - out.print("%s<%s>", Field.class, refExtendsNumberType(out, parameter.getType(resolver()))); - } - else { - out.print(refNumberType(out, parameter.getType(resolver()))); - } - - out.print(" %s", getStrategy().getJavaMemberName(parameter)); + if (parametersAsField) + out.println("%s%s<%s> %s", separator, Field.class, refExtendsNumberType(out, parameter.getType(resolver())), memberName); + else + out.println("%s%s %s", separator, refNumberType(out, parameter.getType(resolver())), memberName); } - sep1 = ", "; + separator = ", "; } } @@ -6523,41 +6491,51 @@ public class JavaGenerator extends AbstractGenerator { out.javadoc("Call %s", functionName); if (scala) - out.print("def %s(", methodName); + out.println("def %s(", methodName); + else if (kotlin) + out.println("fun %s(", methodName); else - out.print("public %s%s %s(", !instance ? "static " : "", functionType, methodName); + out.println("public %s%s %s(", !instance ? "static " : "", functionType, methodName); - String glue = ""; + String separator = " "; if (!instance) { if (scala) - out.print("%s : %s", configurationArgument, Configuration.class); + out.println("%s%s : %s", separator, configurationArgument, Configuration.class); + else if (kotlin) + out.println("%s%s: %s", separator, configurationArgument, Configuration.class); else - out.print("%s %s", Configuration.class, configurationArgument); + out.println("%s %s", separator, Configuration.class, configurationArgument); - glue = ", "; + separator = ", "; } for (ParameterDefinition parameter : function.getInParameters()) { + // Skip SELF parameter - if (instance && parameter.equals(function.getInParameters().get(0))) { + if (instance && parameter.equals(function.getInParameters().get(0))) continue; - } final String paramType = refNumberType(out, parameter.getType(resolver())); final String paramMember = getStrategy().getJavaMemberName(parameter); if (scala) - out.print("%s%s : %s", glue, paramMember, paramType); + out.print("%s%s : %s", separator, paramMember, paramType); + else if (kotlin) + out.print("%s%s: %s?", separator, paramMember, paramType); else - out.print("%s%s %s", glue, paramType, paramMember); + out.print("%s%s %s", separator, paramType, paramMember); - glue = ", "; + separator = ", "; } if (scala) { out.println(") : %s = {", functionType); out.println("val %s = new %s()", localVar, className); } + else if (kotlin) { + out.println("): %s? {", functionType); + out.println("val %s = %s()", localVar, className); + } else { out.println(") {"); out.println("%s %s = new %s();", className, localVar, className); @@ -6569,7 +6547,9 @@ public class JavaGenerator extends AbstractGenerator { ? "this" : getStrategy().getJavaMemberName(parameter); - if (scala) + if (scala || kotlin) + out.println("%s.%s(%s)", localVar, paramSetter, paramMember); + else if (kotlin) out.println("%s.%s(%s)", localVar, paramSetter, paramMember); else out.println("%s.%s(%s);", localVar, paramSetter, paramMember); @@ -6577,7 +6557,7 @@ public class JavaGenerator extends AbstractGenerator { out.println(); - if (scala) + if (scala || kotlin) out.println("%s.execute(%s)", localVar, instance ? "configuration()" : configurationArgument); else out.println("%s.execute(%s);", localVar, instance ? "configuration()" : configurationArgument); @@ -6587,6 +6567,8 @@ public class JavaGenerator extends AbstractGenerator { if (scala) out.println("%s.getReturnValue", localVar); + else if (kotlin) + out.println("return %s.returnValue", localVar); else out.println("return %s.getReturnValue();", localVar); @@ -6607,38 +6589,6 @@ public class JavaGenerator extends AbstractGenerator { final String methodName = getStrategy().getJavaMethodName(procedure, Mode.DEFAULT); final String firstOutParamType = outParams.size() == 1 ? out.ref(getJavaType(outParams.get(0).getType(resolver()))) : ""; - if (kotlin) { - if (!printDeprecationIfUnknownTypes(out, procedure.getAllParameters())) - out.javadoc("Call %s", procedure.getQualifiedOutputName()); - - out.println("fun %s(configuration: %s, params: %s.In.() -> Unit): %s.Out {", methodName, Configuration.class, className, className); - out.println("val i = %s.In()", className); - out.println("params(i)"); - out.println("i.delegate.execute(configuration)"); - out.println(); - - if (procedure.getOutParameters().isEmpty()) { - out.println("return %s.Out", className); - } - else { - out.println("return %s.Out(", className); - - String separator = " "; - for (ParameterDefinition parameter : procedure.getOutParameters()) { - final String paramArgName = getStrategy().getJavaMemberName(parameter); - final String paramGetter = getStrategy().getJavaGetterName(parameter); - - out.println("%s%s = i.delegate.%s()", separator, paramArgName, paramGetter); - - separator = ", "; - } - - out.println(")"); - } - - out.println("}"); - } - if (!printDeprecationIfUnknownTypes(out, procedure.getAllParameters())) out.javadoc("Call %s", procedure.getQualifiedOutputName()); @@ -6768,7 +6718,7 @@ public class JavaGenerator extends AbstractGenerator { out.println("}"); } - protected void printConvenienceMethodTableValuedFunction(JavaWriter out, TableDefinition function, String javaMethodName) { + protected void printConvenienceMethodTableValuedFunction(JavaWriter out, TableDefinition function, String methodName) { // [#281] - Java can't handle more than 255 method parameters if (function.getParameters().size() > 254) { log.warn("Too many parameters", "Function " + function + " has more than 254 in parameters. Skipping generation of convenience method."); @@ -6780,50 +6730,55 @@ public class JavaGenerator extends AbstractGenerator { // [#3456] Local variables should not collide with actual function arguments final String configurationArgument = disambiguateJavaMemberName(function.getParameters(), "configuration"); + // [#5765] To prevent name clashes, this identifier is not imported + final String functionName = getStrategy().getFullJavaIdentifier(function); + if (!printDeprecationIfUnknownTypes(out, function.getParameters())) out.javadoc("Call %s.", function.getQualifiedOutputName()); if (scala) - out.print("def %s(%s : %s", javaMethodName, configurationArgument, Configuration.class); + out.println("def %s(", methodName); + else if (kotlin) + out.println("fun %s(", methodName); else - out.print("public static %s<%s> %s(%s %s", Result.class, recordClassName, javaMethodName, Configuration.class, configurationArgument); + out.println("public static %s<%s> %s(", Result.class, recordClassName, methodName); - if (!function.getParameters().isEmpty()) - out.print(", "); + String separator = " "; + if (scala) + out.println("%s%s : %s", separator, configurationArgument, Configuration.class); + else if (kotlin) + out.println("%s%s: %s", separator, configurationArgument, Configuration.class); + else + out.println("%s%s %s", separator, Configuration.class, configurationArgument); - printParameterDeclarations(out, function, false); + printParameterDeclarations(out, function.getParameters(), false, ", "); if (scala) { - out.println("%s : %s[%s] = {", ")", Result.class, recordClassName); - out.print("%s.dsl().selectFrom(%s.call(", - configurationArgument, - // [#5765] To prevent name clashes, this identifier is not imported - getStrategy().getFullJavaIdentifier(function)); + out.println(") : %s[%s] = {", Result.class, recordClassName); + out.println("%s.dsl().selectFrom(%s.call(", configurationArgument, functionName); + } + else if (kotlin) { + out.println("): %s<%s> = %s.dsl().selectFrom(%s.call(", Result.class, recordClassName, configurationArgument, functionName); } else { - out.println("%s {", ")"); - out.print("return %s.dsl().selectFrom(%s.call(", - configurationArgument, - // [#5765] To prevent name clashes, this identifier is not imported - getStrategy().getFullJavaIdentifier(function)); + out.println(") {"); + out.println("return %s.dsl().selectFrom(%s.call(", configurationArgument, functionName); } - String separator = ""; + separator = " "; for (ParameterDefinition parameter : function.getParameters()) { - out.print(separator); - out.print("%s", getStrategy().getJavaMemberName(parameter)); + out.println("%s%s", separator, getStrategy().getJavaMemberName(parameter)); separator = ", "; } - out.print(")).fetch()"); - - if (scala) - out.println(); + if (scala || kotlin) + out.println(")).fetch()"); else - out.println(";"); + out.println(")).fetch();"); - out.println("}"); + if (!kotlin) + out.println("}"); } protected void printRecordTypeMethod(JavaWriter out, Definition definition) { diff --git a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java index 433ae360c1..dd52a74a41 100644 --- a/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java +++ b/jOOQ-codegen/src/main/java/org/jooq/codegen/JavaWriter.java @@ -175,6 +175,8 @@ public class JavaWriter extends GeneratorWriter { @Override protected String beforeClose(String string) { + string = super.beforeClose(string); + StringBuilder importString = new StringBuilder(); String pkg = "";