From 4608cc56c74d128b8cd1e12c9875f71e038a1ff5 Mon Sep 17 00:00:00 2001 From: Guillaume Smet Date: Wed, 12 Oct 2022 16:12:52 +0200 Subject: [PATCH] Fix JandexUtil#getBoxedTypeName() and move it to Qute extension --- .../quarkus/deployment/util/JandexUtil.java | 26 ----------- .../qute/deployment/QuteProcessor.java | 44 +++++++++++++++++-- 2 files changed, 40 insertions(+), 30 deletions(-) diff --git a/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java b/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java index 4d2d7e01e923d..694f1c79356e5 100644 --- a/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java +++ b/core/deployment/src/main/java/io/quarkus/deployment/util/JandexUtil.java @@ -350,32 +350,6 @@ public static boolean isSubclassOf(IndexView index, ClassInfo info, DotName pare return isSubclassOf(index, superClass, parentName); } - @SuppressWarnings("incomplete-switch") - public static String getBoxedTypeName(Type type) { - switch (type.kind()) { - case PRIMITIVE: - switch (type.asPrimitiveType().primitive()) { - case BOOLEAN: - return "java.lang.Boolean"; - case BYTE: - return "java.lang.Byte"; - case CHAR: - return "java.lang.Character"; - case DOUBLE: - return "java.lang.Double"; - case FLOAT: - return "java.lang.Float"; - case INT: - return "java.lang.Integer"; - case LONG: - return "java.lang.Long"; - case SHORT: - return "java.lang.Short"; - } - } - return type.toString(); - } - private static class ClassNotIndexedException extends RuntimeException { private final DotName dotName; diff --git a/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java b/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java index 54b5f68d3761e..262de9646fde2 100644 --- a/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java +++ b/extensions/qute/deployment/src/main/java/io/quarkus/qute/deployment/QuteProcessor.java @@ -85,7 +85,6 @@ import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem; import io.quarkus.deployment.builditem.nativeimage.ReflectiveClassBuildItem; import io.quarkus.deployment.pkg.builditem.CurateOutcomeBuildItem; -import io.quarkus.deployment.util.JandexUtil; import io.quarkus.fs.util.ZipUtils; import io.quarkus.gizmo.ClassOutput; import io.quarkus.maven.dependency.Dependency; @@ -368,7 +367,7 @@ && isNotLocatedByCustomTemplateLocator(locatorPatternsBuildItem.getLocationPatte throw new TemplateException("Parameter names not recorded for " + classInfo.name() + ": compile the class with -parameters"); } - bindings.put(name, JandexUtil.getBoxedTypeName(type)); + bindings.put(name, getCheckedTemplateParameterTypeName(type)); parameterNames.add(name); } AnnotationValue requireTypeSafeExpressions = annotation.value(CHECKED_TEMPLATE_REQUIRE_TYPE_SAFE); @@ -553,7 +552,7 @@ public Optional getVariant() { String name = MessageBundleProcessor.getParameterName(method, it.previousIndex()); msgBundleTemplateIdToParamDecl .computeIfAbsent(messageBundleMethod.getTemplateId(), s -> new HashMap<>()) - .put(name, new MethodParameterDeclaration(JandexUtil.getBoxedTypeName(paramType), name)); + .put(name, new MethodParameterDeclaration(getCheckedTemplateParameterTypeName(paramType), name)); } } @@ -568,7 +567,7 @@ public void beforeParsing(ParserHelper parserHelper) { // Set the bindings for globals first so that type-safe templates can override them for (TemplateGlobalBuildItem global : globals) { parserHelper.addParameter(global.getName(), - JandexUtil.getBoxedTypeName(global.getVariableType()).toString()); + getCheckedTemplateParameterTypeName(global.getVariableType()).toString()); } addMethodParamsToParserHelper(parserHelper, pathToPathWithoutSuffix.get(templateId), @@ -716,6 +715,43 @@ void validateCheckedFragments(List validatio } } + @SuppressWarnings("incomplete-switch") + private static String getCheckedTemplateParameterTypeName(Type type) { + switch (type.kind()) { + case PARAMETERIZED_TYPE: + return getCheckedTemplateParameterParameterizedTypeName((ParameterizedType) type); + case ARRAY: + // in the case of an array, we get back to using Type#toString() + // otherwise, we end up with java.lang.[I] for int[] + return type.toString(); + } + return type.name().toString(); + } + + private static String getCheckedTemplateParameterParameterizedTypeName(ParameterizedType parameterizedType) { + StringBuilder builder = new StringBuilder(); + + if (parameterizedType.owner() != null) { + builder.append(parameterizedType.owner().name()); + builder.append('.'); + builder.append(parameterizedType.name().local()); + } else { + builder.append(parameterizedType.name()); + } + + List arguments = parameterizedType.arguments(); + if (arguments.size() > 0) { + builder.append('<'); + builder.append(getCheckedTemplateParameterTypeName(arguments.get(0))); + for (int i = 1; i < arguments.size(); i++) { + builder.append(", ").append(getCheckedTemplateParameterTypeName(arguments.get(i))); + } + builder.append('>'); + } + + return builder.toString(); + } + private List mergeParamDeclarations(List parameterDeclarations, Map paramNameToDeclaration) { if (paramNameToDeclaration != null) {