diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java index 1530b3e2e69..7c8d9d8eb72 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java @@ -18,7 +18,11 @@ import org.eclipse.cdt.core.dom.IPDOMManager; 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.IBinding; +import org.eclipse.cdt.core.dom.ast.IEnumeration; 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.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.model.CoreModel; @@ -28,9 +32,6 @@ import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCStructure; -import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPClassType; -import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPNamespace; -import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPNamespaceAlias; import org.eclipse.core.runtime.CoreException; /** @@ -88,7 +89,7 @@ public class AllTypesCache { return; case ICElement.C_STRUCT: if (node instanceof PDOMCStructure) - types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); + types.add(new PDOMTypeInfo((IBinding)node, kind, project)); return; case ICElement.C_UNION: return; @@ -109,25 +110,28 @@ public class AllTypesCache { try { switch (kind) { case ICElement.C_NAMESPACE: - if (node instanceof PDOMCPPNamespace || node instanceof PDOMCPPNamespaceAlias) + if (node instanceof ICPPNamespace || node instanceof ICPPNamespaceAlias) types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); return; case ICElement.C_CLASS: - if (node instanceof PDOMCPPClassType - && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_class) + if (node instanceof ICPPClassType + && ((ICPPClassType)node).getKey() == ICPPClassType.k_class) types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); return; case ICElement.C_STRUCT: - if (node instanceof PDOMCPPClassType - && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_struct) + if (node instanceof ICPPClassType + && ((ICPPClassType)node).getKey() == ICPPClassType.k_struct) types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); return; case ICElement.C_UNION: - if (node instanceof PDOMCPPClassType - && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_union) + if (node instanceof ICPPClassType + && ((ICPPClassType)node).getKey() == ICPPClassType.k_union) types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); return; case ICElement.C_ENUMERATION: + if (node instanceof IEnumeration + /*&& node instanceof ICPPBinding*/) + types.add(new PDOMTypeInfo((IEnumeration)node, kind, project)); return; case ICElement.C_TYPEDEF: return; diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java index f4c8a001e81..1f3a39b0e79 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java @@ -13,11 +13,15 @@ package org.eclipse.cdt.core.browser; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IPDOM; +import org.eclipse.cdt.core.dom.IPDOMResolver; +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.cpp.ICPPBinding; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; @@ -27,11 +31,11 @@ import org.eclipse.core.runtime.CoreException; */ public class PDOMTypeInfo implements ITypeInfo { - private final PDOMBinding binding; + private final IBinding binding; private final int elementType; private final ICProject project; - public PDOMTypeInfo(PDOMBinding binding, int elementType, ICProject project) { + public PDOMTypeInfo(IBinding binding, int elementType, ICProject project) { this.binding = binding; this.elementType = elementType; this.project = project; @@ -95,21 +99,19 @@ public class PDOMTypeInfo implements ITypeInfo { } public IQualifiedTypeName getQualifiedTypeName() { - StringBuffer buf = new StringBuffer(binding.getName()); - try { - PDOMNode parent = binding.getParentNode(); - while (parent != null) - { - if (parent instanceof PDOMBinding) - { - buf.insert(0, ((PDOMBinding)parent).getName() + "::"); - } - parent = parent.getParentNode(); + String qn; + if(binding instanceof ICPPBinding) { + try { + qn = CPPVisitor.renderQualifiedName(((ICPPBinding)binding).getQualifiedName()); + } catch(DOMException de) { + CCorePlugin.log(de); // can't happen when (binding instanceof PDOMBinding) + return null; } - } catch (Exception e) { - // TODO: handle exception - } - return new QualifiedTypeName(buf.toString()); + } else { + qn = binding.getName(); + } + + return new QualifiedTypeName(qn); } public ITypeReference[] getReferences() { @@ -118,8 +120,10 @@ public class PDOMTypeInfo implements ITypeInfo { public ITypeReference getResolvedReference() { try { - PDOMName name = binding.getFirstDefinition(); - return name != null ? new PDOMTypeReference(name, project) : null; + IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(project); + IPDOMResolver resolver = (IPDOMResolver) pdom.getAdapter(IPDOMResolver.class); + IASTName[] names= resolver.getDefinitions(binding); + return names != null && names.length > 0 ? new PDOMTypeReference(names[0], project) : null; } catch (CoreException e) { CCorePlugin.log(e); return null; diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java index 292728fda4f..c0a2b3e435f 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java @@ -11,12 +11,12 @@ package org.eclipse.cdt.core.browser; +import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.IWorkingCopy; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; @@ -29,11 +29,11 @@ import org.eclipse.core.runtime.Path; */ public class PDOMTypeReference implements ITypeReference { - private final PDOMName name; + private final IASTName name; private final ICProject project; private final IPath path; - public PDOMTypeReference(PDOMName name, ICProject project) { + public PDOMTypeReference(IASTName name, ICProject project) { this.name = name; this.project = project; this.path = new Path(name.getFileLocation().getFileName()); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java index 0d8dc80ce04..b971c56fd4f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPVisitor.java @@ -704,7 +704,7 @@ public class CPPVisitor { ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) parent; if( dtor.getNestedDeclarator() == null ) { while( parent.getParent() instanceof IASTDeclarator ) - parent = (IASTDeclarator) parent.getParent(); + parent = parent.getParent(); ASTNodeProperty prop = parent.getPropertyInParent(); if( prop == IASTSimpleDeclaration.DECLARATOR ) return dtor.getFunctionScope(); @@ -765,7 +765,7 @@ public class CPPVisitor { n = ns[ ns.length - 1 ]; } - return (ICPPScope) CPPVisitor.getContainingScope( n ); + return CPPVisitor.getContainingScope( n ); } node = node.getParent(); } @@ -1987,6 +1987,20 @@ public class CPPVisitor { return found; } + /** + * Return the qualified name by concatenating component names with the + * Scope resolution operator :: + * @param qn the component names + * @return the qualified name + */ + public static String renderQualifiedName(String[] qn) { + StringBuffer result = new StringBuffer(); + for(int i=0; i has-a list) 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/PDOMMemberOwner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/PDOMNodeLinkedList.java similarity index 71% rename from core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMemberOwner.java rename to core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/PDOMNodeLinkedList.java index 4b789eb4bcd..0eac85d5eea 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMMemberOwner.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/db/PDOMNodeLinkedList.java @@ -9,31 +9,31 @@ * QNX - Initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.internal.core.pdom.dom; +package org.eclipse.cdt.internal.core.pdom.db; import org.eclipse.cdt.core.dom.IPDOMVisitor; -import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.internal.core.pdom.PDOM; -import org.eclipse.cdt.internal.core.pdom.db.Database; -import org.eclipse.cdt.internal.core.pdom.db.ListItem; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.core.runtime.CoreException; /** + * Represents a linked list * @author Doug Schaefer * */ -public abstract class PDOMMemberOwner extends PDOMBinding { - - private static final int FIRST_MEMBER = PDOMBinding.RECORD_SIZE + 0; +public class PDOMNodeLinkedList { + PDOM pdom; + int offset; + PDOMLinkage linkage; - protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4; + private static final int FIRST_MEMBER = 0; + protected static final int RECORD_SIZE = 4; - public PDOMMemberOwner(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { - super(pdom, parent, name); - } - - public PDOMMemberOwner(PDOM pdom, int record) { - super(pdom, record); + public PDOMNodeLinkedList(PDOM pdom, int offset, PDOMLinkage linkage) { + this.pdom = pdom; + this.offset = offset; + this.linkage = linkage; } protected int getRecordSize() { @@ -41,12 +41,10 @@ public abstract class PDOMMemberOwner extends PDOMBinding { } public void accept(IPDOMVisitor visitor) throws CoreException { - super.accept(visitor); ListItem firstItem = getFirstMemberItem(); if (firstItem == null) return; - PDOMLinkage linkage = getLinkage(); ListItem item = firstItem; do { PDOMNode node = linkage.getNode(item.getItem()); @@ -59,7 +57,7 @@ public abstract class PDOMMemberOwner extends PDOMBinding { private ListItem getFirstMemberItem() throws CoreException { Database db = pdom.getDB(); - int item = db.getInt(record + FIRST_MEMBER); + int item = db.getInt(offset + FIRST_MEMBER); return item != 0 ? new ListItem(db, item) : null; } @@ -71,7 +69,7 @@ public abstract class PDOMMemberOwner extends PDOMBinding { firstMember.setItem(member.getRecord()); firstMember.setNext(firstMember); firstMember.setPrev(firstMember); - db.putInt(record + FIRST_MEMBER, firstMember.getRecord()); + db.putInt(offset + FIRST_MEMBER, firstMember.getRecord()); } else { ListItem newMember = new ListItem(db); newMember.setItem(member.getRecord()); @@ -82,5 +80,4 @@ public abstract class PDOMMemberOwner extends PDOMBinding { newMember.setNext(firstMember); } } - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMMemberOwner.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMMemberOwner.java new file mode 100644 index 00000000000..8af9c8c143b --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/IPDOMMemberOwner.java @@ -0,0 +1,12 @@ +package org.eclipse.cdt.internal.core.pdom.dom; + +import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.core.runtime.CoreException; + +/** + * Interface for PDOM entities that contain members + */ +public interface IPDOMMemberOwner { + public void addMember(PDOMNode member) throws CoreException; + public void accept(IPDOMVisitor visitor) throws CoreException; +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMCPPBinding.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMCPPBinding.java new file mode 100644 index 00000000000..b71e9aed2f6 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/PDOMCPPBinding.java @@ -0,0 +1,66 @@ +/******************************************************************************* + * Copyright (c) 2006 Symbian 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Symbian - 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.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.core.runtime.CoreException; + +/** + * Mirrors type-hierarchy from DOM interfaces + */ +abstract public class PDOMCPPBinding extends PDOMBinding implements ICPPBinding { + public PDOMCPPBinding(PDOM pdom, int record) { + super(pdom, record); + } + public PDOMCPPBinding(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { + super(pdom, parent, name); + } + + // TODO: performance? + public String[] getQualifiedName() throws DOMException { + List result = new ArrayList(); + try { + PDOMNode node = this; + while (node != null) { + if (node instanceof PDOMBinding) { + result.add(0, ((PDOMBinding)node).getName()); + } + node = node.getParentNode(); + } + return (String[]) result.toArray(new String[result.size()]); + } catch(CoreException ce) { + CCorePlugin.log(ce); + return null; + } + } + + // TODO: performance? + public char[][] getQualifiedNameCharArray() throws DOMException { + String[] preResult = getQualifiedName(); + char[][] result = new char[preResult.length][]; + for(int i=0; i