1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-08 00:35:49 +02:00

- Move cdt.internal.core.parser.util.ASTUtil to cdt.core.parser.ast

- Modify search to use ASTUtil for building function parameter strings
- Modify selection search to use parameter info in search (bug 63966)
This commit is contained in:
Andrew Niefer 2004-05-26 18:24:15 +00:00
parent bea9188980
commit e2aba75dbb
9 changed files with 71 additions and 151 deletions

View file

@ -37,6 +37,7 @@ import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTAbstractTypeSpecifierDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTBaseSpecifier;
@ -63,7 +64,6 @@ import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.internal.core.parser.ParserException;
import org.eclipse.cdt.internal.core.parser.QuickParseCallback;
import org.eclipse.cdt.internal.core.parser.StructuralParseCallback;
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;

View file

@ -8,24 +8,12 @@
* Contributors:
* Rational Software - initial implementation
******************************************************************************/
package org.eclipse.cdt.internal.core.parser.util;
package org.eclipse.cdt.core.parser.ast;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.IASTAbstractDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTExpression;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTInitializerClause;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTemplateDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTTemplateParameter;
import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
/**
* This is a utility class to help convert AST elements to Strings.

View file

@ -1,3 +1,7 @@
2004-05-26 Andrew Niefer
Modified search to use ASTUtil.getFunctionParameterTypes to get the strings to search for
functions with specific parameters.
2004-05-21 Andrw Niefer
fix bug 63478

View file

@ -14,14 +14,13 @@
package org.eclipse.cdt.core.search;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTPointerOperator;
import org.eclipse.cdt.core.parser.ast.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTEnumerationSpecifier;
@ -33,14 +32,10 @@ import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTNamespaceDefinition;
import org.eclipse.cdt.core.parser.ast.IASTOffsetableElement;
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.IASTReference;
import org.eclipse.cdt.core.parser.ast.IASTSimpleTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypeSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTTypedefDeclaration;
import org.eclipse.cdt.core.parser.ast.IASTVariable;
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
@ -145,54 +140,12 @@ public class BasicSearchResultCollector implements ICSearchResultCollector {
String paramString = "("; //$NON-NLS-1$
Iterator iter = function.getParameters();
String [] paramTypes = ASTUtil.getFunctionParameterTypes( function );
boolean first = true;
while( iter.hasNext() ){
IASTParameterDeclaration param = (IASTParameterDeclaration) iter.next();
if( !first ) paramString += ", "; //$NON-NLS-1$
IASTTypeSpecifier typeSpec = param.getTypeSpecifier();
if( param.isConst() )
paramString += "const "; //$NON-NLS-1$
if( typeSpec instanceof IASTSimpleTypeSpecifier ){
paramString += ((IASTSimpleTypeSpecifier)typeSpec).getTypename();
} else if( typeSpec instanceof IASTOffsetableNamedElement ){
paramString += ((IASTOffsetableNamedElement)typeSpec).getName();
} else if( typeSpec instanceof IASTElaboratedTypeSpecifier ){
ASTClassKind kind = ((IASTElaboratedTypeSpecifier)typeSpec).getClassKind();
if( kind == ASTClassKind.CLASS ){
paramString += "class "; //$NON-NLS-1$
} else if( kind == ASTClassKind.STRUCT ){
paramString += "struct "; //$NON-NLS-1$
} else if( kind == ASTClassKind.ENUM ){
paramString += "enum "; //$NON-NLS-1$
} else if( kind == ASTClassKind.UNION ){
paramString += "union "; //$NON-NLS-1$
}
paramString += ((IASTElaboratedTypeSpecifier)typeSpec).getName();
}
Iterator ptrs = param.getPointerOperators();
if( ptrs.hasNext() ) paramString += " "; //$NON-NLS-1$
while( ptrs.hasNext() ){
ASTPointerOperator ptr = (ASTPointerOperator)ptrs.next();
if( ptr == ASTPointerOperator.POINTER )
paramString += "*"; //$NON-NLS-1$
else if( ptr == ASTPointerOperator.REFERENCE )
paramString += "&"; //$NON-NLS-1$
else if( ptr == ASTPointerOperator.CONST_POINTER )
paramString += " const * "; //$NON-NLS-1$
else if( ptr == ASTPointerOperator.VOLATILE_POINTER )
paramString += " volatile * "; //$NON-NLS-1$
ptr = ASTPointerOperator.POINTER;
}
first = false;
for( int i = 0; i < paramTypes.length; i++ ){
if( i != 0 )
paramString += ", ";
paramString += paramTypes[i];
}
paramString += ")"; //$NON-NLS-1$

View file

@ -37,6 +37,7 @@ import org.eclipse.cdt.core.parser.ScannerInfo;
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.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
import org.eclipse.cdt.core.parser.ast.IASTDeclaration;
@ -511,81 +512,21 @@ public abstract class CSearchPattern implements ICSearchConstants, ICSearchPatte
IASTFunction function = (IASTFunction) decl;
Iterator parameters = function.getParameters();
char [] param = null;
while( parameters.hasNext() ){
param = getParamString( (IASTParameterDeclaration)parameters.next() );
list.add( param );
}
if (param == null){
String [] paramTypes = ASTUtil.getFunctionParameterTypes(function);
if( paramTypes.length == 0 )
{
//This means that no params have been added (i.e. empty brackets - void case)
param = "void ".toCharArray(); //$NON-NLS-1$
list.add (param);
list.add ("void".toCharArray() ); //$NON-NLS-1$
} else {
for( int i = 0; i < paramTypes.length; i++ ){
list.add( paramTypes[i].toCharArray() );
}
}
}
return list;
}
static public char [] getParamString( IASTParameterDeclaration param ){
if( param == null ) return null;
String signature = ""; //$NON-NLS-1$
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 "; //$NON-NLS-1$
} else if( elaborated.getClassKind() == ASTClassKind.ENUM ) {
signature += "enum "; //$NON-NLS-1$
} else if( elaborated.getClassKind() == ASTClassKind.STRUCT ) {
signature += "struct "; //$NON-NLS-1$
} else if( elaborated.getClassKind() == ASTClassKind.UNION ) {
signature += "union"; //$NON-NLS-1$
}
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 += " "; //$NON-NLS-1$
if( param.isConst() ) signature += "const "; //$NON-NLS-1$
if( param.isVolatile() ) signature += "volatile "; //$NON-NLS-1$
Iterator ptrs = param.getPointerOperators();
while( ptrs.hasNext() ){
ASTPointerOperator ptrOp = (ASTPointerOperator) ptrs.next();
if( ptrOp == ASTPointerOperator.POINTER ){
signature += " * "; //$NON-NLS-1$
} else if( ptrOp == ASTPointerOperator.REFERENCE ){
signature += " & "; //$NON-NLS-1$
} else if( ptrOp == ASTPointerOperator.CONST_POINTER ){
signature += " const * "; //$NON-NLS-1$
} else if( ptrOp == ASTPointerOperator.VOLATILE_POINTER ){
signature += " volatile * "; //$NON-NLS-1$
}
}
Iterator arrayModifiers = param.getArrayModifiers();
while( arrayModifiers.hasNext() ){
arrayModifiers.next();
signature += " [] "; //$NON-NLS-1$
}
return signature.toCharArray();
}
static private LinkedList scanForNames( IScanner scanner, IToken unusedToken ){
LinkedList list = new LinkedList();

View file

@ -17,6 +17,7 @@ import java.io.IOException;
import java.util.Iterator;
import org.eclipse.cdt.core.parser.ISourceElementCallbackDelegate;
import org.eclipse.cdt.core.parser.ast.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTMethod;
import org.eclipse.cdt.core.parser.ast.IASTParameterDeclaration;
@ -99,32 +100,29 @@ public class MethodDeclarationPattern extends CSearchPattern {
//parameters
if( parameterNames != null && parameterNames.length > 0 && parameterNames[0].length > 0 ){
String [] paramTypes = ASTUtil.getFunctionParameterTypes(function);
Iterator params = function.getParameters();
if (!params.hasNext() && CharOperation.equals(parameterNames[0], "void ".toCharArray())){ //$NON-NLS-1$
if ( paramTypes.length == 0 && CharOperation.equals(parameterNames[0], "void".toCharArray())){ //$NON-NLS-1$
//All empty lists have transformed to void, this function has no parms
return ACCURATE_MATCH;
}
if( parameterNames.length != paramTypes.length )
return IMPOSSIBLE_MATCH;
for( int i = 0; i < parameterNames.length; i++ ){
//if this function doesn't have this many parameters, it is not a match.
//or if this function has a parameter, but parameterNames only has null.
if( !params.hasNext() || parameterNames[ i ] == null )
if( parameterNames[ i ] == null )
return IMPOSSIBLE_MATCH;
IASTParameterDeclaration parameter = (IASTParameterDeclaration) params.next();
char[] param = CSearchPattern.getParamString( parameter );
char[] param = paramTypes[ i ].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;
}
return ACCURATE_MATCH;

View file

@ -1,3 +1,8 @@
2004-05-26 Andrew Niefer
Selection search: if searching on a function, use ASTUtil.getFunctionParameterTypes to create a
search pattern to find functions with the same parameters. Also, for AST nodes that have a
qualified name, use that to search. (bug 63966)
2004-05-26 Alain Magloire
CUIPlugin.startup() cleanup. The method

View file

@ -34,8 +34,11 @@ 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.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTFunction;
import org.eclipse.cdt.core.parser.ast.IASTNode;
import org.eclipse.cdt.core.parser.ast.IASTOffsetableNamedElement;
import org.eclipse.cdt.core.parser.ast.IASTQualifiedNameElement;
import org.eclipse.cdt.core.search.ICSearchScope;
import org.eclipse.cdt.core.search.ICSearchConstants.LimitTo;
import org.eclipse.cdt.core.search.ICSearchConstants.SearchFor;
@ -140,6 +143,34 @@ public abstract class FindAction extends Action {
}
protected CSearchQuery createSearchQuery( IASTOffsetableNamedElement node ){
String pattern = null;
if( node instanceof IASTQualifiedNameElement ){
String [] qualNames = ((IASTQualifiedNameElement)node).getFullyQualifiedName();
pattern = "::" + qualNames[0]; //$NON-NLS-1$
for( int i = 1; i < qualNames.length; i++ ){
pattern += "::"; //$NON-NLS-1$
pattern += qualNames[i];
}
} else {
pattern = node.getName();
}
if( node instanceof IASTFunction ){
pattern += '(';
String[] parameterTypes = ASTUtil.getFunctionParameterTypes((IASTFunction) node);
for( int i = 0; i < parameterTypes.length; i++ ){
if( i != 0 )
pattern += ", "; //$NON-NLS-1$
pattern += parameterTypes[i];
}
pattern += ')';
}
return createSearchQuery( pattern, CSearchUtil.getSearchForFromNode(node) );
}
protected ISelection getSelection(){
ISelection sel = null;
if (fSite != null){
@ -205,7 +236,7 @@ public abstract class FindAction extends Action {
return;
}
CSearchQuery job = createSearchQuery(selectedText.getText(), CSearchUtil.getSearchForFromNode(node));
CSearchQuery job = createSearchQuery(node);
NewSearchUI.activateSearchResultView();
NewSearchUI.runQuery(job);

View file

@ -39,6 +39,7 @@ import org.eclipse.cdt.core.parser.ParserUtil;
import org.eclipse.cdt.core.parser.ScannerInfo;
import org.eclipse.cdt.core.parser.ast.ASTClassKind;
import org.eclipse.cdt.core.parser.ast.ASTNotImplementedException;
import org.eclipse.cdt.core.parser.ast.ASTUtil;
import org.eclipse.cdt.core.parser.ast.IASTClassSpecifier;
import org.eclipse.cdt.core.parser.ast.IASTCodeScope;
import org.eclipse.cdt.core.parser.ast.IASTCompilationUnit;
@ -60,7 +61,6 @@ import org.eclipse.cdt.core.parser.ast.IASTCompletionNode.CompletionKind;
import org.eclipse.cdt.core.parser.ast.IASTNode.ILookupResult;
import org.eclipse.cdt.core.parser.ast.IASTNode.LookupKind;
import org.eclipse.cdt.internal.core.CharOperation;
import org.eclipse.cdt.internal.core.parser.util.ASTUtil;
import org.eclipse.cdt.internal.ui.CUIMessages;
import org.eclipse.cdt.internal.ui.util.IDebugLogConstants;
import org.eclipse.cdt.internal.ui.util.Util;