From ceee55836e1155fe2a56b45dafd602f35bf19ce6 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 9 Sep 2003 15:46:44 +0000 Subject: [PATCH] Patch for Andrew Niefer Core : Index Enumerator references - Added createEnumeratorFullyQualifiedName in AbstractIndexer - Added addEnumeratorReference in AbstractIndexer - implemented acceptEnumeratorReference in SourceIndexerRequestor Search pattern matching on function parameters: - modified scanForParameters in CSearchPattern - added getParamString in CSearchPattern - modified matchLevel in MethodDeclarationPattern Enumeration references - modified acceptEnumeratorReference in MatchLocator core.tests: Modified resources/search/classDecl.cpp - to include more function declarations to test parameter matching - to include an enumerator reference to test enumerators Added testMethodDeclarationParameterMatching to FunctionMethodPatternTests.java Added testEnumeratorReferences to OtherPatternTests --- core/org.eclipse.cdt.core.tests/ChangeLog | 7 + .../resources/search/classDecl.cpp | 6 +- .../tests/ClassDeclarationPatternTests.java | 4 +- .../tests/FunctionMethodPatternTests.java | 23 ++- .../core/search/tests/OtherPatternTests.java | 9 ++ core/org.eclipse.cdt.core/index/ChangeLog | 6 + .../core/search/indexing/AbstractIndexer.java | 33 +++-- .../indexing/SourceIndexerRequestor.java | 5 +- core/org.eclipse.cdt.core/search/ChangeLog | 9 ++ .../core/search/matching/CSearchPattern.java | 139 ++++++++++++------ .../core/search/matching/MatchLocator.java | 32 +--- .../matching/MethodDeclarationPattern.java | 23 +-- 12 files changed, 196 insertions(+), 100 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/ChangeLog b/core/org.eclipse.cdt.core.tests/ChangeLog index 20fb1b28e75..f5b168db845 100644 --- a/core/org.eclipse.cdt.core.tests/ChangeLog +++ b/core/org.eclipse.cdt.core.tests/ChangeLog @@ -1,3 +1,10 @@ +2003-09-09 Andrew Niefer + Modified resources/search/classDecl.cpp + - to include more function declarations to test parameter matching + - to include an enumerator reference to test enumerators + Added testMethodDeclarationParameterMatching to FunctionMethodPatternTests.java + Added testEnumeratorReferences to OtherPatternTests + 2003-09-08 John Camelon Added CompleteParseASTTest::testThrowStatement(), testScoping(), testEnumeratorReferences(). Removed LineNumberTest source as it is obsolete. diff --git a/core/org.eclipse.cdt.core.tests/resources/search/classDecl.cpp b/core/org.eclipse.cdt.core.tests/resources/search/classDecl.cpp index 8d4761548eb..31a339d4a92 100644 --- a/core/org.eclipse.cdt.core.tests/resources/search/classDecl.cpp +++ b/core/org.eclipse.cdt.core.tests/resources/search/classDecl.cpp @@ -7,6 +7,9 @@ class Heal{}; class A { class B { void f( A ); + void f( A & ); + void f( A* ); + void f( int &, const char [], A ** ); }; }; @@ -15,6 +18,7 @@ namespace NS { struct a{}; } class B: public A { + public: struct AA {}; enum e { One, @@ -32,7 +36,7 @@ namespace NS { namespace NS3{ class C : public NS::B { - e eE; + e eE = One; }; } diff --git a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java index 0c8a8f0f779..b3e9562af82 100644 --- a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java +++ b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/ClassDeclarationPatternTests.java @@ -198,7 +198,7 @@ public class ClassDeclarationPatternTests extends BaseSearchTest implements ICSe search( workspace, pattern, scope, resultCollector ); Set matches = resultCollector.getSearchResults(); - assertEquals( matches.size(), 3 ); + assertEquals( matches.size(), 6 ); } public void testClassReferenceInFieldType(){ @@ -255,6 +255,6 @@ public class ClassDeclarationPatternTests extends BaseSearchTest implements ICSe Set matches = resultCollector.getSearchResults(); - assertEquals( matches.size(), 4 );//TODO was 6, changed for bug 41445 + assertEquals( matches.size(), 7 ); } } diff --git a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java index e3b6c225377..31d9bc9a580 100644 --- a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java +++ b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java @@ -73,7 +73,7 @@ public class FunctionMethodPatternTests extends BaseSearchTest { Set matches = resultCollector.getSearchResults(); - assertEquals( matches.size(), 1 ); + assertEquals( matches.size(), 4 ); } public void testMethodDeclarationWithParams() { @@ -83,5 +83,24 @@ public class FunctionMethodPatternTests extends BaseSearchTest { Set matches = resultCollector.getSearchResults(); - assertEquals( matches.size(), 1 ); } + assertEquals( matches.size(), 1 ); + } + + public void testMethodDeclarationParameterMatching(){ + ICSearchPattern pattern = SearchEngine.createSearchPattern( "f( A & )", METHOD, DECLARATIONS, true ); + + search( workspace, pattern, scope, resultCollector ); + Set matches = resultCollector.getSearchResults(); + assertEquals( matches.size(), 1 ); + + pattern = SearchEngine.createSearchPattern( "f( A * )", METHOD, DECLARATIONS, true ); + search( workspace, pattern, scope, resultCollector ); + matches = resultCollector.getSearchResults(); + assertEquals( matches.size(), 1 ); + + pattern = SearchEngine.createSearchPattern( "f( int &, const char [], A** )", METHOD, DECLARATIONS, true ); + search( workspace, pattern, scope, resultCollector ); + matches = resultCollector.getSearchResults(); + assertEquals( matches.size(), 1 ); + } } diff --git a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java index 2cabe76c4ba..ca904c345d7 100644 --- a/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java +++ b/core/org.eclipse.cdt.core.tests/search/org/eclipse/cdt/core/search/tests/OtherPatternTests.java @@ -193,4 +193,13 @@ public class OtherPatternTests extends BaseSearchTest { assertEquals( matches.size(), 1 ); } + public void testEnumeratorReferences(){ + ICSearchPattern pattern = SearchEngine.createSearchPattern( "One", FIELD, REFERENCES, true ); + + search( workspace, pattern, scope, resultCollector ); + + Set matches = resultCollector.getSearchResults(); + assertEquals( matches.size(), 1 ); + } + } diff --git a/core/org.eclipse.cdt.core/index/ChangeLog b/core/org.eclipse.cdt.core/index/ChangeLog index b4acd7037b8..b192b204dd2 100644 --- a/core/org.eclipse.cdt.core/index/ChangeLog +++ b/core/org.eclipse.cdt.core/index/ChangeLog @@ -1,3 +1,9 @@ +2003-09-09 Andrew Niefer + Enumerator references + - Added createEnumeratorFullyQualifiedName in AbstractIndexer + - Added addEnumeratorReference in AbstractIndexer + - implemented acceptEnumeratorReference in SourceIndexerRequestor + 2003-09-08 Andrew Niefer - Modified calls to ParserFactory to specify which language to use diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java index 963b92b61fc..344820c725e 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/AbstractIndexer.java @@ -71,25 +71,35 @@ public abstract class AbstractIndexer implements IIndexer, IIndexConstants, ICSe public void addEnumerationSpecifier(IASTEnumerationSpecifier enumeration) { this.output.addRef(encodeTypeEntry(enumeration.getFullyQualifiedName(), ENUM, ICSearchConstants.DECLARATIONS)); - Iterator i = enumeration.getEnumerators(); + Iterator i = enumeration.getEnumerators(); while (i.hasNext()) { IASTEnumerator en = (IASTEnumerator) i.next(); - String name = en.getName(); - IASTEnumerationSpecifier parent = en.getOwnerEnumerationSpecifier(); - String[] parentName = parent.getFullyQualifiedName(); - - //See spec 7.2-10, the the scope of the enumerator is the same level as the enumeration - String[] enumeratorFullName = new String[ parentName.length ]; - - System.arraycopy( parentName, 0, enumeratorFullName, 0, parentName.length); - enumeratorFullName[ parentName.length - 1 ] = name; + String[] enumeratorFullName = + createEnumeratorFullyQualifiedName(en); this.output.addRef(encodeEntry( enumeratorFullName, FIELD_DECL, FIELD_DECL_LENGTH )); } } - + + protected String[] createEnumeratorFullyQualifiedName(IASTEnumerator en) { + String name = en.getName(); + IASTEnumerationSpecifier parent = en.getOwnerEnumerationSpecifier(); + String[] parentName = parent.getFullyQualifiedName(); + + //See spec 7.2-10, the the scope of the enumerator is the same level as the enumeration + String[] enumeratorFullName = new String[ parentName.length ]; + + System.arraycopy( parentName, 0, enumeratorFullName, 0, parentName.length); + enumeratorFullName[ parentName.length - 1 ] = name; + return enumeratorFullName; + } + + public void addEnumeratorReference(IASTEnumerator enumerator) { + this.output.addRef(encodeEntry(createEnumeratorFullyQualifiedName(enumerator),FIELD_REF,FIELD_REF_LENGTH)); + } + public void addMacro(IASTMacro macro) { String[] macroName = new String[1]; macroName[0] = macro.getName(); @@ -574,6 +584,5 @@ public abstract class AbstractIndexer implements IIndexer, IIndexConstants, ICSe return bestPrefix( prefix, (char)0, macroName, null, matchMode, isCaseSenstive ); } - } diff --git a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexerRequestor.java b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexerRequestor.java index 9bb8039c5af..054daeac892 100644 --- a/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexerRequestor.java +++ b/core/org.eclipse.cdt.core/index/org/eclipse/cdt/internal/core/search/indexing/SourceIndexerRequestor.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.parser.ast.IASTEnumerationReference; import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTEnumerator; import org.eclipse.cdt.core.parser.ast.IASTEnumeratorReference; import org.eclipse.cdt.core.parser.ast.IASTField; import org.eclipse.cdt.core.parser.ast.IASTFieldReference; @@ -38,7 +39,6 @@ import org.eclipse.cdt.core.parser.ast.IASTMethod; import org.eclipse.cdt.core.parser.ast.IASTMethodReference; import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition; import org.eclipse.cdt.core.parser.ast.IASTNamespaceReference; -import org.eclipse.cdt.core.parser.ast.IASTScope; import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration; import org.eclipse.cdt.core.parser.ast.IASTTemplateInstantiation; import org.eclipse.cdt.core.parser.ast.IASTTemplateSpecialization; @@ -438,7 +438,8 @@ public class SourceIndexerRequestor implements ISourceElementRequestor, IIndexCo */ public void acceptEnumeratorReference(IASTEnumeratorReference reference) { - // TODO Auto-generated method stub + if( reference.getReferencedElement() instanceof IASTEnumerator ) + indexer.addEnumeratorReference( (IASTEnumerator)reference.getReferencedElement() ); } } diff --git a/core/org.eclipse.cdt.core/search/ChangeLog b/core/org.eclipse.cdt.core/search/ChangeLog index 5fcf42bd3d2..f05a8b776cf 100644 --- a/core/org.eclipse.cdt.core/search/ChangeLog +++ b/core/org.eclipse.cdt.core/search/ChangeLog @@ -1,3 +1,12 @@ +2003-09-09 Andrew Niefer + pattern matching on function parameters: + - modified scanForParameters in CSearchPattern + - added getParamString in CSearchPattern + - modified matchLevel in MethodDeclarationPattern + + Enumeration references + - modified acceptEnumeratorReference in MatchLocator + 2003-09-05 Andrew Niefer - fix searching for enumerators diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java index 285a8105772..2213778727e 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java @@ -15,9 +15,12 @@ package org.eclipse.cdt.internal.core.search.matching; import java.io.IOException; import java.io.StringReader; +import java.util.Iterator; import java.util.LinkedList; import org.eclipse.cdt.core.parser.EndOfFile; +import org.eclipse.cdt.core.parser.IParser; +import org.eclipse.cdt.core.parser.IQuickParseCallback; import org.eclipse.cdt.core.parser.IScanner; import org.eclipse.cdt.core.parser.IToken; import org.eclipse.cdt.core.parser.ParserLanguage; @@ -25,6 +28,16 @@ import org.eclipse.cdt.core.parser.ParserFactory; import org.eclipse.cdt.core.parser.ParserMode; import org.eclipse.cdt.core.parser.ScannerException; import org.eclipse.cdt.core.parser.ast.ASTClassKind; +import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException; +import org.eclipse.cdt.core.parser.ast.ASTPointerOperator; +import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit; +import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTFunction; +import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; +import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; import org.eclipse.cdt.core.search.ICSearchConstants; import org.eclipse.cdt.core.search.ICSearchPattern; import org.eclipse.cdt.core.search.ICSearchScope; @@ -210,10 +223,8 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte IScanner scanner = ParserFactory.createScanner( new StringReader( nameString ), "TEXT", new ScannerInfo(), ParserMode.QUICK_PARSE, ParserLanguage.CPP, null ); LinkedList names = scanForNames( scanner, null ); - - scanner = ParserFactory.createScanner( new StringReader( paramString ), "TEXT", new ScannerInfo(), ParserMode.QUICK_PARSE, ParserLanguage.CPP, null ); - - LinkedList params = scanForParameters( scanner ); + + LinkedList params = scanForParameters( paramString ); char [] name = (char [])names.removeLast(); char [][] qualifications = new char[0][]; @@ -298,53 +309,99 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte * @param object * @return */ - private static LinkedList scanForParameters(IScanner scanner) { + private static LinkedList scanForParameters( String paramString ) { LinkedList list = new LinkedList(); - String param = new String(""); + if( paramString == null || paramString.equals("") ) + return list; - boolean lastTokenWasWild = false; - try{ - IToken token = scanner.nextToken(); - - tokenConsumption: - while( true ){ - switch( token.getType() ){ - case IToken.tCOMMA : - list.addLast( param.toCharArray() ); - param = new String(""); - break; - - case IToken.tLPAREN : - break; - - case IToken.tRPAREN : - list.addLast( param.toCharArray() ); - break tokenConsumption; - - case IToken.tSTAR: - case IToken.tQUESTION: - lastTokenWasWild = true; - param += token.getImage(); - break; - - default: - if( !lastTokenWasWild && param.length() > 0 ) - param += " "; - param += token.getImage(); - break; - } + String functionString = "void f " + paramString + ";"; - token = scanner.nextToken(); + IScanner scanner = ParserFactory.createScanner( new StringReader( functionString ), "TEXT", new ScannerInfo(), ParserMode.QUICK_PARSE, ParserLanguage.CPP, null ); + IQuickParseCallback callback = ParserFactory.createQuickParseCallback(); + IParser parser = ParserFactory.createParser( scanner, callback, ParserMode.QUICK_PARSE, ParserLanguage.CPP ); + + if( parser.parse() ){ + IASTCompilationUnit compUnit = callback.getCompilationUnit(); + Iterator declarations = null; + try { + declarations = compUnit.getDeclarations(); + } catch (ASTNotImplementedException e) { + } + + if( declarations == null || ! declarations.hasNext() ) + return null; + IASTFunction function = (IASTFunction) declarations.next(); + + Iterator parameters = function.getParameters(); + char [] param = null; + while( parameters.hasNext() ){ + param = getParamString( (IASTParameterDeclaration)parameters.next() ); + list.add( param ); } - } catch ( EndOfFile e ){ - list.addLast( param.toCharArray() ); - } catch( ScannerException e ){ } return list; } + static public char [] getParamString( IASTParameterDeclaration param ){ + if( param == null ) return null; + + String signature = ""; + + IASTTypeSpecifier typeSpec = param.getTypeSpecifier(); + if( typeSpec instanceof IASTSimpleTypeSpecifier ){ + IASTSimpleTypeSpecifier simple = (IASTSimpleTypeSpecifier)typeSpec; + signature += simple.getTypename(); + } else if( typeSpec instanceof IASTElaboratedTypeSpecifier ){ + IASTElaboratedTypeSpecifier elaborated = (IASTElaboratedTypeSpecifier)typeSpec; + if( elaborated.getClassKind() == ASTClassKind.CLASS ){ + signature += "class "; + } else if( elaborated.getClassKind() == ASTClassKind.ENUM ) { + signature += "enum "; + } else if( elaborated.getClassKind() == ASTClassKind.STRUCT ) { + signature += "struct "; + } else if( elaborated.getClassKind() == ASTClassKind.UNION ) { + signature += "union"; + } + + signature += elaborated.getName(); + } else if( typeSpec instanceof IASTClassSpecifier ){ + IASTClassSpecifier classSpec = (IASTClassSpecifier)typeSpec; + signature += classSpec.getName(); + } else if( typeSpec instanceof IASTEnumerationSpecifier ){ + IASTEnumerationSpecifier enumSpec = (IASTEnumerationSpecifier)typeSpec; + signature += enumSpec.getName(); + } + + signature += " "; + + if( param.isConst() ) signature += "const "; + if( param.isVolatile() ) signature += "volatile "; + + Iterator ptrs = param.getPointerOperators(); + while( ptrs.hasNext() ){ + ASTPointerOperator ptrOp = (ASTPointerOperator) ptrs.next(); + if( ptrOp == ASTPointerOperator.POINTER ){ + signature += " * "; + } else if( ptrOp == ASTPointerOperator.REFERENCE ){ + signature += " & "; + } else if( ptrOp == ASTPointerOperator.CONST_POINTER ){ + signature += " const * "; + } else if( ptrOp == ASTPointerOperator.VOLATILE_POINTER ){ + signature += " volatile * "; + } + } + + Iterator arrayModifiers = param.getArrayModifiers(); + while( arrayModifiers.hasNext() ){ + arrayModifiers.next(); + signature += " [] "; + } + + return signature.toCharArray(); + } + static private LinkedList scanForNames( IScanner scanner, IToken unusedToken ){ LinkedList list = new LinkedList(); diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java index c6dfd681bfd..99e434f7221 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MatchLocator.java @@ -126,7 +126,15 @@ public class MatchLocator implements ISourceElementRequestor, ICSearchConstants public void exitTemplateSpecialization(IASTTemplateSpecialization specialization) { } public void exitTemplateExplicitInstantiation(IASTTemplateInstantiation instantiation) { } public void exitLinkageSpecification(IASTLinkageSpecification linkageSpec) { } + + public void enterCodeBlock(IASTCodeScope scope) { } + public void exitCodeBlock(IASTCodeScope scope) { } + + public void acceptEnumeratorReference(IASTEnumeratorReference reference){ + check( REFERENCES, reference ); + } + public void acceptMacro(IASTMacro macro){ check( DECLARATIONS, macro ); } @@ -465,29 +473,5 @@ public class MatchLocator implements ISourceElementRequestor, ICSearchConstants System.out.println("(" + Thread.currentThread() + ") " + log); } - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#enterCodeBlock(org.eclipse.cdt.core.parser.ast.IASTScope) - */ - public void enterCodeBlock(IASTCodeScope scope) { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#exitCodeBlock(org.eclipse.cdt.core.parser.ast.IASTScope) - */ - public void exitCodeBlock(IASTCodeScope scope) { - // TODO Auto-generated method stub - - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.parser.ISourceElementRequestor#acceptEnumeratorReference(org.eclipse.cdt.core.parser.ast.IASTEnumerationReference) - */ - public void acceptEnumeratorReference(IASTEnumeratorReference reference) - { - // TODO Auto-generated method stub - - } } diff --git a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MethodDeclarationPattern.java b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MethodDeclarationPattern.java index a1dfe4ac94d..641117e854b 100644 --- a/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MethodDeclarationPattern.java +++ b/core/org.eclipse.cdt.core/search/org/eclipse/cdt/internal/core/search/matching/MethodDeclarationPattern.java @@ -19,11 +19,8 @@ import java.util.Iterator; import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate; import org.eclipse.cdt.core.parser.ast.IASTFunction; import org.eclipse.cdt.core.parser.ast.IASTMethod; -import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement; import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.parser.ast.IASTQualifiedNameElement; -import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier; -import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier; import org.eclipse.cdt.core.search.ICSearchScope; import org.eclipse.cdt.internal.core.CharOperation; import org.eclipse.cdt.internal.core.index.IEntryResult; @@ -96,8 +93,9 @@ public class MethodDeclarationPattern extends CSearchPattern { //parameters if( parameterNames != null && parameterNames.length > 0 && parameterNames[0].length > 0 ){ + Iterator params = function.getParameters(); - + for( int i = 0; i < parameterNames.length; i++ ){ //if this function doesn't have this many parameters, it is not a match. @@ -105,21 +103,14 @@ public class MethodDeclarationPattern extends CSearchPattern { if( !params.hasNext() || parameterNames[ i ] == null ) return IMPOSSIBLE_MATCH; - IASTParameterDeclaration param = (IASTParameterDeclaration) params.next(); - IASTTypeSpecifier typeSpec = param.getTypeSpecifier(); - String paramName = null; - if( typeSpec instanceof IASTSimpleTypeSpecifier ){ - paramName = ((IASTSimpleTypeSpecifier)typeSpec).getTypename(); - } else if( typeSpec instanceof IASTOffsetableNamedElement ){ - paramName = ((IASTOffsetableNamedElement)typeSpec).getName(); - } else { - //??? - return IMPOSSIBLE_MATCH; - } + IASTParameterDeclaration parameter = (IASTParameterDeclaration) params.next(); + char[] param = CSearchPattern.getParamString( parameter ); - if( !matchesName( parameterNames[i], paramName.toCharArray() ) ) + //no wildcards in parameters strings + if( !CharOperation.equals( parameterNames[i], param, _caseSensitive ) ) return IMPOSSIBLE_MATCH; } + //if this function still has more parameters, it is not a match if( params.hasNext() ) return IMPOSSIBLE_MATCH;