[jOOQ/jOOQ#10812] Compilation error in KotlinGenerator generated code when <enumConverter/> flag is turned on

This commit is contained in:
Lukas Eder 2020-10-29 13:36:16 +01:00
parent 32966556b1
commit 65b97aed0e
3 changed files with 36 additions and 3 deletions

View File

@ -153,12 +153,10 @@ import org.jooq.meta.IndexDefinition;
import org.jooq.meta.JavaTypeResolver;
import org.jooq.meta.PackageDefinition;
import org.jooq.meta.ParameterDefinition;
import org.jooq.meta.PositionedDefinition;
import org.jooq.meta.RoutineDefinition;
import org.jooq.meta.SchemaDefinition;
import org.jooq.meta.SequenceDefinition;
import org.jooq.meta.TableDefinition;
import org.jooq.meta.TableElementDefinition;
import org.jooq.meta.TypedElementDefinition;
import org.jooq.meta.UDTDefinition;
import org.jooq.meta.UniqueKeyDefinition;
@ -8046,6 +8044,24 @@ public class JavaGenerator extends AbstractGenerator {
}
}
@Override
public String constructorCall(String type) {
String rawtype = type.replaceAll("<.*>", "").replaceAll("\\[.*\\]", "");
String typeParams = type.replace(rawtype, "");
switch (language) {
case SCALA:
return "new " + out.ref(rawtype) + typeParams.replace("<", "[").replace(">", "]");
case KOTLIN:
return out.ref(rawtype) + typeParams;
case JAVA:
default:
return "new " + out.ref(rawtype) + typeParams;
}
}
@Override
public String ref(String type) {
return out.ref(type);

View File

@ -153,6 +153,11 @@ public abstract class AbstractTypedElementDefinition<T extends Definition>
public String classLiteral(String type) {
return type + ".class";
}
@Override
public String constructorCall(String type) {
return "new " + type;
}
});
return type;
@ -252,7 +257,7 @@ public abstract class AbstractTypedElementDefinition<T extends Definition>
if (Boolean.TRUE.equals(customType.isEnumConverter()) ||
EnumConverter.class.getName().equals(customType.getConverter())) {
String tType = tType(db, resolver, definedType);
converter = "new " + EnumConverter.class.getName() + "<" + tType + ", " + uType + ">(" + resolver.classLiteral(tType) + ", " + resolver.classLiteral(uType) + ")";
converter = resolver.constructorCall(EnumConverter.class.getName() + "<" + resolver.ref(tType) + ", " + resolver.ref(uType) + ">") + "(" + resolver.classLiteral(tType) + ", " + resolver.classLiteral(uType) + ")";
}
else if (customType.getLambdaConverter() != null) {
LambdaConverter c = customType.getLambdaConverter();

View File

@ -65,6 +65,18 @@ public interface JavaTypeResolver {
*/
String classLiteral(String type);
/**
* Get a language dependent constructor call for a type.
* <p>
* <table>
* <tr><th>Language</th><th>Output for <code>String</code></th></tr>
* <tr><td>Java</td><td><code>new EnumConverter&lt;A, B&gt;</code></td></tr>
* <tr><td>Scala</td><td><code>new EnumConverter[A, B]</code></td></tr>
* <tr><td>Kotlin</td><td><code>EnumConverter&lt;A, B&gt;</code></td></tr>
* </table>
*/
String constructorCall(String type);
/**
* Get the unqualified type reference and add an import for the qualified
* type, if necessary.