diff options
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal')
8 files changed, 195 insertions, 11 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java index b3e826f9562..c6b63d2fbe9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCLinkage.java @@ -30,6 +30,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.c.ICASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; @@ -68,6 +69,7 @@ public class PDOMCLinkage extends PDOMLinkage { public static final int CFIELD = PDOMLinkage.LAST_NODE_TYPE + 4; public static final int CENUMERATION = PDOMLinkage.LAST_NODE_TYPE + 5; public static final int CENUMERATOR = PDOMLinkage.LAST_NODE_TYPE + 6; + public static final int CTYPEDEF = PDOMLinkage.LAST_NODE_TYPE + 7; public ILanguage getLanguage() { return new GCCLanguage(); @@ -138,7 +140,8 @@ public class PDOMCLinkage extends PDOMLinkage { if (pdomEnumeration instanceof PDOMCEnumeration) pdomBinding = new PDOMCEnumerator(pdom, parent, name, (PDOMCEnumeration)pdomEnumeration); - } + } else if (binding instanceof ITypedef) + pdomBinding = new PDOMCTypedef(pdom, parent, name, (ITypedef)binding); } if (pdomBinding != null) @@ -184,6 +187,8 @@ public class PDOMCLinkage extends PDOMLinkage { return CENUMERATION; else if (binding instanceof IEnumerator) return CENUMERATOR; + else if (binding instanceof ITypedef) + return CTYPEDEF; else return 0; } @@ -223,6 +228,8 @@ public class PDOMCLinkage extends PDOMLinkage { return new PDOMCEnumeration(pdom, record); case CENUMERATOR: return new PDOMCEnumerator(pdom, record); + case CTYPEDEF: + return new PDOMCTypedef(pdom, record); } return super.getNode(record); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java index 2c4e4b7c8fd..7a129b6b2ee 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCStructure.java @@ -11,6 +11,8 @@ package org.eclipse.cdt.internal.core.pdom.dom.c; +import java.util.ArrayList; + import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTName; @@ -52,7 +54,19 @@ public class PDOMCStructure extends PDOMMemberOwner implements ICompositeType { } public IField[] getFields() throws DOMException { - throw new PDOMNotImplementedError(); + try { + ArrayList fields = new ArrayList(); + + for (PDOMMember member = getFirstMember(); member != null; member = member.getNextMember()) { + if (member instanceof IField) + fields.add(member); + } + + return (IField[])fields.toArray(new IField[fields.size()]); + } catch (CoreException e) { + CCorePlugin.log(e); + return new IField[0]; + } } public IField findField(String name) throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java new file mode 100644 index 00000000000..d688c10c158 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/c/PDOMCTypedef.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) 2006 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.c; + +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.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; +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.PDOMNotImplementedError; +import org.eclipse.core.runtime.CoreException; + +/** + * @author Doug Schaefer + */ +public class PDOMCTypedef extends PDOMBinding implements ITypedef { + + private static final int TYPE = PDOMBinding.RECORD_SIZE + 0; + + protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4; + + public PDOMCTypedef(PDOM pdom, PDOMNode parent, IASTName name, ITypedef typedef) + throws CoreException { + super(pdom, parent, name); + + IType type = typedef.getType(); + PDOMNode typeNode = parent.getLinkage().addType(this, type); + if (typeNode != null) + pdom.getDB().putInt(record + TYPE, typeNode.getRecord()); + } + + public PDOMCTypedef(PDOM pdom, int record) { + super(pdom, record); + } + + protected int getRecordSize() { + return RECORD_SIZE; + } + + public int getNodeType() { + return PDOMCLinkage.CTYPEDEF; + } + + public IType getType() throws DOMException { + try { + int typeRec = pdom.getDB().getInt(record + TYPE); + return (IType)getLinkage().getNode(typeRec); + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } + } + + public boolean isSameType(IType type) { + throw new PDOMNotImplementedError(); + } + + public Object clone() { + throw new PDOMNotImplementedError(); + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBasicType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBasicType.java index aa31c157714..4cc761b1d5d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBasicType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPBasicType.java @@ -19,7 +19,6 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPBasicType; 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.PDOMNode; -import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; import org.eclipse.core.runtime.CoreException; /** @@ -80,7 +79,9 @@ public class PDOMCPPBasicType extends PDOMNode implements ICPPBasicType { } public IASTExpression getValue() throws DOMException { - throw new PDOMNotImplementedError(); + // Returning null for now, not sure what needs to be here if anything + // Values only seem to be used at type resolution time. + return null; } private char getFlags() throws CoreException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java index 9b31027786b..66f7bd4ba2a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPClassType.java @@ -173,7 +173,19 @@ public class PDOMCPPClassType extends PDOMMemberOwner implements ICPPClassType, } public ICPPMethod[] getMethods() throws DOMException { - throw new PDOMNotImplementedError(); + try { + ArrayList methods = new ArrayList(); + + for (PDOMMember member = getFirstMember(); member != null; member = member.getNextMember()) { + if (member instanceof ICPPMethod) + methods.add(member); + } + + return (ICPPMethod[])methods.toArray(new ICPPMethod[methods.size()]); + } catch (CoreException e) { + CCorePlugin.log(e); + return new ICPPMethod[0]; + } } public ICPPClassType[] getNestedClasses() throws DOMException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 0234e1438d7..0a21062b74d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java @@ -26,6 +26,7 @@ import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceAlias; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTQualifiedName; @@ -88,6 +89,7 @@ public class PDOMCPPLinkage extends PDOMLinkage { public static final int CPPPARAMETER = PDOMLinkage.LAST_NODE_TYPE + 9; public static final int CPPENUMERATION = PDOMLinkage.LAST_NODE_TYPE + 10; public static final int CPPENUMERATOR = PDOMLinkage.LAST_NODE_TYPE + 11; + public static final int CPPTYPEDEF = PDOMLinkage.LAST_NODE_TYPE + 12; public ILanguage getLanguage() { return new GPPLanguage(); @@ -159,6 +161,8 @@ public class PDOMCPPLinkage extends PDOMLinkage { if (pdomEnumeration instanceof PDOMCPPEnumeration) pdomBinding = new PDOMCPPEnumerator(pdom, parent, name, (PDOMCPPEnumeration)pdomEnumeration); + } else if (binding instanceof ITypedef) { + pdomBinding = new PDOMCPPTypedef(pdom, parent, name, (ITypedef)binding); } } @@ -233,6 +237,8 @@ public class PDOMCPPLinkage extends PDOMLinkage { return CPPENUMERATION; else if (binding instanceof IEnumerator) return CPPENUMERATOR; + else if (binding instanceof ITypedef) + return CPPTYPEDEF; else return 0; } @@ -382,6 +388,8 @@ public class PDOMCPPLinkage extends PDOMLinkage { return new PDOMCPPEnumeration(pdom, record); case CPPENUMERATOR: return new PDOMCPPEnumerator(pdom, record); + case CPPTYPEDEF: + return new PDOMCPPTypedef(pdom, record); default: return super.getNode(record); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java new file mode 100644 index 00000000000..5fd23334911 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPTypedef.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2006 QNX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * QNX - Initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.pdom.dom.cpp; + +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.IType; +import org.eclipse.cdt.core.dom.ast.ITypedef; +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.PDOMNotImplementedError; +import org.eclipse.core.runtime.CoreException; + +/** + * @author Doug Schaefer + */ +public class PDOMCPPTypedef extends PDOMBinding implements ITypedef { + + private static final int TYPE = PDOMBinding.RECORD_SIZE + 0; + + protected static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 4; + + public PDOMCPPTypedef(PDOM pdom, PDOMNode parent, IASTName name, ITypedef typedef) + throws CoreException { + super(pdom, parent, name); + IType type = typedef.getType(); + PDOMNode typeNode = parent.getLinkage().addType(this, type); + if (typeNode != null) + pdom.getDB().putInt(record + TYPE, typeNode.getRecord()); + } + + public PDOMCPPTypedef(PDOM pdom, int record) { + super(pdom, record); + } + + protected int getRecordSize() { + return RECORD_SIZE; + } + + public int getNodeType() { + return PDOMCPPLinkage.CPPTYPEDEF; + } + + public IType getType() throws DOMException { + try { + PDOMNode node = getLinkage().getNode(pdom.getDB().getInt(record + TYPE)); + return node instanceof IType ? (IType)node : null; + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } + } + + public boolean isSameType(IType type) { + throw new PDOMNotImplementedError(); + } + + public Object clone() { + throw new PDOMNotImplementedError(); + } + +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java index 22fdb9da0ee..8566b9f2472 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPVariable.java @@ -16,7 +16,6 @@ import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPVariable; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor; @@ -44,11 +43,9 @@ public class PDOMCPPVariable extends PDOMBinding implements ICPPVariable { if (nameParent instanceof IASTDeclarator) { IASTDeclarator declarator = (IASTDeclarator)nameParent; IType type = CPPVisitor.createType(declarator); - if (type != null && type instanceof IBinding) { - PDOMBinding pdomType = parent.getLinkage().adaptBinding((IBinding)type); - if (pdomType != null) - pdom.getDB().putInt(record + TYPE_OFFSET, pdomType.getRecord()); - } + PDOMNode typeNode = parent.getLinkage().addType(this, type); + if (typeNode != null) + pdom.getDB().putInt(record + TYPE_OFFSET, typeNode.getRecord()); } } |