1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-09 17:25:38 +02:00

Patch for Devin Steffler.

Further updates to DOM/AST View.
- an implementation for CPPVisitor#getReferences
- updated CVistior#getReferences so that only IASTNames with the same binding AND toString() are returned
This commit is contained in:
John Camelon 2005-02-08 02:14:57 +00:00
parent 66c2e911bf
commit 30277a9b62
3 changed files with 122 additions and 2 deletions

View file

@ -454,7 +454,8 @@ public class CVisitor {
return PROCESS_CONTINUE;
}
if( name.resolveBinding() == binding ){
if( CharArrayUtils.equals(name.toCharArray(), binding.getNameCharArray()) &&
name.resolveBinding() == binding ){
if( refs.length == idx ){
IASTName [] temp = new IASTName[ refs.length * 2 ];
System.arraycopy( refs, 0, temp, 0, refs.length );

View file

@ -73,8 +73,11 @@ import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.dom.ast.IArrayType;
import org.eclipse.cdt.core.dom.ast.IBasicType;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.IFunctionType;
import org.eclipse.cdt.core.dom.ast.ILabel;
import org.eclipse.cdt.core.dom.ast.IParameter;
import org.eclipse.cdt.core.dom.ast.IProblemBinding;
import org.eclipse.cdt.core.dom.ast.IQualifierType;
@ -83,6 +86,7 @@ import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable;
import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator;
import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
@ -98,6 +102,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleDeclSpecifier;
@ -752,6 +757,109 @@ public class CPPVisitor {
}
}
public static class CollectReferencesAction extends CPPBaseVisitorAction {
private static final int DEFAULT_LIST_SIZE = 8;
private IASTName [] refs;
private IBinding binding;
private int idx = 0;
private int kind;
private static final int KIND_LABEL = 1;
private static final int KIND_OBJ_FN = 2;
private static final int KIND_TYPE = 3;
private static final int KIND_NAMEPSACE = 4;
public CollectReferencesAction( IBinding binding ){
this.binding = binding;
this.refs = new IASTName[ DEFAULT_LIST_SIZE ];
processNames = true;
if( binding instanceof ILabel )
kind = KIND_LABEL;
else if( binding instanceof ICompositeType ||
binding instanceof ITypedef ||
binding instanceof IEnumeration)
{
kind = KIND_TYPE;
}
else if( binding instanceof ICPPNamespace) {
kind = KIND_NAMEPSACE;
} else
kind = KIND_OBJ_FN;
}
public int processName( IASTName name ){
if( name instanceof ICPPASTQualifiedName ) return PROCESS_CONTINUE;
ASTNodeProperty prop = name.getPropertyInParent();
switch( kind ){
case KIND_LABEL:
if( prop == IASTGotoStatement.NAME )
break;
return PROCESS_CONTINUE;
case KIND_TYPE:
if( prop == IASTNamedTypeSpecifier.NAME ||
prop == ICPPASTPointerToMember.NAME ||
prop == ICPPASTTypenameExpression.TYPENAME ||
prop == ICPPASTUsingDeclaration.NAME ||
prop == ICPPASTQualifiedName.SEGMENT_NAME)
break;
else if( prop == IASTElaboratedTypeSpecifier.TYPE_NAME ){
IASTNode p = name.getParent().getParent();
if( !(p instanceof IASTSimpleDeclaration) ||
((IASTSimpleDeclaration)p).getDeclarators().length > 0 )
{
break;
}
}
return PROCESS_CONTINUE;
case KIND_OBJ_FN:
if( prop == IASTIdExpression.ID_NAME ||
prop == IASTFieldReference.FIELD_NAME ||
prop == ICASTFieldDesignator.FIELD_NAME ||
prop == ICPPASTUsingDirective.QUALIFIED_NAME ||
prop == ICPPASTUsingDeclaration.NAME ||
prop == IASTFunctionCallExpression.FUNCTION_NAME ||
prop == ICPPASTUsingDeclaration.NAME ||
prop == ICPPASTQualifiedName.SEGMENT_NAME)
{
break;
}
return PROCESS_CONTINUE;
case KIND_NAMEPSACE:
if( prop == ICPPASTUsingDirective.QUALIFIED_NAME ||
prop == ICPPASTNamespaceAlias.MAPPING_NAME ||
prop == ICPPASTUsingDeclaration.NAME ||
prop == ICPPASTQualifiedName.SEGMENT_NAME) {
break;
}
return PROCESS_CONTINUE;
}
if( CharArrayUtils.equals(name.toCharArray(), binding.getNameCharArray()) &&
name.resolveBinding() == binding ){
if( refs.length == idx ){
IASTName [] temp = new IASTName[ refs.length * 2 ];
System.arraycopy( refs, 0, temp, 0, refs.length );
refs = temp;
}
refs[idx++] = name;
}
return PROCESS_CONTINUE;
}
public IASTName[] getReferences(){
if( idx < refs.length ){
IASTName [] temp = new IASTName[ idx ];
System.arraycopy( refs, 0, temp, 0, idx );
refs = temp;
}
return refs;
}
}
public static void visitTranslationUnit( IASTTranslationUnit tu, CPPBaseVisitorAction action ){
IASTDeclaration [] decls = tu.getDeclarations();
for( int i = 0; i < decls.length; i++ ){
@ -1508,4 +1616,14 @@ public class CPPVisitor {
return action.getProblems();
}
/**
* @param unit
* @param binding
* @return
*/
public static IASTName[] getReferences(IASTTranslationUnit tu, IBinding binding) {
CollectReferencesAction action = new CollectReferencesAction( binding );
visitTranslationUnit( tu, action );
return action.getReferences();
}
}

View file

@ -636,7 +636,8 @@ public class DOMAST extends ViewPart {
pattern.append(STRING_QUOTE);
if (lang == ParserLanguage.CPP) {
// TODO Devin when implemented in CPPVisitor
IASTName[] names = CPPVisitor.getReferences( ((TreeObject)((IStructuredSelection)selection).getFirstElement()).getNode().getTranslationUnit(), name.resolveBinding() );
displayNames(names, OPEN_REFERENCES, pattern.toString());
} else {
IASTName[] names = CVisitor.getReferences( ((TreeObject)((IStructuredSelection)selection).getFirstElement()).getNode().getTranslationUnit(), name.resolveBinding() );
displayNames(names, OPEN_REFERENCES, pattern.toString());