Skip to content

Commit 58bcf53

Browse files
SUPERCILEXsjudd
authored andcommitted
Give generated code meaningful parameter names (#2970)
* Give generated code meaningful parameter names Signed-off-by: Alex Saveau <saveau.alexandre@gmail.com>
1 parent 5212e95 commit 58bcf53

File tree

40 files changed

+3193
-3068
lines changed

40 files changed

+3193
-3068
lines changed

annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/GlideGenerator.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.squareup.javapoet.ClassName;
99
import com.squareup.javapoet.MethodSpec;
1010
import com.squareup.javapoet.MethodSpec.Builder;
11+
import com.squareup.javapoet.ParameterSpec;
1112
import com.squareup.javapoet.TypeSpec;
1213
import java.util.ArrayList;
1314
import java.util.List;
@@ -16,7 +17,6 @@
1617
import javax.lang.model.element.ExecutableElement;
1718
import javax.lang.model.element.Modifier;
1819
import javax.lang.model.element.TypeElement;
19-
import javax.lang.model.element.VariableElement;
2020
import javax.lang.model.util.Elements;
2121

2222
/**
@@ -138,7 +138,7 @@ public MethodSpec apply(ExecutableElement input) {
138138
}
139139

140140
private MethodSpec overrideGlideStaticMethod(ExecutableElement methodToOverride) {
141-
List<? extends VariableElement> parameters = methodToOverride.getParameters();
141+
List<ParameterSpec> parameters = ProcessorUtil.getParameters(methodToOverride);
142142

143143
TypeElement element =
144144
(TypeElement) processingEnv.getTypeUtils().asElement(methodToOverride.getReturnType());
@@ -147,7 +147,7 @@ private MethodSpec overrideGlideStaticMethod(ExecutableElement methodToOverride)
147147
MethodSpec.methodBuilder(methodToOverride.getSimpleName().toString())
148148
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
149149
.addJavadoc(processorUtil.generateSeeMethodJavadoc(methodToOverride))
150-
.addParameters(ProcessorUtil.getParameters(methodToOverride));
150+
.addParameters(parameters);
151151

152152
addReturnAnnotations(builder, methodToOverride);
153153

@@ -162,9 +162,9 @@ private MethodSpec overrideGlideStaticMethod(ExecutableElement methodToOverride)
162162
args.add(ClassName.get(glideType));
163163
args.add(methodToOverride.getSimpleName());
164164
if (!parameters.isEmpty()) {
165-
for (VariableElement param : parameters) {
165+
for (ParameterSpec param : parameters) {
166166
code.append("$L, ");
167-
args.add(param.getSimpleName());
167+
args.add(param.name);
168168
}
169169
code = new StringBuilder(code.substring(0, code.length() - 2));
170170
}
@@ -210,20 +210,20 @@ private MethodSpec overrideGlideWithMethod(
210210
String packageName, TypeSpec generatedRequestManager, ExecutableElement methodToOverride) {
211211
ClassName generatedRequestManagerClassName =
212212
ClassName.get(packageName, generatedRequestManager.name);
213-
List<? extends VariableElement> parameters = methodToOverride.getParameters();
213+
List<ParameterSpec> parameters = ProcessorUtil.getParameters(methodToOverride);
214214
Preconditions.checkArgument(
215215
parameters.size() == 1, "Expected size of 1, but got %s", methodToOverride);
216-
VariableElement parameter = parameters.iterator().next();
216+
ParameterSpec parameter = parameters.iterator().next();
217217

218218
Builder builder = MethodSpec.methodBuilder(methodToOverride.getSimpleName().toString())
219219
.addModifiers(Modifier.PUBLIC, Modifier.STATIC)
220220
.addJavadoc(processorUtil.generateSeeMethodJavadoc(methodToOverride))
221-
.addParameters(ProcessorUtil.getParameters(methodToOverride))
221+
.addParameters(parameters)
222222
.returns(generatedRequestManagerClassName)
223223
.addStatement("return ($T) $T.$N($L)",
224224
generatedRequestManagerClassName, glideType,
225225
methodToOverride.getSimpleName().toString(),
226-
parameter.getSimpleName());
226+
parameter.name);
227227

228228
return addReturnAnnotations(builder, methodToOverride).build();
229229
}

annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/ProcessorUtil.java

+114-13
Original file line numberDiff line numberDiff line change
@@ -256,15 +256,15 @@ void warnLog(String toLog) {
256256
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, toLog);
257257
}
258258

259-
static CodeBlock generateCastingSuperCall(TypeName toReturn, ExecutableElement method) {
259+
static CodeBlock generateCastingSuperCall(TypeName toReturn, MethodSpec method) {
260260
return CodeBlock.builder()
261-
.add("return ($T) super.$N(", toReturn, method.getSimpleName())
261+
.add("return ($T) super.$N(", toReturn, method.name)
262262
.add(
263-
FluentIterable.from(method.getParameters())
264-
.transform(new Function<VariableElement, String>() {
263+
FluentIterable.from(method.parameters)
264+
.transform(new Function<ParameterSpec, String>() {
265265
@Override
266-
public String apply(VariableElement input) {
267-
return input.getSimpleName().toString();
266+
public String apply(ParameterSpec input) {
267+
return input.name;
268268
}
269269
})
270270
.join(Joiner.on(",")))
@@ -317,18 +317,119 @@ static List<ParameterSpec> getParameters(List<? extends VariableElement> paramet
317317
for (VariableElement parameter : parameters) {
318318
result.add(getParameter(parameter));
319319
}
320-
return result;
320+
return dedupedParameters(result);
321+
}
322+
323+
private static List<ParameterSpec> dedupedParameters(List<ParameterSpec> parameters) {
324+
boolean hasDupes = false;
325+
Set<String> names = new HashSet<>();
326+
for (ParameterSpec parameter : parameters) {
327+
String name = parameter.name;
328+
if (names.contains(name)) {
329+
hasDupes = true;
330+
} else {
331+
names.add(name);
332+
}
333+
}
334+
335+
if (hasDupes) {
336+
List<ParameterSpec> copy = parameters;
337+
parameters = new ArrayList<>();
338+
for (int i = 0; i < copy.size(); i++) {
339+
ParameterSpec parameter = copy.get(i);
340+
parameters.add(ParameterSpec.builder(parameter.type, parameter.name + i)
341+
.addModifiers(parameter.modifiers)
342+
.addAnnotations(parameter.annotations)
343+
.build());
344+
}
345+
}
346+
347+
return parameters;
321348
}
322349

323-
private static ParameterSpec getParameter(VariableElement method) {
324-
TypeName type = TypeName.get(method.asType());
325-
String name = method.getSimpleName().toString();
326-
return ParameterSpec.builder(type, name)
327-
.addModifiers(method.getModifiers())
328-
.addAnnotations(getAnnotations(method))
350+
private static ParameterSpec getParameter(VariableElement parameter) {
351+
TypeName type = TypeName.get(parameter.asType());
352+
return ParameterSpec.builder(type, computeParameterName(parameter, type))
353+
.addModifiers(parameter.getModifiers())
354+
.addAnnotations(getAnnotations(parameter))
329355
.build();
330356
}
331357

358+
private static String computeParameterName(VariableElement parameter, TypeName type) {
359+
String rawClassName = type.withoutAnnotations().toString();
360+
361+
String name;
362+
363+
if (type.isPrimitive() || type.isBoxedPrimitive()) {
364+
name = getSmartPrimitiveParameterName(parameter);
365+
} else {
366+
if (rawClassName.contains("<") && rawClassName.contains(">")) {
367+
String[] preGenericSplit = rawClassName.split("<");
368+
String preGeneric = preGenericSplit[0];
369+
String[] postGenericSplit = rawClassName.split(">");
370+
String postGeneric = postGenericSplit[postGenericSplit.length - 1];
371+
if (postGenericSplit.length > 1) {
372+
rawClassName = preGeneric + postGeneric;
373+
} else {
374+
rawClassName = preGeneric;
375+
}
376+
}
377+
378+
String[] qualifiers = rawClassName.split("\\.");
379+
rawClassName = qualifiers[qualifiers.length - 1];
380+
381+
rawClassName = applySmartParameterNameReplacements(rawClassName);
382+
383+
boolean allCaps = true;
384+
for (char c : rawClassName.toCharArray()) {
385+
if (Character.isLowerCase(c)) {
386+
allCaps = false;
387+
break;
388+
}
389+
}
390+
if (allCaps) {
391+
name = rawClassName.toLowerCase();
392+
} else {
393+
int indexOfLastWordStart = 0;
394+
char[] chars = rawClassName.toCharArray();
395+
for (int i = 0, charArrayLength = chars.length; i < charArrayLength; i++) {
396+
char c = chars[i];
397+
if (Character.isUpperCase(c)) {
398+
indexOfLastWordStart = i;
399+
}
400+
}
401+
rawClassName = rawClassName.substring(indexOfLastWordStart, rawClassName.length());
402+
403+
name = Character.toLowerCase(rawClassName.charAt(0))
404+
+ rawClassName.substring(1, rawClassName.length());
405+
}
406+
}
407+
408+
return name;
409+
}
410+
411+
private static String getSmartPrimitiveParameterName(VariableElement parameter) {
412+
for (AnnotationMirror annotation : parameter.getAnnotationMirrors()) {
413+
String annotationName = annotation.getAnnotationType().toString().toUpperCase();
414+
if (annotationName.endsWith("RES")) {
415+
// Catch annotations like StringRes
416+
return "id";
417+
} else if (annotationName.endsWith("RANGE")) {
418+
// Catch annotations like IntRange
419+
return "value";
420+
}
421+
}
422+
423+
return parameter.getSimpleName().toString();
424+
}
425+
426+
private static String applySmartParameterNameReplacements(String name) {
427+
name = name.replace("[]", "s");
428+
name = name.replace(Class.class.getSimpleName(), "clazz");
429+
name = name.replace(Object.class.getSimpleName(), "o");
430+
return name;
431+
}
432+
332433
private static List<AnnotationSpec> getAnnotations(VariableElement element) {
333434
List<AnnotationSpec> result = new ArrayList<>();
334435
for (AnnotationMirror mirror : element.getAnnotationMirrors()) {

annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/RequestBuilderGenerator.java

+14-15
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import javax.lang.model.element.ExecutableElement;
3434
import javax.lang.model.element.Modifier;
3535
import javax.lang.model.element.TypeElement;
36-
import javax.lang.model.element.VariableElement;
3736
import javax.lang.model.type.DeclaredType;
3837
import javax.lang.model.type.TypeMirror;
3938

@@ -214,20 +213,20 @@ private MethodSpec generateRequestBuilderOverride(ExecutableElement methodToOver
214213
ParameterizedTypeName.get(generatedRequestBuilderClassName, ClassName.get(typeArgument));
215214

216215
MethodSpec.Builder builder = ProcessorUtil.overriding(methodToOverride)
217-
.returns(generatedRequestBuilderOfType)
218-
.addCode(CodeBlock.builder()
219-
.add("return ($T) super.$N(",
220-
generatedRequestBuilderOfType, methodToOverride.getSimpleName())
221-
.add(FluentIterable.from(methodToOverride.getParameters())
222-
.transform(new Function<VariableElement, String>() {
223-
@Override
224-
public String apply(VariableElement input) {
225-
return input.getSimpleName().toString();
226-
}
227-
})
228-
.join(Joiner.on(", ")))
229-
.add(");\n")
230-
.build());
216+
.returns(generatedRequestBuilderOfType);
217+
builder.addCode(CodeBlock.builder()
218+
.add("return ($T) super.$N(",
219+
generatedRequestBuilderOfType, methodToOverride.getSimpleName())
220+
.add(FluentIterable.from(builder.build().parameters)
221+
.transform(new Function<ParameterSpec, String>() {
222+
@Override
223+
public String apply(ParameterSpec input) {
224+
return input.name;
225+
}
226+
})
227+
.join(Joiner.on(", ")))
228+
.add(");\n")
229+
.build());
231230

232231
for (AnnotationMirror mirror : methodToOverride.getAnnotationMirrors()) {
233232
builder = builder.addAnnotation(AnnotationSpec.get(mirror));

annotation/compiler/src/main/java/com/bumptech/glide/annotation/compiler/RequestManagerGenerator.java

+9-7
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.squareup.javapoet.AnnotationSpec;
1313
import com.squareup.javapoet.ClassName;
1414
import com.squareup.javapoet.MethodSpec;
15+
import com.squareup.javapoet.MethodSpec.Builder;
1516
import com.squareup.javapoet.ParameterSpec;
1617
import com.squareup.javapoet.ParameterizedTypeName;
1718
import com.squareup.javapoet.TypeSpec;
@@ -192,10 +193,12 @@ private MethodSpec generateRequestManagerRequestManagerMethodOverride(
192193
String generatedPackageName, ExecutableElement method) {
193194
ClassName generatedRequestManagerName =
194195
ClassName.get(generatedPackageName, GENERATED_REQUEST_MANAGER_SIMPLE_NAME);
195-
return ProcessorUtil.overriding(method)
196+
Builder returns = ProcessorUtil.overriding(method)
196197
.addAnnotation(nonNull())
197-
.returns(generatedRequestManagerName)
198-
.addCode(ProcessorUtil.generateCastingSuperCall(generatedRequestManagerName, method))
198+
.returns(generatedRequestManagerName);
199+
return returns
200+
.addCode(ProcessorUtil.generateCastingSuperCall(
201+
generatedRequestManagerName, returns.build()))
199202
.build();
200203
}
201204

@@ -240,10 +243,9 @@ private MethodSpec generateRequestManagerRequestBuilderMethodOverride(
240243
ParameterizedTypeName.get(generatedRequestBuilderClassName, ClassName.get(typeArgument));
241244

242245
MethodSpec.Builder builder = ProcessorUtil.overriding(methodToOverride)
243-
.returns(generatedRequestBuilderOfType)
244-
.addCode(
245-
ProcessorUtil.generateCastingSuperCall(
246-
generatedRequestBuilderOfType, methodToOverride));
246+
.returns(generatedRequestBuilderOfType);
247+
builder.addCode(
248+
ProcessorUtil.generateCastingSuperCall(generatedRequestBuilderOfType, builder.build()));
247249

248250
for (AnnotationMirror mirror : methodToOverride.getAnnotationMirrors()) {
249251
builder.addAnnotation(AnnotationSpec.get(mirror));

0 commit comments

Comments
 (0)