Index: search/org/eclipse/jdt/core/search/MethodReferenceMatch.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodReferenceMatch.java,v
retrieving revision 1.10
diff -u -r1.10 MethodReferenceMatch.java
--- search/org/eclipse/jdt/core/search/MethodReferenceMatch.java 27 May 2004 10:12:33 -0000 1.10
+++ search/org/eclipse/jdt/core/search/MethodReferenceMatch.java 14 Jul 2004 18:20:26 -0000
@@ -23,6 +23,8 @@
* @since 3.0
*/
public class MethodReferenceMatch extends SearchMatch {
+ private boolean constructor;
+ private boolean synthetic;
/**
* Creates a new method reference match.
@@ -31,13 +33,37 @@
* @param accuracy one of {@link #A_ACCURATE} or {@link #A_INACCURATE}
* @param offset the offset the match starts at, or -1 if unknown
* @param length the length of the match, or -1 if unknown
- * @param insideDocComment true
if this search match is inside a doc
* comment, and false
otherwise
+ * @param constructor true
if this search match is a constructor
+ * false
otherwise
+ * @param synthetic true
if this search match is a synthetic element
+ * false
otherwise
+ * @param insideDocComment true
if this search match is inside a doc
* @param participant the search participant that created the match
* @param resource the resource of the element
*/
- public MethodReferenceMatch(IJavaElement enclosingElement, int accuracy, int offset, int length, boolean insideDocComment, SearchParticipant participant, IResource resource) {
+ public MethodReferenceMatch(IJavaElement enclosingElement, int accuracy, int offset, int length, boolean constructor, boolean synthetic, boolean insideDocComment, SearchParticipant participant, IResource resource) {
super(enclosingElement, accuracy, offset, length, participant, resource);
setInsideDocComment(insideDocComment);
+ this.constructor = constructor;
+ this.synthetic = synthetic;
+ }
+
+ /**
+ * @return Returns whether the reference is on a constructor or not.
+ */
+ public final boolean isConstructor() {
+ return this.constructor;
+ }
+
+ /**
+ * Returns whether the reference is on a synthetic element.
+ * Note that for a constructor reference, it can be synthetic when default constructor
+ * declaration is used or implicit super constructor is called.
+ *
+ * @return whether the reference is synthetic or not.
+ */
+ public final boolean isSynthetic() {
+ return this.synthetic;
}
}
Index: search/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java,v
retrieving revision 1.11
diff -u -r1.11 ConstructorLocator.java
--- search/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java 1 Jul 2004 09:31:54 -0000 1.11
+++ search/org/eclipse/jdt/internal/core/search/matching/ConstructorLocator.java 14 Jul 2004 18:20:27 -0000
@@ -11,6 +11,7 @@
package org.eclipse.jdt.internal.core.search.matching;
import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.search.SearchMatch;
import org.eclipse.jdt.internal.compiler.ast.*;
import org.eclipse.jdt.internal.compiler.lookup.Binding;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
@@ -114,6 +115,33 @@
}
return ((InternalSearchPattern)this.pattern).mustResolve ? POSSIBLE_MATCH : ACCURATE_MATCH;
+}
+public SearchMatch newDeclarationMatch(ASTNode reference, IJavaElement element, int accuracy, int length, MatchLocator locator) {
+ SearchMatch match = null;
+ int offset = reference.sourceStart;
+ if (this.pattern.findReferences) {
+ if (reference instanceof TypeDeclaration) {
+ TypeDeclaration type = (TypeDeclaration) reference;
+ AbstractMethodDeclaration[] methods = type.methods;
+ if (methods != null) {
+ for (int i = 0, max = methods.length; i < max; i++) {
+ AbstractMethodDeclaration method = methods[i];
+ boolean synthetic = method.isDefaultConstructor() && method.sourceStart < type.bodyStart;
+ match = locator.newMethodReferenceMatch(element, accuracy, offset, length, method.isConstructor(), synthetic, method);
+ }
+ }
+ } else if (reference instanceof ConstructorDeclaration) {
+ ConstructorDeclaration constructor = (ConstructorDeclaration) reference;
+ ExplicitConstructorCall call = constructor.constructorCall;
+ boolean synthetic = call != null && call.isSuperAccess();
+ match = locator.newMethodReferenceMatch(element, accuracy, offset, length, constructor.isConstructor(), synthetic, constructor);
+ }
+ }
+ if (match != null) {
+ return match;
+ }
+ // super implementation...
+ return locator.newDeclarationMatch(element, accuracy, reference.sourceStart, length);
}
public int resolveLevel(ASTNode node) {
if (this.pattern.findReferences) {
Index: search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java,v
retrieving revision 1.188
diff -u -r1.188 MatchLocator.java
--- search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 7 Jul 2004 15:35:34 -0000 1.188
+++ search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java 14 Jul 2004 18:20:32 -0000
@@ -994,6 +994,20 @@
if (type.exists()) return type;
return null;
}
+/*
+public SearchMatch newConstructorReferenceMatch(
+ IJavaElement enclosingElement,
+ int accuracy,
+ int offset,
+ int length,
+ ASTNode reference,
+ boolean synthetic) {
+ SearchParticipant participant = getParticipant();
+ IResource resource = this.currentPossibleMatch.resource;
+ boolean insideDocComment = (reference.bits & ASTNode.InsideJavadoc) != 0;
+ return new ConstructorReferenceMatch(enclosingElement, accuracy, offset, length, insideDocComment, synthetic, participant, resource);
+}
+*/
public SearchMatch newDeclarationMatch(
IJavaElement element,
int accuracy,
@@ -1064,11 +1078,13 @@
int accuracy,
int offset,
int length,
+ boolean isConstructor,
+ boolean isSynthetic,
ASTNode reference) {
SearchParticipant participant = getParticipant();
IResource resource = this.currentPossibleMatch.resource;
boolean insideDocComment = (reference.bits & ASTNode.InsideJavadoc) != 0;
- return new MethodReferenceMatch(enclosingElement, accuracy, offset, length, insideDocComment, participant, resource);
+ return new MethodReferenceMatch(enclosingElement, accuracy, offset, length, isConstructor, isSynthetic, insideDocComment, participant, resource);
}
public SearchMatch newPackageReferenceMatch(
@@ -1342,7 +1358,8 @@
}
if (encloses(enclosingElement)) {
int length = scanner.currentPosition - nameSourceStart;
- SearchMatch match = newDeclarationMatch(enclosingElement, accuracy, nameSourceStart, length);
+// SearchMatch match = newDeclarationMatch(enclosingElement, accuracy, nameSourceStart, length);
+ SearchMatch match = this.patternLocator.newDeclarationMatch(method, enclosingElement, accuracy, length, this);
report(match);
}
}
@@ -1534,7 +1551,8 @@
// report the type declaration
if (accuracy > -1 && encloses(enclosingElement)) {
int offset = type.sourceStart;
- SearchMatch match = newDeclarationMatch(enclosingElement, accuracy, offset, type.sourceEnd-offset+1);
+// SearchMatch match = newDeclarationMatch(enclosingElement, accuracy, offset, type.sourceEnd-offset+1);
+ SearchMatch match = this.patternLocator.newDeclarationMatch(type, enclosingElement, accuracy, type.sourceEnd-offset+1, this);
report(match);
}
Index: search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java,v
retrieving revision 1.21
diff -u -r1.21 MethodLocator.java
--- search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java 1 Jul 2004 09:31:54 -0000 1.21
+++ search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java 14 Jul 2004 18:20:34 -0000
@@ -145,11 +145,11 @@
reportDeclaration(((MessageSend) reference).binding, locator, declPattern.knownMethods);
} else if (this.pattern.findReferences && reference instanceof MessageSend) {
int offset = (int) (((MessageSend) reference).nameSourcePosition >>> 32);
- SearchMatch match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference);
+ SearchMatch match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, false /*not constructor*/, false/*not synthetic*/, reference);
locator.report(match);
} else {
int offset = reference.sourceStart;
- SearchMatch match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference);
+ SearchMatch match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, false /*not constructor*/, false/*not synthetic*/, reference);
locator.report(match);
}
}
Index: search/org/eclipse/jdt/internal/core/search/matching/OrLocator.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/OrLocator.java,v
retrieving revision 1.11
diff -u -r1.11 OrLocator.java
--- search/org/eclipse/jdt/internal/core/search/matching/OrLocator.java 1 Mar 2004 18:02:56 -0000 1.11
+++ search/org/eclipse/jdt/internal/core/search/matching/OrLocator.java 14 Jul 2004 18:20:36 -0000
@@ -193,6 +193,24 @@
if (closestPattern != null)
closestPattern.matchReportReference(reference, element, accuracy, locator);
}
+public SearchMatch newDeclarationMatch(ASTNode reference, IJavaElement element, int accuracy, int length, MatchLocator locator) {
+ PatternLocator closestPattern = null;
+ int level = IMPOSSIBLE_MATCH;
+ for (int i = 0, pl = this.patternLocators.length; i < pl; i++) {
+ PatternLocator patternLocator = this.patternLocators[i];
+ int newLevel = patternLocator.referenceType() == 0 ? IMPOSSIBLE_MATCH : patternLocator.resolveLevel(reference);
+ if (newLevel > level) {
+ closestPattern = patternLocator;
+ if (newLevel == ACCURATE_MATCH) break;
+ level = newLevel;
+ }
+ }
+ if (closestPattern != null) {
+ return closestPattern.newDeclarationMatch(reference, element, accuracy, length, locator);
+ }
+ // super implementation...
+ return locator.newDeclarationMatch(element, accuracy, reference.sourceStart, length);
+}
public int resolveLevel(ASTNode node) {
int level = IMPOSSIBLE_MATCH;
for (int i = 0, length = this.patternLocators.length; i < length; i++) {
Index: search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java
===================================================================
RCS file: /data/cvs/eclipse/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java,v
retrieving revision 1.24
diff -u -r1.24 PatternLocator.java
--- search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java 27 Apr 2004 16:21:42 -0000 1.24
+++ search/org/eclipse/jdt/internal/core/search/matching/PatternLocator.java 14 Jul 2004 18:20:37 -0000
@@ -241,7 +241,7 @@
match = locator.newFieldReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference);
break;
case IJavaElement.METHOD:
- match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference);
+ match = locator.newMethodReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference instanceof ExplicitConstructorCall, false/*not synthetic*/, reference);
break;
case IJavaElement.LOCAL_VARIABLE:
match = locator.newLocalVariableReferenceMatch(element, accuracy, offset, reference.sourceEnd-offset+1, reference);
@@ -250,6 +250,9 @@
if (match != null) {
locator.report(match);
}
+}
+public SearchMatch newDeclarationMatch(ASTNode reference, IJavaElement element, int accuracy, int length, MatchLocator locator) {
+ return locator.newDeclarationMatch(element, accuracy, reference.sourceStart, length);
}
protected int referenceType() {
return 0; // defaults to unknown (a generic JavaSearchMatch will be created)