Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix #1498: kotlin lib missing resource ID for OnClick annotation #1540

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
package butterknife.compiler;

import butterknife.OnTouch;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;
import com.google.common.collect.ImmutableList;
import com.squareup.javapoet.AnnotationSpec;
import com.squareup.javapoet.ClassName;
Expand All @@ -27,6 +24,10 @@
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.TypeMirror;

import butterknife.OnTouch;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;

import static butterknife.compiler.ButterKnifeProcessor.ACTIVITY_TYPE;
import static butterknife.compiler.ButterKnifeProcessor.DIALOG_TYPE;
import static butterknife.compiler.ButterKnifeProcessor.VIEW_TYPE;
Expand Down Expand Up @@ -776,6 +777,15 @@ private ViewBinding.Builder getOrCreateViewBindings(Id id) {
return viewId;
}

boolean viewBindingsIdCoedIsNumber(Id id){
ViewBinding.Builder viewId = viewIdMap.get(id);
if (viewId == null) {
return id.coedIsNumber();
}else {
return false;
}
}

BindingSet build() {
ImmutableList.Builder<ViewBinding> viewBindings = ImmutableList.builder();
for (ViewBinding.Builder builder : viewIdMap.values()) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,33 +1,5 @@
package butterknife.compiler;

import butterknife.BindAnim;
import butterknife.BindArray;
import butterknife.BindBitmap;
import butterknife.BindBool;
import butterknife.BindColor;
import butterknife.BindDimen;
import butterknife.BindDrawable;
import butterknife.BindFloat;
import butterknife.BindFont;
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.compiler.FieldTypefaceBinding.TypefaceStyles;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;
import com.google.auto.common.SuperficialValidation;
import com.google.auto.service.AutoService;
import com.google.common.collect.ImmutableSet;
Expand Down Expand Up @@ -75,6 +47,35 @@
import javax.lang.model.util.Types;
import javax.tools.Diagnostic.Kind;

import butterknife.BindAnim;
import butterknife.BindArray;
import butterknife.BindBitmap;
import butterknife.BindBool;
import butterknife.BindColor;
import butterknife.BindDimen;
import butterknife.BindDrawable;
import butterknife.BindFloat;
import butterknife.BindFont;
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.compiler.FieldTypefaceBinding.TypefaceStyles;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;

import static butterknife.internal.Constants.NO_RES_ID;
import static java.util.Objects.requireNonNull;
import static javax.lang.model.element.ElementKind.CLASS;
Expand Down Expand Up @@ -124,6 +125,7 @@ public final class ButterKnifeProcessor extends AbstractProcessor {
private boolean debuggable = true;

private final RScanner rScanner = new RScanner();
private final FindRScanner findRScanner = new FindRScanner();

@Override public synchronized void init(ProcessingEnvironment env) {
super.init(env);
Expand Down Expand Up @@ -999,7 +1001,7 @@ private void findAndParseListener(RoundEnvironment env,
for (Element element : env.getElementsAnnotatedWith(annotationClass)) {
if (!SuperficialValidation.validateElement(element)) continue;
try {
parseListenerAnnotation(annotationClass, element, builderMap, erasedTargetNames);
parseListenerAnnotation(annotationClass, element, builderMap, erasedTargetNames,env);
} catch (Exception e) {
StringWriter stackTrace = new StringWriter();
e.printStackTrace(new PrintWriter(stackTrace));
Expand All @@ -1011,7 +1013,7 @@ private void findAndParseListener(RoundEnvironment env,
}

private void parseListenerAnnotation(Class<? extends Annotation> annotationClass, Element element,
Map<TypeElement, BindingSet.Builder> builderMap, Set<TypeElement> erasedTargetNames)
Map<TypeElement, BindingSet.Builder> builderMap, Set<TypeElement> erasedTargetNames, RoundEnvironment env)
throws Exception {
// This should be guarded by the annotation's @Target but it's worth a check for safe casting.
if (!(element instanceof ExecutableElement) || element.getKind() != METHOD) {
Expand Down Expand Up @@ -1194,7 +1196,26 @@ && isSubtypeOfType(methodParameterType, VIEW_TYPE))
Map<Integer, Id> resourceIds = elementToIds(element, annotationClass, ids);

for (Map.Entry<Integer, Id> entry : resourceIds.entrySet()) {
if (!builder.addMethod(entry.getValue(), listener, method, binding)) {
Id id = entry.getValue();
if (builder.viewBindingsIdCoedIsNumber(entry.getValue())){
String rPackageName = ((Symbol.MethodSymbol) element).owner.owner.toString() + ".R";
findRScanner.reset();
findRScanner.rId = entry.getValue().value;
for (Element element1 : env.getRootElements()) {
if (element1.toString().equals(rPackageName)) {
JCTree tree = (JCTree) trees.getTree(element1);
if (tree != null) { // tree can be null if the references are compiled types and not source
tree.accept(findRScanner);
if (findRScanner.resourceId != null) {
id = findRScanner.resourceId;
break;
}
}
break;
}
}
}
if (!builder.addMethod(id, listener, method, binding)) {
error(element, "Multiple listener methods with return value specified for ID %d. (%s.%s)",
entry.getKey(), enclosingElement.getQualifiedName(), element.getSimpleName());
return;
Expand Down Expand Up @@ -1382,4 +1403,35 @@ void reset() {
resourceIds.clear();
}
}

private static class FindRScanner extends TreeScanner {

Id resourceId = null;
int rId = -1;

@Override
public void visitVarDef(JCTree.JCVariableDecl var1) {
try {
if (rId != -1) {
int rIdValue = (Integer) ((JCTree.JCLiteral) var1.init).value;

if (rIdValue == rId) {
Symbol symbol = var1.sym;
if (symbol.getEnclosingElement() != null) {
try {
resourceId = new Id(rIdValue, symbol);
} catch (Exception ignored) {
}
}
}
}
} catch (Exception ignored) {
}
}

void reset() {
resourceId = null;
rId = -1;
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package butterknife.compiler;

import androidx.annotation.Nullable;
import com.squareup.javapoet.ClassName;
import com.squareup.javapoet.CodeBlock;
import com.sun.tools.javac.code.Symbol;
import java.util.regex.Pattern;
import androidx.annotation.Nullable;

/**
* Represents an ID of an Android resource.
Expand Down Expand Up @@ -48,4 +49,9 @@ final class Id {
@Override public String toString() {
throw new UnsupportedOperationException("Please use value or code explicitly");
}

public boolean coedIsNumber(){
Pattern pattern = Pattern.compile("[\\d]*");
return pattern.matcher(code.toString()).matches();
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package butterknife.compiler;

import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.Nullable;
import butterknife.internal.ListenerClass;
import butterknife.internal.ListenerMethod;

final class ViewBinding {
private final Id id;
Expand Down