diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CQualifierType.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CQualifierType.java index ff49cc9f614..1183cd3ceac 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CQualifierType.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CQualifierType.java @@ -13,6 +13,7 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.DOMException; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.c.ICASTDeclSpecifier; @@ -108,6 +109,8 @@ public class CQualifierType implements ICQualifierType, ITypeContainer { } else if( declSpec instanceof IASTCompositeTypeSpecifier ){ IASTCompositeTypeSpecifier compTypeSpec = (IASTCompositeTypeSpecifier) declSpec; t = (IType) compTypeSpec.getName().resolveBinding(); + } else if (declSpec instanceof IASTEnumerationSpecifier) { + t = new CEnumeration(((IASTEnumerationSpecifier)declSpec).getName()); } else { t = new CBasicType((ICASTSimpleDeclSpecifier)declSpec); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java index 4fd84c87b2b..b61583006c8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/PDOM.java @@ -67,11 +67,12 @@ public class PDOM extends PlatformObject private final IPath dbPath; private Database db; - public static final int VERSION = 3; + public static final int VERSION = 4; // 0 - the beginning of it all // 1 - first change to kick off upgrades // 2 - added file inclusions // 3 - added macros and change string implementation + // 4 - added parameters in C++ public static final int LINKAGES = Database.DATA_AREA; public static final int FILE_INDEX = Database.DATA_AREA + 4; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java index ff9e88f3c25..21cb974b2b7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPFunction.java @@ -11,13 +11,21 @@ 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.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; 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; @@ -28,10 +36,28 @@ import org.eclipse.core.runtime.CoreException; * @author Doug Schaefer * */ -public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction { +public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction, ICPPFunctionType { + public static final int NUM_PARAMS = PDOMBinding.RECORD_SIZE + 0; + public static final int FIRST_PARAM = PDOMBinding.RECORD_SIZE + 4; + + public static final int RECORD_SIZE = PDOMBinding.RECORD_SIZE + 8; + public PDOMCPPFunction(PDOM pdom, PDOMNode parent, IASTName name) throws CoreException { super(pdom, parent, name, PDOMCPPLinkage.CPPFUNCTION); + IASTNode parentNode = name.getParent(); + if (parentNode instanceof ICPPASTFunctionDeclarator) { + ICPPASTFunctionDeclarator funcDecl = (ICPPASTFunctionDeclarator)parentNode; + IASTParameterDeclaration[] params = funcDecl.getParameters(); + pdom.getDB().putInt(record + NUM_PARAMS, params.length); + for (int i = 0; i < params.length; ++i) { + ICPPASTParameterDeclaration param = (ICPPASTParameterDeclaration)params[i]; + IASTName paramName = param.getDeclarator().getName(); + IBinding binding = paramName.resolveBinding(); + ICPPParameter paramBinding = (ICPPParameter)binding; + setFirstParameter(new PDOMCPPParameter(pdom, this, paramName, paramBinding)); + } + } } public PDOMCPPFunction(PDOM pdom, int bindingRecord) { @@ -42,6 +68,18 @@ public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction { return RECORD_SIZE; } + public PDOMCPPParameter getFirstParameter() throws CoreException { + int rec = pdom.getDB().getInt(record + FIRST_PARAM); + return rec != 0 ? new PDOMCPPParameter(pdom, rec) : null; + } + + public void setFirstParameter(PDOMCPPParameter param) throws CoreException { + if (param != null) + param.setNextParameter(getFirstParameter()); + int rec = param != null ? param.getRecord() : 0; + pdom.getDB().putInt(record + FIRST_PARAM, rec); + } + public boolean isInline() throws DOMException { throw new PDOMNotImplementedError(); } @@ -55,13 +93,23 @@ public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction { } public IParameter[] getParameters() throws DOMException { - // TODO - return new IParameter[0]; + try { + int n = pdom.getDB().getInt(record + NUM_PARAMS); + IParameter[] params = new IParameter[n]; + PDOMCPPParameter param = getFirstParameter(); + while (param != null) { + params[--n] = param; + param = param.getNextParameter(); + } + return params; + } catch (CoreException e) { + CCorePlugin.log(e); + return new IParameter[0]; + } } public IFunctionType getType() throws DOMException { - // TODO - return null; + return this; } public boolean isAuto() throws DOMException { @@ -97,4 +145,30 @@ public class PDOMCPPFunction extends PDOMBinding implements ICPPFunction { throw new PDOMNotImplementedError(); } + public IType[] getParameterTypes() throws DOMException { + return new IType[0]; +// TODO throw new PDOMNotImplementedError(); + } + + public IType getReturnType() throws DOMException { + return null; +// TODO throw new PDOMNotImplementedError(); + } + + public boolean isConst() { + throw new PDOMNotImplementedError(); + } + + public boolean isVolatile() { + throw new PDOMNotImplementedError(); + } + + 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/PDOMCPPLinkage.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPLinkage.java index 1116e42b89c..9280b808190 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 @@ -36,6 +36,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBlockScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPClassType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPField; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPFunction; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPImplicitMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNamespace; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPNamespaceAlias; @@ -121,6 +122,8 @@ public class PDOMCPPLinkage extends PDOMLinkage { pdomBinding = new PDOMCPPVariable(pdom, parent, name); } else if (binding instanceof CPPMethod && parent instanceof PDOMCPPClassType) { pdomBinding = new PDOMCPPMethod(pdom, (PDOMCPPClassType)parent, name); + } else if (binding instanceof CPPImplicitMethod) { + // skip these for now } else if (binding instanceof CPPFunction) { pdomBinding = new PDOMCPPFunction(pdom, parent, name); } else if (binding instanceof CPPClassType) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java index 82c0ecc3825..7954ff20c2f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPMethod.java @@ -14,11 +14,19 @@ 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.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IFunctionType; import org.eclipse.cdt.core.dom.ast.IParameter; import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunctionType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; import org.eclipse.cdt.internal.core.pdom.PDOM; import org.eclipse.cdt.internal.core.pdom.dom.PDOMMember; import org.eclipse.cdt.internal.core.pdom.dom.PDOMMemberOwner; @@ -29,10 +37,28 @@ import org.eclipse.core.runtime.CoreException; * @author Doug Schaefer * */ -public class PDOMCPPMethod extends PDOMMember implements ICPPMethod { +public class PDOMCPPMethod extends PDOMMember implements ICPPMethod, ICPPFunctionType { + public static final int NUM_PARAMS = PDOMMember.RECORD_SIZE + 0; + public static final int FIRST_PARAM = PDOMMember.RECORD_SIZE + 4; + + public static final int RECORD_SIZE = PDOMMember.RECORD_SIZE + 8; + public PDOMCPPMethod(PDOM pdom, PDOMMemberOwner parent, IASTName name) throws CoreException { super(pdom, parent, name, PDOMCPPLinkage.CPPMETHOD); + IASTNode parentNode = name.getParent(); + if (parentNode instanceof ICPPASTFunctionDeclarator) { + ICPPASTFunctionDeclarator funcDecl = (ICPPASTFunctionDeclarator)parentNode; + IASTParameterDeclaration[] params = funcDecl.getParameters(); + pdom.getDB().putInt(record + NUM_PARAMS, params.length); + for (int i = 0; i < params.length; ++i) { + ICPPASTParameterDeclaration param = (ICPPASTParameterDeclaration)params[i]; + IASTName paramName = param.getDeclarator().getName(); + IBinding binding = paramName.resolveBinding(); + ICPPParameter paramBinding = (ICPPParameter)binding; + setFirstParameter(new PDOMCPPParameter(pdom, this, paramName, paramBinding)); + } + } } public PDOMCPPMethod(PDOM pdom, int record) { @@ -43,6 +69,18 @@ public class PDOMCPPMethod extends PDOMMember implements ICPPMethod { return RECORD_SIZE; } + public PDOMCPPParameter getFirstParameter() throws CoreException { + int rec = pdom.getDB().getInt(record + FIRST_PARAM); + return rec != 0 ? new PDOMCPPParameter(pdom, rec) : null; + } + + public void setFirstParameter(PDOMCPPParameter param) throws CoreException { + if (param != null) + param.setNextParameter(getFirstParameter()); + int rec = param != null ? param.getRecord() : 0; + pdom.getDB().putInt(record + FIRST_PARAM, rec); + } + public boolean isVirtual() throws DOMException { throw new PDOMNotImplementedError(); } @@ -60,8 +98,19 @@ public class PDOMCPPMethod extends PDOMMember implements ICPPMethod { } public IParameter[] getParameters() throws DOMException { - // TODO - need some real parameters - return new IParameter[0]; + try { + int n = pdom.getDB().getInt(record + NUM_PARAMS); + IParameter[] params = new IParameter[n]; + PDOMCPPParameter param = getFirstParameter(); + while (param != null) { + params[--n] = param; + param = param.getNextParameter(); + } + return params; + } catch (CoreException e) { + CCorePlugin.log(e); + return new IParameter[0]; + } } public IScope getFunctionScope() throws DOMException { @@ -69,8 +118,7 @@ public class PDOMCPPMethod extends PDOMMember implements ICPPMethod { } public IFunctionType getType() throws DOMException { - // TODO - return null; + return this; } public boolean isStatic() throws DOMException { @@ -120,4 +168,32 @@ public class PDOMCPPMethod extends PDOMMember implements ICPPMethod { } } + public Object clone() { + throw new PDOMNotImplementedError(); + } + + public IType[] getParameterTypes() throws DOMException { + return new IType[0]; +// TODO throw new PDOMNotImplementedError(); + } + + public IType getReturnType() throws DOMException { + return null; +// TODO throw new PDOMNotImplementedError(); + } + + public boolean isConst() { + return false; +// TODO throw new PDOMNotImplementedError(); + } + + public boolean isVolatile() { + return false; +// TODO throw new PDOMNotImplementedError(); + } + + public boolean isSameType(IType type) { + throw new PDOMNotImplementedError(); + } + } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java new file mode 100644 index 00000000000..4cb7a4c995f --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/pdom/dom/cpp/PDOMCPPParameter.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * 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.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IScope; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPParameter; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNode; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; +import org.eclipse.core.runtime.CoreException; + +/** + * A parameter to a function or a method + * + * @author Doug Schaefer + */ +public class PDOMCPPParameter extends PDOMNode implements ICPPParameter { + + public static final int NEXT_PARAM = PDOMNode.RECORD_SIZE + 0; + public static final int RECORD_SIZE = PDOMNode.RECORD_SIZE + 4; + + public PDOMCPPParameter(PDOM pdom, int record) { + super(pdom, record); + } + + public PDOMCPPParameter(PDOM pdom, PDOMNode parent, IASTName name, ICPPParameter param) + throws CoreException { + super(pdom, parent, name.toCharArray()); +// IType type = param.getType(); + } + + protected int getRecordSize() { + return RECORD_SIZE; + } + + public void setNextParameter(PDOMCPPParameter nextParam) throws CoreException { + int rec = nextParam != null ? nextParam.getRecord() : 0; + pdom.getDB().putInt(record + NEXT_PARAM, rec); + } + + public PDOMCPPParameter getNextParameter() throws CoreException { + int rec = pdom.getDB().getInt(record + NEXT_PARAM); + return rec != 0 ? new PDOMCPPParameter(pdom, rec) : null; + } + + public IASTInitializer getDefaultValue() { + return null; +// TODO 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 boolean isMutable() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public IType getType() throws DOMException { + return null; +// TODO throw new PDOMNotImplementedError(); + } + + public boolean isAuto() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public boolean isExtern() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public boolean isRegister() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public boolean isStatic() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public String getName() { + return new String(getNameCharArray()); + } + + public IScope getScope() throws DOMException { + throw new PDOMNotImplementedError(); + } + + public Object getAdapter(Class adapter) { + throw new PDOMNotImplementedError(); + } + + public char[] getNameCharArray() { + try { + return super.getNameCharArray(); + } catch (CoreException e) { + CCorePlugin.log(e); + return new char[0]; + } + } +}