diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java index 81cb0ee03b5..02b34f23845 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/internal/pdom/tests/DefDeclTests.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 QNX Software Systems and others. + * Copyright (c) 2006, 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 @@ -23,10 +23,16 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.index.IIndex; +import org.eclipse.cdt.core.index.IIndexFile; +import org.eclipse.cdt.core.index.IIndexFileLocation; +import org.eclipse.cdt.core.index.IIndexName; import org.eclipse.cdt.core.index.IndexFilter; +import org.eclipse.cdt.core.index.IndexLocationFactory; import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.testplugin.util.TestSourceReader; import org.eclipse.cdt.internal.core.CCoreInternals; +import org.eclipse.cdt.internal.core.index.IIndexFragmentName; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; @@ -204,25 +210,35 @@ public class DefDeclTests extends PDOMTestBase { assertDefDeclRef("foo", "06", 1, 1, 1); } - public void testWrongMatchedStaticDefinition_unexpected() throws Exception { - assertDefDeclRef("foo", "07", 1, 1, 1); + public void testWrongMatchedStaticDefinition() throws Exception { + assertDefDeclRef("foo", "07", 0, 1, 1); } - public void testStaticBindings_f08_unexpected() throws Exception { - // should be 2 bindings, otherwise how to distinguish proper def/decl - // pairs? - // static elements cannot be found on global scope, see bug 161216 + public void testStaticBindings_f08() throws Exception { String elName = "foo" + "08"; - IBinding[] binds = pdom.findBindings(Pattern.compile(elName), true, - IndexFilter.ALL, new NullProgressMonitor()); - assertEquals(0, binds.length); -// assertEquals(elName, binds[0].getName()); -// IBinding element = binds[0]; -// IBinding binding = element; -// checkDefinition(binding, "def" + "08", 2); -// checkReference(binding, "ref" + "08", 2); -// checkDefinition(binding, "defS" + "08", 2); -// checkReference(binding, "refS" + "08", 2); + + IIndexFileLocation ifl= IndexLocationFactory.getIFL((ITranslationUnit) cproject.findElement(new Path("func.c"))); + IIndexFile file= pdom.getFile(ifl); + int offset= TestSourceReader.indexOfInFile("foo08();", new Path(ifl.getFullPath())); + IIndexName[] names= file.findNames(offset, 5); + assertEquals(1, names.length); + + IBinding element = pdom.findBinding((IIndexFragmentName)names[0]); + assertEquals(elName, element.getName()); + checkDefinition(element, "def" + "08", 1); + checkReference(element, "ref" + "08", 1); + + // check the other file + ifl= IndexLocationFactory.getIFL((ITranslationUnit) cproject.findElement(new Path("second.c"))); + file= pdom.getFile(ifl); + offset= TestSourceReader.indexOfInFile("foo08();", new Path(ifl.getFullPath())); + names= file.findNames(offset, 5); + assertEquals(1, names.length); + + element = pdom.findBinding((IIndexFragmentName)names[0]); + assertEquals(elName, element.getName()); + checkDefinition(element, "defS" + "08", 1); + checkReference(element, "refS" + "08", 1); } public void testSimpleGlobalWrite_v09() throws Exception { @@ -263,7 +279,7 @@ public class DefDeclTests extends PDOMTestBase { assertDefDeclRef("type", "_t03", 1, 1, 1); } - public void _testStructAndTypedef_t04_unexpected() throws Exception { + public void testStructAndTypedef_t04() throws Exception { String num = "_t04"; String elName = "type" + num; @@ -274,7 +290,7 @@ public class DefDeclTests extends PDOMTestBase { IBinding struct = bindings[0] instanceof ICompositeType ? bindings[0] : bindings[1]; checkReference(typedef, "ref" + num, 1); - checkDeclaration(typedef, "def" + num, 1); + checkDefinition(typedef, "def" + num, 1); checkReference(struct, "refS" + num, 1); checkDefinition(struct, "defS" + num, 1); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java index a8c23d0e42c..89da0dc5ad4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/index/IIndexBinding.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2007 Wind River Systems, Inc. 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 @@ -12,6 +12,7 @@ package org.eclipse.cdt.core.index; import org.eclipse.cdt.core.dom.ast.IBinding; +import org.eclipse.core.runtime.CoreException; /** * Represents the semantics of a name in the index. @@ -35,4 +36,11 @@ public interface IIndexBinding extends IBinding { * Returns the qualified name of this binding as array of strings. */ String[] getQualifiedName(); + + /** + * Returns whether the scope of the binding is file-local. A file local + * binding is private to an index and should not be adapted to a binding + * in another index. + */ + boolean isFileLocal() throws CoreException; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java index df20edcec4a..4acb933a600 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPField.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2006 IBM Corporation and others. + * Copyright (c) 2004, 2007 IBM Corporation 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 @@ -165,7 +165,6 @@ public class CPPField extends CPPVariable implements ICPPField, ICPPInternalBind } public ICompositeType getCompositeTypeOwner() throws DOMException { - // mstodo Auto-generated method stub - return null; + return getClassOwner(); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index b00b664f682..4c194928296 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -72,7 +72,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { private Database db; - public static final int VERSION = 22; + public static final int VERSION = 24; // 0 - the beginning of it all // 1 - first change to kick off upgrades // 2 - added file inclusions @@ -97,6 +97,7 @@ public class PDOM extends PlatformObject implements IIndexFragment, IPDOM { // 21 - change representation of paths in the pdom (167549) // 22 - fix inheritance relations (167396) // 23 - types on c-variables, return types on c-functions + // 24 - file local scopes (161216) public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/BindingCollector.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/BindingCollector.java index 5a9620612f4..8a2cd38f865 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/BindingCollector.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/BindingCollector.java @@ -11,27 +11,17 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.pdom.dom; -import java.util.ArrayList; import java.util.List; -import org.eclipse.cdt.core.dom.IPDOMNode; -import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.index.IndexFilter; -import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; -import org.eclipse.core.runtime.CoreException; /** * Visitor to find bindings in a BTree or below a PDOMNode. Nested bindings are not visited. * @since 4.0 */ -public final class BindingCollector implements IBTreeVisitor, IPDOMVisitor { - private final PDOMLinkage linkage; - private final char[] name; - private final boolean prefixLookup; +public final class BindingCollector extends NamedNodeCollector { private IndexFilter filter; - - private List bindings = new ArrayList(); /** * Collects all bindings with given name. @@ -45,55 +35,21 @@ public final class BindingCollector implements IBTreeVisitor, IPDOMVisitor { * true a binding is considered if its name starts with the given prefix. */ public BindingCollector(PDOMLinkage linkage, char[] name, IndexFilter filter, boolean prefixLookup) { - this.name = name; - this.linkage= linkage; + super(linkage, name, prefixLookup); this.filter= filter; - this.prefixLookup = prefixLookup; } - - public int compare(int record) throws CoreException { - PDOMNamedNode node = ((PDOMNamedNode)linkage.getNode(record)); - return compare(node); - } - - private int compare(PDOMNamedNode node) throws CoreException { - if (prefixLookup) { - return node.getDBName().comparePrefix(name); - } - return node.getDBName().compare(name); - } - - public boolean visit(int record) throws CoreException { - if (record == 0) - return true; - PDOMBinding tBinding = linkage.getPDOM().getBinding(record); - if (tBinding != null) { - visit(tBinding); + public boolean addNode(PDOMNamedNode tBinding) { + if (tBinding instanceof IBinding) { + if (filter == null || filter.acceptBinding((IBinding) tBinding)) { + return super.addNode(tBinding); + } } return true; // look for more } - - private void visit(PDOMBinding tBinding) { - if (filter == null || filter.acceptBinding(tBinding)) { - bindings.add(tBinding); - } - } public IBinding[] getBindings() { + List bindings= getNodeList(); return (IBinding[])bindings.toArray(new IBinding[bindings.size()]); } - - public boolean visit(IPDOMNode node) throws CoreException { - if (node instanceof PDOMBinding) { - PDOMBinding pb= (PDOMBinding) node; - if (compare(pb) == 0) { - visit(pb); - } - } - return false; // don't visit children - } - - public void leave(IPDOMNode node) throws CoreException { - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/NamedNodeCollector.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/NamedNodeCollector.java new file mode 100644 index 00000000000..d9cd0e8cdfb --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/NamedNodeCollector.java @@ -0,0 +1,100 @@ +/******************************************************************************* + * Copyright (c) 2007 Wind River Systems, Inc. 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: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom; + +import java.util.ArrayList; +import java.util.List; + +import org.eclipse.cdt.core.dom.IPDOMNode; +import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; +import org.eclipse.core.runtime.CoreException; + +/** + * Visitor to find named nodes in a BTree or below a PDOMNode. Nested nodes are not visited. + * @since 4.0 + */ +public class NamedNodeCollector implements IBTreeVisitor, IPDOMVisitor { + private final PDOMLinkage linkage; + private final char[] name; + private final boolean prefixLookup; + + private List nodes = new ArrayList(); + + /** + * Collects all nodes with given name. + */ + public NamedNodeCollector(PDOMLinkage linkage, char[] name) { + this(linkage, name, false); + } + + /** + * Collects all nodes with given name, passing the filter. If prefixLookup is set to + * true a binding is considered if its name starts with the given prefix. + */ + public NamedNodeCollector(PDOMLinkage linkage, char[] name, boolean prefixLookup) { + this.name = name; + this.linkage= linkage; + this.prefixLookup = prefixLookup; + } + + final public int compare(int record) throws CoreException { + PDOMNamedNode node = ((PDOMNamedNode)linkage.getNode(record)); + return compare(node); + } + + private int compare(PDOMNamedNode node) throws CoreException { + if (prefixLookup) { + return node.getDBName().comparePrefix(name); + } + return node.getDBName().compare(name); + } + + final public boolean visit(int record) throws CoreException { + if (record == 0) + return true; + + PDOMNode node= linkage.getNode(record); + if (node instanceof PDOMNamedNode) { + return addNode((PDOMNamedNode) node); + } + return true; // look for more + } + + /** + * Return true to continue the visit. + */ + protected boolean addNode(PDOMNamedNode node) { + nodes.add(node); + return true; // look for more + } + + final protected List getNodeList() { + return nodes; + } + + final public PDOMNamedNode[] getNodes() { + return (PDOMNamedNode[])nodes.toArray(new PDOMNamedNode[nodes.size()]); + } + + final public boolean visit(IPDOMNode node) throws CoreException { + if (node instanceof PDOMNamedNode) { + PDOMNamedNode pb= (PDOMNamedNode) node; + if (compare(pb) == 0) { + addNode(pb); + } + } + return false; // don't visit children + } + + final public void leave(IPDOMNode node) throws CoreException { + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java index fbbda752cd2..e9fbab19f85 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMBinding.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2005, 2006 QNX Software Systems and others. + * Copyright (c) 2005, 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 @@ -234,4 +234,8 @@ public abstract class PDOMBinding extends PDOMNamedNode implements IIndexFragmen return null; } } + + final public boolean isFileLocal() throws CoreException { + return getParentNode() instanceof PDOMFileLocalScope; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java new file mode 100644 index 00000000000..b428e929a0a --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMFileLocalScope.java @@ -0,0 +1,54 @@ +/******************************************************************************* + * Copyright (c) 2007 Wind River Systems, Inc. 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: + * Markus Schorn - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.pdom.dom; + +import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.db.PDOMNodeLinkedList; +import org.eclipse.core.runtime.CoreException; + +public class PDOMFileLocalScope extends PDOMNamedNode implements IPDOMMemberOwner { + private static final int MEMBERLIST = PDOMNamedNode.RECORD_SIZE; + private static final int RECORD_SIZE = MEMBERLIST+4; + + + public PDOMFileLocalScope(PDOM pdom, PDOMNode parent, char[] name) throws CoreException { + super(pdom, parent, name); + } + + public PDOMFileLocalScope(PDOM pdom, int record) { + super(pdom, record); + } + + protected int getRecordSize() { + return RECORD_SIZE; + } + + public int getNodeType() { + return PDOMLinkage.FILE_LOCAL_SCOPE_TYPE; + } + + public void accept(IPDOMVisitor visitor) throws CoreException { + super.accept(visitor); + PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); + list.accept(visitor); + } + + public void addMember(PDOMNode member) throws CoreException { + PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkageImpl()); + list.addMember(member); + } + + public void addChild(PDOMNode child) throws CoreException { + addMember(child); + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java index ef2c3713112..c00116c448d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMLinkage.java @@ -59,12 +59,13 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage protected static final int RECORD_SIZE = PDOMNamedNode.RECORD_SIZE + 12; // node types - protected static final int LINKAGE = 0; // special one for myself - static final int POINTER_TYPE = 1; - static final int ARRAY_TYPE = 2; - static final int QUALIFIER_TYPE = 3; + protected static final int LINKAGE= 0; // special one for myself + static final int POINTER_TYPE= 1; + static final int ARRAY_TYPE= 2; + static final int QUALIFIER_TYPE= 3; + static final int FILE_LOCAL_SCOPE_TYPE= 4; - protected static final int LAST_NODE_TYPE = QUALIFIER_TYPE; + protected static final int LAST_NODE_TYPE = FILE_LOCAL_SCOPE_TYPE; public PDOMLinkage(PDOM pdom, int record) { super(pdom, record); @@ -144,6 +145,8 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage return new PDOMArrayType(pdom, record); case QUALIFIER_TYPE: return new PDOMQualifierType(pdom, record); + case FILE_LOCAL_SCOPE_TYPE: + return new PDOMFileLocalScope(pdom, record); } return null; } @@ -178,17 +181,28 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage /** * * @param binding + * @param createFileLocalScope if true the creation of a file local + * scope object is allowed. * @return * @throws CoreException */ - public PDOMNode getAdaptedParent(IBinding binding) throws CoreException { + protected PDOMNode getAdaptedParent(IBinding binding, boolean createFileLocalScope) throws CoreException { try { IScope scope = binding.getScope(); if (scope == null) { - return binding instanceof PDOMBinding ? this : null; + if (binding instanceof IIndexBinding) { + IIndexBinding ib= (IIndexBinding) binding; + // don't adapt file local bindings from other fragments to this one. + if (ib.isFileLocal()) { + return null; + } + // in an index the null scope represents global scope. + return this; + } + return null; } if (scope instanceof IIndexBinding) { @@ -207,8 +221,13 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage IASTNode scopeNode = ASTInternal.getPhysicalNodeOfScope(scope); if (scopeNode instanceof IASTCompoundStatement) return null; - else if (scopeNode instanceof IASTTranslationUnit) + else if (scopeNode instanceof IASTTranslationUnit) { + if (isFileLocalBinding(binding)) { + IASTTranslationUnit tu= (IASTTranslationUnit) scopeNode; + return findFileLocalScope(tu.getFilePath(), createFileLocalScope); + } return this; + } else { IName scopeName = scope.getScopeName(); if (scopeName instanceof IASTName) { @@ -224,6 +243,7 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage return null; } + protected abstract boolean isFileLocalBinding(IBinding binding) throws DOMException; public abstract int getBindingType(IBinding binding); public IBinding[] findBindingsForPrefix(char[] prefix, IndexFilter filter) throws CoreException { @@ -263,4 +283,51 @@ public abstract class PDOMLinkage extends PDOMNamedNode implements IIndexLinkage */ public void onDeleteName(PDOMName nextName) throws CoreException { } + + /** + * Searches for the a file local scope object. If none is found depending + * on the value of the parameter 'create' such an object is created. + * @param fileName + * @param create + * @since 4.0 + */ + final protected PDOMFileLocalScope findFileLocalScope(String fileName, boolean create) throws CoreException { + char[] fname= fileName.toCharArray(); + int fnamestart= findFileNameStart(fname); + StringBuffer buf= new StringBuffer(); + buf.append('{'); + buf.append(fname, fnamestart, fname.length-fnamestart); + buf.append(':'); + buf.append(fileName.hashCode()); + buf.append('}'); + fname= buf.toString().toCharArray(); + + final PDOMFileLocalScope[] fls= new PDOMFileLocalScope[] {null}; + NamedNodeCollector collector= new NamedNodeCollector(this, fname) { + public boolean addNode(PDOMNamedNode node) { + if (node instanceof PDOMFileLocalScope) { + fls[0]= (PDOMFileLocalScope) node; + return false; // done + } + return true; + } + }; + getIndex().accept(collector); + if (fls[0] == null && create) { + fls[0]= new PDOMFileLocalScope(pdom, this, fname); + addChild(fls[0]); + } + return fls[0]; + } + + private static int findFileNameStart(char[] fname) { + for (int i= fname.length-2; i>=0; i--) { + switch (fname[i]) { + case '/': + case '\\': + return i+1; + } + } + return 0; + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java index 11b73604c4c..e17b57cddee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java @@ -33,8 +33,6 @@ import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICBasicType; -import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; -import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.db.IBTreeComparator; @@ -79,53 +77,45 @@ class PDOMCLinkage extends PDOMLinkage { public PDOMBinding addBinding(IBinding binding) throws CoreException { PDOMBinding pdomBinding = adaptBinding(binding); - try { - if (pdomBinding == null) { - PDOMNode parent = getAdaptedParent(binding); - if (parent == null) - return null; - - // assign names to anonymous types. - binding= PDOMASTAdapter.getAdapterIfAnonymous(binding); + if (pdomBinding == null) { + PDOMNode parent = getAdaptedParent(binding, true); + if (parent == null) + return null; + + // assign names to anonymous types. + binding= PDOMASTAdapter.getAdapterIfAnonymous(binding); - if (binding == null || binding instanceof IParameter) - return null; // skip parameters - - if (binding instanceof IField) { // must be before IVariable - if (parent instanceof IPDOMMemberOwner) - pdomBinding = new PDOMCField(pdom, (IPDOMMemberOwner)parent, (IField) binding); - } else if (binding instanceof IVariable) { - IVariable var= (IVariable) binding; - if (!var.isStatic()) { // bug 161216 - pdomBinding = new PDOMCVariable(pdom, parent, var); - } - } else if (binding instanceof IFunction) { - IFunction func= (IFunction) binding; - if (!func.isStatic()) { // bug 161216 - pdomBinding = new PDOMCFunction(pdom, parent, func); - } - } else if (binding instanceof ICompositeType) - pdomBinding = new PDOMCStructure(pdom, parent, (ICompositeType) binding); - else if (binding instanceof IEnumeration) - pdomBinding = new PDOMCEnumeration(pdom, parent, (IEnumeration) binding); - else if (binding instanceof IEnumerator) { - try { - IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType(); - PDOMBinding pdomEnumeration = adaptBinding(enumeration); - if (pdomEnumeration instanceof PDOMCEnumeration) - pdomBinding = new PDOMCEnumerator(pdom, parent, (IEnumerator) binding, (PDOMCEnumeration)pdomEnumeration); - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); - } - } else if (binding instanceof ITypedef) - pdomBinding = new PDOMCTypedef(pdom, parent, (ITypedef)binding); - - if(pdomBinding!=null) { - parent.addChild(pdomBinding); + if (binding == null || binding instanceof IParameter) + return null; // skip parameters + + if (binding instanceof IField) { // must be before IVariable + if (parent instanceof IPDOMMemberOwner) + pdomBinding = new PDOMCField(pdom, (IPDOMMemberOwner)parent, (IField) binding); + } else if (binding instanceof IVariable) { + IVariable var= (IVariable) binding; + pdomBinding = new PDOMCVariable(pdom, parent, var); + } else if (binding instanceof IFunction) { + IFunction func= (IFunction) binding; + pdomBinding = new PDOMCFunction(pdom, parent, func); + } else if (binding instanceof ICompositeType) + pdomBinding = new PDOMCStructure(pdom, parent, (ICompositeType) binding); + else if (binding instanceof IEnumeration) + pdomBinding = new PDOMCEnumeration(pdom, parent, (IEnumeration) binding); + else if (binding instanceof IEnumerator) { + try { + IEnumeration enumeration = (IEnumeration)((IEnumerator)binding).getType(); + PDOMBinding pdomEnumeration = adaptBinding(enumeration); + if (pdomEnumeration instanceof PDOMCEnumeration) + pdomBinding = new PDOMCEnumerator(pdom, parent, (IEnumerator) binding, (PDOMCEnumeration)pdomEnumeration); + } catch (DOMException e) { + throw new CoreException(Util.createStatus(e)); } + } else if (binding instanceof ITypedef) + pdomBinding = new PDOMCTypedef(pdom, parent, (ITypedef)binding); + + if(pdomBinding!=null) { + parent.addChild(pdomBinding); } - } catch (DOMException e) { - throw new CoreException(Util.createStatus(e)); } return pdomBinding; } @@ -186,7 +176,7 @@ class PDOMCLinkage extends PDOMLinkage { return null; } } - PDOMNode parent = getAdaptedParent(binding); + PDOMNode parent = getAdaptedParent(binding, false); if (parent == this) { return FindBinding.findBinding(getIndex(), getPDOM(), binding.getNameCharArray(), new int[] {getBindingType(binding)}); @@ -262,7 +252,18 @@ class PDOMCLinkage extends PDOMLinkage { return new FindBinding.DefaultBindingBTreeComparator(getPDOM()); } - public IBinding findInGlobalScope(String filePath, IASTName name) throws CoreException { - return null; + protected boolean isFileLocalBinding(IBinding binding) throws DOMException { + if (binding instanceof IField) { + return false; + } + if (binding instanceof IVariable) { + IVariable var= (IVariable) binding; + return var.isStatic(); + } + if (binding instanceof IFunction) { + IFunction f= (IFunction) binding; + return f.isStatic(); + } + return false; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index b4e5a4ccbe4..ccc8771c9bc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -40,8 +40,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPReferenceType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; -import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; -import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.internal.core.Util; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalFunction; @@ -128,10 +126,16 @@ class PDOMCPPLinkage extends PDOMLinkage { } private PDOMBinding addBinding(IBinding binding) throws CoreException { + // assign names to anonymous types. + binding= PDOMASTAdapter.getAdapterIfAnonymous(binding); + if (binding == null) { + return null; + } + PDOMBinding pdomBinding = adaptBinding(binding); try { if (pdomBinding == null) { - PDOMNode parent = getAdaptedParent(binding); + PDOMNode parent = getAdaptedParent(binding, true); if (parent == null) return null; pdomBinding = addBinding(parent, binding); @@ -146,32 +150,25 @@ class PDOMCPPLinkage extends PDOMLinkage { private PDOMBinding addBinding(PDOMNode parent, IBinding binding) throws CoreException, DOMException { PDOMBinding pdomBinding= null; - // assign names to anonymous types. - binding= PDOMASTAdapter.getAdapterIfAnonymous(binding); - if (binding == null) { - return null; - } - - if (binding instanceof ICPPField && parent instanceof PDOMCPPClassType) - pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding); - else if (binding instanceof ICPPVariable && !(binding.getScope() instanceof CPPBlockScope)) { + if (binding instanceof ICPPField ) { + if (parent instanceof PDOMCPPClassType) { + pdomBinding = new PDOMCPPField(pdom, (PDOMCPPClassType)parent, (ICPPField) binding); + } + } else if (binding instanceof ICPPVariable) { if (!(binding.getScope() instanceof CPPBlockScope)) { ICPPVariable var= (ICPPVariable) binding; - if (!var.isStatic()) { // bug 161216 - pdomBinding = new PDOMCPPVariable(pdom, parent, var); - } + pdomBinding = new PDOMCPPVariable(pdom, parent, var); + } + } else if (binding instanceof ICPPConstructor) { + if (parent instanceof PDOMCPPClassType) { + pdomBinding = new PDOMCPPConstructor(pdom, parent, (ICPPConstructor)binding); + } + } else if (binding instanceof ICPPMethod) { + if (parent instanceof PDOMCPPClassType) { + pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding); } - } else if (binding instanceof ICPPConstructor && parent instanceof PDOMCPPClassType) { - pdomBinding = new PDOMCPPConstructor(pdom, parent, (ICPPConstructor)binding); - } else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) { - pdomBinding = new PDOMCPPMethod(pdom, parent, (ICPPMethod)binding); } else if (binding instanceof ICPPFunction) { - ICPPFunction func = (ICPPFunction)binding; - if (binding instanceof ICPPInternalFunction) { - if (!((ICPPInternalFunction)binding).isStatic(false)) - pdomBinding = new PDOMCPPFunction(pdom, parent, func); - } else - pdomBinding = new PDOMCPPFunction(pdom, parent, func); + pdomBinding = new PDOMCPPFunction(pdom, parent, (ICPPFunction) binding); } else if (binding instanceof ICPPClassType) { pdomBinding= new PDOMCPPClassType(pdom, parent, (ICPPClassType) binding); } else if (binding instanceof ICPPNamespaceAlias) { @@ -269,7 +266,7 @@ class PDOMCPPLinkage extends PDOMLinkage { } } - PDOMNode parent = getAdaptedParent(binding); + PDOMNode parent = getAdaptedParent(binding, false); if (parent == this) { return CPPFindBinding.findBinding(getIndex(), this, binding); @@ -392,4 +389,25 @@ class PDOMCPPLinkage extends PDOMLinkage { } } } + + protected boolean isFileLocalBinding(IBinding binding) throws DOMException { + if (binding instanceof ICPPField) { + return false; + } + if (binding instanceof ICPPVariable) { + if (!(binding.getScope() instanceof CPPBlockScope)) { + ICPPVariable var= (ICPPVariable) binding; + return var.isStatic(); + } + return false; + } + if (binding instanceof ICPPMethod) { + return false; + } + if (binding instanceof ICPPInternalFunction) { + ICPPInternalFunction func = (ICPPInternalFunction)binding; + return func.isStatic(false); + } + return false; + } }