aboutsummaryrefslogtreecommitdiff
path: root/src/eclipseAgent
diff options
context:
space:
mode:
authorReinier Zwitserloot <reinier@zwitserloot.com>2010-11-15 00:10:26 +0000
committerReinier Zwitserloot <reinier@zwitserloot.com>2010-11-15 00:10:26 +0000
commitee560cc7fa52be3202055e03767bd90b46431052 (patch)
treed6c8945731c8dafcbafd26f78f55607d90879552 /src/eclipseAgent
parentd44421dada3d35750c08163ef76514018f89b055 (diff)
downloadlombok-ee560cc7fa52be3202055e03767bd90b46431052.tar.gz
lombok-ee560cc7fa52be3202055e03767bd90b46431052.tar.bz2
lombok-ee560cc7fa52be3202055e03767bd90b46431052.zip
eclipse @Delegate: Whoops; earlier fixes meant methods that existed explicitly in multiple supertypes got added that many times, resulting in duplicate method errors. Fixed.
Diffstat (limited to 'src/eclipseAgent')
-rw-r--r--src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java21
1 files changed, 15 insertions, 6 deletions
diff --git a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
index a1b39926..b77247e4 100644
--- a/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
+++ b/src/eclipseAgent/lombok/eclipse/agent/PatchDelegate.java
@@ -5,9 +5,12 @@ import static lombok.eclipse.Eclipse.*;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
+import java.util.Set;
import lombok.eclipse.Eclipse;
import lombok.eclipse.handlers.EclipseHandlerUtil;
@@ -194,10 +197,8 @@ public class PatchDelegate {
Eclipse.setGeneratedBy(method.typeParameters[i], source);
method.typeParameters[i].name = binding.typeVariables[i].sourceName;
ReferenceBinding super1 = binding.typeVariables[i].superclass;
- System.out.println("super1: " + super1);
ReferenceBinding[] super2 = binding.typeVariables[i].superInterfaces;
if (super2 == null) super2 = new ReferenceBinding[0];
- System.out.println("super2: " + Arrays.asList(super2));
if (super1 != null || super2.length > 0) {
int offset = super1 == null ? 0 : 1;
method.typeParameters[i].bounds = new TypeReference[super2.length + offset - 1];
@@ -260,6 +261,12 @@ public class PatchDelegate {
}
private static void addAllMethodBindings(List<MethodBinding> list, TypeBinding binding) {
+ Set<String> banList = new HashSet<String>();
+ banList.addAll(METHODS_IN_OBJECT);
+ addAllMethodBindings(list, binding, banList);
+ }
+
+ private static void addAllMethodBindings(List<MethodBinding> list, TypeBinding binding, Collection<String> banList) {
if (binding == null) return;
if (binding instanceof MemberTypeBinding) {
ClassScope cs = ((SourceTypeBinding)binding).scope;
@@ -275,19 +282,21 @@ public class PatchDelegate {
if (binding instanceof ReferenceBinding) {
ReferenceBinding rb = (ReferenceBinding) binding;
for (MethodBinding mb : rb.availableMethods()) {
+ String sig = printSig(mb);
if (mb.isStatic()) continue;
if (mb.isBridge()) continue;
if (mb.isConstructor()) continue;
if (mb.isDefaultAbstract()) continue;
if (!mb.isPublic()) continue;
if (mb.isSynthetic()) continue;
- if (METHODS_IN_OBJECT.contains(printSig(mb))) continue;
+ if (banList.contains(sig)) continue;
list.add(mb);
+ banList.add(sig);
}
- addAllMethodBindings(list, rb.superclass());
+ addAllMethodBindings(list, rb.superclass(), banList);
ReferenceBinding[] interfaces = rb.superInterfaces();
if (interfaces != null) {
- for (ReferenceBinding iface : interfaces) addAllMethodBindings(list, iface);
+ for (ReferenceBinding iface : interfaces) addAllMethodBindings(list, iface, banList);
}
}
}
@@ -331,7 +340,7 @@ public class PatchDelegate {
return pkg.isEmpty() ? qsn : (pkg + "." + qsn);
} else if (binding instanceof ArrayBinding) {
StringBuilder out = new StringBuilder();
- out.append(binding.leafComponentType());
+ out.append(simpleTypeBindingToString(binding.leafComponentType()));
for (int i = 0; i < binding.dimensions(); i++) out.append("[]");
return out.toString();
}