From 350f80a21ddd2cf0b03fda3bb5e241cce2c6ed63 Mon Sep 17 00:00:00 2001 From: LoLo Date: Thu, 24 Nov 2016 03:05:47 +0800 Subject: [PATCH] issue #138: fix compilation error when using injection within an inner class --- .../dart/common/InjectionTarget.java | 8 ++++++- .../processor/HensonNavigatorGenerator.java | 22 ++++++++++--------- .../processor/IntentBuilderGenerator.java | 4 ++-- 3 files changed, 21 insertions(+), 13 deletions(-) diff --git a/dart-common/src/main/java/com/f2prateek/dart/common/InjectionTarget.java b/dart-common/src/main/java/com/f2prateek/dart/common/InjectionTarget.java index a925fc98..7d4cc508 100755 --- a/dart-common/src/main/java/com/f2prateek/dart/common/InjectionTarget.java +++ b/dart-common/src/main/java/com/f2prateek/dart/common/InjectionTarget.java @@ -21,7 +21,7 @@ import java.util.Map; import javax.lang.model.type.TypeMirror; -public final class InjectionTarget { +public final class InjectionTarget implements Comparable { public final Map injectionMap = new LinkedHashMap<>(); public final String classPackage; public final String className; @@ -57,4 +57,10 @@ private ExtraInjection getOrCreateExtraBinding(String key) { public String getFqcn() { return classPackage + "." + className; } + + @Override + public int compareTo(InjectionTarget o) { + if (o == null) return 0; + return -this.targetClass.compareTo(o.targetClass); + } } diff --git a/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/HensonNavigatorGenerator.java b/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/HensonNavigatorGenerator.java index ad72b9d8..1e7d1f1c 100644 --- a/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/HensonNavigatorGenerator.java +++ b/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/HensonNavigatorGenerator.java @@ -10,7 +10,7 @@ import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; import java.util.Collection; -import java.util.HashSet; +import java.util.TreeSet; import javax.lang.model.element.Modifier; /** @@ -29,7 +29,7 @@ public class HensonNavigatorGenerator extends BaseGenerator { public static final String HENSON_NAVIGATOR_CLASS_NAME = "Henson"; public static final String WITH_CONTEXT_SET_STATE_CLASS_NAME = "WithContextSetState"; private String packageName; - private Collection targetClassNames; + private Collection targets; public HensonNavigatorGenerator(String packageName, Collection targets) { if (packageName != null) { @@ -38,7 +38,7 @@ public HensonNavigatorGenerator(String packageName, Collection this.packageName = findCommonPackage(targets); } - this.targetClassNames = getClassNamesWhereHensonCanGoto(targets); + this.targets = getTargetsWhereHensonCanGoto(targets); } private String hensonNavigatorClassName() { @@ -78,8 +78,8 @@ private void emitNavigationMethods(TypeSpec.Builder hensonNavigatorTypeBuilder) .addParameter(ClassName.get("android.content", "Context"), "context") .addStatement("this.context = context") .build()); - for (String targetClassName : targetClassNames) { - emitNavigationMethod(withContextSetStateBuilder, targetClassName); + for (InjectionTarget target : targets) { + emitNavigationMethod(withContextSetStateBuilder, target); } hensonNavigatorTypeBuilder.addType(withContextSetStateBuilder.build()); } @@ -99,7 +99,9 @@ private void emitWith(TypeSpec.Builder builder) { builder.addMethod(gotoMethodBuilder.build()); } - private void emitNavigationMethod(TypeSpec.Builder builder, String targetClassName) { + private void emitNavigationMethod(TypeSpec.Builder builder, InjectionTarget target) { + String targetClassName = target.targetClass; + targetClassName = targetClassName.replace(target.className.replaceAll("\\$", "."), "") + target.className; TypeName intentBuilderClassName = ClassName.bestGuess(targetClassName + IntentBuilderGenerator.BUNDLE_BUILDER_SUFFIX); String simpleTargetClassName = targetClassName.substring(targetClassName.lastIndexOf('.') + 1); @@ -147,13 +149,13 @@ private String findCommonPackage(String commonPackageName, String packageName) { return commonRoot; } - private Collection getClassNamesWhereHensonCanGoto(Collection targets) { - Collection classNames = new HashSet<>(); + private Collection getTargetsWhereHensonCanGoto(Collection targets) { + Collection canGotoTargets = new TreeSet<>(); for (InjectionTarget injectionTarget : targets) { if (!injectionTarget.isAbstractTargetClass) { - classNames.add(injectionTarget.targetClass); + canGotoTargets.add(injectionTarget); } } - return classNames; + return canGotoTargets; } } diff --git a/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/IntentBuilderGenerator.java b/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/IntentBuilderGenerator.java index 8d0bbce1..332d2362 100644 --- a/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/IntentBuilderGenerator.java +++ b/henson-processor/src/main/java/com/f2prateek/dart/henson/processor/IntentBuilderGenerator.java @@ -86,10 +86,10 @@ private void emitConstructor(TypeSpec.Builder intentBuilderTypeBuilder) { if (usesReflection) { emitGetClassDynamically(intentBuilderTypeBuilder); constructorBuilder.addStatement("intent = new Intent(context, getClassDynamically($S))", - target.getFqcn()); + target.getFqcn().replaceAll("\\$", ".")); } else { constructorBuilder.addStatement("intent = new Intent(context, $L.class)", - target.className); + target.className.replaceAll("\\$", ".")); } intentBuilderTypeBuilder.addMethod(constructorBuilder.build()); }