From aabfc1636980205abbdf69caa54daf81d66f4c51 Mon Sep 17 00:00:00 2001 From: Ippei Nawate Date: Mon, 9 Jan 2017 21:51:39 +0900 Subject: [PATCH 1/3] Fix a logic to find common package name --- .../dart/henson/processor/HensonNavigatorGenerator.java | 4 ++++ 1 file changed, 4 insertions(+) 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..b2e4d2fc 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 @@ -143,7 +143,11 @@ private String findCommonPackage(String commonPackageName, String packageName) { break; } } + String commonRoot = packageName.substring(0, indexCommon); + if (commonRoot.endsWith(".")) { + commonRoot = commonRoot.substring(0, commonRoot.length()); + } return commonRoot; } From 4a496593ffe89e1e6f8c3bc9655beede2ac03eae Mon Sep 17 00:00:00 2001 From: Ippei Nawate Date: Tue, 10 Jan 2017 09:37:58 +0900 Subject: [PATCH 2/3] Fix foundamental issue --- .../processor/HensonNavigatorGenerator.java | 31 +++++++++++++++---- 1 file changed, 25 insertions(+), 6 deletions(-) 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 b2e4d2fc..62de8a2c 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 @@ -9,6 +9,9 @@ import com.squareup.javapoet.MethodSpec; import com.squareup.javapoet.TypeName; import com.squareup.javapoet.TypeSpec; + +import java.lang.reflect.Array; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import javax.lang.model.element.Modifier; @@ -137,20 +140,36 @@ private String findCommonPackage(Collection targets) { private String findCommonPackage(String commonPackageName, String packageName) { int indexCommon = 0; - int maxLength = Math.min(commonPackageName.length(), packageName.length()); + String[] commonPackages = splitIntoPackages(commonPackageName); + String[] packages = splitIntoPackages(packageName); + int maxLength = Math.min(commonPackages.length, packages.length); for (; indexCommon < maxLength; indexCommon++) { - if (commonPackageName.charAt(indexCommon) != packageName.charAt(indexCommon)) { + if (!commonPackages[indexCommon].equals(packages[indexCommon])) { break; } } - String commonRoot = packageName.substring(0, indexCommon); - if (commonRoot.endsWith(".")) { - commonRoot = commonRoot.substring(0, commonRoot.length()); - } + String commonRoot = join(Arrays.copyOfRange(packages, 0, indexCommon), "."); return commonRoot; } + private String[] splitIntoPackages(String packageName) { + String[] packages = packageName.split("\\."); + if (packages.length == 0) { + return new String[] {packageName}; + } + return packages; + } + + private String join(String[] strs, String delimiter) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < strs.length; i++) { + if (i != 0) sb.append(delimiter); + sb.append(strs[i]); + } + return sb.toString(); + } + private Collection getClassNamesWhereHensonCanGoto(Collection targets) { Collection classNames = new HashSet<>(); for (InjectionTarget injectionTarget : targets) { From 3f2e1bd19e70de061ab2d6c26b4aabf4d6858454 Mon Sep 17 00:00:00 2001 From: Ippei Nawate Date: Tue, 10 Jan 2017 09:38:53 +0900 Subject: [PATCH 3/3] Add test --- .../HensonNavigatorGeneratorTest.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/henson-processor/src/test/java/com/f2prateek/dart/henson/processor/HensonNavigatorGeneratorTest.java b/henson-processor/src/test/java/com/f2prateek/dart/henson/processor/HensonNavigatorGeneratorTest.java index 2ae7b60c..cd439d50 100644 --- a/henson-processor/src/test/java/com/f2prateek/dart/henson/processor/HensonNavigatorGeneratorTest.java +++ b/henson-processor/src/test/java/com/f2prateek/dart/henson/processor/HensonNavigatorGeneratorTest.java @@ -20,7 +20,12 @@ import com.google.common.base.Joiner; import com.google.testing.compile.JavaFileObjects; import javax.tools.JavaFileObject; + +import com.google.testing.compile.JavaSourcesSubjectFactory; import org.junit.Test; + +import java.util.Arrays; + import static com.google.common.truth.Truth.assert_; import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource; @@ -278,4 +283,110 @@ public class HensonNavigatorGeneratorTest { .and() .generatesSources(expectedSource1); } + + @Test public void samePackage() throws Exception { + JavaFileObject source1 = JavaFileObjects.forSourceString("test.TestOne", Joiner.on('\n').join( // + "package test;", // + "import android.app.Activity;", // + "import com.f2prateek.dart.InjectExtra;", // + "public class TestOne extends Activity {", // + " @InjectExtra(\"key\") String extra;", // + "}" // + )); + + JavaFileObject source2 = JavaFileObjects.forSourceString("test.TestTwo", Joiner.on('\n').join( // + "package test;", // + "import android.app.Activity;", // + "import com.f2prateek.dart.InjectExtra;", // + "public class TestTwo extends Activity {", // + " @InjectExtra(\"key\") String extra;", // + "}" // + )); + + JavaFileObject expectedSource = + JavaFileObjects.forSourceString("test/Henson", Joiner.on('\n').join( // + "package test;", // + "import android.content.Context;", // + "public class Henson {", // + " private Henson() {", // + " }", // + " public static WithContextSetState with(Context context) {", // + " return new test.Henson.WithContextSetState(context);", // + " }", // + " public static class WithContextSetState {", // + " private Context context;", // + " private WithContextSetState(Context context) {", // + " this.context = context;", // + " }", // + " public TestOne$$IntentBuilder gotoTestOne() {", // + " return new test.TestOne$$IntentBuilder(context);", // + " }", // + " public TestTwo$$IntentBuilder gotoTestTwo() {", // + " return new test.TestTwo$$IntentBuilder(context);", // + " }", // + " }", // + "}" // + )); + + assert_().about(JavaSourcesSubjectFactory.javaSources()) + .that(Arrays.asList(source1, source2)) + .processedWith(ProcessorTestUtilities.hensonProcessors()) + .compilesWithoutError() + .and() + .generatesSources(expectedSource); + } + + @Test public void differentPackage() throws Exception { + JavaFileObject source1 = JavaFileObjects.forSourceString("test.test1.TestOne", Joiner.on('\n').join( // + "package test.test1;", // + "import android.app.Activity;", // + "import com.f2prateek.dart.InjectExtra;", // + "public class TestOne extends Activity {", // + " @InjectExtra(\"key\") String extra;", // + "}" // + )); + + JavaFileObject source2 = JavaFileObjects.forSourceString("test.test2.TestTwo", Joiner.on('\n').join( // + "package test.test2;", // + "import android.app.Activity;", // + "import com.f2prateek.dart.InjectExtra;", // + "public class TestTwo extends Activity {", // + " @InjectExtra(\"key\") String extra;", // + "}" // + )); + + JavaFileObject expectedSource = + JavaFileObjects.forSourceString("test/Henson", Joiner.on('\n').join( // + "package test;", // + "import android.content.Context;", // + "import test.test1.TestOne$$IntentBuilder;", // + "import test.test2.TestTwo$$IntentBuilder;", // + "public class Henson {", // + " private Henson() {", // + " }", // + " public static WithContextSetState with(Context context) {", // + " return new test.Henson.WithContextSetState(context);", // + " }", // + " public static class WithContextSetState {", // + " private Context context;", // + " private WithContextSetState(Context context) {", // + " this.context = context;", // + " }", // + " public TestOne$$IntentBuilder gotoTestOne() {", // + " return new test.test1.TestOne$$IntentBuilder(context);", // + " }", // + " public TestTwo$$IntentBuilder gotoTestTwo() {", // + " return new test.test2.TestTwo$$IntentBuilder(context);", // + " }", // + " }", // + "}" // + )); + + assert_().about(JavaSourcesSubjectFactory.javaSources()) + .that(Arrays.asList(source1, source2)) + .processedWith(ProcessorTestUtilities.hensonProcessors()) + .compilesWithoutError() + .and() + .generatesSources(expectedSource); + } }