Skip to content

Commit 9bbc804

Browse files
committed
Issue-182: Removing string replace from registries and changing hardcoded string inside switch block instead
1 parent 6b3153f commit 9bbc804

File tree

6 files changed

+65
-32
lines changed

6 files changed

+65
-32
lines changed

toothpick-compiler/src/main/java/toothpick/compiler/registry/generators/RegistryGenerator.java

+3-5
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,7 @@ private void emitGetterMethods(TypeSpec.Builder registryTypeSpec) {
7474
.addParameter(ParameterizedTypeName.get(ClassName.get(Class.class), t), "clazz")
7575
.returns(ParameterizedTypeName.get(ClassName.get(registryInjectionTarget.type), t));
7676

77-
//the ultimate part of the switch is about converting $ to .
78-
//this is a bad hack, but the easiest workaroung to injectionTarget.getQualifiedName() using only . and not $ for FQN...
79-
getMethod.addStatement("String className = clazz.getName().replace('$$','.')");
77+
getMethod.addStatement("String className = clazz.getName()");
8078
int numOfBuckets = getNumberOfBuckets(registryInjectionTarget.injectionTargetList);
8179
getMethod.addStatement("int bucket = (className.hashCode() & $L)", numOfBuckets - 1);
8280
CodeBlock.Builder switchBlockBuilder = CodeBlock.builder().beginControlFlow("switch(bucket)");
@@ -115,7 +113,7 @@ private MethodSpec generateGetterMethod(List<TypeElement> getterMethodBucket, in
115113
String typeSimpleName = registryInjectionTarget.type.getSimpleName();
116114

117115
for (TypeElement injectionTarget : getterMethodBucket) {
118-
switchBlockBuilder.add("case ($S):" + LINE_SEPARATOR, injectionTarget.getQualifiedName().toString());
116+
switchBlockBuilder.add("case ($S):" + LINE_SEPARATOR, getGeneratedFQNClassName(injectionTarget));
119117
switchBlockBuilder.addStatement("return ($L<T>) new $L$$$$$L()", typeSimpleName, getGeneratedFQNClassName(injectionTarget), typeSimpleName);
120118
}
121119

@@ -131,7 +129,7 @@ private Map<Integer, List<TypeElement>> getGetterMethodBuckets(List<TypeElement>
131129
Map<Integer, List<TypeElement>> getterMethodBuckets = new HashMap<>();
132130

133131
for (TypeElement injectionTarget : injectionTargetList) {
134-
int index = injectionTarget.getQualifiedName().toString().hashCode() & (numOfBuckets - 1);
132+
int index = getGeneratedFQNClassName(injectionTarget).hashCode() & (numOfBuckets - 1);
135133
List<TypeElement> methodBucket = getterMethodBuckets.get(index);
136134
if (methodBucket == null) {
137135
methodBucket = new ArrayList<>();

toothpick-compiler/src/test/java/toothpick/compiler/factory/FactoryRegistryTest.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ public class FactoryRegistryTest {
3333
" }", //
3434
"", //
3535
" public <T> Factory<T> getFactory(Class<T> clazz) {", //
36-
" String className = clazz.getName().replace('$','.');", //
36+
" String className = clazz.getName();", //
3737
" int bucket = (className.hashCode() & 0);", //
3838
" switch(bucket) {", //
3939
" case (0):", //
@@ -85,7 +85,7 @@ public class FactoryRegistryTest {
8585
" }", //
8686
"", //
8787
" public <T> Factory<T> getFactory(Class<T> clazz) {", //
88-
" String className = clazz.getName().replace('$','.');", //
88+
" String className = clazz.getName();", //
8989
" int bucket = (className.hashCode() & 0);", //
9090
" switch(bucket) {", //
9191
" case (0):", //
@@ -134,7 +134,7 @@ public class FactoryRegistryTest {
134134
" }", //
135135
"", //
136136
" public <T> Factory<T> getFactory(Class<T> clazz) {", //
137-
" String className = clazz.getName().replace('$','.');", //
137+
" String className = clazz.getName();", //
138138
" int bucket = (className.hashCode() & -1);", //
139139
" switch(bucket) {", //
140140
" default:", //
@@ -165,9 +165,9 @@ public class FactoryRegistryTest {
165165
" public static class InnerClass2 {", //
166166
" @Inject public InnerClass2() {", //
167167
" }", //
168-
" }", //
169-
" public static class InnerClass3 {", //
170-
" @Inject public InnerClass3() {", //
168+
" public static class InnerClass3 {", //
169+
" @Inject public InnerClass3() {", //
170+
" }", //
171171
" }", //
172172
" }", //
173173
"}" //
@@ -185,7 +185,7 @@ public class FactoryRegistryTest {
185185
" }", //
186186
"", //
187187
" public <T> Factory<T> getFactory(Class<T> clazz) {", //
188-
" String className = clazz.getName().replace('$','.');", //
188+
" String className = clazz.getName();", //
189189
" int bucket = (className.hashCode() & 3);", //
190190
" switch(bucket) {", //
191191
" case (0):", //
@@ -203,6 +203,8 @@ public class FactoryRegistryTest {
203203
"", //
204204
" private <T> Factory<T> getFactoryBucket0(Class<T> clazz, String className) {", //
205205
" switch(className) {", //
206+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass2\"):", //
207+
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$$Factory();", //
206208
" case (\"test.TestARegistryWithMoreThanOneBucket\"):", //
207209
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$$Factory();", //
208210
" default:", //
@@ -212,26 +214,24 @@ public class FactoryRegistryTest {
212214
"", //
213215
" private <T> Factory<T> getFactoryBucket1(Class<T> clazz, String className) {", //
214216
" switch(className) {", //
215-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass1\"):", //
216-
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass1$$Factory();", //
217+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass2$InnerClass3\"):", //
218+
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$InnerClass3$$Factory();", //
217219
" default:", //
218220
" return getFactoryInChildrenRegistries(clazz);", //
219221
" }", //
220222
" }", //
221223
"", //
222224
" private <T> Factory<T> getFactoryBucket2(Class<T> clazz, String className) {", //
223225
" switch(className) {", //
224-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass2\"):", //
225-
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$$Factory();", //
226226
" default:", //
227227
" return getFactoryInChildrenRegistries(clazz);", //
228228
" }", //
229229
" }", //
230230
"", //
231231
" private <T> Factory<T> getFactoryBucket3(Class<T> clazz, String className) {", //
232232
" switch(className) {", //
233-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass3\"):", //
234-
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass3$$Factory();", //
233+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass1\"):", //
234+
" return (Factory<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass1$$Factory();", //
235235
" default:", //
236236
" return getFactoryInChildrenRegistries(clazz);", //
237237
" }", //

toothpick-compiler/src/test/java/toothpick/compiler/memberinjector/MemberInjectorRegistryTest.java

+13-13
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public void testASimpleRegistry() {
3434
" }", //
3535
"", //
3636
" public <T> MemberInjector<T> getMemberInjector(Class<T> clazz) {", //
37-
" String className = clazz.getName().replace('$','.');", //
37+
" String className = clazz.getName();", //
3838
" int bucket = (className.hashCode() & 0);", //
3939
" switch(bucket) {", //
4040
" case (0):", //
@@ -87,7 +87,7 @@ public void testARegistry_withDependencies() {
8787
" }", //
8888
"", //
8989
" public <T> MemberInjector<T> getMemberInjector(Class<T> clazz) {", //
90-
" String className = clazz.getName().replace('$','.');", //
90+
" String className = clazz.getName();", //
9191
" int bucket = (className.hashCode() & 0);", //
9292
" switch(bucket) {", //
9393
" case (0):", //
@@ -136,7 +136,7 @@ public void testARegistry_withDependencies() {
136136
" }", //
137137
"", //
138138
" public <T> MemberInjector<T> getMemberInjector(Class<T> clazz) {", //
139-
" String className = clazz.getName().replace('$','.');", //
139+
" String className = clazz.getName();", //
140140
" int bucket = (className.hashCode() & -1);", //
141141
" switch(bucket) {", //
142142
" default:", //
@@ -165,9 +165,9 @@ public void testARegistry_withDependencies() {
165165
" }", //
166166
" public static class InnerClass2 {", //
167167
" @Inject String s;", //
168-
" }", //
169-
" public static class InnerClass3 {", //
170-
" @Inject String s;", //
168+
" public static class InnerClass3 {", //
169+
" @Inject String s;", //
170+
" }", //
171171
" }", //
172172
"}" //
173173
));
@@ -184,7 +184,7 @@ public void testARegistry_withDependencies() {
184184
" }", //
185185
"", //
186186
" public <T> MemberInjector<T> getMemberInjector(Class<T> clazz) {", //
187-
" String className = clazz.getName().replace('$','.');", //
187+
" String className = clazz.getName();", //
188188
" int bucket = (className.hashCode() & 3);", //
189189
" switch(bucket) {", //
190190
" case (0):", //
@@ -204,33 +204,33 @@ public void testARegistry_withDependencies() {
204204
" switch(className) {", //
205205
" case (\"test.TestARegistryWithMoreThanOneBucket\"):", //
206206
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$$MemberInjector();", //
207+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass2\"):", //
208+
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$$MemberInjector();", //
207209
" default:", //
208210
" return getMemberInjectorInChildrenRegistries(clazz);", //
209211
" }", //
210212
" }", //
211213
"", //
212214
" private <T> MemberInjector<T> getMemberInjectorBucket1(Class<T> clazz, String className) {", //
213215
" switch(className) {", //
214-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass1\"):", //
215-
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass1$$MemberInjector();", //
216+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass2$InnerClass3\"):", //
217+
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$InnerClass3$$MemberInjector();", //
216218
" default:", //
217219
" return getMemberInjectorInChildrenRegistries(clazz);", //
218220
" }", //
219221
" }", //
220222
"", //
221223
" private <T> MemberInjector<T> getMemberInjectorBucket2(Class<T> clazz, String className) {", //
222224
" switch(className) {", //
223-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass2\"):", //
224-
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass2$$MemberInjector();", //
225225
" default:", //
226226
" return getMemberInjectorInChildrenRegistries(clazz);", //
227227
" }", //
228228
" }", //
229229
"", //
230230
" private <T> MemberInjector<T> getMemberInjectorBucket3(Class<T> clazz, String className) {", //
231231
" switch(className) {", //
232-
" case (\"test.TestARegistryWithMoreThanOneBucket.InnerClass3\"):", //
233-
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass3$$MemberInjector();", //
232+
" case (\"test.TestARegistryWithMoreThanOneBucket$InnerClass1\"):", //
233+
" return (MemberInjector<T>) new test.TestARegistryWithMoreThanOneBucket$InnerClass1$$MemberInjector();", //
234234
" default:", //
235235
" return getMemberInjectorInChildrenRegistries(clazz);", //
236236
" }", //

toothpick-runtime/src/test/java/toothpick/ToothpickBaseTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ protected ToothpickBaseTest() {
1414
public static void setUp() throws Exception {
1515
MemberInjectorRegistryLocator.setRootRegistry(new toothpick.test.MemberInjectorRegistry());
1616
FactoryRegistryLocator.setRootRegistry(new toothpick.test.FactoryRegistry());
17-
Configuration.forProduction();
17+
Toothpick.setConfiguration(Configuration.forProduction().disableReflection());
1818
}
1919

2020
@After
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package toothpick.data;
2+
3+
import javax.inject.Inject;
4+
5+
public class FooNested implements IFoo {
6+
@Inject public Bar bar;
7+
8+
public static class InnerClass1 {
9+
@Inject public Bar bar;
10+
11+
public static class InnerClass2 {
12+
@Inject public Bar bar;
13+
}
14+
}
15+
}

toothpick-runtime/src/test/java/toothpick/inject/InjectionWithoutModuleTest.java

+20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import toothpick.data.Bar;
1010
import toothpick.data.Foo;
1111
import toothpick.data.FooChildMaskingMember;
12+
import toothpick.data.FooNested;
1213
import toothpick.data.FooParentMaskingMember;
1314

1415
import static org.hamcrest.CoreMatchers.isA;
@@ -37,6 +38,25 @@ public void testSimpleInjection() throws Exception {
3738
assertThat(foo.bar, isA(Bar.class));
3839
}
3940

41+
@Test
42+
public void testNestedClassInjection() throws Exception {
43+
//GIVEN
44+
Scope scope = new ScopeImpl("");
45+
46+
//WHEN
47+
FooNested fooNested = scope.getInstance(FooNested.class);
48+
FooNested.InnerClass1 innerClass1 = scope.getInstance(FooNested.InnerClass1.class);
49+
FooNested.InnerClass1.InnerClass2 innerClass2 = scope.getInstance(FooNested.InnerClass1.InnerClass2.class);
50+
51+
//THEN
52+
assertThat(fooNested.bar, notNullValue());
53+
assertThat(fooNested.bar, isA(Bar.class));
54+
assertThat(innerClass1.bar, notNullValue());
55+
assertThat(innerClass1.bar, isA(Bar.class));
56+
assertThat(innerClass2.bar, notNullValue());
57+
assertThat(innerClass2.bar, isA(Bar.class));
58+
}
59+
4060
@Test
4161
public void testInjection_shouldFail_whenFieldsAreMasked() throws Exception {
4262
//GIVEN

0 commit comments

Comments
 (0)