Skip to content

Commit

Permalink
Adds failing test for JakeWharton#779
Browse files Browse the repository at this point in the history
  • Loading branch information
felipecsl committed Oct 20, 2016
1 parent 7c39e47 commit 1692866
Show file tree
Hide file tree
Showing 2 changed files with 230 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -1,30 +1,5 @@
package butterknife.compiler;

import butterknife.BindArray;
import butterknife.BindBitmap;
import butterknife.BindBool;
import butterknife.BindColor;
import butterknife.BindDimen;
import butterknife.BindDrawable;
import butterknife.BindFloat;
import butterknife.BindInt;
import butterknife.BindString;
import butterknife.BindView;
import butterknife.BindViews;
import butterknife.OnCheckedChanged;
import butterknife.OnClick;
import butterknife.OnEditorAction;
import butterknife.OnFocusChange;
import butterknife.OnItemClick;
import butterknife.OnItemLongClick;
import butterknife.OnItemSelected;
import butterknife.OnLongClick;
import butterknife.OnPageChange;
import butterknife.OnTextChanged;
import butterknife.OnTouch;
import butterknife.Optional;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;
import com.google.auto.common.SuperficialValidation;
import com.google.auto.service.AutoService;
import com.squareup.javapoet.ClassName;
Expand All @@ -35,6 +10,7 @@
import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.tree.JCTree;
import com.sun.tools.javac.tree.TreeScanner;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
Expand All @@ -52,6 +28,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.Filer;
import javax.annotation.processing.ProcessingEnvironment;
Expand All @@ -62,6 +39,7 @@
import javax.lang.model.element.Element;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.Modifier;
import javax.lang.model.element.Name;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.ArrayType;
Expand All @@ -74,6 +52,32 @@
import javax.lang.model.util.Types;
import javax.tools.Diagnostic.Kind;

import butterknife.BindArray;
import butterknife.BindBitmap;
import butterknife.BindBool;
import butterknife.BindColor;
import butterknife.BindDimen;
import butterknife.BindDrawable;
import butterknife.BindFloat;
import butterknife.BindInt;
import butterknife.BindString;
import butterknife.BindView;
import butterknife.BindViews;
import butterknife.OnCheckedChanged;
import butterknife.OnClick;
import butterknife.OnEditorAction;
import butterknife.OnFocusChange;
import butterknife.OnItemClick;
import butterknife.OnItemLongClick;
import butterknife.OnItemSelected;
import butterknife.OnLongClick;
import butterknife.OnPageChange;
import butterknife.OnTextChanged;
import butterknife.OnTouch;
import butterknife.Optional;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;

import static javax.lang.model.element.ElementKind.CLASS;
import static javax.lang.model.element.ElementKind.INTERFACE;
import static javax.lang.model.element.ElementKind.METHOD;
Expand Down Expand Up @@ -417,16 +421,16 @@ private void parseBindView(Element element, Map<TypeElement, BindingSet.Builder>
TypeVariable typeVariable = (TypeVariable) elementType;
elementType = typeVariable.getUpperBound();
}
Name qualifiedName = enclosingElement.getQualifiedName();
Name simpleName = element.getSimpleName();
if (!isSubtypeOfType(elementType, VIEW_TYPE) && !isInterface(elementType)) {
if (elementType.getKind() == TypeKind.ERROR) {
note(element, "@%s field with unresolved type (%s) "
+ "must elsewhere be generated as a View or interface. (%s.%s)",
BindView.class.getSimpleName(), elementType, enclosingElement.getQualifiedName(),
element.getSimpleName());
BindView.class.getSimpleName(), elementType, qualifiedName, simpleName);
} else {
error(element, "@%s fields must extend from View or be an interface. (%s.%s)",
BindView.class.getSimpleName(), enclosingElement.getQualifiedName(),
element.getSimpleName());
BindView.class.getSimpleName(), qualifiedName, simpleName);
hasError = true;
}
}
Expand All @@ -444,15 +448,15 @@ private void parseBindView(Element element, Map<TypeElement, BindingSet.Builder>
if (viewBindings != null && viewBindings.getFieldBinding() != null) {
FieldViewBinding existingBinding = viewBindings.getFieldBinding();
error(element, "Attempt to use @%s for an already bound ID %d on '%s'. (%s.%s)",
BindView.class.getSimpleName(), id, existingBinding.getName(),
enclosingElement.getQualifiedName(), element.getSimpleName());
BindView.class.getSimpleName(), id, existingBinding.getName(), qualifiedName,
simpleName);
return;
}
} else {
builder = getOrCreateBindingBuilder(builderMap, enclosingElement);
}

String name = element.getSimpleName().toString();
String name = simpleName.toString();
TypeName type = TypeName.get(elementType);
boolean required = isFieldRequired(element);

Expand Down
196 changes: 194 additions & 2 deletions butterknife/src/test/java/butterknife/RClassTest.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package butterknife;

import butterknife.compiler.ButterKnifeProcessor;
import com.google.testing.compile.JavaFileObjects;
import javax.tools.JavaFileObject;

import org.junit.Test;

import javax.tools.JavaFileObject;

import butterknife.compiler.ButterKnifeProcessor;

import static com.google.common.truth.Truth.assertAbout;
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
import static java.util.Arrays.asList;
Expand Down Expand Up @@ -128,6 +131,195 @@ public class RClassTest {
.generatesSources(bindingSource);
}

@Test public void issue779() {
JavaFileObject r2Bar = JavaFileObjects.forSourceString("test.bar.R2", ""
+ "package test.bar;\n"
+ "public final class R2 {\n"
+ " public static final class array {\n"
+ " public static final int res = 0x7f040001;\n"
+ " }\n"
+ " public static final class bool {\n"
+ " public static final int res = 0x7f040002;\n"
+ " }\n"
+ " public static final class color {\n"
+ " public static final int res = 0x7f040003;\n"
+ " }\n"
+ " public static final class id {\n"
+ " public static final int res = 0x7f040004;\n"
+ " }\n"
+ " public static final class string {\n"
+ " public static final int res = 0x7f040005;\n"
+ " }\n"
+ "}");

JavaFileObject nonFinalRBar = JavaFileObjects.forSourceString("test.bar.R", ""
+ "package test.bar;\n"
+ "public final class R {\n"
+ " public static final class array {\n"
+ " public static int res = 0x7f040001;\n"
+ " }\n"
+ " public static final class bool {\n"
+ " public static int res = 0x7f040002;\n"
+ " }\n"
+ " public static final class color {\n"
+ " public static int res = 0x7f040003;\n"
+ " }\n"
+ " public static final class id {\n"
+ " public static int res = 0x7f040004;\n"
+ " }\n"
+ " public static final class styleable {\n"
+ " public static int[] ActionBar = { 0x7f010001, 0x7f010003 };\n"
+ " }\n"
+ "}"
);

JavaFileObject nonFinalRFoo = JavaFileObjects.forSourceString("test.foo.R", ""
+ "package test.foo;\n"
+ "public final class R {\n"
+ " public static final class array {\n"
+ " public static int res = 0x7f040001;\n"
+ " }\n"
+ " public static final class bool {\n"
+ " public static int res = 0x7f040002;\n"
+ " }\n"
+ " public static final class color {\n"
+ " public static int res = 0x7f040003;\n"
+ " }\n"
+ " public static final class id {\n"
+ " public static int bogus = 0x7f040004;\n"
+ " }\n"
+ " public static final class styleable {\n"
+ " public static int[] ActionBar = { 0x7f010001, 0x7f010003 };\n"
+ " }\n"
+ "}"
);

JavaFileObject r2Foo = JavaFileObjects.forSourceString("test.foo.R2", ""
+ "package test.foo;\n"
+ "public final class R2 {\n"
+ " public static final class array {\n"
+ " public static final int res = 0x7f040001;\n"
+ " }\n"
+ " public static final class bool {\n"
+ " public static final int res = 0x7f040002;\n"
+ " }\n"
+ " public static final class color {\n"
+ " public static final int res = 0x7f040003;\n"
+ " }\n"
+ " public static final class id {\n"
+ " public static final int bogus = 0x7f040004;\n"
+ " }\n"
+ " public static final class string {\n"
+ " public static final int res = 0x7f040005;\n"
+ " }\n"
+ "}");

JavaFileObject fooSource = JavaFileObjects.forSourceString("test.foo.FooTest", ""
+ "package test.foo;\n"
+ "import android.app.Activity;\n"
+ "import android.view.View;\n"
+ "import butterknife.BindView;\n"
+ "public class FooTest extends Activity {\n"
+ " @BindView(R2.id.bogus) View one;\n"
+ "}"
);

JavaFileObject barSource = JavaFileObjects.forSourceString("test.bar.Test", ""
+ "package test.bar;\n"
+ "import android.app.Activity;\n"
+ "import butterknife.BindView;\n"
+ "public class Test extends Activity {\n"
+ " @BindView(R2.id.res) CustomView one;\n"
+ "}"
);

JavaFileObject customView = JavaFileObjects.forSourceString("test.bar.CustomView", ""
+ "package test.bar;\n"
+ "import android.view.View;\n"
+ "import android.content.Context;\n"
+ "public class CustomView extends View {\n"
+ " public CustomView(Context context) {\n"
+ " super(context);"
+ " }"
+ "}"
);

JavaFileObject bindingSourceBar = JavaFileObjects.forSourceString("test/Test_ViewBinding", ""
+ "// Generated code from Butter Knife. Do not modify!\n"
+ "package test.bar;\n\n"
+ "import android.support.annotation.CallSuper;\n"
+ "import android.support.annotation.UiThread;\n"
+ "import android.view.View;\n"
+ "import butterknife.Unbinder;\n"
+ "import butterknife.internal.Utils;\n"
+ "import java.lang.IllegalStateException;\n"
+ "import java.lang.Override;\n"
+ "public class Test_ViewBinding implements Unbinder {\n"
+ " private Test target;\n"
+ " @UiThread\n"
+ " public Test_ViewBinding(Test target, View source) {\n"
+ " this.target = target;\n"
+ " target.one = Utils.findRequiredViewAsType(source, R.id.res, \"field 'one'\", " +
"CustomView.class);\n"
+ " }\n"
+ " @Override\n"
+ " @CallSuper\n"
+ " public void unbind() {\n"
+ " Test target = this.target;\n"
+
" if (target == null) throw new IllegalStateException(\"Bindings already cleared.\");\n\n"
+ " this.target = null;\n\n"
+ " target.one = null;\n\n"
+ " }\n"
+ "}"
);

JavaFileObject bindingSourceFoo = JavaFileObjects.forSourceString("test/FooTest_ViewBinding", ""
+ "// Generated code from Butter Knife. Do not modify!\n"
+ "package test.foo;\n\n"
+ "import android.support.annotation.CallSuper;\n"
+ "import android.support.annotation.UiThread;\n"
+ "import android.view.View;\n"
+ "import butterknife.Unbinder;\n"
+ "import butterknife.internal.Utils;\n"
+ "import java.lang.IllegalStateException;\n"
+ "import java.lang.Override;\n"
+ "public class FooTest_ViewBinding implements Unbinder {\n"
+ " private FooTest target;\n"
+ " @UiThread\n"
+ " public Test_ViewBinding(FooTest target, View source) {\n"
+ " this.target = target;\n"
+ " target.one = Utils.findRequiredView(source, R.id.bogus, \"field 'one'\");\n"
+ " }\n"
+ " @Override\n"
+ " @CallSuper\n"
+ " public void unbind() {\n"
+ " FooTest target = this.target;\n"
+
" if (target == null) throw new IllegalStateException(\"Bindings already cleared.\");\n\n"
+ " this.target = null;\n\n"
+ " target.one = null;\n\n"
+ " }\n"
+ "}"
);

assertAbout(javaSources())
.that(asList(customView, fooSource, barSource, nonFinalRBar, nonFinalRFoo, r2Bar, r2Foo))
.withCompilerOptions("-Xlint:-processing")
.processedWith(new ButterKnifeProcessor())
.compilesWithoutWarnings()
.and()
.generatesSources(bindingSourceBar);

assertAbout(javaSources())
.that(asList(customView, fooSource, barSource, nonFinalRBar, nonFinalRFoo, r2Bar, r2Foo))
.withCompilerOptions("-Xlint:-processing")
.processedWith(new ButterKnifeProcessor())
.compilesWithoutWarnings()
.and()
.generatesSources(bindingSourceFoo);
}

@Test public void app() {
JavaFileObject source = JavaFileObjects.forSourceString("test.Test", ""
+ "package test;\n"
Expand Down

0 comments on commit 1692866

Please sign in to comment.