From 8be383305b8cd768a34890b0e0e27b2663fc13b7 Mon Sep 17 00:00:00 2001 From: homedirectory Date: Wed, 7 Feb 2024 19:52:44 +0200 Subject: [PATCH] Ensure that keywords aren't used for variable names This corrects the generation of variable names corresponding to terminal parameters, such as Class or Enum. Previous implementation could erronously generate code such as: `java.lang.Enum enum = ...;` or `Type method(Class class)` --- .../grammar/types/ClassParameter.java | 20 ++++++------------- .../technion/cs/fling/namers/NaiveNamer.java | 8 ++++++++ 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/java/il/ac/technion/cs/fling/internal/grammar/types/ClassParameter.java b/src/main/java/il/ac/technion/cs/fling/internal/grammar/types/ClassParameter.java index 409f3010..f4fa42da 100644 --- a/src/main/java/il/ac/technion/cs/fling/internal/grammar/types/ClassParameter.java +++ b/src/main/java/il/ac/technion/cs/fling/internal/grammar/types/ClassParameter.java @@ -1,6 +1,8 @@ package il.ac.technion.cs.fling.internal.grammar.types; + +import static il.ac.technion.cs.fling.namers.NaiveNamer.lowerCamelCase; +import static il.ac.technion.cs.fling.namers.NaiveNamer.unreservedName; import static java.util.Objects.requireNonNull; -import il.ac.technion.cs.fling.namers.NaiveNamer; // TODO allow primitive types. public class ClassParameter implements StringTypeParameter { public final Class parameterClass; @@ -11,7 +13,9 @@ public ClassParameter(final Class parameterClass) { return parameterClass.getCanonicalName(); } @Override public String baseParameterName() { - return unPrimitiveTypeSimple(NaiveNamer.lowerCamelCase(parameterClass.getSimpleName())); + if (parameterClass.isPrimitive()) + return parameterClass.getSimpleName().substring(0, 1); + return unreservedName(lowerCamelCase(parameterClass.getSimpleName())); } @Override public int hashCode() { return parameterClass.hashCode(); @@ -39,16 +43,4 @@ public static String unPrimitiveType(final String typeName) { void.class.getName().equals(typeName) ? Void.class.getCanonicalName() : // typeName; } - public static String unPrimitiveTypeSimple(final String typeName) { - return byte.class.getName().equals(typeName) ? "b" : // - short.class.getName().equals(typeName) ? "s" : // - int.class.getName().equals(typeName) ? "i" : // - long.class.getName().equals(typeName) ? "l" : // - float.class.getName().equals(typeName) ? "f" : // - double.class.getName().equals(typeName) ? "d" : // - boolean.class.getName().equals(typeName) ? "b" : // - char.class.getName().equals(typeName) ? "c" : // - void.class.getName().equals(typeName) ? "v" : // - typeName; - } } diff --git a/src/main/java/il/ac/technion/cs/fling/namers/NaiveNamer.java b/src/main/java/il/ac/technion/cs/fling/namers/NaiveNamer.java index a85b3b76..e33e438c 100644 --- a/src/main/java/il/ac/technion/cs/fling/namers/NaiveNamer.java +++ b/src/main/java/il/ac/technion/cs/fling/namers/NaiveNamer.java @@ -23,6 +23,9 @@ import il.ac.technion.cs.fling.internal.grammar.rules.Component; import il.ac.technion.cs.fling.internal.grammar.rules.Constants; import il.ac.technion.cs.fling.internal.grammar.rules.Variable; + +import javax.lang.model.SourceVersion; + public class NaiveNamer implements Namer { private final Map astChildrenCounter = new HashMap<>(); private final Map notationsChildrenCounter = new HashMap<>(); @@ -168,6 +171,11 @@ public static String getNameFromBase(final String baseName, final Map