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

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
This commit is contained in:
John Camelon 2003-09-09 15:46:44 +00:00
parent 0ec0b04c3e
commit ceee55836e
12 changed files with 196 additions and 100 deletions

View file

@ -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.

View file

@ -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;
};
}

View file

@ -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 );
}
}

View file

@ -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 );
}
}

View file

@ -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 );
}
}

View file

@ -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

View file

@ -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 );
}
}

View file

@ -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() );
}
}

View file

@ -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

View file

@ -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();

View file

@ -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
}
}

View file

@ -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;