Skip to content

Commit 9fffab9

Browse files
committed
Fix inner class generation bug
1 parent 31846f6 commit 9fffab9

File tree

6 files changed

+32
-23
lines changed

6 files changed

+32
-23
lines changed

icepick-processor/src/main/java/icepick/processor/ClassWriter.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,15 @@ void writeClass(FieldEnclosingClass fieldEnclosingClass, Collection<AnnotatedFie
3535
private String getClassTemplate(FieldEnclosingClass fieldEnclosingClass, Collection<AnnotatedField> fields) throws IOException {
3636
String className = fieldEnclosingClass.className;
3737
String packageName = fieldEnclosingClass.packageName;
38+
String sanitizedClassName = fieldEnclosingClass.sanitizedClassName;
3839
String saveInstanceStateBody = makeOnSaveInstanceStateBody(fields);
3940
String restoreInstanceStateBody = makeOnRestoreInstanceStateBody(fields);
4041
String saveInstanceStateStart = makeSaveInstanceStateStart(className, fieldEnclosingClass.parentFqcn);
4142
String restoreInstanceStateStart = makeRestoreInstanceStateStart(className);
4243
String saveInstanceStateEnd = makeSaveInstanceStateEnd();
4344
String restoreInstanceStateEnd = makeRestoreInstanceStateEnd(fieldEnclosingClass.parentFqcn);
4445

45-
return replaceTemplateWith(packageName, className, saveInstanceStateStart, restoreInstanceStateStart, saveInstanceStateBody, restoreInstanceStateBody, saveInstanceStateEnd, restoreInstanceStateEnd);
46+
return replaceTemplateWith(packageName, sanitizedClassName, saveInstanceStateStart, restoreInstanceStateStart, saveInstanceStateBody, restoreInstanceStateBody, saveInstanceStateEnd, restoreInstanceStateEnd);
4647
}
4748

4849
private String makeOnRestoreInstanceStateBody(Collection<AnnotatedField> fields) {
@@ -77,10 +78,10 @@ private String makeBundlePut(AnnotatedField annotatedField) {
7778

7879
protected abstract String makeRestoreInstanceStateEnd(String parentFqcn);
7980

80-
private String replaceTemplateWith(String packageName, String className, String saveInstanceStateStart, String restoreInstanceStateStart, String saveInstanceStateBody, String restoreInstanceStateBody, String saveInstanceStateEnd, String restoreInstanceStateEnd) throws IOException {
81+
private String replaceTemplateWith(String packageName, String sanitizedClassName, String saveInstanceStateStart, String restoreInstanceStateStart, String saveInstanceStateBody, String restoreInstanceStateBody, String saveInstanceStateEnd, String restoreInstanceStateEnd) throws IOException {
8182
return CLASS_TEMPLATE
8283
.replace(PACKAGE, packageName)
83-
.replace(CLASS_NAME, className)
84+
.replace(CLASS_NAME, sanitizedClassName)
8485
.replace(SUFFIX, getSuffix())
8586
.replace(SAVE_INSTANCE_STATE_START, saveInstanceStateStart)
8687
.replace(SAVE_INSTANCE_STATE_BODY, saveInstanceStateBody)
@@ -136,8 +137,10 @@ static class Factory {
136137
this.suffix = suffix;
137138
}
138139

139-
public ClassWriter from(TypeElement classType) throws IOException {
140-
JavaFileObject jfo = filer.createSourceFile(classType.getQualifiedName() + suffix, classType);
140+
public ClassWriter from(FieldEnclosingClass fieldEnclosingClass) throws IOException {
141+
TypeElement classType = fieldEnclosingClass.type;
142+
String sanitizedClassName = fieldEnclosingClass.sanitizedClassName;
143+
JavaFileObject jfo = filer.createSourceFile(sanitizedClassName + suffix, classType);
141144
boolean isView = typeUtils.isAssignable(classType.asType(), elementUtils.getTypeElement("android.view.View").asType());
142145
return isView ? new ViewWriter(jfo, suffix) : new FragmentActivityWriter(jfo, suffix);
143146
}

icepick-processor/src/main/java/icepick/processor/EnvironmentFactory.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import javax.lang.model.element.Element;
55
import javax.lang.model.element.TypeElement;
66
import javax.lang.model.type.TypeMirror;
7+
import javax.lang.model.util.Elements;
8+
import javax.lang.model.util.Types;
79
import java.io.IOException;
810
import java.util.Collection;
911

@@ -14,9 +16,11 @@ class EnvironmentFactory {
1416
private final ClassWriter.Factory writerFactory;
1517

1618
static EnvironmentFactory from(ProcessingEnvironment processingEnv, String suffix) {
17-
FieldEnclosingClass.Factory enclosingClassFactory = new FieldEnclosingClass.Factory(processingEnv.getTypeUtils());
18-
AnnotatedField.Factory fieldFactory = new AnnotatedField.Factory(processingEnv.getElementUtils(), processingEnv.getTypeUtils());
19-
ClassWriter.Factory writerFactory = new ClassWriter.Factory(processingEnv.getTypeUtils(), processingEnv.getElementUtils(), processingEnv.getFiler(), suffix);
19+
Types typeUtils = processingEnv.getTypeUtils();
20+
Elements elementUtils = processingEnv.getElementUtils();
21+
FieldEnclosingClass.Factory enclosingClassFactory = new FieldEnclosingClass.Factory(typeUtils, elementUtils);
22+
AnnotatedField.Factory fieldFactory = new AnnotatedField.Factory(elementUtils, typeUtils);
23+
ClassWriter.Factory writerFactory = new ClassWriter.Factory(typeUtils, elementUtils, processingEnv.getFiler(), suffix);
2024
return new EnvironmentFactory(enclosingClassFactory, fieldFactory, writerFactory);
2125
}
2226

@@ -34,7 +38,7 @@ public AnnotatedField makeField(Element element) {
3438
return fieldFactory.from(element);
3539
}
3640

37-
public ClassWriter makeWriter(TypeElement classType) throws IOException {
38-
return writerFactory.from(classType);
41+
public ClassWriter makeWriter(FieldEnclosingClass enclosingClass) throws IOException {
42+
return writerFactory.from(enclosingClass);
3943
}
4044
}

icepick-processor/src/main/java/icepick/processor/FieldEnclosingClass.java

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,51 @@
44
import javax.lang.model.type.DeclaredType;
55
import javax.lang.model.type.TypeKind;
66
import javax.lang.model.type.TypeMirror;
7+
import javax.lang.model.util.Elements;
78
import javax.lang.model.util.Types;
89
import java.util.Collection;
910

1011
class FieldEnclosingClass {
1112

1213
public final TypeElement type;
1314
public final String className;
15+
public final String sanitizedClassName;
1416
public final String packageName;
1517
public final String parentFqcn;
1618

17-
FieldEnclosingClass(TypeElement type, String className, String packageName, String parentFqcn) {
19+
FieldEnclosingClass(TypeElement type, String className, String sanitizedClassName, String packageName, String parentFqcn) {
1820
this.type = type;
1921
this.className = className;
22+
this.sanitizedClassName = sanitizedClassName;
2023
this.packageName = packageName;
2124
this.parentFqcn = parentFqcn;
2225
}
2326

2427
static class Factory {
2528

2629
private final Types typeUtils;
30+
private final Elements elementUtils;
2731

28-
Factory(Types typeUtils) {
32+
Factory(Types typeUtils, Elements elementUtils) {
2933
this.typeUtils = typeUtils;
34+
this.elementUtils = elementUtils;
3035
}
3136

3237
public FieldEnclosingClass from(TypeElement classType, Collection<TypeMirror> parents) {
3338
String className = findName(classType);
3439
String packageName = findPackage(classType);
3540
String parentFqcn = findParentFqcn(classType, parents);
36-
return new FieldEnclosingClass(classType, className, packageName, parentFqcn);
41+
String sanitizedClassName = className.replace(".", "$");
42+
return new FieldEnclosingClass(classType, className, sanitizedClassName, packageName, parentFqcn);
3743
}
3844

3945
private String findName(TypeElement classType) {
40-
return classType.getSimpleName().toString();
46+
int packageLength = findPackage(classType).length() + 1;
47+
return classType.getQualifiedName().toString().substring(packageLength);
4148
}
4249

4350
private String findPackage(TypeElement classType) {
44-
return classType.getQualifiedName().toString().replace("." + classType.getSimpleName(), "");
51+
return elementUtils.getPackageOf(classType).getQualifiedName().toString();
4552
}
4653

4754
private String findParentFqcn(TypeElement classType, Collection<TypeMirror> parents) {

icepick-processor/src/main/java/icepick/processor/IcicleProcessorState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ private Collection<AnnotatedField> attemptConversion(Collection<Element> element
101101
private void writeHelpers(Map<FieldEnclosingClass, Collection<AnnotatedField>> elementsByEnclosingClass) {
102102
for (FieldEnclosingClass fieldEnclosingClass : elementsByEnclosingClass.keySet()) {
103103
try {
104-
ClassWriter classWriter = factory.makeWriter(fieldEnclosingClass.type);
104+
ClassWriter classWriter = factory.makeWriter(fieldEnclosingClass);
105105
classWriter.writeClass(fieldEnclosingClass, elementsByEnclosingClass.get(fieldEnclosingClass));
106106
} catch (IOException e) {
107107
logger.logError("Impossible to create helper for %. Reason: %" + fieldEnclosingClass.className, e);

icepick-processor/src/test/java/icepick/processor/FragmentActivityWriterTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class FragmentActivityWriterTest {
1818
final StringWriter stringWriter = new StringWriter();
1919
final JavaFileObject jfo = mock(JavaFileObject.class);
2020
final ClassWriter classWriter = new FragmentActivityWriter(jfo, "$$Icicle");
21-
final FieldEnclosingClass fieldEnclosingClass = new FieldEnclosingClass(mock(TypeElement.class), "TestActivity", "com.frankiesardo", "com.frankiesardo.SuperClass");
21+
final FieldEnclosingClass fieldEnclosingClass = new FieldEnclosingClass(mock(TypeElement.class), "TestActivity", "TestActivity", "com.frankiesardo", "com.frankiesardo.SuperClass");
2222

2323
final Set<AnnotatedField> fields = new LinkedHashSet<AnnotatedField>();
2424

icepick-processor/src/test/java/icepick/processor/ViewWriterTest.java

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@
99
import org.junit.Before;
1010
import org.junit.Test;
1111

12-
import icepick.processor.AnnotatedField;
13-
import icepick.processor.ClassWriter;
14-
import icepick.processor.FieldEnclosingClass;
15-
import icepick.processor.ViewWriter;
16-
1712
import static org.junit.Assert.assertEquals;
1813
import static org.mockito.Mockito.mock;
1914
import static org.mockito.Mockito.when;
@@ -23,7 +18,7 @@ public class ViewWriterTest {
2318
final StringWriter stringWriter = new StringWriter();
2419
final JavaFileObject jfo = mock(JavaFileObject.class);
2520
final ViewWriter icicleWriter = new ViewWriter(jfo, "$$Icicle");
26-
final FieldEnclosingClass fieldEnclosingClass = new FieldEnclosingClass(mock(TypeElement.class), "TestView", "com.frankiesardo", "com.frankiesardo.SuperClass");
21+
final FieldEnclosingClass fieldEnclosingClass = new FieldEnclosingClass(mock(TypeElement.class), "TestView", "TestView", "com.frankiesardo", "com.frankiesardo.SuperClass");
2722

2823
final Set<AnnotatedField> fields = new LinkedHashSet<AnnotatedField>();
2924

0 commit comments

Comments
 (0)