1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Fix for PR 99433: [Search] Return parms not part of qualification matching. Function/methos parameters are now used as a part of search pattern.

This commit is contained in:
Vladimir Hirsl 2005-06-16 19:55:34 +00:00
parent 652898366b
commit 51203a09e7
16 changed files with 437 additions and 416 deletions

View file

@ -1,3 +1,12 @@
2005-06-16 Vladimir Hirsl
Updated search related tests to reflect function parameters in search pattern.
* indexer/org/eclipse/cdt/core/indexer/tests/DependencyTests.java
* indexer/org/eclipse/cdt/core/indexer/tests/DOMSourceIndexerTests.java
* regression/org/eclipse/cdt/core/tests/SearchRegressionTests.java
* search/org/eclipse/cdt/core/search/tests/FunctionMethodPatternTests.java
* search/org/eclipse/cdt/core/search/tests/SearchTestSuite.java
2005-06-08 Alain Magloire
Remove the ResolverModelTest
- misc/org/eclipse/cdt/core/filetype/tests/ResolverTeste.java

View file

@ -176,7 +176,7 @@ public class DOMSourceIndexerTests extends TestCase implements IIndexChangeListe
suite.addTest(new FailingTest(new DOMSourceIndexerTests("testIndexContents"))); //$NON-NLS-1$
suite.addTest(new DOMSourceIndexerTests("testMacros")); //$NON-NLS-1$
suite.addTest(new FailingTest(new DOMSourceIndexerTests("testRefs"))); //$NON-NLS-1$
suite.addTest(new FailingTest(new DOMSourceIndexerTests("testExactDeclarations"))); //$NON-NLS-1$
suite.addTest(new DOMSourceIndexerTests("testExactDeclarations")); //$NON-NLS-1$
suite.addTest(new FailingTest(new DOMSourceIndexerTests("testRemoveFileFromIndex"))); //$NON-NLS-1$
suite.addTest(new DOMSourceIndexerTests("testRemoveProjectFromIndex")); //$NON-NLS-1$
suite.addTest(new DOMSourceIndexerTests("testIndexShutdown")); //$NON-NLS-1$

View file

@ -82,9 +82,9 @@ import org.eclipse.core.runtime.Platform;
//suite.addTest(new DependencyTests("testDepTable"));
suite.addTest(new DependencyTests("testDepSourceChangeTree"));
suite.addTest(new DependencyTests("testDepHeaderChangeTree"));
suite.addTest(new FailingTest(new DependencyTests("testDepHeaderChangeReindex")));
suite.addTest(new FailingTest(new DependencyTests("testDepSourceChangeTable")));
suite.addTest(new FailingTest(new DependencyTests("testDepHeaderChangeTable")));
suite.addTest(new DependencyTests("testDepHeaderChangeReindex"));
suite.addTest(new DependencyTests("testDepSourceChangeTable"));
suite.addTest(new DependencyTests("testDepHeaderChangeTable"));
suite.addTest(new DependencyTests("testUpdateDependancyNPE"));
return suite;
}

View file

@ -122,6 +122,7 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
protected Set search( ICSearchPattern pattern ) {
try {
resultCollector.aboutToStart();
searchEngine.search( workspace, pattern, scope, resultCollector, false );
} catch (InterruptedException e) {
//boo
@ -198,29 +199,28 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
suite.addTest( new SearchRegressionTests("testClassStructDeclaration") ); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testClassStructReference") ); //$NON-NLS-1$
//Fix up for DOM Indexer
suite.addTest( new FailingTest(new SearchRegressionTests("testNamespaceDeclaration"))); //$NON-NLS-1$
//Fix up for DOM Indexer
suite.addTest( new FailingTest(new SearchRegressionTests("testNamespaceDefinition"))); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testNamespaceDeclaration")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testNamespaceDefinition")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testNamespaceReference")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testMethodDeclaration")); //$NON-NLS-1$
//Fix up for DOM Indexer
suite.addTest( new FailingTest(new SearchRegressionTests("testMethodDefinition"))); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testMethodDefinition")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testMethodReference") ); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testMethodReferenceOperator") ); //$NON-NLS-1$
suite.addTest( new FailingTest( new SearchRegressionTests("testMethodReferenceImplicitOperator"), 80117 ) ); //defect80117 //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testMethodReferenceInitializer")); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testMethodReferenceInline")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testMethodReferenceWithCctor") ); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testConstructorReferenceArg")); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testConstructorReferenceAlone")); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testMethodReferenceInitializer")); //defect76169 //$NON-NLS-1$
//fails because inline def refers to a member not declared yet
suite.addTest(new SearchRegressionTests("testMethodReferenceInline")); //defect79425//$NON-NLS-1$
//method call with constructor call not found
suite.addTest( new SearchRegressionTests("testMethodReferenceWithCctor") ); //defect79789//$NON-NLS-1$
//constructor call in function argument not found
suite.addTest( new SearchRegressionTests("testConstructorReferenceArg")); //defect79785 //$NON-NLS-1$
//constructor call by itself not found
suite.addTest(new SearchRegressionTests("testConstructorReferenceAlone")); //defect79792 //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testDestructorReference") ); //defect79792 //$NON-NLS-1$
//Fixup for DOM Indexer
suite.addTest( new FailingTest(new SearchRegressionTests("testFunctionDeclaration"))); //$NON-NLS-1$
//Fixup for DOM Indexer
suite.addTest( new FailingTest(new SearchRegressionTests("testFunctionDefinition"))); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testFunctionDeclaration")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testFunctionDefinition")); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testFunctionReference") ); //$NON-NLS-1$
suite.addTest( new SearchRegressionTests("testFieldDeclaration") ); //$NON-NLS-1$
@ -245,7 +245,7 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
suite.addTest( new FailingTest(new SearchRegressionTests("testUnionReference"))); //$NON-NLS-1$
suite.addTest( new FailingTest(new SearchRegressionTests("testEnumerationDeclaration"))); //$NON-NLS-1$
suite.addTest( new FailingTest(new SearchRegressionTests("testEnumerationReference"))); //$NON-NLS-1$
suite.addTest(new SearchRegressionTests("testEnumerationReference")); //$NON-NLS-1$
//search doesn't distinguish between global and local symbols
suite.addTest( new FailingTest( new SearchRegressionTests("testEnumerationReferenceGlobal"), 79811 ) ); //defect79811 //$NON-NLS-1$
@ -541,7 +541,7 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
public void testMethodDefinition() throws Exception {
Writer writer = new StringWriter();
writer.write("class N { \n" ); //$NON-NLS-1$
writer.write(" N& operator ||(const N &rhs){} \n" ); //$NON-NLS-1$
writer.write(" N& operator ||(const N &rhs){return *this;}\n" ); //$NON-NLS-1$
writer.write(" N& operator|(const N &rhs); \n" ); //$NON-NLS-1$
writer.write(" int m; \n" ); //$NON-NLS-1$
writer.write("}; \n" ); //$NON-NLS-1$
@ -575,7 +575,8 @@ public class SearchRegressionTests extends BaseTestFramework implements ICSearch
String code = writer.toString();
IFile cpp = importFile( "MethodDefinition.cpp", code ); //$NON-NLS-1$
//vp1 operator, constructor, destructor, inline, static, const, explicit constructor
ICElement[] list = {cproject.findElement(new Path("MethodDefinition.cpp"))}; //$NON-NLS-1$
ICElement[] list = new ICElement[1];//{cproject.findElement(new Path("MethodDefinition.cpp"))}; //$NON-NLS-1$
list[0] = cproject;
ICSearchPattern pattern=SearchEngine.createSearchPattern("*", METHOD, DEFINITIONS, true); //$NON-NLS-1$
Set matches = search(pattern, list);
assertMatch( matches, cpp, code.indexOf( "operator|/*def1*/" ) ); //$NON-NLS-1$

View file

@ -114,7 +114,7 @@ public class FunctionMethodPatternTests extends BaseSearchTest {
Set matches = resultCollector.getSearchResults();
assertEquals( 2, matches.size());
pattern = SearchEngine.createSearchPattern( "turn(void)", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
pattern = SearchEngine.createSearchPattern( "turn(void)", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
matches = resultCollector.getSearchResults();
@ -129,7 +129,7 @@ public class FunctionMethodPatternTests extends BaseSearchTest {
}
public void testOperators_bug43063_bug42979(){
ICSearchPattern pattern = SearchEngine.createSearchPattern( "operator \\*", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
ICSearchPattern pattern = SearchEngine.createSearchPattern( "operator \\*", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
Set matches = resultCollector.getSearchResults();
@ -158,10 +158,15 @@ public class FunctionMethodPatternTests extends BaseSearchTest {
assertTrue( ((IOffsetLocatable)match1.getLocatable()).getNameStartOffset() != ((IOffsetLocatable)match2.getLocatable()).getNameStartOffset() );
pattern = SearchEngine.createSearchPattern( "operator *", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
pattern = SearchEngine.createSearchPattern( "operator *", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
matches = resultCollector.getSearchResults();
assertEquals( matches.size(), 5 );
pattern = SearchEngine.createSearchPattern( "operator *", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
matches = resultCollector.getSearchResults();
assertEquals( matches.size(), 6 ); //3 in classDecl.cpp
assertEquals( matches.size(), 8 ); //2 in classDecl.cpp
pattern = SearchEngine.createSearchPattern( "operator ->\\*", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
assertTrue( pattern instanceof MethodDeclarationPattern );
@ -214,13 +219,13 @@ public class FunctionMethodPatternTests extends BaseSearchTest {
}
public void testConstructorDestructor(){
ICSearchPattern pattern = SearchEngine.createSearchPattern( "A", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
ICSearchPattern pattern = SearchEngine.createSearchPattern( "A", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
Set matches = resultCollector.getSearchResults();
assertEquals( matches.size(), 1 );
pattern = SearchEngine.createSearchPattern( "~A", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
pattern = SearchEngine.createSearchPattern( "~A", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
matches = resultCollector.getSearchResults();
@ -228,7 +233,7 @@ public class FunctionMethodPatternTests extends BaseSearchTest {
}
public void testLookupForDefinition(){
ICSearchPattern pattern = SearchEngine.createSearchPattern( "turn", METHOD, DECLARATIONS, true ); //$NON-NLS-1$
ICSearchPattern pattern = SearchEngine.createSearchPattern( "turn", METHOD, DECLARATIONS_DEFINITIONS, true ); //$NON-NLS-1$
search( workspace, pattern, scope, resultCollector );
Set matches = resultCollector.getSearchResults();
assertEquals( matches.size(), 3 );

View file

@ -26,7 +26,7 @@ public class SearchTestSuite extends TestCase {
TestSuite suite= new TestSuite(SearchTestSuite.class.getName());
suite.addTestSuite(ClassDeclarationPatternTests.class);
//suite.addTestSuite(FunctionMethodPatternTests.class);
suite.addTestSuite(FunctionMethodPatternTests.class);
suite.addTestSuite(OtherPatternTests.class);
suite.addTestSuite(ParseTestOnSearchFiles.class);
return suite;

View file

@ -1,3 +1,19 @@
2005-06-16 Vladimir Hirsl
Fix for PR 99433: [Search] Return parms not part of qualification matching
Function/methos parameters are now used as a part of search pattern.
Note: return parameters are NOT used as a part of search pattern. The PR title
is somewhat missleading.
* index/org/eclipse/cdt/internal/core/index/ctagsindexer/CTagEntry.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CGenerateIndexVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/CPPGenerateIndexVisitor.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexEncoderUtil.java
* index/org/eclipse/cdt/internal/core/index/domsourceindexer/IndexVisitorUtil.java
* search/org/eclipse/cdt/core/search/BasicSearchMatch.java
* search/org/eclipse/cdt/core/search/DOMSearchUtil.java
* search/org/eclipse/cdt/internal/core/search/matching/CSearchPattern.java
* search/org/eclipse/cdt/internal/core/search/matching/MethodDeclarationPattern.java
2005-06-14 David Inglis
Support for older cygpaths - bug # 94702

View file

@ -216,11 +216,7 @@ class CTagEntry{
private char[][] getFunctionSignature() {
String signature = (String) tagExtensionField.get(CTagsConsoleParser.SIGNATURE);
LinkedList list = CSearchPattern.scanForParameters(signature);
char [][] parameters = new char [0][];
parameters = (char[][])list.toArray( parameters );
return parameters;
return CSearchPattern.scanForParameters(signature);
}
private int getModifiers() {

View file

@ -244,7 +244,7 @@ public class CGenerateIndexVisitor extends CASTVisitor {
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setSignature(IndexVisitorUtil.getParameters(name));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
indexEntry.serialize(indexer.getOutput());

View file

@ -297,7 +297,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.METHOD, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setSignature(IndexVisitorUtil.getParameters(name));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
serialize(indexEntry);
@ -313,7 +313,7 @@ public class CPPGenerateIndexVisitor extends CPPASTVisitor {
}
FunctionEntry indexEntry = new FunctionEntry(IIndex.FUNCTION, entryKind, qualifiedName, modifiers, fileNumber);
indexEntry.setNameOffset(fileLoc.getNodeOffset(), fileLoc.getNodeLength(), IIndex.OFFSET);
indexEntry.setSignature(IndexVisitorUtil.getParameters((IFunction) binding));
indexEntry.setSignature(IndexVisitorUtil.getParameters(name));
indexEntry.setReturnType(IndexVisitorUtil.getReturnType((IFunction) binding));
serialize(indexEntry);

View file

@ -39,14 +39,14 @@ public class IndexEncoderUtil {
String filePath = ""; //$NON-NLS-1$
if (tempFile != null){
//File is local to workspace
filePath = tempFile.getFullPath().toOSString();
filePath = tempFile.getFullPath().toString();
}
else {
//File is external to workspace
filePath = fileName;
}
if (!filePath.equals(indexer.getResourceFile().getFullPath().toOSString())) {
if (!filePath.equals(indexer.getResourceFile().getFullPath().toString())) {
//We are not in the file that has triggered the index. Thus, we need to find the
//file number for the current file (if it has one). If the current file does not
//have a file number, we need to add it to the index.

View file

@ -10,12 +10,11 @@
***********************************************************************/
package org.eclipse.cdt.internal.core.index.domsourceindexer;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
import org.eclipse.cdt.core.dom.ast.ASTTypeUtil;
import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
import org.eclipse.cdt.core.dom.ast.IBinding;
@ -180,32 +179,31 @@ public class IndexVisitorUtil {
}
/**
* @param function
* @param functionName
* @return
*/
static char[][] getParameters(IFunction function) {
List parameterList = new ArrayList();
try {
IFunctionType functionType = function.getType();
IType[] parameterTypes = functionType.getParameterTypes();
for (int i = 0; i < parameterTypes.length; i++) {
IType parameterType = parameterTypes[i];
parameterList.add(ASTTypeUtil.getType(parameterType).toCharArray());
public static char[][] getParameters(IASTName functionName) {
IASTNode parent = functionName.getParent();
if (parent instanceof IASTDeclarator) {
IASTDeclarator declarator = (IASTDeclarator) parent;
String[] parameters = ASTSignatureUtil.getParameterSignatureArray(declarator);
if (parameters.length == 0) {
return new char[][] { "void".toCharArray() }; //$NON-NLS-1$
}
if (parameterList.isEmpty()) {
parameterList.add("void".toCharArray()); //$NON-NLS-1$
char[][] rv = new char[parameters.length][];
for (int k = 0; k < parameters.length; k++) {
rv[k] = parameters[k].toCharArray();
}
return rv;
}
catch (DOMException e) {
}
return (char[][]) parameterList.toArray(new char[parameterList.size()][]);
return new char[0][];
}
/**
* @param function
* @return
*/
static char[] getReturnType(IFunction function) {
public static char[] getReturnType(IFunction function) {
try {
IFunctionType functionType = function.getType();
IType returnType = functionType.getReturnType();

View file

@ -28,6 +28,7 @@ public class BasicSearchMatch implements IMatch, Comparable {
String parentName = null;
String[] qualifiedName;
String[] parameters;
String returnType;
IResource resource = null;
@ -194,7 +195,11 @@ public class BasicSearchMatch implements IMatch, Comparable {
return parentName;
}
public String getReturnType() {
public String[] getParameters() {
return parameters;
}
public String getReturnType() {
return returnType;
}
@ -266,7 +271,11 @@ public class BasicSearchMatch implements IMatch, Comparable {
parentName = string;
}
/**
public void setParameters(String[] params) {
parameters = params;
}
/**
* @param string
*/
public void setReturnType(String string) {

View file

@ -102,49 +102,15 @@ public class DOMSearchUtil {
// build the SearchFor/pattern based on the IBinding
SearchFor searchFor = createSearchFor(binding);
if (binding instanceof IFunction) {
searchFor = ICSearchConstants.FUNCTION;
} else if (binding instanceof ICPPNamespace || binding instanceof ICPPNamespaceAlias) {
searchFor = ICSearchConstants.NAMESPACE;
} else if (binding instanceof ICPPField) {
searchFor = ICSearchConstants.FIELD;
} else if (binding instanceof IEnumerator) {
searchFor = ICSearchConstants.ENUMTOR;
} else if (binding instanceof ICPPMethod) {
searchFor = ICSearchConstants.METHOD;
} else if (binding instanceof IMacroBinding) {
searchFor = ICSearchConstants.MACRO;
} else if (binding instanceof ITypedef) {
searchFor = ICSearchConstants.TYPEDEF;
} else if (binding instanceof IVariable) {
searchFor = ICSearchConstants.VAR;
} else if (binding instanceof ICPPClassType) {
searchFor = ICSearchConstants.CLASS;
} else if (binding instanceof ICompositeType) {
try {
switch(((ICompositeType)binding).getKey()) {
case ICompositeType.k_struct:
searchFor = ICSearchConstants.CLASS_STRUCT;
break;
case ICompositeType.k_union:
searchFor = ICSearchConstants.UNION;
break;
}
} catch (DOMException e) {
searchFor = ICSearchConstants.UNKNOWN_SEARCH_FOR;
}
} else if (binding instanceof IEnumeration) {
searchFor = ICSearchConstants.ENUM;
} else {
searchFor = ICSearchConstants.UNKNOWN_SEARCH_FOR;
}
return CSearchPattern.createPattern(DOMSearchUtil.getSearchPattern(searchName), searchFor, limitTo, ICSearchConstants.EXACT_MATCH, caseSensitive);
}
private static SearchFor createSearchFor( IBinding binding ) {
SearchFor searchFor = null;
if (binding instanceof IFunction) {
if (binding instanceof ICPPMethod) {
searchFor = ICSearchConstants.METHOD;
} else if (binding instanceof IFunction) {
searchFor = ICSearchConstants.FUNCTION;
} else if (binding instanceof ICPPNamespace || binding instanceof ICPPNamespaceAlias) {
searchFor = ICSearchConstants.NAMESPACE;
@ -152,8 +118,6 @@ public class DOMSearchUtil {
searchFor = ICSearchConstants.FIELD;
} else if (binding instanceof IEnumerator) {
searchFor = ICSearchConstants.ENUMTOR;
} else if (binding instanceof ICPPMethod) {
searchFor = ICSearchConstants.METHOD;
} else if (binding instanceof IMacroBinding) {
searchFor = ICSearchConstants.MACRO;
} else if (binding instanceof ITypedef) {

View file

@ -14,16 +14,20 @@
package org.eclipse.cdt.internal.core.search.matching;
import java.io.IOException;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.ASTSignatureUtil;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTSimpleDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.EndOfFileException;
import org.eclipse.cdt.core.parser.IParser;
import org.eclipse.cdt.core.parser.IParserLogService;
import org.eclipse.cdt.core.parser.IProblem;
import org.eclipse.cdt.core.parser.IQuickParseCallback;
import org.eclipse.cdt.core.parser.IScanner;
import org.eclipse.cdt.core.parser.ISourceElementRequestor;
import org.eclipse.cdt.core.parser.IToken;
import org.eclipse.cdt.core.parser.NullLogService;
import org.eclipse.cdt.core.parser.NullSourceElementRequestor;
@ -31,22 +35,29 @@ import org.eclipse.cdt.core.parser.ParserFactory;
import org.eclipse.cdt.core.parser.ParserFactoryError;
import org.eclipse.cdt.core.parser.ParserLanguage;
import org.eclipse.cdt.core.parser.ParserMode;
import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.search.ICSearchConstants;
import org.eclipse.cdt.core.search.ICSearchPattern;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.core.search.OrPattern;
import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.dom.parser.ISourceCodeParser;
import org.eclipse.cdt.internal.core.dom.parser.c.ANSICParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.c.GNUCSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.c.ICParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ANSICPPParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.dom.parser.cpp.GNUCPPSourceParser;
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPParserExtensionConfiguration;
import org.eclipse.cdt.internal.core.index.IEntryResult;
import org.eclipse.cdt.internal.core.index.IIndex;
import org.eclipse.cdt.internal.core.index.cindexstorage.io.BlocksIndexInput;
import org.eclipse.cdt.internal.core.index.cindexstorage.io.IndexInput;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.core.parser.scanner2.DOMScanner;
import org.eclipse.cdt.internal.core.parser.scanner2.FileCodeReaderFactory;
import org.eclipse.cdt.internal.core.parser.scanner2.GCCScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.GPPScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.parser.scanner2.IScannerExtensionConfiguration;
import org.eclipse.cdt.internal.core.search.IIndexSearchRequestor;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.OperationCanceledException;
@ -182,28 +193,13 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
return orPattern;
}
char [] patternArray = patternString.toCharArray();
char[][] names = scanForNames( patternString );
IScanner scanner = null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
new CodeReader(patternArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback,
nullLog, null);
} catch (ParserFactoryError e) {
}
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[] name = names[names.length - 1];
char[][] qualifications = new char [names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
char [] name = (char []) list.removeLast();
char [][] qualifications = new char [0][];
return new NamespaceDeclarationPattern( name, (char[][]) list.toArray( qualifications ), matchMode, limitTo, caseSensitive );
return new NamespaceDeclarationPattern( name, qualifications , matchMode, limitTo, caseSensitive );
}
// /**
@ -261,26 +257,14 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
orPattern.addPattern( createFieldPattern( patternString, searchFor, DEFINITIONS, matchMode, caseSensitive ) );
return orPattern;
}
char [] patternArray = patternString.toCharArray();
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
IScanner scanner=null;
try {
scanner =
ParserFactory.createScanner(
new CodeReader(patternArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback, nullLog, null);
} catch (ParserFactoryError e) {
}
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[][] names = scanForNames( patternString );
char [] name = (char []) list.removeLast();
char [][] qualifications = new char[0][];
char[] name = names[names.length - 1];
char[][] qualifications = new char[names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
return new FieldDeclarationPattern( name, (char[][]) list.toArray( qualifications ), matchMode, searchFor, limitTo, caseSensitive );
return new FieldDeclarationPattern( name, qualifications, matchMode, searchFor, limitTo, caseSensitive );
}
/**
@ -309,34 +293,23 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
int index = patternString.indexOf( '(' );
String paramString = ( index == -1 ) ? "" : patternString.substring( index ); //$NON-NLS-1$
String nameString = ( index == -1 ) ? patternString : patternString.substring( 0, index );
char [] nameArray = nameString.toCharArray();
IScanner scanner=null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
new CodeReader(nameArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback, nullLog, null);
} catch (ParserFactoryError e) {
}
LinkedList names = scanForNames( scanner, callback, null, nameArray );
LinkedList params = scanForParameters( paramString );
char[][] names = scanForNames( nameString );
char[][] parameters = scanForParameters( paramString );
char [] name = (char [])names.removeLast();
char [][] qualifications = new char[0][];
qualifications = (char[][])names.toArray( qualifications );
char [][] parameters = new char [0][];
parameters = (char[][])params.toArray( parameters );
// TODO implement
//LinkedList returnType = scanForReturnType();
return new MethodDeclarationPattern( name, qualifications, parameters, matchMode, searchFor, limitTo, caseSensitive );
char[] name = names[names.length - 1];
char[][] qualifications = new char[names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
char[] returnType = new char[0];
return new MethodDeclarationPattern( name, qualifications, parameters, returnType, matchMode, searchFor, limitTo, caseSensitive );
}
private static final IParserLogService nullLog = new NullLogService();
private static final IParserLogService nullLog = new NullLogService();
/**
* @param patternString
* @param limitTo
@ -367,269 +340,209 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
orPattern.addPattern( createClassPattern( patternString, STRUCT, limitTo, matchMode, caseSensitive ) );
return orPattern;
}
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
new CodeReader(patternArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback, nullLog, null );
} catch (ParserFactoryError e1) {
}
IToken token = null;
try {
token = scanner.nextToken();
} catch (EndOfFileException e) {
}
if( token != null ){
boolean nullifyToken = true;
if( token.getType() == IToken.t_class ){
searchFor = CLASS;
} else if ( token.getType() == IToken.t_struct ){
searchFor = STRUCT;
} else if ( token.getType() == IToken.t_union ){
searchFor = UNION;
} else if ( token.getType() == IToken.t_enum ){
searchFor = ENUM;
} else if ( token.getType() == IToken.t_typedef ){
searchFor = TYPEDEF;
} else {
nullifyToken = false;
}
if( nullifyToken ){
patternArray = CharOperation.subarray( patternArray, token.getLength() + 1, -1 );
token = null;
}
}
LinkedList list = scanForNames( scanner, callback, token, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
return new ClassDeclarationPattern( name, (char[][])list.toArray( qualifications ), searchFor, limitTo, matchMode, caseSensitive);
String[] tokens = patternString.split("\\s+"); //$NON-NLS-1$
if (tokens.length > 0) {
boolean removeFirst = true;
if (tokens[0].equals("class")) { //$NON-NLS-1$
searchFor = CLASS;
}
else if (tokens[0].equals("struct")) { //$NON-NLS-1$
searchFor = STRUCT;
}
else if (tokens[0].equals("union")) { //$NON-NLS-1$
searchFor = UNION;
}
else if (tokens[0].equals("enum")) { //$NON-NLS-1$
searchFor = ENUM;
}
else if (tokens[0].equals("typedef")) { //$NON-NLS-1$
searchFor = TYPEDEF;
}
else {
removeFirst = false;
}
if (removeFirst) {
patternString = patternString.substring(tokens[0].length()).trim();
}
}
char[][] names = scanForNames( patternString ); // return type as first element of the array
char[] name = names[names.length - 1];
char[][] qualifications = new char[names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
return new ClassDeclarationPattern( name, qualifications, searchFor, limitTo, matchMode, caseSensitive);
}
private static CSearchPattern createDerivedPattern(String patternString, SearchFor searchFor, LimitTo limitTo, int matchMode, boolean caseSensitive) {
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
new CodeReader(patternArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback, nullLog, null);
} catch (ParserFactoryError e1) {
}
searchFor = DERIVED;
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
return new DerivedTypesPattern( name, (char[][])list.toArray( qualifications ), searchFor, limitTo, matchMode, caseSensitive );
char[][] names = scanForNames( patternString );
char[] name = names[names.length - 1];
char[][] qualifications = new char[names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
return new DerivedTypesPattern( name, qualifications, searchFor, limitTo, matchMode, caseSensitive );
}
private static CSearchPattern createFriendPattern(String patternString, SearchFor searchFor, LimitTo limitTo, int matchMode, boolean caseSensitive) {
char [] patternArray = patternString.toCharArray();
IScanner scanner =null;
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
try {
scanner =
ParserFactory.createScanner(
new CodeReader(patternArray),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback, nullLog, null);
} catch (ParserFactoryError e1) {
}
searchFor = FRIEND;
LinkedList list = scanForNames( scanner, callback, null, patternArray );
char[] name = (char [])list.removeLast();
char [][] qualifications = new char[0][];
return new FriendPattern( name, (char[][])list.toArray( qualifications ), searchFor, limitTo, matchMode, caseSensitive );
char[][] names = scanForNames( patternString );
char[] name = names[names.length - 1];
char[][] qualifications = new char[names.length - 1][];
System.arraycopy(names, 0, qualifications, 0, qualifications.length);
return new FriendPattern( name, qualifications, searchFor, limitTo, matchMode, caseSensitive );
}
/**
/**
* @param nameString
* @return
*/
private static char[][] scanForNames(String nameString) {
final List nameList = new ArrayList();
if (nameString != null && nameString.length() > 0) {
Requestor callback = new Requestor( ParserMode.COMPLETE_PARSE );
IScanner scanner = createScanner(nameString, callback);
if (scanner != null) {
String name = new String(""); //$NON-NLS-1$
char[] pattern = nameString.toCharArray();
int idx = 0;
try {
IToken token = scanner.nextToken();
IToken prev = null;
boolean encounteredWild = false;
boolean lastTokenWasOperator = false;
while( true ){
switch( token.getType() ){
case IToken.tCOLONCOLON :
nameList.add( name.toCharArray() );
name = new String(""); //$NON-NLS-1$
lastTokenWasOperator = false;
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
break;
case IToken.t_operator :
name += token.getImage();
name += ' ';
lastTokenWasOperator = true;
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
break;
default:
if( token.getType() == IToken.tSTAR ||
token.getType() == IToken.tQUESTION ) {
if( idx > 0 && idx < pattern.length && CharOperation.isWhitespace( pattern[ idx - 1 ] ) && !lastTokenWasOperator )
name += ' ';
encounteredWild = true;
}
else if( !encounteredWild && !lastTokenWasOperator && name.length() > 0 &&
prev.getType() != IToken.tIDENTIFIER &&
prev.getType() != IToken.tLT &&
prev.getType() != IToken.tCOMPL &&
prev.getType() != IToken.tARROW &&
prev.getType() != IToken.tLBRACKET &&
token.getType() != IToken.tRBRACKET &&
token.getType()!= IToken.tGT
){
name += ' ';
} else {
encounteredWild = false;
}
name += token.getImage();
if( encounteredWild && idx < pattern.length - 1 && CharOperation.isWhitespace( pattern[ idx + 1 ] ) )
{
name += ' ';
}
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
lastTokenWasOperator = false;
break;
}
prev = token;
token = null;
while( token == null ){
token = scanner.nextToken();
if( callback.badCharacterOffset != -1 && token.getOffset() > callback.badCharacterOffset ){
//TODO : This may not be \\, it could be another bad character
if( !encounteredWild && !lastTokenWasOperator && prev.getType() != IToken.tARROW ) name += " "; //$NON-NLS-1$
name += "\\"; //$NON-NLS-1$
idx++;
encounteredWild = true;
lastTokenWasOperator = false;
prev = null;
callback.badCharacterOffset = -1;
}
}
}
} catch (EndOfFileException e) {
nameList.add( name.toCharArray() );
}
}
}
return (char[][]) nameList.toArray(new char [nameList.size()] []);
}
/**
* @param scanner
* @param object
* @return
*/
public static LinkedList scanForParameters( String paramString ) {
LinkedList list = new LinkedList();
public static char[][] scanForParameters( String paramString ) {
char[][] rv = new char[0][];
if( paramString == null || paramString.equals("") ) //$NON-NLS-1$
return list;
return rv;
String functionString = "void f " + paramString + ";"; //$NON-NLS-1$ //$NON-NLS-2$
IScanner scanner=null;
IQuickParseCallback callback = ParserFactory.createQuickParseCallback();
try {
scanner =
ParserFactory.createScanner(
new CodeReader(functionString.toCharArray()),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
ParserLanguage.CPP,
callback,new NullLogService(), null);
} catch (ParserFactoryError e1) {
}
IParser parser=null;
try {
parser =
ParserFactory.createParser(
scanner,
callback,
ParserMode.QUICK_PARSE,
ParserLanguage.CPP, ParserUtil.getParserLogService());
} catch (ParserFactoryError e2) {
}
if( parser.parse() ){
IASTCompilationUnit compUnit = callback.getCompilationUnit();
Iterator declarations = null;
try {
declarations = compUnit.getDeclarations();
} catch (ASTNotImplementedException e) {
}
if( declarations == null || ! declarations.hasNext() )
return null;
IASTDeclaration decl = (IASTDeclaration) declarations.next();
if( !(decl instanceof IASTFunction) ){
//if the user puts something not so good in the brackets, we might not get a function back
return list;
}
IASTFunction function = (IASTFunction) decl;
String [] paramTypes = ASTUtil.getFunctionParameterTypes(function);
if( paramTypes.length == 0 )
{
//This means that no params have been added (i.e. empty brackets - void case)
list.add ("void".toCharArray() ); //$NON-NLS-1$
} else {
for( int i = 0; i < paramTypes.length; i++ ){
list.add( paramTypes[i].toCharArray() );
}
}
}
return list;
try {
IASTTranslationUnit tu = parse(functionString);
if (tu != null) {
IASTDeclaration[] decls = tu.getDeclarations();
for (int i = 0; i < decls.length; i++) {
IASTDeclaration decl = decls[i];
if (decl instanceof IASTSimpleDeclaration) {
IASTSimpleDeclaration simpleDecl = (IASTSimpleDeclaration) decl;
IASTDeclarator[] declarators = simpleDecl.getDeclarators();
for (int j = 0; j < declarators.length; j++) {
String[] parameters = ASTSignatureUtil.getParameterSignatureArray(declarators[j]);
rv = new char[parameters.length][];
for (int k = 0; k < parameters.length; k++) {
rv[k] = parameters[k].toCharArray();
}
// take first set of parameters only
break;
}
}
// take first declaration only
break;
}
}
}
catch (ParserException e) {
}
return rv;
}
static private LinkedList scanForNames( IScanner scanner, Requestor callback, IToken unusedToken, char[] pattern ){
LinkedList list = new LinkedList();
String name = new String(""); //$NON-NLS-1$
int idx = 0;
try {
IToken token = ( unusedToken != null ) ? unusedToken : scanner.nextToken();
IToken prev = null;
boolean encounteredWild = false;
boolean lastTokenWasOperator = false;
while( true ){
switch( token.getType() ){
case IToken.tCOLONCOLON :
list.addLast( name.toCharArray() );
name = new String(""); //$NON-NLS-1$
lastTokenWasOperator = false;
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
break;
case IToken.t_operator :
name += token.getImage();
name += ' ';
lastTokenWasOperator = true;
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
break;
default:
if( token.getType() == IToken.tSTAR ||
token.getType() == IToken.tQUESTION
)
{
if( idx > 0 && idx < pattern.length && CharOperation.isWhitespace( pattern[ idx - 1 ] ) && !lastTokenWasOperator )
name += ' ';
encounteredWild = true;
} else if( !encounteredWild && !lastTokenWasOperator && name.length() > 0 &&
prev.getType() != IToken.tIDENTIFIER &&
prev.getType() != IToken.tLT &&
prev.getType() != IToken.tCOMPL &&
prev.getType() != IToken.tARROW &&
prev.getType() != IToken.tLBRACKET &&
token.getType() != IToken.tRBRACKET &&
token.getType()!= IToken.tGT
){
name += ' ';
} else {
encounteredWild = false;
}
name += token.getImage();
if( encounteredWild && idx < pattern.length - 1 && CharOperation.isWhitespace( pattern[ idx + 1 ] ) )
{
name += ' ';
}
idx += token.getLength();
while( idx < pattern.length && CharOperation.isWhitespace( pattern[idx] ) ){ idx++; }
lastTokenWasOperator = false;
break;
}
prev = token;
token = null;
while( token == null ){
token = scanner.nextToken();
if( callback.badCharacterOffset != -1 && token.getOffset() > callback.badCharacterOffset ){
//TODO : This may not be \\, it could be another bad character
if( !encounteredWild && !lastTokenWasOperator && prev.getType() != IToken.tARROW ) name += " "; //$NON-NLS-1$
name += "\\"; //$NON-NLS-1$
idx++;
encounteredWild = true;
lastTokenWasOperator = false;
prev = null;
callback.badCharacterOffset = -1;
}
}
}
} catch (EndOfFileException e) {
list.addLast( name.toCharArray() );
}
return list;
}
protected boolean matchesName( char[] pattern, char[] name ){
if( pattern == null ){
return true; //treat null as "*"
@ -756,4 +669,70 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
protected int _matchMode;
protected boolean _caseSensitive;
protected LimitTo _limitTo;
protected static IASTTranslationUnit parse( String code ) throws ParserException {
return parse(code, ParserLanguage.CPP);
}
/**
* @param string
* @param c
* @return
* @throws ParserException
*/
protected static IASTTranslationUnit parse( String code, ParserLanguage lang ) throws ParserException {
IParserLogService NULL_LOG = new NullLogService();
CodeReader codeReader = new CodeReader(code .toCharArray());
ScannerInfo scannerInfo = new ScannerInfo();
IScannerExtensionConfiguration configuration = null;
if( lang == ParserLanguage.C )
configuration = new GCCScannerExtensionConfiguration();
else
configuration = new GPPScannerExtensionConfiguration();
IScanner scanner = new DOMScanner( codeReader, scannerInfo, ParserMode.COMPLETE_PARSE, lang, NULL_LOG, configuration, FileCodeReaderFactory.getInstance() );
ISourceCodeParser parser2 = null;
if( lang == ParserLanguage.CPP )
{
ICPPParserExtensionConfiguration config = new ANSICPPParserExtensionConfiguration();
parser2 = new GNUCPPSourceParser(scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, config );
}
else {
ICParserExtensionConfiguration config = new ANSICParserExtensionConfiguration();
parser2 = new GNUCSourceParser( scanner, ParserMode.COMPLETE_PARSE, NULL_LOG, config );
}
IASTTranslationUnit tu = parser2.parse();
if( parser2.encounteredError())
throw new ParserException( "FAILURE"); //$NON-NLS-1$
return tu;
}
protected static IScanner createScanner( String code, ISourceElementRequestor callback ) {
return createScanner(code, callback, ParserLanguage.CPP);
}
/**
* @param code
* @param callback
* @param lang
* @return
*/
protected static IScanner createScanner( String code, ISourceElementRequestor callback, ParserLanguage lang ) {
IScanner scanner = null;
try {
scanner = ParserFactory.createScanner(
new CodeReader(code.toCharArray()),
new ScannerInfo(),
ParserMode.QUICK_PARSE,
lang, callback, nullLog, null);
}
catch (ParserFactoryError e) {
}
return scanner;
}
}

View file

@ -52,18 +52,21 @@ public class MethodDeclarationPattern extends CSearchPattern {
private char[][] parameterNames;
private char[] simpleName;
private char[][] qualifications;
private char[] returnTypes;
private char[] decodedSimpleName;
private char[][] decodedQualifications;
private char[][] decodedParameters;
private char[] decodedReturnTypes;
public MethodDeclarationPattern(char[] name, char[][] qual, char [][] params, int matchMode, SearchFor search, LimitTo limitTo, boolean caseSensitive) {
public MethodDeclarationPattern(char[] name, char[][] qual, char [][] params, char[] returnTypes, int matchMode, SearchFor search, LimitTo limitTo, boolean caseSensitive) {
//super( name, params, matchMode, limitTo, caseSensitive );
super( matchMode, caseSensitive, limitTo );
qualifications = qual;
simpleName = name;
parameterNames = params;
this.returnTypes = returnTypes;
searchFor = search;
}
@ -167,6 +170,28 @@ public class MethodDeclarationPattern extends CSearchPattern {
}
}
//Check for return type
boolean returnTypeExists=false;
int returnStart=0;
int returnEnd=0;
if (end != 0 &&
end<missmatch.length){
//Make sure that we have a parameter string and that there is still something left
//to be decoded
for (int j=end; j<missmatch.length; j++){
if (missmatch[j].equals("R(")){ //$NON-NLS-1$
returnStart=j;
returnTypeExists=true;
}
if (missmatch[j].equals(")R")){ //$NON-NLS-1$
returnEnd=j;
break;
}
}
}
if (parmsExist){
this.decodedParameters = new char[end - (start + 1)][];
@ -174,9 +199,9 @@ public class MethodDeclarationPattern extends CSearchPattern {
for (int i=start+1; i<end; i++){
decodedParameters[counter++]=missmatch[i].toCharArray();
}
this.decodedQualifications = new char[missmatch.length - (end + 1)][];
this.decodedQualifications = new char[missmatch.length - (returnEnd + 1)][];
counter=0;
for (int i = end + 1; i < missmatch.length; i++)
for (int i = returnEnd + 1; i < missmatch.length; i++)
this.decodedQualifications[counter++] = missmatch[i].toCharArray();
} else {
this.decodedParameters = new char[0][];
@ -185,6 +210,9 @@ public class MethodDeclarationPattern extends CSearchPattern {
this.decodedQualifications[i] = missmatch[i].toCharArray();
}
if (returnTypeExists){
this.returnTypes = missmatch[returnStart + 1].toCharArray();
}
}
}
@ -205,9 +233,25 @@ public class MethodDeclarationPattern extends CSearchPattern {
return false;
}
if (!matchReturnType(returnTypes, decodedReturnTypes)){
return false;
}
return true;
}
/**
* @param returnTypes
* @param decodedReturnTypes
* @return
*/
private boolean matchReturnType(char[] returnTypes, char[] decodedReturnTypes) {
if( returnTypes == null || decodedReturnTypes == null ){
return true; //treat null as "*"
}
return CharOperation.equals( returnTypes, decodedReturnTypes, true);
}
private boolean matchParameters(char[][] parameterNames2, char[][] decodedParameters2) {
if (parameterNames2.length == 0)