Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » General (non-technical) » Test » test 2
test 2 [message #560711] Wed, 11 July 2007 14:51
Eclipse UserFriend
Originally posted by: dfg.dt.it

I am having a problem with searching for classes that extend another
class. The version of Eclipse that I am using is Version: 3.3.0, Build id:
I20070503-1400.

I have the following code



final Set<SearchMatch> classesThatExtendFoo= new
HashSet<SearchMatch>();

IJavaSearchScope scope= SearchEngine.createWorkspaceScope();
SearchPattern pattern= SearchPattern.createPattern("Foo",
IJavaSearchConstants.TYPE, IJavaSearchConstants.IMPLEMENTORS,
SearchPattern.R_EXACT_MATCH); SearchEngine engine= new
SearchEngine();
engine.search(pattern, new SearchParticipant[] {
SearchEngine.getDefaultSearchParticipant()}, scope, new SearchRequestor() {

@Override
public void acceptSearchMatch(SearchMatch match) throws
CoreException {
if (match.getAccuracy() == SearchMatch.A_ACCURATE &&
!match.isInsideDocComment())
System.out.println(match);
classesThatExtendFoo.add(match);
} }, new SubProgressMonitor(monitor, 1,
SubProgressMonitor.SUPPRESS_SUBTASK_LABEL));



which I am trying to use in order to find classes that extend a class
named Foo.

This code works when the class Foo exists in my project.

But I would also like it to work when the class Foo does not exist in the
project (i.e. the code will be broken and will not compile).

For example if I have the class



class Bar extends Foo{
}



and the class Foo does not exist in the project is it still possible to
find classes that extend Foo i.e. Bar?



The code above does not find Bar.

The code gets as far as "process(PossibleMatch, boolean) line: 1549"



<unknown receiving type>(MatchLocator).process(PossibleMatch, boolean)
line: 1549
<unknown receiving type>(MatchLocator).locateMatches(JavaProject,
PossibleMatch[], int, int) line: 1037
<unknown receiving type>(MatchLocator).locateMatches(JavaProject,
PossibleMatchSet, int) line: 1078
<unknown receiving type>(MatchLocator).locateMatches(SearchDocument[])
line: 1199
<unknown receiving
type>(JavaSearchParticipant).locateMatches(SearchDocument[],
SearchPattern, IJavaSearchScope, SearchRequestor, IProgressMonitor) line:
94
<unknown receiving type>(BasicSearchEngine).findMatches(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 217
<unknown receiving type>(BasicSearchEngine).search(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 502
<unknown receiving type>(SearchEngine).search(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 550



so it does identify Bar as a possible match.

The problem arises when it goes to report the possible match



MatchLocator.reportMatching(CompilationUnitDeclaration, boolean) line:
2139
<unknown receiving type>(MatchLocator).process(PossibleMatch, boolean)
line: 1549
<unknown receiving type>(MatchLocator).locateMatches(JavaProject,
PossibleMatch[], int, int) line: 1037
<unknown receiving type>(MatchLocator).locateMatches(JavaProject,
PossibleMatchSet, int) line: 1078
<unknown receiving type>(MatchLocator).locateMatches(SearchDocument[])
line: 1199
<unknown receiving
type>(JavaSearchParticipant).locateMatches(SearchDocument[],
SearchPattern, IJavaSearchScope, SearchRequestor, IProgressMonitor) line:
94
<unknown receiving type>(BasicSearchEngine).findMatches(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 217
<unknown receiving type>(BasicSearchEngine).search(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 502
<unknown receiving type>(SearchEngine).search(SearchPattern,
SearchParticipant[], IJavaSearchScope, SearchRequestor, IProgressMonitor)
line: 550



it calls the method resolveLevel



/**
* Finds out whether the given ast node matches this search pattern.
* Returns IMPOSSIBLE_MATCH if it doesn't.
* Returns INACCURATE_MATCH if it potentially matches this search
pattern (ie. * it has already been resolved but resolving failed.)
* Returns ACCURATE_MATCH if it matches exactly this search pattern
(ie. * it doesn't need to be resolved or it has already been
resolved.)
*/
public int resolveLevel(ASTNode possibleMatchingNode) {
// only called with nodes which were possible matches to the call
to matchLevel
// need to do instance of checks to find out exact type of ASTNode
return IMPOSSIBLE_MATCH;
}



from the class

org.eclipse.jdt.internal.core.search.matching.SuperTypeRefer enceLocator

in order to see if the class that the class Bar extends is a match for the
class Foo.

But even though the node passed in to the method resolveLevel is for the
class Foo an IMPOSSIBLE_MATCH is returned as no bindings exist (or are
missing) for the class Foo. No bindings exist for the class Foo (I
presume) because the class Foo does not exist.

The problem with the lack of binding information can be seen here




ProblemReferenceBinding(ReferenceBinding).sourceName() line: 1136

ProblemReferenceBinding(ReferenceBinding).qualifiedSourceNam e() line:
1065
PatternLocator.qualifiedSourceName(TypeBinding) line: 113
SuperTypeReferenceLocator(PatternLocator).resolveLevelForTyp e(char[],
TypeBinding) line: 749
SuperTypeReferenceLocator(PatternLocator).resolveLevelForTyp e(char[],
char[], TypeBinding) line: 698
SuperTypeReferenceLocator.resolveLevel(ASTNode) line: 82
MatchLocator.reportMatching(CompilationUnitDeclaration, boolean) line:
2139
MatchLocator.process(PossibleMatch, boolean) line: 1549
MatchLocator.locateMatches(JavaProject, PossibleMatch[], int, int)
line: 1037
MatchLocator.locateMatches(JavaProject, PossibleMatchSet, int) line:
1078
MatchLocator.locateMatches(SearchDocument[]) line: 1199
JavaSearchParticipant.locateMatches(SearchDocument[], SearchPattern,
IJavaSearchScope, SearchRequestor, IProgressMonitor) line: 94
BasicSearchEngine.findMatches(SearchPattern, SearchParticipant[],
IJavaSearchScope, SearchRequestor, IProgressMonitor) line: 217
BasicSearchEngine.search(SearchPattern, SearchParticipant[],
IJavaSearchScope, SearchRequestor, IProgressMonitor) line: 502
SearchEngine.search(SearchPattern, SearchParticipant[],
IJavaSearchScope, SearchRequestor, IProgressMonitor) line: 550



where the sourceName returned is null, and similiary when searching for
the package name. This results in an IMPOSSIBLE_MATCH being returned from
the method
org.eclipse.jdt.internal.core.search.matching.SuperTypeRefer enceLocator::resolveLevelForType.
Is there anyway to get around this and find Bar i.e. find all classes that
extend Foo even when the class Foo does not exist?

Creating the class Foo on the fly solves this problem but I was wondering
if there is a way of doing this without having to create the class Foo?


Any help greatly appreciated,

Máirtín
Previous Topic:test format
Next Topic:test 2
Goto Forum:
  


Current Time: Mon Dec 22 01:32:51 GMT 2014

Powered by FUDForum. Page generated in 0.02155 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software