1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-09-10 03:53:21 +02:00

Patch for 149565, by Andrew Ferguson (creating API for PDom)

This commit is contained in:
Markus Schorn 2006-09-27 15:05:11 +00:00
parent 5239cb2ebd
commit 6e62fd8891
35 changed files with 398 additions and 451 deletions

View file

@ -18,7 +18,11 @@ import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.IPDOMNode; import org.eclipse.cdt.core.dom.IPDOMNode;
import org.eclipse.cdt.core.dom.IPDOMVisitor; import org.eclipse.cdt.core.dom.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.DOMException; 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.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.c.GCCLanguage;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.model.CoreModel; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; 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.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; import org.eclipse.core.runtime.CoreException;
/** /**
@ -88,7 +89,7 @@ public class AllTypesCache {
return; return;
case ICElement.C_STRUCT: case ICElement.C_STRUCT:
if (node instanceof PDOMCStructure) if (node instanceof PDOMCStructure)
types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); types.add(new PDOMTypeInfo((IBinding)node, kind, project));
return; return;
case ICElement.C_UNION: case ICElement.C_UNION:
return; return;
@ -109,25 +110,28 @@ public class AllTypesCache {
try { try {
switch (kind) { switch (kind) {
case ICElement.C_NAMESPACE: 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)); types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
return; return;
case ICElement.C_CLASS: case ICElement.C_CLASS:
if (node instanceof PDOMCPPClassType if (node instanceof ICPPClassType
&& ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_class) && ((ICPPClassType)node).getKey() == ICPPClassType.k_class)
types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
return; return;
case ICElement.C_STRUCT: case ICElement.C_STRUCT:
if (node instanceof PDOMCPPClassType if (node instanceof ICPPClassType
&& ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_struct) && ((ICPPClassType)node).getKey() == ICPPClassType.k_struct)
types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
return; return;
case ICElement.C_UNION: case ICElement.C_UNION:
if (node instanceof PDOMCPPClassType if (node instanceof ICPPClassType
&& ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_union) && ((ICPPClassType)node).getKey() == ICPPClassType.k_union)
types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project));
return; return;
case ICElement.C_ENUMERATION: case ICElement.C_ENUMERATION:
if (node instanceof IEnumeration
/*&& node instanceof ICPPBinding*/)
types.add(new PDOMTypeInfo((IEnumeration)node, kind, project));
return; return;
case ICElement.C_TYPEDEF: case ICElement.C_TYPEDEF:
return; return;

View file

@ -13,11 +13,15 @@
package org.eclipse.cdt.core.browser; package org.eclipse.cdt.core.browser;
import org.eclipse.cdt.core.CCorePlugin; 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.model.ICProject;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -27,11 +31,11 @@ import org.eclipse.core.runtime.CoreException;
*/ */
public class PDOMTypeInfo implements ITypeInfo { public class PDOMTypeInfo implements ITypeInfo {
private final PDOMBinding binding; private final IBinding binding;
private final int elementType; private final int elementType;
private final ICProject project; private final ICProject project;
public PDOMTypeInfo(PDOMBinding binding, int elementType, ICProject project) { public PDOMTypeInfo(IBinding binding, int elementType, ICProject project) {
this.binding = binding; this.binding = binding;
this.elementType = elementType; this.elementType = elementType;
this.project = project; this.project = project;
@ -95,21 +99,19 @@ public class PDOMTypeInfo implements ITypeInfo {
} }
public IQualifiedTypeName getQualifiedTypeName() { public IQualifiedTypeName getQualifiedTypeName() {
StringBuffer buf = new StringBuffer(binding.getName()); String qn;
try { if(binding instanceof ICPPBinding) {
PDOMNode parent = binding.getParentNode(); try {
while (parent != null) qn = CPPVisitor.renderQualifiedName(((ICPPBinding)binding).getQualifiedName());
{ } catch(DOMException de) {
if (parent instanceof PDOMBinding) CCorePlugin.log(de); // can't happen when (binding instanceof PDOMBinding)
{ return null;
buf.insert(0, ((PDOMBinding)parent).getName() + "::");
}
parent = parent.getParentNode();
} }
} catch (Exception e) { } else {
// TODO: handle exception qn = binding.getName();
} }
return new QualifiedTypeName(buf.toString());
return new QualifiedTypeName(qn);
} }
public ITypeReference[] getReferences() { public ITypeReference[] getReferences() {
@ -118,8 +120,10 @@ public class PDOMTypeInfo implements ITypeInfo {
public ITypeReference getResolvedReference() { public ITypeReference getResolvedReference() {
try { try {
PDOMName name = binding.getFirstDefinition(); IPDOM pdom = CCorePlugin.getPDOMManager().getPDOM(project);
return name != null ? new PDOMTypeReference(name, project) : null; 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) { } catch (CoreException e) {
CCorePlugin.log(e); CCorePlugin.log(e);
return null; return null;

View file

@ -11,12 +11,12 @@
package org.eclipse.cdt.core.browser; 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.CoreModel;
import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit; import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy; 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.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
@ -29,11 +29,11 @@ import org.eclipse.core.runtime.Path;
*/ */
public class PDOMTypeReference implements ITypeReference { public class PDOMTypeReference implements ITypeReference {
private final PDOMName name; private final IASTName name;
private final ICProject project; private final ICProject project;
private final IPath path; private final IPath path;
public PDOMTypeReference(PDOMName name, ICProject project) { public PDOMTypeReference(IASTName name, ICProject project) {
this.name = name; this.name = name;
this.project = project; this.project = project;
this.path = new Path(name.getFileLocation().getFileName()); this.path = new Path(name.getFileLocation().getFileName());

View file

@ -704,7 +704,7 @@ public class CPPVisitor {
ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) parent; ICPPASTFunctionDeclarator dtor = (ICPPASTFunctionDeclarator) parent;
if( dtor.getNestedDeclarator() == null ) { if( dtor.getNestedDeclarator() == null ) {
while( parent.getParent() instanceof IASTDeclarator ) while( parent.getParent() instanceof IASTDeclarator )
parent = (IASTDeclarator) parent.getParent(); parent = parent.getParent();
ASTNodeProperty prop = parent.getPropertyInParent(); ASTNodeProperty prop = parent.getPropertyInParent();
if( prop == IASTSimpleDeclaration.DECLARATOR ) if( prop == IASTSimpleDeclaration.DECLARATOR )
return dtor.getFunctionScope(); return dtor.getFunctionScope();
@ -765,7 +765,7 @@ public class CPPVisitor {
n = ns[ ns.length - 1 ]; n = ns[ ns.length - 1 ];
} }
return (ICPPScope) CPPVisitor.getContainingScope( n ); return CPPVisitor.getContainingScope( n );
} }
node = node.getParent(); node = node.getParent();
} }
@ -1987,6 +1987,20 @@ public class CPPVisitor {
return found; 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<qn.length; i++) {
result.append(qn[i] + (i+1<qn.length ? "::" : "")); //$NON-NLS-1$//$NON-NLS-2$
}
return result.toString();
}
public static String [] getQualifiedName( IBinding binding ){ public static String [] getQualifiedName( IBinding binding ){
IASTName [] ns = null; IASTName [] ns = null;
try { try {

View file

@ -57,7 +57,7 @@ public class PDOM extends PlatformObject
private Database db; private Database db;
public static final int VERSION = 11; public static final int VERSION = 12;
// 0 - the beginning of it all // 0 - the beginning of it all
// 1 - first change to kick off upgrades // 1 - first change to kick off upgrades
// 2 - added file inclusions // 2 - added file inclusions
@ -70,6 +70,7 @@ public class PDOM extends PlatformObject
// 9 - base classes // 9 - base classes
// 10 - typedefs, types on C++ variables // 10 - typedefs, types on C++ variables
// 11 - changed how members work // 11 - changed how members work
// 12 - one more change for members (is-a list -> has-a list)
public static final int LINKAGES = Database.DATA_AREA; public static final int LINKAGES = Database.DATA_AREA;
public static final int FILE_INDEX = Database.DATA_AREA + 4; public static final int FILE_INDEX = Database.DATA_AREA + 4;

View file

@ -9,31 +9,31 @@
* QNX - Initial API and implementation * 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.IPDOMVisitor;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.db.ListItem; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
/** /**
* Represents a linked list
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public abstract class PDOMMemberOwner extends PDOMBinding { public class PDOMNodeLinkedList {
PDOM pdom;
int offset;
PDOMLinkage linkage;
private static final int FIRST_MEMBER = PDOMBinding.RECORD_SIZE + 0; private static final int FIRST_MEMBER = 0;
protected static final int RECORD_SIZE = 4;
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4; public PDOMNodeLinkedList(PDOM pdom, int offset, PDOMLinkage linkage) {
this.pdom = pdom;
public PDOMMemberOwner(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { this.offset = offset;
super(pdom, parent, name); this.linkage = linkage;
}
public PDOMMemberOwner(PDOM pdom, int record) {
super(pdom, record);
} }
protected int getRecordSize() { protected int getRecordSize() {
@ -41,12 +41,10 @@ public abstract class PDOMMemberOwner extends PDOMBinding {
} }
public void accept(IPDOMVisitor visitor) throws CoreException { public void accept(IPDOMVisitor visitor) throws CoreException {
super.accept(visitor);
ListItem firstItem = getFirstMemberItem(); ListItem firstItem = getFirstMemberItem();
if (firstItem == null) if (firstItem == null)
return; return;
PDOMLinkage linkage = getLinkage();
ListItem item = firstItem; ListItem item = firstItem;
do { do {
PDOMNode node = linkage.getNode(item.getItem()); PDOMNode node = linkage.getNode(item.getItem());
@ -59,7 +57,7 @@ public abstract class PDOMMemberOwner extends PDOMBinding {
private ListItem getFirstMemberItem() throws CoreException { private ListItem getFirstMemberItem() throws CoreException {
Database db = pdom.getDB(); 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; return item != 0 ? new ListItem(db, item) : null;
} }
@ -71,7 +69,7 @@ public abstract class PDOMMemberOwner extends PDOMBinding {
firstMember.setItem(member.getRecord()); firstMember.setItem(member.getRecord());
firstMember.setNext(firstMember); firstMember.setNext(firstMember);
firstMember.setPrev(firstMember); firstMember.setPrev(firstMember);
db.putInt(record + FIRST_MEMBER, firstMember.getRecord()); db.putInt(offset + FIRST_MEMBER, firstMember.getRecord());
} else { } else {
ListItem newMember = new ListItem(db); ListItem newMember = new ListItem(db);
newMember.setItem(member.getRecord()); newMember.setItem(member.getRecord());
@ -82,5 +80,4 @@ public abstract class PDOMMemberOwner extends PDOMBinding {
newMember.setNext(firstMember); newMember.setNext(firstMember);
} }
} }
} }

View file

@ -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;
}

View file

@ -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<preResult.length; i++) {
result[i] = preResult[i].toCharArray();
}
return result;
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
}

View file

@ -50,8 +50,8 @@ public abstract class PDOMNode implements IPDOMNode{
// parent // parent
db.putInt(record + PARENT, parent != null ? parent.getRecord() : 0); db.putInt(record + PARENT, parent != null ? parent.getRecord() : 0);
if (parent instanceof PDOMMemberOwner) if (parent instanceof IPDOMMemberOwner)
((PDOMMemberOwner)parent).addMember(this); ((IPDOMMemberOwner)parent).addMember(this);
} }
protected abstract int getRecordSize(); protected abstract int getRecordSize();

View file

@ -27,7 +27,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCEnumeration extends PDOMBinding implements IEnumeration { class PDOMCEnumeration extends PDOMBinding implements IEnumeration {
private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0; private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0;

View file

@ -25,7 +25,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCEnumerator extends PDOMBinding implements IEnumerator { class PDOMCEnumerator extends PDOMBinding implements IEnumerator {
private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0; private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0;
private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4; private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4;

View file

@ -16,8 +16,9 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IField; import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -25,10 +26,10 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCField extends PDOMBinding implements IField { class PDOMCField extends PDOMBinding implements IField {
public PDOMCField(PDOM pdom, PDOMMemberOwner parent, IASTName name) throws CoreException { public PDOMCField(PDOM pdom, IPDOMMemberOwner parent, IASTName name) throws CoreException {
super(pdom, parent, name); super(pdom, (PDOMNode) parent, name);
} }
public PDOMCField(PDOM pdom, int record) { public PDOMCField(PDOM pdom, int record) {

View file

@ -27,7 +27,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCFunction extends PDOMBinding implements IFunction { class PDOMCFunction extends PDOMBinding implements IFunction {
public PDOMCFunction(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { public PDOMCFunction(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException {
super(pdom, parent, name); super(pdom, parent, name);

View file

@ -36,10 +36,10 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier;
import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage;
import org.eclipse.cdt.core.model.ILanguage; import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; 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.PDOMNode;
@ -49,7 +49,7 @@ import org.eclipse.core.runtime.Status;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCLinkage extends PDOMLinkage { class PDOMCLinkage extends PDOMLinkage {
public PDOMCLinkage(PDOM pdom, int record) { public PDOMCLinkage(PDOM pdom, int record) {
super(pdom, record); super(pdom, record);
@ -124,8 +124,8 @@ public class PDOMCLinkage extends PDOMLinkage {
if (binding instanceof IParameter) if (binding instanceof IParameter)
return null; // skip parameters return null; // skip parameters
else if (binding instanceof IField) { // must be before IVariable else if (binding instanceof IField) { // must be before IVariable
if (parent instanceof PDOMMemberOwner) if (parent instanceof IPDOMMemberOwner)
pdomBinding = new PDOMCField(pdom, (PDOMMemberOwner)parent, name); pdomBinding = new PDOMCField(pdom, (IPDOMMemberOwner)parent, name);
} else if (binding instanceof IVariable) } else if (binding instanceof IVariable)
pdomBinding = new PDOMCVariable(pdom, parent, name); pdomBinding = new PDOMCVariable(pdom, parent, name);
else if (binding instanceof IFunction) else if (binding instanceof IFunction)
@ -240,9 +240,9 @@ public class PDOMCLinkage extends PDOMLinkage {
FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding)); FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding));
getIndex().accept(visitor); getIndex().accept(visitor);
return visitor.pdomBinding; return visitor.pdomBinding;
} else if (parent instanceof PDOMMemberOwner) { } else if (parent instanceof IPDOMMemberOwner) {
FindBinding2 visitor = new FindBinding2(binding.getNameCharArray(), getBindingType(binding)); FindBinding2 visitor = new FindBinding2(binding.getNameCharArray(), getBindingType(binding));
PDOMMemberOwner owner = (PDOMMemberOwner)parent; IPDOMMemberOwner owner = (IPDOMMemberOwner)parent;
try { try {
owner.accept(visitor); owner.accept(visitor);
} catch (CoreException e) { } catch (CoreException e) {

View file

@ -24,7 +24,9 @@ import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IScope;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner; 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.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -34,16 +36,28 @@ import org.eclipse.core.runtime.Status;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType { public class PDOMCStructure extends PDOMBinding implements ICompositeType, IPDOMMemberOwner {
private static final int MEMBERLIST = PDOMBinding.RECORD_SIZE;
protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4;
public PDOMCStructure(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { public PDOMCStructure(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException {
super(pdom, parent, name); super(pdom, parent, name);
// linked list is initialized by malloc zeroing allocated storage
} }
public PDOMCStructure(PDOM pdom, int record) { public PDOMCStructure(PDOM pdom, int record) {
super(pdom, record); super(pdom, record);
} }
public void accept(IPDOMVisitor visitor) throws CoreException {
super.accept(visitor);
new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkage()).accept(visitor);
}
public void addMember(PDOMNode member) throws CoreException {
new PDOMNodeLinkedList(pdom, record+MEMBERLIST, getLinkage()).addMember(member);
}
public int getNodeType() { public int getNodeType() {
return PDOMCLinkage.CSTRUCTURE; return PDOMCLinkage.CSTRUCTURE;
} }
@ -129,4 +143,7 @@ public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType {
return false; return false;
} }
protected int getRecordSize() {
return RECORD_SIZE;
}
} }

View file

@ -24,7 +24,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCTypedef extends PDOMBinding implements ITypedef { class PDOMCTypedef extends PDOMBinding implements ITypedef {
private static final int TYPE = PDOMBinding.RECORD_SIZE + 0; private static final int TYPE = PDOMBinding.RECORD_SIZE + 0;

View file

@ -25,7 +25,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCVariable extends PDOMBinding implements IVariable { class PDOMCVariable extends PDOMBinding implements IVariable {
public PDOMCVariable(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { public PDOMCVariable(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException {
super(pdom, parent, name); super(pdom, parent, name);

View file

@ -21,7 +21,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCPPBase implements ICPPBase { class PDOMCPPBase implements ICPPBase {
private static final int BASECLASS = 0; private static final int BASECLASS = 0;
private static final int NEXTBASE = 4; private static final int NEXTBASE = 4;

View file

@ -25,7 +25,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType { class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType {
public static final int TYPE_ID = PDOMNode.RECORD_SIZE + 0; // short public static final int TYPE_ID = PDOMNode.RECORD_SIZE + 0; // short
public static final int FLAGS = PDOMNode.RECORD_SIZE + 2; // short public static final int FLAGS = PDOMNode.RECORD_SIZE + 2; // short

View file

@ -34,9 +34,11 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -45,13 +47,14 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType, class PDOMCPPClassType extends PDOMCPPBinding implements ICPPClassType,
ICPPClassScope { ICPPClassScope, IPDOMMemberOwner {
private static final int FIRSTBASE = PDOMMemberOwner.RECORD_SIZE + 0; private static final int FIRSTBASE = PDOMCPPBinding.RECORD_SIZE + 0;
private static final int KEY = PDOMMemberOwner.RECORD_SIZE + 4; // byte private static final int KEY = PDOMCPPBinding.RECORD_SIZE + 4; // byte
private static final int MEMBERLIST = PDOMCPPBinding.RECORD_SIZE + 8;
protected static final int RECORD_SIZE = PDOMMemberOwner.RECORD_SIZE + 5; protected static final int RECORD_SIZE = PDOMCPPBinding.RECORD_SIZE + 12;
public PDOMCPPClassType(PDOM pdom, PDOMNode parent, IASTName name) public PDOMCPPClassType(PDOM pdom, PDOMNode parent, IASTName name)
throws CoreException { throws CoreException {
@ -62,6 +65,12 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
if (binding instanceof ICPPClassType) // not sure why it wouldn't if (binding instanceof ICPPClassType) // not sure why it wouldn't
key = ((ICPPClassType) binding).getKey(); key = ((ICPPClassType) binding).getKey();
pdom.getDB().putByte(record + KEY, (byte) key); pdom.getDB().putByte(record + KEY, (byte) key);
// linked list is initialized by storage being zero'd by malloc
}
public void addMember(PDOMNode member) throws CoreException {
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkage());
list.addMember(member);
} }
public PDOMCPPClassType(PDOM pdom, int bindingRecord) { public PDOMCPPClassType(PDOM pdom, int bindingRecord) {
@ -122,6 +131,12 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
} }
} }
public void accept(IPDOMVisitor visitor) throws CoreException {
super.accept(visitor);
PDOMNodeLinkedList list = new PDOMNodeLinkedList(pdom, record + MEMBERLIST, getLinkage());
list.accept(visitor);
}
public ICPPConstructor[] getConstructors() throws DOMException { public ICPPConstructor[] getConstructors() throws DOMException {
// TODO // TODO
return new ICPPConstructor[0]; return new ICPPConstructor[0];
@ -262,14 +277,6 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType,
} }
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException { public boolean isGloballyQualified() throws DOMException {
try { try {
return getParentNode() instanceof PDOMLinkage; return getParentNode() instanceof PDOMLinkage;

View file

@ -18,8 +18,10 @@ import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -27,7 +29,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCPPEnumeration extends PDOMBinding implements IEnumeration { class PDOMCPPEnumeration extends PDOMCPPBinding implements IEnumeration, ICPPBinding {
private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0; private static final int FIRST_ENUMERATOR = PDOMBinding.RECORD_SIZE + 0;

View file

@ -16,8 +16,10 @@ import org.eclipse.cdt.core.dom.ast.DOMException;
import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -25,7 +27,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPEnumerator extends PDOMBinding implements IEnumerator { class PDOMCPPEnumerator extends PDOMCPPBinding implements IEnumerator, ICPPBinding {
private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0; private static final int ENUMERATION = PDOMBinding.RECORD_SIZE + 0;
private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4; private static final int NEXT_ENUMERATOR = PDOMBinding.RECORD_SIZE + 4;

View file

@ -19,7 +19,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPField; import org.eclipse.cdt.core.dom.ast.cpp.ICPPField;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -27,7 +27,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPField extends PDOMBinding implements ICPPField { class PDOMCPPField extends PDOMCPPBinding implements ICPPField {
public PDOMCPPField(PDOM pdom, PDOMCPPClassType parent, IASTName name) public PDOMCPPField(PDOM pdom, PDOMCPPClassType parent, IASTName name)
throws CoreException { throws CoreException {
@ -59,14 +59,6 @@ public class PDOMCPPField extends PDOMBinding implements ICPPField {
return CPPVisitor.getQualifiedName( this ); return CPPVisitor.getQualifiedName( this );
} }
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
public int getVisibility() throws DOMException { public int getVisibility() throws DOMException {
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }

View file

@ -28,6 +28,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -36,7 +37,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction, ICPPFunctionType { class PDOMCPPFunction extends PDOMCPPBinding implements ICPPFunction, ICPPFunctionType {
public static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0; public static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0;
public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4; public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4;
@ -139,18 +140,6 @@ public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction, ICPPFu
return false; return false;
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
public IType[] getParameterTypes() throws DOMException { public IType[] getParameterTypes() throws DOMException {
try { try {
int n = pdom.getDB().getInt(record + NUM_PARAMS); int n = pdom.getDB().getInt(record + NUM_PARAMS);

View file

@ -45,10 +45,10 @@ import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile; import org.eclipse.cdt.internal.core.pdom.dom.PDOMFile;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; 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.PDOMNode;
@ -59,7 +59,7 @@ import org.eclipse.core.runtime.Status;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPLinkage extends PDOMLinkage { class PDOMCPPLinkage extends PDOMLinkage {
public PDOMCPPLinkage(PDOM pdom, int record) { public PDOMCPPLinkage(PDOM pdom, int record) {
super(pdom, record); super(pdom, record);
@ -139,12 +139,12 @@ public class PDOMCPPLinkage extends PDOMLinkage {
if (!(binding.getScope() instanceof CPPBlockScope)) if (!(binding.getScope() instanceof CPPBlockScope))
pdomBinding = new PDOMCPPVariable(pdom, parent, name); pdomBinding = new PDOMCPPVariable(pdom, parent, name);
} else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) { } else if (binding instanceof ICPPMethod && parent instanceof PDOMCPPClassType) {
pdomBinding = new PDOMCPPMethod(pdom, (PDOMCPPClassType)parent, name); pdomBinding = new PDOMCPPMethod(pdom, parent, name);
} else if (binding instanceof CPPImplicitMethod && parent instanceof PDOMCPPClassType) { } else if (binding instanceof CPPImplicitMethod && parent instanceof PDOMCPPClassType) {
if(!name.isReference()) { if(!name.isReference()) {
//because we got the implicit method off of an IASTName that is not a reference, //because we got the implicit method off of an IASTName that is not a reference,
//it is no longer completly implicit and it should be treated as a normal method. //it is no longer completly implicit and it should be treated as a normal method.
pdomBinding = new PDOMCPPMethod(pdom, (PDOMCPPClassType)parent, name); pdomBinding = new PDOMCPPMethod(pdom, parent, name);
} }
} else if (binding instanceof ICPPFunction) { } else if (binding instanceof ICPPFunction) {
pdomBinding = new PDOMCPPFunction(pdom, parent, name); pdomBinding = new PDOMCPPFunction(pdom, parent, name);
@ -298,9 +298,9 @@ public class PDOMCPPLinkage extends PDOMLinkage {
FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding)); FindBinding visitor = new FindBinding(pdom, binding.getNameCharArray(), getBindingType(binding));
getIndex().accept(visitor); getIndex().accept(visitor);
return visitor.pdomBinding; return visitor.pdomBinding;
} else if (parent instanceof PDOMMemberOwner) { } else if (parent instanceof IPDOMMemberOwner) {
FindBinding2 visitor = new FindBinding2(binding.getNameCharArray(), getBindingType(binding)); FindBinding2 visitor = new FindBinding2(binding.getNameCharArray(), getBindingType(binding));
PDOMMemberOwner owner = (PDOMMemberOwner)parent; IPDOMMemberOwner owner = (IPDOMMemberOwner)parent;
try { try {
owner.accept(visitor); owner.accept(visitor);
} catch (CoreException e) { } catch (CoreException e) {

View file

@ -29,7 +29,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner; import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -37,14 +38,14 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPMethod extends PDOMBinding implements ICPPMethod, ICPPFunctionType { class PDOMCPPMethod extends PDOMCPPBinding implements ICPPMethod, ICPPFunctionType {
public static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0; public static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0;
public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4; public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4;
public static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8; public static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8;
public PDOMCPPMethod(PDOM pdom, PDOMMemberOwner parent, IASTName name) throws CoreException { public PDOMCPPMethod(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException {
super(pdom, parent, name); super(pdom, parent, name);
IASTNode parentNode = name.getParent(); IASTNode parentNode = name.getParent();
if (parentNode instanceof ICPPASTFunctionDeclarator) { if (parentNode instanceof ICPPASTFunctionDeclarator) {
@ -147,18 +148,6 @@ public class PDOMCPPMethod extends PDOMBinding implements ICPPMethod, ICPPFuncti
return false; return false;
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
public int getVisibility() throws DOMException { public int getVisibility() throws DOMException {
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }

View file

@ -29,6 +29,7 @@ import org.eclipse.cdt.internal.core.pdom.db.BTree;
import org.eclipse.cdt.internal.core.pdom.db.IBTreeVisitor; 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.FindBindingsInBTree;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNamedNode; 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.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
@ -38,7 +39,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPNamespace extends PDOMBinding class PDOMCPPNamespace extends PDOMCPPBinding
implements ICPPNamespace, ICPPNamespaceScope { implements ICPPNamespace, ICPPNamespaceScope {
private static final int INDEX_OFFSET = PDOMBinding.RECORD_SIZE + 0; private static final int INDEX_OFFSET = PDOMBinding.RECORD_SIZE + 0;
@ -70,7 +71,7 @@ public class PDOMCPPNamespace extends PDOMBinding
getIndex().accept(new IBTreeVisitor() { getIndex().accept(new IBTreeVisitor() {
public int compare(int record) throws CoreException { public int compare(int record) throws CoreException {
return 1; return 1;
}; }
public boolean visit(int record) throws CoreException { public boolean visit(int record) throws CoreException {
PDOMBinding binding = pdom.getBinding(record); PDOMBinding binding = pdom.getBinding(record);
if (binding != null) { if (binding != null) {
@ -79,7 +80,7 @@ public class PDOMCPPNamespace extends PDOMBinding
visitor.leave(binding); visitor.leave(binding);
} }
return true; return true;
}; }
}); });
} }
@ -87,18 +88,6 @@ public class PDOMCPPNamespace extends PDOMBinding
getIndex().insert(child.getRecord(), child.getIndexComparator()); getIndex().insert(child.getRecord(), child.getIndexComparator());
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
public IBinding[] getMemberBindings() throws DOMException { public IBinding[] getMemberBindings() throws DOMException {
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }

View file

@ -17,7 +17,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceAlias;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespaceScope;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -26,7 +26,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPNamespaceAlias extends PDOMBinding implements class PDOMCPPNamespaceAlias extends PDOMCPPBinding implements
ICPPNamespaceAlias { ICPPNamespaceAlias {
public PDOMCPPNamespaceAlias(PDOM pdom, PDOMNode parent, public PDOMCPPNamespaceAlias(PDOM pdom, PDOMNode parent,
@ -54,18 +54,6 @@ public class PDOMCPPNamespaceAlias extends PDOMBinding implements
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
public int getDelegateType() { public int getDelegateType() {
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }

View file

@ -30,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
* *
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter { class PDOMCPPParameter extends PDOMNamedNode implements ICPPParameter {
private static final int NEXT_PARAM = PDOMNamedNode.RECORD_SIZE + 0; private static final int NEXT_PARAM = PDOMNamedNode.RECORD_SIZE + 0;
private static final int TYPE = PDOMNamedNode.RECORD_SIZE + 4; private static final int TYPE = PDOMNamedNode.RECORD_SIZE + 4;

View file

@ -24,7 +24,7 @@ import org.eclipse.core.runtime.CoreException;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
*/ */
public class PDOMCPPTypedef extends PDOMBinding implements ITypedef { class PDOMCPPTypedef extends PDOMBinding implements ITypedef {
private static final int TYPE = PDOMBinding.RECORD_SIZE + 0; private static final int TYPE = PDOMBinding.RECORD_SIZE + 0;

View file

@ -21,6 +21,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
import org.eclipse.cdt.internal.core.pdom.PDOM; 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.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMCPPBinding;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -29,7 +30,7 @@ import org.eclipse.core.runtime.CoreException;
* @author Doug Schaefer * @author Doug Schaefer
* *
*/ */
public class PDOMCPPVariable extends PDOMBinding implements ICPPVariable { class PDOMCPPVariable extends PDOMCPPBinding implements ICPPVariable {
private static final int TYPE_OFFSET = PDOMBinding.RECORD_SIZE + 0; private static final int TYPE_OFFSET = PDOMBinding.RECORD_SIZE + 0;
@ -90,17 +91,4 @@ public class PDOMCPPVariable extends PDOMBinding implements ICPPVariable {
public boolean isStatic() throws DOMException { public boolean isStatic() throws DOMException {
throw new PDOMNotImplementedError(); throw new PDOMNotImplementedError();
} }
public String[] getQualifiedName() throws DOMException {
throw new PDOMNotImplementedError();
}
public char[][] getQualifiedNameCharArray() throws DOMException {
throw new PDOMNotImplementedError();
}
public boolean isGloballyQualified() throws DOMException {
throw new PDOMNotImplementedError();
}
} }

View file

@ -17,38 +17,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.PathUtil;
import org.eclipse.cdt.core.browser.QualifiedTypeName;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
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.PDOMMemberOwner;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.ui.CHelpProviderManager;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.actions.WorkbenchRunnableAdapter;
import org.eclipse.cdt.internal.ui.codemanipulation.AddIncludesOperation;
import org.eclipse.cdt.internal.ui.text.CWordFinder;
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IFunctionSummary;
import org.eclipse.cdt.ui.IRequiredInclude;
import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider;
import org.eclipse.cdt.ui.text.ICHelpInvocationContext;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
@ -72,6 +40,41 @@ import org.eclipse.ui.dialogs.ElementListSelectionDialog;
import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.ITextEditor;
import org.eclipse.ui.texteditor.IUpdate; import org.eclipse.ui.texteditor.IUpdate;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.PathUtil;
import org.eclipse.cdt.core.browser.QualifiedTypeName;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.ui.IFunctionSummary;
import org.eclipse.cdt.ui.IRequiredInclude;
import org.eclipse.cdt.ui.browser.typeinfo.TypeInfoLabelProvider;
import org.eclipse.cdt.ui.text.ICHelpInvocationContext;
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.PDOMName;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode;
import org.eclipse.cdt.internal.ui.CHelpProviderManager;
import org.eclipse.cdt.internal.ui.ICHelpContextIds;
import org.eclipse.cdt.internal.ui.actions.WorkbenchRunnableAdapter;
import org.eclipse.cdt.internal.ui.codemanipulation.AddIncludesOperation;
import org.eclipse.cdt.internal.ui.text.CWordFinder;
import org.eclipse.cdt.internal.ui.util.ExceptionHandler;
// TODO this is a big TODO. // TODO this is a big TODO.
public class AddIncludeOnSelectionAction extends Action implements IUpdate { public class AddIncludeOnSelectionAction extends Action implements IUpdate {
@ -286,7 +289,7 @@ public class AddIncludeOnSelectionAction extends Action implements IUpdate {
{ {
PDOMBinding pdomBinding = (PDOMBinding) pdomBindings.get(i); PDOMBinding pdomBinding = (PDOMBinding) pdomBindings.get(i);
if (pdomBinding instanceof PDOMMemberOwner //class or struct if (pdomBinding instanceof IPDOMMemberOwner //class or struct
|| pdomBinding instanceof IEnumeration) || pdomBinding instanceof IEnumeration)
{ {
PDOMName currentDef = pdomBinding.getFirstDefinition(); PDOMName currentDef = pdomBinding.getFirstDefinition();

View file

@ -8,6 +8,7 @@
* Contributors: * Contributors:
* QNX - Initial API and implementation * QNX - Initial API and implementation
* IBM Corporation * IBM Corporation
* Markus Schorn (Wind River Systems)
*******************************************************************************/ *******************************************************************************/
package org.eclipse.cdt.internal.ui.search; package org.eclipse.cdt.internal.ui.search;
@ -17,27 +18,33 @@ import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException; import java.util.regex.PatternSyntaxException;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOM;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.ICompositeType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCLinkage;
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.PDOMCPPLinkage;
import org.eclipse.cdt.internal.ui.util.Messages;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Status; import org.eclipse.core.runtime.Status;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.dom.IPDOM;
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.IEnumerator;
import org.eclipse.cdt.core.dom.ast.IField;
import org.eclipse.cdt.core.dom.ast.IFunction;
import org.eclipse.cdt.core.dom.ast.ITypedef;
import org.eclipse.cdt.core.dom.ast.IVariable;
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.dom.ast.cpp.ICPPNamespaceAlias;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding;
import org.eclipse.cdt.internal.ui.util.Messages;
/** /**
* @author Doug Schaefer * @author Doug Schaefer
* *
@ -144,153 +151,49 @@ public class PDOMSearchPatternQuery extends PDOMSearchQuery {
//TODO search for macro //TODO search for macro
if ((flags & FIND_ALL_TYPES) == FIND_ALL_TYPES) boolean matches= false;
{ if ((flags & FIND_ALL_TYPES) == FIND_ALL_TYPES) {
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding); matches= true;
} }
else else if (pdomBinding instanceof ICompositeType) {
{ ICompositeType ct= (ICompositeType) pdomBinding;
//C++ switch (ct.getKey()) {
if (pdomBinding.getLinkage() instanceof PDOMCPPLinkage) case ICompositeType.k_struct:
{ case ICPPClassType.k_class:
switch (pdomBinding.getNodeType()) { matches= (flags & FIND_CLASS_STRUCT) != 0;
case PDOMCPPLinkage.CPPCLASSTYPE: break;
{ case ICompositeType.k_union:
switch (((PDOMCPPClassType)pdomBinding).getKey()) matches= (flags & FIND_UNION) != 0;
{ break;
case ICPPClassType.k_class:
case ICompositeType.k_struct:
if (((flags & FIND_CLASS_STRUCT) == FIND_CLASS_STRUCT))
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case ICompositeType.k_union:
if ((flags & FIND_UNION) == FIND_UNION)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
default:
break;
}
break;
}
case PDOMCPPLinkage.CPPENUMERATION:
if ((flags & FIND_ENUM) == FIND_ENUM)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPENUMERATOR:
if ((flags & FIND_ENUMERATOR) == FIND_ENUMERATOR)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPFIELD:
if ((flags & FIND_FIELD) == FIND_FIELD)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPFUNCTION:
if ((flags & FIND_FUNCTION) == FIND_FUNCTION)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPMETHOD:
if ((flags & FIND_METHOD) == FIND_METHOD)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPNAMESPACE:
case PDOMCPPLinkage.CPPNAMESPACEALIAS:
if ((flags & FIND_NAMESPACE) == FIND_NAMESPACE)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPTYPEDEF:
if ((flags & FIND_TYPEDEF) == FIND_TYPEDEF)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCPPLinkage.CPPVARIABLE:
if ((flags & FIND_VARIABLE) == FIND_VARIABLE)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
default:
break;
}
}
//C
else if (pdomBinding.getLinkage() instanceof PDOMCLinkage)
{
switch (pdomBinding.getNodeType()) {
case PDOMCLinkage.CSTRUCTURE:
switch (((PDOMCStructure)pdomBinding).getKey())
{
case ICompositeType.k_struct:
if (((flags & FIND_CLASS_STRUCT) == FIND_CLASS_STRUCT))
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case ICompositeType.k_union:
if ((flags & FIND_UNION) == FIND_UNION)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
}
break;
case PDOMCLinkage.CENUMERATION:
if ((flags & FIND_ENUM) == FIND_ENUM)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCLinkage.CENUMERATOR:
if ((flags & FIND_ENUMERATOR) == FIND_ENUMERATOR)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCLinkage.CFIELD:
if ((flags & FIND_FIELD) == FIND_FIELD)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCLinkage.CFUNCTION:
if ((flags & FIND_FUNCTION) == FIND_FUNCTION)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCLinkage.CTYPEDEF:
if ((flags & FIND_TYPEDEF) == FIND_TYPEDEF)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
case PDOMCLinkage.CVARIABLE:
if ((flags & FIND_VARIABLE) == FIND_VARIABLE)
{
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
break;
default:
break;
}
} }
} }
else if (pdomBinding instanceof IEnumeration) {
matches= (flags & FIND_ENUM) != 0;
}
else if (pdomBinding instanceof IEnumerator) {
matches= (flags & FIND_ENUMERATOR) != 0;
}
else if (pdomBinding instanceof IField) {
matches= (flags & FIND_FIELD) != 0;
}
else if (pdomBinding instanceof ICPPMethod) {
matches= (flags & FIND_METHOD) != 0;
}
else if (pdomBinding instanceof IVariable) {
matches= (flags & FIND_VARIABLE) != 0;
}
else if (pdomBinding instanceof IFunction) {
matches= (flags & FIND_FUNCTION) != 0;
}
else if (pdomBinding instanceof ICPPNamespace || pdomBinding instanceof ICPPNamespaceAlias) {
matches= (flags & FIND_NAMESPACE) != 0;
}
else if (pdomBinding instanceof ITypedef) {
matches= (flags & FIND_TYPEDEF) != 0;
}
if (matches) {
createMatches(pdomBinding.getLinkage().getLanguage(), pdomBinding);
}
} }
} finally { } finally {
pdom.releaseReadLock(); pdom.releaseReadLock();

View file

@ -15,31 +15,6 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.AllTypesCache;
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.ITypeInfo;
import org.eclipse.cdt.core.browser.ITypeReference;
import org.eclipse.cdt.core.browser.TypeSearchScope;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
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.PDOMNode;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkage;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider;
import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResource;
@ -48,7 +23,6 @@ import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.jface.operation.IRunnableContext;
import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.IStructuredSelection;
@ -57,6 +31,38 @@ import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbenchPart; import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.views.contentoutline.ContentOutline; import org.eclipse.ui.views.contentoutline.ContentOutline;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.browser.AllTypesCache;
import org.eclipse.cdt.core.browser.IQualifiedTypeName;
import org.eclipse.cdt.core.browser.ITypeInfo;
import org.eclipse.cdt.core.browser.ITypeReference;
import org.eclipse.cdt.core.browser.TypeSearchScope;
import org.eclipse.cdt.core.dom.IPDOMManager;
import org.eclipse.cdt.core.dom.ast.IBinding;
import org.eclipse.cdt.core.dom.ast.IEnumeration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPBinding;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITypeDef;
import org.eclipse.cdt.core.parser.IScannerInfo;
import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor;
import org.eclipse.cdt.internal.core.pdom.PDOM;
import org.eclipse.cdt.internal.ui.editor.CEditor;
import org.eclipse.cdt.internal.ui.viewsupport.IViewPartInputProvider;
import org.eclipse.cdt.internal.ui.wizards.filewizard.NewSourceFileGenerator;
import org.eclipse.core.runtime.NullProgressMonitor;
public class NewClassWizardUtil { public class NewClassWizardUtil {
/** /**
@ -366,7 +372,7 @@ public class NewClassWizardUtil {
* Search for the given qualified name of the give * Search for the given qualified name of the give
* @param typeName qualified name of the type to search * @param typeName qualified name of the type to search
* @param project * @param project
* @param pdomNodeType PDOMCPPLinkage type * @param queryType Class of interface type to search for (e.g. ICPPClassType.class)
* @return one of {@link #SEARCH_MATCH_ERROR}, * @return one of {@link #SEARCH_MATCH_ERROR},
* {@link #SEARCH_MATCH_FOUND_ANOTHER_NAMESPACE}, * {@link #SEARCH_MATCH_FOUND_ANOTHER_NAMESPACE},
* {@link #SEARCH_MATCH_FOUND_ANOTHER_TYPE}, * {@link #SEARCH_MATCH_FOUND_ANOTHER_TYPE},
@ -374,7 +380,7 @@ public class NewClassWizardUtil {
* {@link #SEARCH_MATCH_FOUND_EXACT} or * {@link #SEARCH_MATCH_FOUND_EXACT} or
* {@link #SEARCH_MATCH_NOTFOUND}. * {@link #SEARCH_MATCH_NOTFOUND}.
*/ */
public static int searchForCppType(IQualifiedTypeName typeName, ICProject project, int pdomNodeType) { public static int searchForCppType(IQualifiedTypeName typeName, ICProject project, Class queryType) {
if(project == null) { if(project == null) {
return SEARCH_MATCH_ERROR; return SEARCH_MATCH_ERROR;
} }
@ -388,35 +394,29 @@ public class NewClassWizardUtil {
boolean sameTypeNameExists = false; boolean sameTypeNameExists = false;
boolean sameNameDifferentTypeExists = false; boolean sameNameDifferentTypeExists = false;
for (int i = 0; i < bindings.length; ++i) for (int i = 0; i < bindings.length; ++i) {
{ ICPPBinding binding = (ICPPBinding)bindings[i];
PDOMBinding binding = (PDOMBinding)bindings[i];
PDOMBinding pdomBinding = pdom.getLinkage(GPPLanguage.getDefault()).adaptBinding(binding);
//get the fully qualified name of this binding //get the fully qualified name of this binding
String bindingFullName = getBindingQualifiedName(pdomBinding); String bindingFullName = CPPVisitor.renderQualifiedName(binding.getQualifiedName());
int currentNodeType = pdomBinding.getNodeType(); Class currentNodeType = binding.getClass();
// full binding // full binding
if (currentNodeType == pdomNodeType) if (queryType.isAssignableFrom(currentNodeType)) {
{ if (bindingFullName.equals(fullyQualifiedTypeName)) {
if (bindingFullName.equals(fullyQualifiedTypeName))
{
return SEARCH_MATCH_FOUND_EXACT; return SEARCH_MATCH_FOUND_EXACT;
} else { } else {
// same type , same name , but different name space // same type , same name , but different name space
// see if there is an exact match; // see if there is an exact match;
sameTypeNameExists = true; sameTypeNameExists = true;
} }
} } else if(ICPPClassType.class.isAssignableFrom(currentNodeType) ||
else if(currentNodeType == PDOMCPPLinkage.CPPCLASSTYPE || IEnumeration.class.isAssignableFrom(currentNodeType) || // TODO - this should maybe be ICPPEnumeration
currentNodeType == PDOMCPPLinkage.CPPENUMERATION || ICPPNamespace.class.isAssignableFrom(currentNodeType) ||
currentNodeType == PDOMCPPLinkage.CPPNAMESPACE || ITypeDef.class.isAssignableFrom(currentNodeType) ||
currentNodeType == PDOMCPPLinkage.CPPTYPEDEF || ICPPBasicType.class.isAssignableFrom(currentNodeType))
currentNodeType == PDOMCPPLinkage.CPPBASICTYPE)
{ {
if (bindingFullName.equals(fullyQualifiedTypeName)) if (bindingFullName.equals(fullyQualifiedTypeName)) {
{
return SEARCH_MATCH_FOUND_EXACT_ANOTHER_TYPE; return SEARCH_MATCH_FOUND_EXACT_ANOTHER_TYPE;
} else { } else {
// different type , same name , but different name space // different type , same name , but different name space
@ -436,25 +436,4 @@ public class NewClassWizardUtil {
} }
return SEARCH_MATCH_NOTFOUND; return SEARCH_MATCH_NOTFOUND;
} }
/**
* Get the fully qualified name for a given PDOMBinding
* @param pdomBinding
* @return binding's fully qualified name
* @throws CoreException
*/
public static String getBindingQualifiedName(PDOMBinding pdomBinding) throws CoreException
{
StringBuffer buf = new StringBuffer(pdomBinding.getName());
PDOMNode parent = pdomBinding.getParentNode();
while (parent != null)
{
if (parent instanceof PDOMBinding)
{
buf.insert(0, ((PDOMBinding)parent).getName() + "::"); //$NON-NLS-1$
}
parent = parent.getParentNode();
}
return buf.toString();
}
} }

View file

@ -54,6 +54,8 @@ import org.eclipse.cdt.core.browser.PathUtil;
import org.eclipse.cdt.core.browser.QualifiedTypeName; import org.eclipse.cdt.core.browser.QualifiedTypeName;
import org.eclipse.cdt.core.browser.TypeSearchScope; import org.eclipse.cdt.core.browser.TypeSearchScope;
import org.eclipse.cdt.core.browser.TypeUtil; import org.eclipse.cdt.core.browser.TypeUtil;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace;
import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICContainer; import org.eclipse.cdt.core.model.ICContainer;
@ -65,8 +67,6 @@ import org.eclipse.cdt.core.parser.IScannerInfoProvider;
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
import org.eclipse.cdt.ui.CUIPlugin; import org.eclipse.cdt.ui.CUIPlugin;
import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPLinkage;
import org.eclipse.cdt.internal.ui.dialogs.StatusInfo; import org.eclipse.cdt.internal.ui.dialogs.StatusInfo;
import org.eclipse.cdt.internal.ui.dialogs.StatusUtil; import org.eclipse.cdt.internal.ui.dialogs.StatusUtil;
import org.eclipse.cdt.internal.ui.util.SWTUtil; import org.eclipse.cdt.internal.ui.util.SWTUtil;
@ -1488,13 +1488,13 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
/* search for parent name space first */ /* search for parent name space first */
int searchResult; int searchResult;
if (typeName.isQualified()) { if (typeName.isQualified()) {
searchResult = NewClassWizardUtil.searchForCppType(typeName.getEnclosingTypeName(),project, PDOMCPPLinkage.CPPNAMESPACE); searchResult = NewClassWizardUtil.searchForCppType(typeName.getEnclosingTypeName(),project, ICPPNamespace.class);
if (searchResult != NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT) { if (searchResult != NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT) {
status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingNamespaceNotExists")); //$NON-NLS-1$ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.EnclosingNamespaceNotExists")); //$NON-NLS-1$
return status; return status;
} }
} }
searchResult = NewClassWizardUtil.searchForCppType(typeName, project, PDOMCPPLinkage.CPPNAMESPACE); searchResult = NewClassWizardUtil.searchForCppType(typeName, project, ICPPNamespace.class);
switch(searchResult) { switch(searchResult) {
case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT: case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT:
status.setOK(); status.setOK();
@ -1563,7 +1563,7 @@ public class NewClassCreationWizardPage extends NewElementWizardPage {
fullyQualifiedName = new QualifiedTypeName(namespace).append(typeName); fullyQualifiedName = new QualifiedTypeName(namespace).append(typeName);
} }
} }
int searchResult = NewClassWizardUtil.searchForCppType(fullyQualifiedName, project,PDOMCPPLinkage.CPPCLASSTYPE); int searchResult = NewClassWizardUtil.searchForCppType(fullyQualifiedName, project, ICPPClassType.class);
switch(searchResult) { switch(searchResult) {
case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT: case NewClassWizardUtil.SEARCH_MATCH_FOUND_EXACT:
status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.ClassNameExists")); //$NON-NLS-1$ status.setError(NewClassWizardMessages.getString("NewClassCreationWizardPage.error.ClassNameExists")); //$NON-NLS-1$