### Eclipse Workspace Patch 1.0 #P org.eclipse.cdt.core Index: parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java,v retrieving revision 1.29 diff -u -r1.29 GPPLanguage.java --- parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java 5 Jan 2007 13:12:22 -0000 1.29 +++ parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java 25 Jan 2007 17:40:47 -0000 @@ -97,7 +97,8 @@ scanner, ParserMode.COMPLETION_PARSE, ParserUtil.getParserLogService(), - new GPPParserExtensionConfiguration()); + new GPPParserExtensionConfiguration(), + index); // Run the parse and return the completion node parser.parse(); Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java,v retrieving revision 1.16 diff -u -r1.16 CPPClassInstanceScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java 16 Nov 2006 21:35:42 -0000 1.16 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassInstanceScope.java 25 Jan 2007 17:40:47 -0000 @@ -243,6 +243,13 @@ * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find(String name) { + return find(name, false); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find(String name, boolean prefixLookup) { if( name != null ) {} return null; } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java,v retrieving revision 1.24 diff -u -r1.24 CPPScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java 6 Dec 2006 10:41:25 -0000 1.24 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPScope.java 25 Jan 2007 17:40:47 -0000 @@ -201,7 +201,14 @@ * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find(String name) throws DOMException { - return CPPSemantics.findBindings( this, name, false ); + return CPPSemantics.findBindings( this, name, false, false ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find(String name, boolean prefixLookup) throws DOMException { + return CPPSemantics.findBindings( this, name, false, prefixLookup ); } public void flushCache() { Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java,v retrieving revision 1.7 diff -u -r1.7 CPPASTIdExpression.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java 22 Jan 2007 14:44:44 -0000 1.7 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTIdExpression.java 25 Jan 2007 17:40:47 -0000 @@ -11,14 +11,23 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.Linkage; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ -public class CPPASTIdExpression extends CPPASTNode implements IASTIdExpression { +public class CPPASTIdExpression extends CPPASTNode implements IASTIdExpression, IASTCompletionContext { private IASTName name; public IASTName getName() { @@ -59,4 +68,29 @@ return CPPVisitor.getExpressionType(this); } + public IBinding[] resolvePrefix(IASTName n) { + IScope scope = CPPVisitor.getContainingScope(n); + + IBinding[] b1 = null; + try { + b1 = scope.find(n.toString(), true); + } catch (DOMException e) { + } + + IIndex index = getTranslationUnit().getIndex(); + + IBinding[] b2 = null; + try { + b2 = index.findBindingsForPrefix( + n.toString(), + IndexFilter.getFilter(Linkage.CPP_LINKAGE)); + } catch (CoreException e) { + } + + int size = (b1 == null ? 0 : b1.length) + (b2 == null ? 0 : b2.length); + IBinding[] all = new IBinding[size]; + if (b1 != null) ArrayUtil.addAll(IBinding.class, all, b1); + if (b2 != null) ArrayUtil.addAll(IBinding.class, all, b2); + return all; + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java,v retrieving revision 1.147 diff -u -r1.147 CPPSemantics.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java 15 Dec 2006 16:44:57 -0000 1.147 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPSemantics.java 25 Jan 2007 17:40:47 -0000 @@ -90,6 +90,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTWhileStatement; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBlockScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassTemplate; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; @@ -116,6 +117,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateTypeParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; +import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; @@ -127,6 +129,7 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ITypeContainer; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; +import org.eclipse.core.runtime.CoreException; /** * @author aniefer @@ -1375,6 +1378,24 @@ IASTNode [] nodes = null; IASTNode parent = ASTInternal.getPhysicalNodeOfScope(scope); + if (parent == null && scope instanceof IIndexBinding) { + IBinding[] bindings = scope.find(data.astName.toString(), data.prefixLookup); + mergeResults(data, bindings, true); + return null; + } else if (scope instanceof ICPPNamespaceScope && !(scope instanceof ICPPBlockScope)) { + ICPPNamespaceScope ns = (ICPPNamespaceScope) scope; + IIndex index = parent.getTranslationUnit().getIndex(); + try { + IIndexBinding binding = index.findBinding(ns.getScopeName()); + if (binding instanceof ICPPNamespaceScope) { + ICPPNamespaceScope indexNs = (ICPPNamespaceScope) binding; + IBinding[] bindings = indexNs.find(data.astName.toString(), data.prefixLookup); + mergeResults(data, bindings, true); + } + } catch (CoreException e) { + } + } + IASTName [] namespaceDefs = null; int namespaceIdx = -1; @@ -1789,8 +1810,8 @@ } char[] c = potential.toCharArray(); char [] n = data.name(); - return ( (data.prefixLookup && CharArrayUtils.equals( c, 0, n.length, n )) || - (!data.prefixLookup && CharArrayUtils.equals( c, n )) ); + return (data.prefixLookup && CharArrayUtils.equals(c, 0, n.length, n, false)) + || (!data.prefixLookup && CharArrayUtils.equals(c, n)); } private static void addDefinition( IBinding binding, IASTName name ){ @@ -3251,15 +3272,19 @@ return null; } - public static IBinding[] findBindings( IScope scope, String name, boolean qualified ) throws DOMException{ - return findBindings( scope, name.toCharArray(), qualified ); + public static IBinding[] findBindings( IScope scope, String name, boolean qualified, boolean prefixLookup ) throws DOMException{ + return findBindings( scope, name.toCharArray(), qualified, prefixLookup ); } - public static IBinding[] findBindings( IScope scope, char []name, boolean qualified ) throws DOMException{ + public static IBinding[] findBindings( IScope scope, char []name, boolean qualified, boolean prefixLookup ) throws DOMException{ CPPASTName astName = new CPPASTName(); astName.setName( name ); astName.setParent( ASTInternal.getPhysicalNodeOfScope(scope)); astName.setPropertyInParent( STRING_LOOKUP_PROPERTY ); + if (prefixLookup) { + return prefixLookup(astName, scope); + } + LookupData data = new LookupData( astName ); data.forceQualified = qualified; @@ -3296,13 +3321,17 @@ return (IBinding[]) set.keyArray( IBinding.class ); } - public static IBinding [] prefixLookup( IASTName name ){ + public static IBinding [] prefixLookup( IASTName name ){ + return prefixLookup(name, name); + } + + public static IBinding [] prefixLookup( IASTName name, Object start ){ LookupData data = createLookupData( name, true ); data.prefixLookup = true; data.foundItems = new CharArrayObjectMap( 2 ); try { - lookup( data, name ); + lookup( data, start ); } catch ( DOMException e ) { } CharArrayObjectMap map = (CharArrayObjectMap) data.foundItems; Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java,v retrieving revision 1.6 diff -u -r1.6 CPPASTBaseSpecifier.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java 23 Jan 2007 16:06:41 -0000 1.6 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java 25 Jan 2007 17:40:47 -0000 @@ -10,16 +10,28 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ public class CPPASTBaseSpecifier extends CPPASTNode implements - ICPPASTBaseSpecifier { + ICPPASTBaseSpecifier, IASTCompletionContext { private boolean isVirtual; private int visibility; @@ -98,4 +110,49 @@ return r_unclear; } + public IBinding[] resolvePrefix(IASTName n) { + List filtered = new ArrayList(); + IndexFilter filter = new IndexFilter(){ + public boolean acceptBinding(IBinding binding) { + if (binding instanceof ICPPClassType) { + ICPPClassType classType = (ICPPClassType) binding; + try { + int key = classType.getKey(); + if (key == ICPPClassType.k_class) { + return true; + } + } catch (DOMException e) { + } + } + return false; + } + public boolean acceptLinkage(ILinkage linkage) { + return linkage.getID() == ILinkage.CPP_LINKAGE_ID; + } + }; + + IScope scope = CPPVisitor.getContainingScope(n); + + try { + IBinding[] bindings = scope.find(n.toString(), true); + for (int i = 0; i < bindings.length; i++) { + if (filter.acceptBinding(bindings[i])) { + filtered.add(bindings[i]); + } + } + } catch (DOMException e) { + } + + IIndex index = getTranslationUnit().getIndex(); + + try { + IBinding[] bindings = index.findBindingsForPrefix(n.toString(), filter); + for (int i = 0; i < bindings.length; i++) { + filtered.add(bindings[i]); + } + } catch (CoreException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionScope.java,v retrieving revision 1.17 diff -u -r1.17 CPPFunctionScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionScope.java 29 Sep 2006 07:19:43 -0000 1.17 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPFunctionScope.java 25 Jan 2007 17:40:47 -0000 @@ -14,6 +14,9 @@ */ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; @@ -31,6 +34,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.util.CharArrayObjectMap; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; /** * @author aniefer @@ -72,11 +76,30 @@ * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find(String name) throws DOMException { + return find(name, false); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find(String name, boolean prefixLookup) throws DOMException { char [] n = name.toCharArray(); - if( labels.containsKey( n ) ) - return new IBinding[] { (IBinding) labels.get( n ) }; - - return super.find( name ); + List bindings = new ArrayList(); + + for (int i = 0; i < labels.size(); i++) { + char[] key = labels.keyAt(i); + if ((prefixLookup && CharArrayUtils.equals(key, 0, n.length, n, false)) + || (!prefixLookup && CharArrayUtils.equals(key, n))) { + bindings.add((IBinding) labels.get(key)); + } + } + + IBinding[] additional = super.find( name, prefixLookup ); + for (int i = 0; i < additional.length; i++) { + bindings.add(additional[i]); + } + + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); } public IScope getParent() throws DOMException { Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java,v retrieving revision 1.5 diff -u -r1.5 CPPASTUsingDirective.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java 22 Jan 2007 14:44:44 -0000 1.5 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDirective.java 25 Jan 2007 17:40:47 -0000 @@ -10,15 +10,28 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDirective; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ public class CPPASTUsingDirective extends CPPASTNode implements - ICPPASTUsingDirective { + ICPPASTUsingDirective, IASTCompletionContext { private IASTName name; @@ -65,4 +78,43 @@ return r_reference; return r_unclear; } + + public IBinding[] resolvePrefix(IASTName n) { + List filtered = new ArrayList(); + IndexFilter filter = new IndexFilter() { + public boolean acceptBinding(IBinding binding) { + return binding instanceof ICPPNamespace; + } + public boolean acceptLinkage(ILinkage linkage) { + return linkage.getID() == ILinkage.CPP_LINKAGE_ID; + } + }; + + IASTDeclaration[] decls = getTranslationUnit().getDeclarations(); + char[] nChars = n.toCharArray(); + for (int i = 0; i < decls.length; i++) { + if (decls[i] instanceof ICPPASTNamespaceDefinition) { + ICPPASTNamespaceDefinition defn = (ICPPASTNamespaceDefinition) decls[i]; + IASTName name = defn.getName(); + if (CharArrayUtils.equals(name.toCharArray(), 0, nChars.length, nChars, false)) { + IBinding binding = name.resolveBinding(); + if (filter.acceptBinding(binding)) { + filtered.add(binding); + } + } + } + } + + IIndex index = getTranslationUnit().getIndex(); + + try { + IBinding[] bindings = index.findBindingsForPrefix(n.toString(), filter); + for (int i = 0; i < bindings.length; i++) { + filtered.add(bindings[i]); + } + } catch (CoreException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java,v retrieving revision 1.8 diff -u -r1.8 CPPASTFieldReference.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java 22 Jan 2007 14:44:44 -0000 1.8 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFieldReference.java 25 Jan 2007 17:40:47 -0000 @@ -10,19 +10,31 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; /** * @author jcamelon */ public class CPPASTFieldReference extends CPPASTNode implements - ICPPASTFieldReference, IASTAmbiguityParent { + ICPPASTFieldReference, IASTAmbiguityParent, IASTCompletionContext { private boolean isTemplate; private IASTExpression owner; @@ -101,5 +113,64 @@ public IType getExpressionType() { return CPPVisitor.getExpressionType(this); } + + public IBinding[] resolvePrefix(IASTName n) { + IASTExpression expression = getFieldOwner(); + IType type = expression.getExpressionType(); + type = CPPSemantics.getUltimateType(type, true); //stop at pointer to member? + + if (type instanceof ICPPClassType) { + ICPPClassType classType = (ICPPClassType) type; + List bindings = new ArrayList(); + char[] name = n.toCharArray(); + + try { + IField[] fields = classType.getFields(); + for (int i = 0; i < fields.length; i++) { + char[] potential = fields[i].getNameCharArray(); + if (CharArrayUtils.equals(potential, 0, name.length, name, false)) { + bindings.add(fields[i]); + } + } + } catch (DOMException e) { + } + + try { + ICPPMethod[] methods = classType.getMethods(); + for (int i = 0; i < methods.length; i++) { + if (!(methods[i] instanceof ICPPConstructor) && !methods[i].isImplicit()) { + char[] potential = methods[i].getNameCharArray(); + if (CharArrayUtils.equals(potential, 0, name.length, name, false)) { + bindings.add(methods[i]); + } + } + } + } catch (DOMException e) { + } + + collectBases(classType, bindings, n.toCharArray()); + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + } + + return null; + } + private void collectBases(ICPPClassType classType, List bindings, char[] prefix) { + if (CharArrayUtils.equals(classType.getNameCharArray(), + 0, prefix.length, prefix, false)) { + bindings.add(classType); + } + + try { + ICPPBase[] bases = classType.getBases(); + for (int i = 0; i < bases.length; i++) { + IBinding base = bases[i].getBaseClass(); + if (base instanceof ICPPClassType) { + ICPPClassType baseClass = (ICPPClassType) base; + collectBases(baseClass, bindings, prefix); + } + } + } catch (DOMException e) { + } + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java,v retrieving revision 1.37 diff -u -r1.37 CPPClassScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java 6 Dec 2006 16:27:51 -0000 1.37 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassScope.java 25 Jan 2007 17:40:47 -0000 @@ -300,6 +300,13 @@ * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find(String name) throws DOMException { + return find(name, false); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find(String name, boolean prefixLookup) throws DOMException { char [] n = name.toCharArray(); ICPPASTCompositeTypeSpecifier compType = (ICPPASTCompositeTypeSpecifier) getPhysicalNode(); IASTName compName = compType.getName(); @@ -307,10 +314,11 @@ IASTName [] ns = ((ICPPASTQualifiedName)compName).getNames(); compName = ns[ ns.length - 1 ]; } - if( CharArrayUtils.equals( n, compName.toCharArray() ) ){ + if((prefixLookup && CharArrayUtils.equals(compName.toCharArray(), 0, n.length, n, false)) + || (!prefixLookup && CharArrayUtils.equals(compName.toCharArray(), n))) { return (IBinding[]) ArrayUtil.addAll( IBinding.class, null, getConstructors( bindings, true ) ); } - return super.find( name ); + return super.find( name, prefixLookup ); } public static boolean isConstructorReference( IASTName name ){ Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java,v retrieving revision 1.5 diff -u -r1.5 CPPASTUsingDeclaration.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java 22 Jan 2007 14:44:44 -0000 1.5 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTUsingDeclaration.java 25 Jan 2007 17:40:47 -0000 @@ -10,15 +10,28 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTUsingDeclaration; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ public class CPPASTUsingDeclaration extends CPPASTNode implements - ICPPASTUsingDeclaration { + ICPPASTUsingDeclaration, IASTCompletionContext { private boolean typeName; private IASTName name; @@ -80,4 +93,43 @@ return r_reference; return r_unclear; } + + public IBinding[] resolvePrefix(IASTName n) { + List filtered = new ArrayList(); + IndexFilter filter = new IndexFilter() { + public boolean acceptBinding(IBinding binding) { + return binding instanceof ICPPNamespace; + } + public boolean acceptLinkage(ILinkage linkage) { + return linkage.getID() == ILinkage.CPP_LINKAGE_ID; + } + }; + + IASTDeclaration[] decls = getTranslationUnit().getDeclarations(); + char[] nChars = n.toCharArray(); + for (int i = 0; i < decls.length; i++) { + if (decls[i] instanceof ICPPASTNamespaceDefinition) { + ICPPASTNamespaceDefinition defn = (ICPPASTNamespaceDefinition) decls[i]; + IASTName name = defn.getName(); + if (CharArrayUtils.equals(name.toCharArray(), 0, nChars.length, nChars, false)) { + IBinding binding = name.resolveBinding(); + if (filter.acceptBinding(binding)) { + filtered.add(binding); + } + } + } + } + + IIndex index = getTranslationUnit().getIndex(); + + try { + IBinding[] bindings = index.findBindingsForPrefix(n.toString(), filter); + for (int i = 0; i < bindings.length; i++) { + filtered.add(bindings[i]); + } + } catch (CoreException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java,v retrieving revision 1.6 diff -u -r1.6 CPPASTNamedTypeSpecifier.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java 23 Jan 2007 16:06:41 -0000 1.6 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamedTypeSpecifier.java 25 Jan 2007 17:40:47 -0000 @@ -10,15 +10,31 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IEnumeration; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameter; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ public class CPPASTNamedTypeSpecifier extends CPPASTBaseDeclSpecifier implements - ICPPASTNamedTypeSpecifier { + ICPPASTNamedTypeSpecifier, IASTCompletionContext { private boolean typename; private IASTName name; @@ -79,4 +95,54 @@ return r_reference; return r_unclear; } + + public IBinding[] resolvePrefix(IASTName n) { + List filtered = new ArrayList(); + + IScope scope = CPPVisitor.getContainingScope(n); + + try { + IBinding[] bindings = scope.find(n.toString(), true); + for (int i = 0; i < bindings.length; i++) { + if (bindings[i] instanceof ICPPTemplateParameter) { + filtered.add(bindings[i]); + } + } + } catch (DOMException e) { + } + + IndexFilter filter = new IndexFilter() { + public boolean acceptBinding(IBinding binding) { + return binding instanceof ICPPClassType + || binding instanceof IEnumeration + || binding instanceof ICPPNamespace + || binding instanceof ITypedef; + } + public boolean acceptLinkage(ILinkage linkage) { + return linkage.getID() == ILinkage.CPP_LINKAGE_ID; + } + }; + + try { + IBinding[] bindings = getTranslationUnit().getScope().find(n.toString(), true); + for (int i = 0 ; i < bindings.length; i++) { + if (filter.acceptBinding(bindings[i])) { + filtered.add(bindings[i]); + } + } + } catch (DOMException e1) { + } + + IIndex index = getTranslationUnit().getIndex(); + + try { + IBinding[] bindings = index.findBindingsForPrefix(n.toString(), filter); + for (int i = 0; i < bindings.length; i++) { + filtered.add(bindings[i]); + } + } catch (CoreException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java,v retrieving revision 1.42 diff -u -r1.42 CPPClassType.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java 6 Dec 2006 10:41:25 -0000 1.42 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassType.java 25 Jan 2007 17:40:47 -0000 @@ -333,7 +333,7 @@ * @see org.eclipse.cdt.core.dom.ast.ICompositeType#findField(java.lang.String) */ public IField findField(String name) throws DOMException { - IBinding [] bindings = CPPSemantics.findBindings( getCompositeScope(), name, true ); + IBinding [] bindings = CPPSemantics.findBindings( getCompositeScope(), name, true, false ); IField field = null; for ( int i = 0; i < bindings.length; i++ ) { if( bindings[i] instanceof IField ){ Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java,v retrieving revision 1.15 diff -u -r1.15 CPPASTName.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java 23 Jan 2007 16:06:41 -0000 1.15 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTName.java 25 Jan 2007 17:40:47 -0000 @@ -18,6 +18,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.parser.util.CharArrayUtils; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; /** @@ -75,7 +76,16 @@ } public IBinding[] resolvePrefix() { - return CPPSemantics.prefixLookup(this); + IASTNode node = getParent(); + while (!(node instanceof IASTCompletionContext)) { + if (node == null) { + return null; + } + node = node.getParent(); + } + + IASTCompletionContext context = (IASTCompletionContext) node; + return context.resolvePrefix(this); } public void setBinding(IBinding binding) { Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java,v retrieving revision 1.21 diff -u -r1.21 CPPClassTemplate.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java 3 Jan 2007 22:56:30 -0000 1.21 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPClassTemplate.java 25 Jan 2007 17:40:47 -0000 @@ -236,7 +236,7 @@ * @see org.eclipse.cdt.core.dom.ast.ICompositeType#findField(java.lang.String) */ public IField findField(String name) throws DOMException { - IBinding [] bindings = CPPSemantics.findBindings( getCompositeScope(), name, true ); + IBinding [] bindings = CPPSemantics.findBindings( getCompositeScope(), name, true, false ); IField field = null; for ( int i = 0; i < bindings.length; i++ ) { if( bindings[i] instanceof IField ){ Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java,v retrieving revision 1.6 diff -u -r1.6 CPPUnknownScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java 12 Oct 2006 13:23:41 -0000 1.6 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownScope.java 25 Jan 2007 17:40:47 -0000 @@ -59,7 +59,13 @@ * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find( String name ) { - // TODO Auto-generated method stub + return null; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find( String name, boolean prefixLookup ) { return null; } Index: parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java,v retrieving revision 1.21 diff -u -r1.21 CPPASTQualifiedName.java --- parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java 23 Jan 2007 16:06:41 -0000 1.21 +++ parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTQualifiedName.java 25 Jan 2007 17:40:47 -0000 @@ -10,7 +10,11 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNameOwner; import org.eclipse.cdt.core.dom.ast.IASTNode; @@ -19,13 +23,18 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTOperatorName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; /** * @author jcamelon */ public class CPPASTQualifiedName extends CPPASTNode implements - ICPPASTQualifiedName { + ICPPASTQualifiedName, IASTCompletionContext { /** * @param duple @@ -287,4 +296,45 @@ } return false; } + + public IBinding[] resolvePrefix(IASTName n) { + IBinding binding = names[names.length - 2].resolveBinding(); + if (binding instanceof ICPPClassType) { + ICPPClassType classType = (ICPPClassType) binding; + List bindings = new ArrayList(); + char[] name = n.toCharArray(); + + try { + ICPPMethod[] methods = classType.getDeclaredMethods(); + for (int i = 0; i < methods.length; i++) { + char[] potential = methods[i].getNameCharArray(); + if (CharArrayUtils.equals(potential, 0, name.length, name, false)) { + bindings.add(methods[i]); + } + } + } catch (DOMException e) { + } + + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + } else if (binding instanceof ICPPNamespace) { + ICPPNamespace namespace = (ICPPNamespace) binding; + List bindings = new ArrayList(); + char[] name = n.toCharArray(); + + try { + IBinding[] members = namespace.getMemberBindings(); + for (int i = 0 ; i < members.length; i++) { + char[] potential = members[i].getNameCharArray(); + if (CharArrayUtils.equals(potential, 0, name.length, name, false)) { + bindings.add(members[i]); + } + } + } catch (DOMException e) { + } + + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + } + + return null; + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java,v retrieving revision 1.8 diff -u -r1.8 CASTIdExpression.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java 20 Dec 2006 20:59:43 -0000 1.8 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTIdExpression.java 25 Jan 2007 17:40:47 -0000 @@ -12,14 +12,23 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.Linkage; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ -public class CASTIdExpression extends CASTNode implements IASTIdExpression { +public class CASTIdExpression extends CASTNode implements IASTIdExpression, IASTCompletionContext { private IASTName name; @@ -61,4 +70,29 @@ return CVisitor.getExpressionType(this); } + public IBinding[] resolvePrefix(IASTName n) { + IScope scope = CVisitor.getContainingScope(n); + + IBinding[] b1 = null; + try { + b1 = scope.find(n.toString(), true); + } catch (DOMException e) { + } + + IIndex index = getTranslationUnit().getIndex(); + + IBinding[] b2 = null; + try { + b2 = index.findBindingsForPrefix( + n.toString(), + IndexFilter.getFilter(Linkage.C_LINKAGE)); + } catch (CoreException e) { + } + + int size = (b1 == null ? 0 : b1.length) + (b2 == null ? 0 : b2.length); + IBinding[] all = new IBinding[size]; + if (b1 != null) ArrayUtil.addAll(IBinding.class, all, b1); + if (b2 != null) ArrayUtil.addAll(IBinding.class, all, b2); + return all; + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java,v retrieving revision 1.6 diff -u -r1.6 CASTTypedefNameSpecifier.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java 20 Dec 2006 20:59:43 -0000 1.6 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTTypedefNameSpecifier.java 25 Jan 2007 17:40:47 -0000 @@ -11,15 +11,29 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; +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.IScope; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.c.ICASTTypedefNameSpecifier; +import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.core.runtime.CoreException; /** * @author jcamelon */ public class CASTTypedefNameSpecifier extends CASTBaseDeclSpecifier implements - ICASTTypedefNameSpecifier { + ICASTTypedefNameSpecifier, IASTCompletionContext { private IASTName name; /* (non-Javadoc) @@ -63,4 +77,45 @@ return r_unclear; } + public IBinding[] resolvePrefix(IASTName n) { + List filtered = new ArrayList(); + IndexFilter filter = new IndexFilter() { + public boolean acceptBinding(IBinding binding) { + return binding instanceof ICompositeType + || binding instanceof IEnumeration + || binding instanceof ITypedef; + } + public boolean acceptLinkage(ILinkage linkage) { + return linkage.getID() == ILinkage.C_LINKAGE_ID; + } + }; + + IScope scope = CVisitor.getContainingScope(n); + + if (scope == null) { + scope = getTranslationUnit().getScope(); + } + + try { + IBinding[] bindings = scope.find(n.toString(), true); + for (int i = 0 ; i < bindings.length; i++) { + if (filter.acceptBinding(bindings[i])) { + filtered.add(bindings[i]); + } + } + } catch (DOMException e) { + } + + IIndex index = getTranslationUnit().getIndex(); + + try { + IBinding[] bindings = index.findBindingsForPrefix(n.toString(), filter); + for (int i = 0; i < bindings.length; i++) { + filtered.add(bindings[i]); + } + } catch (CoreException e) { + } + + return (IBinding[]) filtered.toArray(new IBinding[filtered.size()]); + } } Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java,v retrieving revision 1.17 diff -u -r1.17 CScope.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java 12 Oct 2006 13:23:41 -0000 1.17 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CScope.java 25 Jan 2007 17:40:47 -0000 @@ -95,11 +95,19 @@ return (IASTName[]) ArrayUtil.trim( IASTName.class, result ); } } + /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find( String name ) throws DOMException { - return CVisitor.findBindings( this, name ); + return CVisitor.findBindings( this, name, false ); + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find( String name, boolean prefixLookup ) throws DOMException { + return CVisitor.findBindings( this, name, prefixLookup ); } public IBinding getBinding( int namespaceType, char [] name ){ Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java,v retrieving revision 1.88 diff -u -r1.88 CVisitor.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java 20 Oct 2006 15:02:43 -0000 1.88 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CVisitor.java 25 Jan 2007 17:40:47 -0000 @@ -12,6 +12,9 @@ package org.eclipse.cdt.internal.core.dom.parser.c; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -609,7 +612,7 @@ char [] p = fieldReference.getFieldName().toCharArray(); IField [] fields = ((ICompositeType) type).getFields(); for ( int i = 0; i < fields.length; i++ ) { - if( CharArrayUtils.equals( fields[i].getNameCharArray(), 0, p.length, p ) ){ + if( CharArrayUtils.equals( fields[i].getNameCharArray(), 0, p.length, p, false ) ){ result = (IBinding[]) ArrayUtil.append( IBinding.class, result, fields[i] ); } } @@ -1415,7 +1418,7 @@ char [] c = candidate.toCharArray(); if( prefixMap == null && CharArrayUtils.equals( c, name ) ){ return candidate; - } else if( prefixMap != null && CharArrayUtils.equals( c, 0, name.length, name ) && !prefixMap.containsKey( c ) ){ + } else if( prefixMap != null && CharArrayUtils.equals( c, 0, name.length, name, false ) && !prefixMap.containsKey( c ) ){ prefixMap.put( c, candidate ); } return prefixMap; @@ -1437,7 +1440,7 @@ char [] n = name.toCharArray(); if( prefixMap == null && CharArrayUtils.equals( c, n ) ) return tempName; - else if( prefixMap != null && CharArrayUtils.equals( c, 0, n.length, n ) && !prefixMap.containsKey( c ) ) + else if( prefixMap != null && CharArrayUtils.equals( c, 0, n.length, n, false ) && !prefixMap.containsKey( c ) ) prefixMap.put( c, tempName ); } else { return checkForBinding( scope, paramDecl.getDeclSpecifier(), name, typesOnly, prefixMap ); @@ -1920,7 +1923,7 @@ return (IBinding[]) ArrayUtil.trim( IBinding.class, result ); } - public static IBinding[] findBindings( IScope scope, String name ) throws DOMException{ + public static IBinding[] findBindings( IScope scope, String name, boolean prefixLookup ) throws DOMException{ IASTNode node = ASTInternal.getPhysicalNodeOfScope(scope); if( node instanceof IASTFunctionDefinition ) node = ((IASTFunctionDefinition)node).getBody(); @@ -1930,39 +1933,65 @@ //normal names astName.setPropertyInParent( STRING_LOOKUP_PROPERTY ); - IBinding b1 = (IBinding) findBinding( astName, astName, COMPLETE ); + int flags = prefixLookup ? COMPLETE | PREFIX_LOOKUP : COMPLETE; + Object o1 = findBinding( astName, astName, flags ); + IBinding[] b1 = null; + if (o1 instanceof IBinding) { + b1 = new IBinding[] { (IBinding) o1 }; + } else { + b1 = (IBinding[]) o1; + } + //structure names astName.setPropertyInParent( STRING_LOOKUP_TAGS_PROPERTY ); - IBinding b2 = (IBinding) findBinding( astName, astName, COMPLETE | TAGS ); + flags = prefixLookup ? COMPLETE | TAGS | PREFIX_LOOKUP : COMPLETE | TAGS; + Object o2 = findBinding( astName, astName, flags ); + IBinding[] b2 = null; + if (o2 instanceof IBinding) { + b2 = new IBinding[] { (IBinding) o2 }; + } else { + b2 = (IBinding[]) o2; + } + //label names - ILabel b3 = null; + List b3 = new ArrayList(); do{ char [] n = name.toCharArray(); if( scope instanceof ICFunctionScope ){ ILabel [] labels = ((CFunctionScope)scope).getLabels(); for( int i = 0; i < labels.length; i++ ){ ILabel label = labels[i]; - if( CharArrayUtils.equals( label.getNameCharArray(), n) ){ - b3 = label; - break; + if (prefixLookup) { + if (CharArrayUtils.equals(label.getNameCharArray(), + 0, n.length, n, false)) { + b3.add(label); + } + } else { + if (CharArrayUtils.equals(label.getNameCharArray(), n)) { + b3.add(label); + break; + } } } - break; + if (!prefixLookup) break; } scope = scope.getParent(); } while( scope != null ); - int c = (( b1 != null ) ? 1 : 0) + (( b2 != null ) ? 1 : 0) + (( b3 != null ) ? 1 : 0); + int c = (b1 == null ? 0 : b1.length) + (b2 == null ? 0 :b2.length) + (b3 == null ? 0 : b3.size()); + IBinding [] result = new IBinding [c]; - c = 0; - if( b1 != null ) - result[c++] = b1; - if( b2 != null ) - result[c++] = b2; - if( b3 != null ) - result[c] = b3; + + if (b1 != null) + ArrayUtil.addAll(IBinding.class, result, b1); + + if (b2 != null) + ArrayUtil.addAll(IBinding.class, result, b2); + + if (b3 != null) + ArrayUtil.addAll(IBinding.class, result, b3.toArray(new IBinding[b3.size()])); return result; } Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java,v retrieving revision 1.16 diff -u -r1.16 CASTName.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java 20 Dec 2006 20:59:44 -0000 1.16 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTName.java 25 Jan 2007 17:40:47 -0000 @@ -19,6 +19,7 @@ import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.internal.core.dom.Linkage; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; /** * @author jcamelon @@ -56,7 +57,16 @@ } public IBinding[] resolvePrefix() { - return CVisitor.prefixLookup(this); + IASTNode node = getParent(); + while (!(node instanceof IASTCompletionContext)) { + if (node == null) { + return null; + } + node = node.getParent(); + } + + IASTCompletionContext context = (IASTCompletionContext) node; + return context.resolvePrefix(this); } public void setBinding(IBinding binding) { Index: parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java,v retrieving revision 1.10 diff -u -r1.10 CASTFieldReference.java --- parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java 20 Dec 2006 20:59:43 -0000 1.10 +++ parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldReference.java 25 Jan 2007 17:40:47 -0000 @@ -11,18 +11,28 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.c; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTFieldReference; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.dom.ast.ICompositeType; +import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; +import org.eclipse.cdt.internal.core.dom.parser.IASTCompletionContext; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPSemantics; /** * @author jcamelon */ -public class CASTFieldReference extends CASTNode implements IASTFieldReference, IASTAmbiguityParent { +public class CASTFieldReference extends CASTNode implements IASTFieldReference, IASTAmbiguityParent, IASTCompletionContext { private IASTExpression owner; private IASTName name; @@ -92,5 +102,31 @@ public IType getExpressionType() { return CVisitor.getExpressionType(this); } - + + public IBinding[] resolvePrefix(IASTName n) { + IASTExpression expression = getFieldOwner(); + IType type = expression.getExpressionType(); + type = CPPSemantics.getUltimateType(type, true); //stop at pointer to member? + + if (type instanceof ICompositeType) { + ICompositeType compType = (ICompositeType) type; + List bindings = new ArrayList(); + char[] name = n.toCharArray(); + + try { + IField[] fields = compType.getFields(); + for (int i = 0; i < fields.length; i++) { + char[] potential = fields[i].getNameCharArray(); + if (CharArrayUtils.equals(potential, 0, name.length, name, false)) { + bindings.add(fields[i]); + } + } + } catch (DOMException e) { + } + + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + } + + return null; + } } Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java,v retrieving revision 1.4 diff -u -r1.4 PDOMCPPBase.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java 19 Jan 2007 12:37:42 -0000 1.4 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBase.java 25 Jan 2007 17:40:48 -0000 @@ -16,6 +16,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBase; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.Database; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.core.runtime.CoreException; @@ -83,8 +84,13 @@ public IBinding getBaseClass() { try { PDOMName name= getBaseClassSpecifierImpl(); - if (name != null) - return name.getPDOMBinding(); + if (name != null) { + PDOMBinding b = name.getPDOMBinding(); + while( b instanceof PDOMCPPTypedef && ((PDOMCPPTypedef)b).getType() instanceof PDOMBinding ){ + b = (PDOMBinding) ((PDOMCPPTypedef)b).getType(); + } + return b; + } } catch (CoreException e) { CCorePlugin.log(e); } Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java,v retrieving revision 1.38 diff -u -r1.38 PDOMCPPClassType.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java 23 Jan 2007 15:14:33 -0000 1.38 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java 25 Jan 2007 17:40:48 -0000 @@ -35,6 +35,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPConstructor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassScope; @@ -169,6 +170,7 @@ acceptInHierarchy(new HashSet(), methods); return methods.getMethods(); } catch (CoreException e) { + CCorePlugin.log(e); return new ICPPMethod[0]; } } @@ -401,12 +403,54 @@ return null; } + private static class BindingFinder implements IPDOMVisitor { + private List fBindings = new ArrayList(); + private char[] fName; + private boolean fPrefixLookup; + + public BindingFinder(char[] name, boolean prefiexLookup) { + fName= name; + fPrefixLookup= prefiexLookup; + } + + public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof PDOMNamedNode && node instanceof IBinding + && !(node instanceof ICPPConstructor)) { + char[] n= ((PDOMNamedNode) node).getDBName().getChars(); + if ((fPrefixLookup && CharArrayUtils.equals(n, 0, fName.length, fName, false)) + || (!fPrefixLookup && CharArrayUtils.equals(n, fName))) { + fBindings.add(node); + } + } + return false; + } + public void leave(IPDOMNode node) throws CoreException { + } + public IBinding[] getBindings() { + return (IBinding[])fBindings.toArray(new IBinding[fBindings.size()]); + } + } + + public IBinding[] find(String name) throws DOMException { + return find(name, false); + } + + public IBinding[] find(String name, boolean prefixLookup) throws DOMException { + try { + BindingFinder visitor= new BindingFinder(name.toCharArray(), prefixLookup); + acceptInHierarchy(new HashSet(), visitor); + return visitor.getBindings(); + } catch (CoreException e) { + CCorePlugin.log(e); + } + return null; + } + // Not implemented public Object clone() {fail();return null;} public IField findField(String name) throws DOMException {fail();return null;} public IBinding[] getFriends() throws DOMException {fail();return null;} - public IBinding[] find(String name) throws DOMException {fail();return null;} public IScope getParent() throws DOMException { try { Index: parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java,v retrieving revision 1.24 diff -u -r1.24 PDOMCPPNamespace.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java 15 Dec 2006 11:30:00 -0000 1.24 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPNamespace.java 25 Jan 2007 17:40:48 -0000 @@ -13,7 +13,11 @@ package org.eclipse.cdt.internal.core.pdom.dom.cpp; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -28,6 +32,7 @@ import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; import org.eclipse.cdt.internal.core.pdom.dom.FindBindingsInBTree; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; @@ -93,8 +98,12 @@ } public IBinding[] find(String name) { + return find(name, false); + } + + public IBinding[] find(String name, boolean prefixLookup) { try { - FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray()); + FindBindingsInBTree visitor = new FindBindingsInBTree(getLinkageImpl(), name.toCharArray(), null, prefixLookup); getIndex().accept(visitor); return visitor.getBinding(); } catch (CoreException e) { @@ -124,6 +133,31 @@ return true; } - public IBinding[] getMemberBindings() throws DOMException {fail(); return null;} + private static class BindingCollector implements IPDOMVisitor { + private List fBindings = new ArrayList(); + + public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof PDOMNamedNode && node instanceof IBinding) { + fBindings.add(node); + } + return false; + } + public void leave(IPDOMNode node) throws CoreException { + } + public IBinding[] getBindings() { + return (IBinding[])fBindings.toArray(new IBinding[fBindings.size()]); + } + } + + public IBinding[] getMemberBindings() throws DOMException { + BindingCollector visitor= new BindingCollector(); + try { + accept(visitor); + } catch (CoreException e) { + CCorePlugin.log(e); + } + return visitor.getBindings(); + } + public void addUsingDirective(IASTNode directive) throws DOMException {fail();} } Index: parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCField.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCField.java,v retrieving revision 1.8 diff -u -r1.8 PDOMCField.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCField.java 27 Oct 2006 10:08:06 -0000 1.8 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCField.java 25 Jan 2007 17:40:48 -0000 @@ -14,10 +14,8 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IField; -import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; @@ -25,10 +23,10 @@ * @author Doug Schaefer * */ -class PDOMCField extends PDOMBinding implements IField { +class PDOMCField extends PDOMCVariable implements IField { public PDOMCField(PDOM pdom, IPDOMMemberOwner parent, IField field) throws CoreException { - super(pdom, (PDOMNode) parent, field.getNameCharArray()); + super(pdom, (PDOMNode) parent, field); } public PDOMCField(PDOM pdom, int record) { @@ -42,12 +40,6 @@ public int getNodeType() { return PDOMCLinkage.CFIELD; } - - public IType getType() throws DOMException { - return null; - // TODO - do we need the real type? - //throw new PDOMNotImplementedError(); - } public boolean isStatic() throws DOMException { // ISO/IEC 9899:TC1 6.7.2.1 Index: parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java,v retrieving revision 1.16 diff -u -r1.16 PDOMCStructure.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java 6 Dec 2006 10:41:25 -0000 1.16 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java 25 Jan 2007 17:40:48 -0000 @@ -28,12 +28,14 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.c.ICCompositeTypeScope; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.index.IIndexType; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; import org.eclipse.cdt.internal.core.pdom.dom.IPDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; @@ -196,11 +198,49 @@ fail(); return null; } - public IBinding[] find(String name) throws DOMException { - fail(); return null; - } - public IBinding getBinding(IASTName name, boolean resolve) throws DOMException { fail(); return null; } + + private static class BindingFinder implements IPDOMVisitor { + private List fBindings = new ArrayList(); + private char[] fName; + private boolean fPrefixLookup; + + public BindingFinder(char[] name, boolean prefiexLookup) { + fName= name; + fPrefixLookup= prefiexLookup; + } + + public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof PDOMNamedNode && node instanceof IBinding) { + char[] n= ((PDOMNamedNode) node).getDBName().getChars(); + if ((fPrefixLookup && CharArrayUtils.equals(n, 0, fName.length, fName, false)) + || (!fPrefixLookup && CharArrayUtils.equals(n, fName))) { + fBindings.add(node); + } + } + return false; + } + public void leave(IPDOMNode node) throws CoreException { + } + public IBinding[] getBindings() { + return (IBinding[])fBindings.toArray(new IBinding[fBindings.size()]); + } + } + + public IBinding[] find(String name) throws DOMException { + return find(name, false); + } + + public IBinding[] find(String name, boolean prefixLookup) throws DOMException { + try { + BindingFinder visitor= new BindingFinder(name.toCharArray(), prefixLookup); + accept(visitor); + return visitor.getBindings(); + } catch (CoreException e) { + CCorePlugin.log(e); + } + return null; + } } Index: parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java,v retrieving revision 1.8 diff -u -r1.8 PDOMCFunction.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java 27 Oct 2006 10:08:06 -0000 1.8 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCFunction.java 25 Jan 2007 17:40:48 -0000 @@ -44,20 +44,35 @@ public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4; /** + * Offset for return type of this function (relative to + * the beginning of the record). + */ + private static final int RETURN_TYPE = PDOMBinding.RECORD_SIZE + 8; + + /** * Offset of annotation information (relative to the beginning of the * record). */ - private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 8; // byte + private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 12; // byte /** * The size in bytes of a PDOMCPPFunction record in the database. */ - public static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 9; + public static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 13; public PDOMCFunction(PDOM pdom, PDOMNode parent, IFunction function) throws CoreException { super(pdom, parent, function.getNameCharArray()); try { + IFunctionType ft= function.getType(); + IType rt= ft.getReturnType(); + if (rt != null) { + PDOMNode typeNode = getLinkageImpl().addType(this, rt); + if (typeNode != null) { + pdom.getDB().putInt(record + RETURN_TYPE, typeNode.getRecord()); + } + } + IParameter[] params = function.getParameters(); pdom.getDB().putInt(record + NUM_PARAMS, params.length); for (int i = 0; i < params.length; ++i) { @@ -173,8 +188,19 @@ return getBit(getByte(record + ANNOTATIONS), PDOMCAnnotation.VARARGS_OFFSET); } + public IType getReturnType() throws DOMException { + try { + PDOMNode node = getLinkageImpl().getNode(pdom.getDB().getInt(record + RETURN_TYPE)); + if (node instanceof IType) { + return (IType) node; + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + return null; + } + public IScope getFunctionScope() throws DOMException {fail(); return null;} - public IType getReturnType() throws DOMException {fail();return null;} public boolean isSameType(IType type) {fail(); return false;} public Object clone() {fail(); return null;} } Index: parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java,v retrieving revision 1.9 diff -u -r1.9 PDOMCVariable.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java 27 Oct 2006 10:08:06 -0000 1.9 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCVariable.java 25 Jan 2007 17:40:48 -0000 @@ -12,11 +12,13 @@ package org.eclipse.cdt.internal.core.pdom.dom.c; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.db.Database; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; @@ -28,20 +30,32 @@ class PDOMCVariable extends PDOMBinding implements IVariable { /** + * Offset of pointer to type information for this parameter + * (relative to the beginning of the record). + */ + private static final int TYPE_OFFSET = PDOMBinding.RECORD_SIZE + 0; + + /** * Offset of annotation information (relative to the beginning of the * record). */ - private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 0; + private static final int ANNOTATIONS = PDOMBinding.RECORD_SIZE + 4; /** * The size in bytes of a PDOMCVariable record in the database. */ - protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 1; + protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 5; public PDOMCVariable(PDOM pdom, PDOMNode parent, IVariable variable) throws CoreException { super(pdom, parent, variable.getNameCharArray()); try { + // Find the type record + Database db = pdom.getDB(); + PDOMNode typeNode = parent.getLinkageImpl().addType(this, variable.getType()); + if (typeNode != null) + db.putInt(record + TYPE_OFFSET, typeNode.getRecord()); + pdom.getDB().putByte(record + ANNOTATIONS, PDOMCAnnotation.encodeAnnotation(variable)); } catch (DOMException e) { throw new CoreException(Util.createStatus(e)); @@ -61,9 +75,13 @@ } public IType getType() throws DOMException { - return null; - // TODO - do we need the real type? - //throw new PDOMNotImplementedError(); + try { + int typeRec = pdom.getDB().getInt(record + TYPE_OFFSET); + return (IType)getLinkageImpl().getNode(typeRec); + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } } public boolean isStatic() throws DOMException { Index: parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java,v retrieving revision 1.28 diff -u -r1.28 PDOMLinkage.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java 24 Jan 2007 14:02:24 -0000 1.28 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java 25 Jan 2007 17:40:48 -0000 @@ -14,6 +14,9 @@ package org.eclipse.cdt.internal.core.pdom.dom; +import java.util.ArrayList; +import java.util.List; + import org.eclipse.cdt.core.dom.ILinkage; import org.eclipse.cdt.core.dom.IName; import org.eclipse.cdt.core.dom.IPDOMVisitor; @@ -29,9 +32,11 @@ import org.eclipse.cdt.core.dom.ast.IQualifierType; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.index.IIndexBinding; import org.eclipse.cdt.core.index.IIndexLinkage; +import org.eclipse.cdt.core.index.IndexFilter; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.ASTInternal; import org.eclipse.cdt.internal.core.pdom.PDOM; @@ -228,6 +233,50 @@ return visitor.getBinding(); } + private static class PrefixedBindingFinder implements IBTreeVisitor { + private PDOMLinkage linkage; + private String prefix; + private IndexFilter filter; + private List bindings = new ArrayList(); + + PrefixedBindingFinder(PDOMLinkage linkage, String prefix, IndexFilter filter) { + this.linkage = linkage; + this.prefix = prefix; + this.filter = filter; + } + + public int compare(int record) throws CoreException { + PDOMNamedNode node = (PDOMNamedNode) linkage.getNode(record); + IString name = node.getDBName(); + if (name.getString().startsWith(prefix)) { + return 0; + } + return name.compare(prefix); + } + + public boolean visit(int record) throws CoreException { + PDOMBinding binding = linkage.getPDOM().getBinding(record); + if (filter.acceptImplicitMethods() || !(binding instanceof ICPPMethod) || + !((ICPPMethod)binding).isImplicit()) { + if (filter.acceptBinding(binding)) { + bindings.add(binding); + } + } + return true; + } + + public IBinding[] getBindings() { + return (IBinding[]) bindings.toArray(new IBinding[bindings.size()]); + } + } + + public IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException { + PrefixedBindingFinder visitor = new PrefixedBindingFinder(this, prefix, filter); + getIndex().accept(visitor); + + return visitor.getBindings(); + } + /** * Callback informing the linkage that a name has been added. This is * used to do addtional processing, like establishing inheritance relationships. Index: parser/org/eclipse/cdt/internal/core/pdom/dom/FindBindingsInBTree.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/FindBindingsInBTree.java,v retrieving revision 1.4 diff -u -r1.4 FindBindingsInBTree.java --- parser/org/eclipse/cdt/internal/core/pdom/dom/FindBindingsInBTree.java 20 Oct 2006 13:19:52 -0000 1.4 +++ parser/org/eclipse/cdt/internal/core/pdom/dom/FindBindingsInBTree.java 25 Jan 2007 17:40:48 -0000 @@ -14,17 +14,24 @@ import java.util.List; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; +import org.eclipse.cdt.internal.core.pdom.db.IString; import org.eclipse.core.runtime.CoreException; public final class FindBindingsInBTree implements IBTreeVisitor { protected final PDOMLinkage linkage; protected final char[] name; + protected final boolean prefixLookup; public int compare(int record) throws CoreException { - PDOMNamedNode node = ((PDOMNamedNode)linkage.getNode(record)); - return node.getDBName().compare(name); + PDOMNamedNode node = ((PDOMNamedNode)linkage.getNode(record)); + IString n = node.getDBName(); + if (prefixLookup && n.getString().startsWith(new String(name))) { + return 0; + } + return n.compare(name); } private List bindings = new ArrayList(); @@ -59,9 +66,22 @@ * @param desiredType */ public FindBindingsInBTree(PDOMLinkage linkage, char[] name, int[] desiredType) { + this(linkage, name, desiredType, false); + } + + /** + * Match a collection of types. + * + * @param pdom + * @param name + * @param desiredType + * @param prefixLookup + */ + public FindBindingsInBTree(PDOMLinkage linkage, char[] name, int[] desiredType, boolean prefixLookup) { this.name = name; this.desiredType = desiredType; this.linkage= linkage; + this.prefixLookup = prefixLookup; } public boolean visit(int record) throws CoreException { @@ -69,8 +89,10 @@ return true; PDOMBinding tBinding = linkage.getPDOM().getBinding(record); - if (!tBinding.hasName(name)) - // no more bindings with our desired name + if ((!prefixLookup && !tBinding.hasName(name)) + || (prefixLookup && !CharArrayUtils.equals( + tBinding.getNameCharArray(), + 0, name.length, name, false))) return false; if (desiredType == null) { Index: parser/org/eclipse/cdt/internal/core/pdom/PDOM.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java,v retrieving revision 1.47 diff -u -r1.47 PDOM.java --- parser/org/eclipse/cdt/internal/core/pdom/PDOM.java 19 Jan 2007 12:37:42 -0000 1.47 +++ parser/org/eclipse/cdt/internal/core/pdom/PDOM.java 25 Jan 2007 17:40:48 -0000 @@ -95,6 +95,7 @@ // 20 - add pointer to member types, array types, return types for functions // 21 - change representation of paths in the pdom (167549) // 22 - fix inheritance relations (167396) + // 23 - port content assist to PDOM (169860) public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; @@ -257,13 +258,13 @@ private List bindings = new ArrayList(); private boolean isFullyQualified; private BitSet matchesUpToLevel; - private boolean acceptImplicitMethods; + private IndexFilter filter; - public BindingFinder(Pattern[] pattern, boolean isFullyQualified, boolean acceptImplicitMethods, IProgressMonitor monitor) { + public BindingFinder(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) { this.pattern = pattern; this.monitor = monitor; this.isFullyQualified= isFullyQualified; - this.acceptImplicitMethods= acceptImplicitMethods; + this.filter= filter; matchesUpToLevel= new BitSet(); matchesUpToLevel.set(0); matchStack.add(matchesUpToLevel); @@ -280,9 +281,11 @@ // check if we have a complete match. final int lastIdx = pattern.length-1; if (matchesUpToLevel.get(lastIdx) && pattern[lastIdx].matcher(name).matches()) { - if (acceptImplicitMethods || !(binding instanceof ICPPMethod) || + if (filter.acceptImplicitMethods() || !(binding instanceof ICPPMethod) || !((ICPPMethod)binding).isImplicit()) { - bindings.add(binding); + if (filter.acceptBinding(binding)) { + bindings.add(binding); + } } } @@ -344,7 +347,7 @@ } public IIndexFragmentBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException { - BindingFinder finder = new BindingFinder(pattern, isFullyQualified, filter.acceptImplicitMethods(), monitor); + BindingFinder finder = new BindingFinder(pattern, isFullyQualified, filter, monitor); for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) { PDOMLinkage linkage = (PDOMLinkage) iter.next(); if (filter.acceptLinkage(linkage)) { @@ -614,4 +617,18 @@ } return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY; } + + public IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException { + ArrayList result = new ArrayList(); + for (Iterator iter = fLinkageIDCache.values().iterator(); iter.hasNext();) { + PDOMLinkage linkage = (PDOMLinkage) iter.next(); + if (filter.acceptLinkage(linkage)) { + IBinding[] bindings = linkage.findBindingsForPrefix(prefix, filter); + for (int j = 0; j < bindings.length; j++) { + result.add(bindings[j]); + } + } + } + return (IBinding[]) result.toArray(new IBinding[result.size()]); + } } \ No newline at end of file Index: parser/org/eclipse/cdt/core/index/IIndex.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndex.java,v retrieving revision 1.4 diff -u -r1.4 IIndex.java --- parser/org/eclipse/cdt/core/index/IIndex.java 6 Dec 2006 10:41:26 -0000 1.4 +++ parser/org/eclipse/cdt/core/index/IIndex.java 25 Jan 2007 17:40:47 -0000 @@ -242,6 +242,15 @@ public IBinding[] findInNamespace(IBinding nsbinding, char[] name); /** + * Searches for all bindings with names that start with the given prefix. + * @param prefix the prefix with which all returned bindings must start + * @param filter a filter that allows for skipping parts of the index + * @return an array of bindings with the prefix + * @throws CoreException + */ + public IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException; + + /** * Searches for all names that resolve to the given binding. You can limit the result to references, declarations * or definitions, or a combination of those. * @param binding a binding for which names are searched for Index: parser/org/eclipse/cdt/core/index/IndexFilter.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IndexFilter.java,v retrieving revision 1.4 diff -u -r1.4 IndexFilter.java --- parser/org/eclipse/cdt/core/index/IndexFilter.java 6 Dec 2006 10:41:25 -0000 1.4 +++ parser/org/eclipse/cdt/core/index/IndexFilter.java 25 Jan 2007 17:40:47 -0000 @@ -13,6 +13,7 @@ package org.eclipse.cdt.core.index; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.IBinding; /** * Can be subclassed and used for queries in the index. @@ -61,4 +62,14 @@ public boolean acceptImplicitMethods() { return false; } + + /** + * Determines whether or not a binding is valid. + * + * @param binding the binding being checked for validity + * @return whether or not the binding is valid + */ + public boolean acceptBinding(IBinding binding) { + return true; + } } Index: parser/org/eclipse/cdt/internal/core/index/CIndex.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/CIndex.java,v retrieving revision 1.7 diff -u -r1.7 CIndex.java --- parser/org/eclipse/cdt/internal/core/index/CIndex.java 6 Dec 2006 10:41:24 -0000 1.7 +++ parser/org/eclipse/cdt/internal/core/index/CIndex.java 25 Jan 2007 17:40:47 -0000 @@ -154,8 +154,7 @@ monitor.done(); return (IIndexBinding[]) result.toArray(new IIndexBinding[result.size()]); } - - + public IIndexName[] findNames(IBinding binding, int flags) throws CoreException { ArrayList result= new ArrayList(); for (int i = 0; i < fPrimaryFragmentCount; i++) { @@ -368,4 +367,25 @@ } return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY; } + + public IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException { + ArrayList result= new ArrayList(); + for (int i = 0; i < fFragments.length; i++) { + try { + IBinding[] part = fFragments[i].findBindingsForPrefix(prefix, filter); + for (int j = 0; j < part.length; j++) { + IBinding binding = part[j]; + if (binding instanceof IIndexBinding) { + result.add(binding); + } + } + } catch (CoreException e) { + CCorePlugin.log(e); + } + } + if (!result.isEmpty()) { + return (IIndexBinding[]) result.toArray(new IIndexBinding[result.size()]); + } + return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY; + } } Index: parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java,v retrieving revision 1.5 diff -u -r1.5 IIndexFragment.java --- parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java 6 Dec 2006 10:41:24 -0000 1.5 +++ parser/org/eclipse/cdt/internal/core/index/IIndexFragment.java 25 Jan 2007 17:40:47 -0000 @@ -143,4 +143,9 @@ * Returns all bindings with the given name in the given namespace */ IBinding[] findInNamespace(IBinding nsbinding, char[] name) throws CoreException; + + /** + * Returns all bindings with the given prefix, accepted by the given filter + */ + IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException; } Index: parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java,v retrieving revision 1.4 diff -u -r1.4 EmptyCIndex.java --- parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java 6 Dec 2006 10:41:24 -0000 1.4 +++ parser/org/eclipse/cdt/internal/core/index/EmptyCIndex.java 25 Jan 2007 17:40:47 -0000 @@ -93,7 +93,7 @@ public IIndexBinding[] findBindings(Pattern[] pattern, boolean isFullyQualified, IndexFilter filter, IProgressMonitor monitor) throws CoreException { return IIndexFragmentBinding.EMPTY_INDEX_BINDING_ARRAY; } - + public IIndexBinding adaptBinding(IBinding binding) throws CoreException { return null; } @@ -105,4 +105,8 @@ public IBinding[] findInNamespace(IBinding nsbinding, char[] name) { return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY; } + + public IBinding[] findBindingsForPrefix(String prefix, IndexFilter filter) throws CoreException { + return IIndexBinding.EMPTY_INDEX_BINDING_ARRAY; + } } \ No newline at end of file Index: parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java,v retrieving revision 1.27 diff -u -r1.27 GCCLanguage.java --- parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java 5 Jan 2007 13:12:22 -0000 1.27 +++ parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java 25 Jan 2007 17:40:47 -0000 @@ -97,7 +97,8 @@ scanner, ParserMode.COMPLETION_PARSE, ParserUtil.getParserLogService(), - new GCCParserExtensionConfiguration()); + new GCCParserExtensionConfiguration(), + index); // Run the parse and return the completion node parser.parse(); Index: parser/org/eclipse/cdt/core/dom/ast/IScope.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IScope.java,v retrieving revision 1.15 diff -u -r1.15 IScope.java --- parser/org/eclipse/cdt/core/dom/ast/IScope.java 20 Oct 2006 15:02:43 -0000 1.15 +++ parser/org/eclipse/cdt/core/dom/ast/IScope.java 25 Jan 2007 17:40:47 -0000 @@ -47,6 +47,18 @@ public IBinding[] find(String name) throws DOMException; /** + * This is the general lookup entry point. It returns the list of + * valid bindings for a given name or prefix. The lookup proceeds as an unqualified + * lookup. Constructors are not considered during this lookup and won't be returned. + * No attempt is made to resolve potential ambiguities or perform access checking. + * + * @param name the name for which to search + * @param prefixLookup whether or not to only check prefixes + * @return List of IBinding + */ + public IBinding[] find(String name, boolean prefixLookup) throws DOMException; + + /** * Get the binding in this scope that the given name would resolve to. Could * return null if there is no matching binding in this scope, if the binding has not * yet been cached in this scope, or if resolve == false and the appropriate binding Index: parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java,v retrieving revision 1.24 diff -u -r1.24 ProblemBinding.java --- parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java 6 Dec 2006 10:41:32 -0000 1.24 +++ parser/org/eclipse/cdt/internal/core/dom/parser/ProblemBinding.java 25 Jan 2007 17:40:47 -0000 @@ -134,13 +134,19 @@ throw new DOMException( this ); } - /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) */ public IBinding[] find( String name ) throws DOMException { throw new DOMException( this ); } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IScope#find(java.lang.String) + */ + public IBinding[] find( String name, boolean prefixLookup ) throws DOMException { + throw new DOMException( this ); + } /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.IScope#getScopeName() Index: parser/org/eclipse/cdt/internal/core/dom/parser/IASTCompletionContext.java =================================================================== RCS file: parser/org/eclipse/cdt/internal/core/dom/parser/IASTCompletionContext.java diff -N parser/org/eclipse/cdt/internal/core/dom/parser/IASTCompletionContext.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ parser/org/eclipse/cdt/internal/core/dom/parser/IASTCompletionContext.java 1 Jan 1970 00:00:00 -0000 @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2007 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX - Initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.dom.parser; + +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IBinding; + +/** + * Interface for a code completion's context. Used for context-sensitive + * finding of bindings with a certain prefix. + * + *

+ * This interface is not intended to be implemented by clients. + *

+ *

+ * EXPERIMENTAL. This class or interface has been added as + * part of a work in progress. There is no guarantee that this API will work or + * that it will remain the same. Please do not use this API without consulting + * with the CDT team. + *

+ * + * @author Bryan Wilkinson + * @since 4.0 + */ +public interface IASTCompletionContext { + + /** + * Returns bindings that start with the given prefix, only considering those + * that are valid for this context. + * + * @param n the name containing a prefix + * @return valid bindings in this context for the given prefix + */ + IBinding[] resolvePrefix(IASTName n); +} #P org.eclipse.cdt.ui Index: src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java,v retrieving revision 1.35 diff -u -r1.35 CCompletionProcessor2.java --- src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java 18 Dec 2006 19:16:18 -0000 1.35 +++ src/org/eclipse/cdt/internal/ui/text/contentassist/CCompletionProcessor2.java 25 Jan 2007 17:40:48 -0000 @@ -29,9 +29,11 @@ import org.eclipse.ui.IEditorPart; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IPDOMManager; import org.eclipse.cdt.core.dom.ast.ASTCompletionNode; import org.eclipse.cdt.core.index.IIndex; import org.eclipse.cdt.core.index.IIndexManager; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.ICCompletionProposal; @@ -78,11 +80,14 @@ String prefix = null; if (workingCopy != null) { - // TODO, to improve performance, we want to skip all headers - // But right now we're not getting any completions -// fCurrentCompletionNode = workingCopy.getCompletionNode(index, ITranslationUnit.AST_SKIP_ALL_HEADERS, offset); - fCurrentCompletionNode = workingCopy.getCompletionNode(index, 0, offset); - + IPDOMManager manager = CCorePlugin.getPDOMManager(); + String indexerId = manager.getIndexerId(workingCopy.getCProject()); + int flags = ITranslationUnit.AST_SKIP_ALL_HEADERS; + if (IPDOMManager.ID_NO_INDEXER.equals(indexerId)) { + flags = 0; + } + fCurrentCompletionNode = workingCopy.getCompletionNode(index, flags, offset); + if (fCurrentCompletionNode != null) prefix = fCurrentCompletionNode.getPrefix(); } Index: src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java,v retrieving revision 1.33 diff -u -r1.33 DOMCompletionContributor.java --- src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java 18 Jan 2007 11:08:45 -0000 1.33 +++ src/org/eclipse/cdt/internal/ui/text/contentassist/DOMCompletionContributor.java 25 Jan 2007 17:40:48 -0000 @@ -23,6 +23,7 @@ import org.eclipse.cdt.core.dom.ast.ASTTypeUtil; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTFunctionStyleMacroParameter; +import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorFunctionStyleMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; @@ -48,6 +49,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPUsingDeclaration; import org.eclipse.cdt.core.model.IWorkingCopy; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; +import org.eclipse.cdt.core.parser.util.CharArrayUtils; import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.text.contentassist.ICompletionContributor; @@ -61,7 +63,9 @@ ASTCompletionNode completionNode, String prefix, List proposals) { + if (completionNode != null) { + boolean handleMacros = false; IASTName[] names = completionNode.getNames(); if (names == null || names.length == 0) // No names, not much we can do here @@ -74,6 +78,7 @@ // The node isn't properly hooked up, must have backtracked out of this node continue; IBinding[] bindings = names[i].resolvePrefix(); + if (names[i].getParent() instanceof IASTIdExpression) handleMacros = true; if (bindings != null) for (int j = 0; j < bindings.length; ++j) { IBinding binding = bindings[j]; @@ -91,11 +96,11 @@ } // Find all macros if there is a prefix - if (prefix.length() > 0) { + if (prefix.length() > 0 && handleMacros) { IASTPreprocessorMacroDefinition[] macros = completionNode.getTranslationUnit().getMacroDefinitions(); if (macros != null) for (int i = 0; i < macros.length; ++i) - if (macros[i].getName().toString().startsWith(prefix)) + if (CharArrayUtils.equals(macros[i].getName().toCharArray(), 0, prefix.length(), prefix.toCharArray(), false)) handleMacro(macros[i], completionNode, offset, viewer, proposals); } }