diff options
author | Doug Schaefer | 2006-04-21 14:57:50 +0000 |
---|---|---|
committer | Doug Schaefer | 2006-04-21 14:57:50 +0000 |
commit | 6f82c412965382024bff1a0af75556a033ddae58 (patch) | |
tree | 847be56667cdd003a7a0402fc57010798dbc19dc /core/org.eclipse.cdt.core/browser | |
parent | 6870b4d62993fb8c3e2c367a9b35cf86a46b6500 (diff) | |
download | org.eclipse.cdt-6f82c412965382024bff1a0af75556a033ddae58.tar.gz org.eclipse.cdt-6f82c412965382024bff1a0af75556a033ddae58.tar.xz org.eclipse.cdt-6f82c412965382024bff1a0af75556a033ddae58.zip |
Got Open Type working on top of the PDOM.
Diffstat (limited to 'core/org.eclipse.cdt.core/browser')
3 files changed, 231 insertions, 18 deletions
diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java index 7aa324dc945..8080aca6bf4 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java @@ -12,10 +12,26 @@ package org.eclipse.cdt.core.browser; import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.IPDOMManager; +import org.eclipse.cdt.core.dom.IPDOMNode; +import org.eclipse.cdt.core.dom.IPDOMVisitor; +import org.eclipse.cdt.core.dom.ast.DOMException; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; +import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; +import org.eclipse.cdt.core.dom.ast.gnu.cpp.GPPLanguage; +import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.internal.core.browser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.pdom.PDOM; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMLinkage; +import org.eclipse.cdt.internal.core.pdom.dom.c.PDOMCStructure; +import org.eclipse.cdt.internal.core.pdom.dom.cpp.PDOMCPPClassType; +import org.eclipse.core.runtime.CoreException; /** * Manages a search cache for types in the workspace. Instead of returning @@ -32,24 +48,117 @@ import org.eclipse.cdt.internal.core.browser.util.ArrayUtil; */ public class AllTypesCache { + private abstract static class TypesCollector implements IPDOMVisitor { + private final int[] kinds; + protected final List types; + protected final ICProject project; + + protected TypesCollector(int[] kinds, List types, ICProject project) { + this.kinds = kinds; + this.types = types; + this.project = project; + } + + protected abstract void visitKind(IPDOMNode node, int kind); + + public boolean visit(IPDOMNode node) throws CoreException { + for (int i = 0; i < kinds.length; ++i) + visitKind(node, kinds[i]); + return true; + } + + public List getTypes() { + return types; + } + } + + private static class CTypesCollector extends TypesCollector { + public CTypesCollector(int[] kinds, List types, ICProject project) { + super(kinds, types, project); + } + + protected void visitKind(IPDOMNode node, int kind) { + switch (kind) { + case ICElement.C_NAMESPACE: + return; + case ICElement.C_CLASS: + return; + case ICElement.C_STRUCT: + if (node instanceof PDOMCStructure) + types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); + return; + case ICElement.C_UNION: + return; + case ICElement.C_ENUMERATION: + return; + case ICElement.C_TYPEDEF: + return; + } + } + } + + private static class CPPTypesCollector extends TypesCollector { + public CPPTypesCollector(int[] kinds, List types, ICProject project) { + super(kinds, types, project); + } + + protected void visitKind(IPDOMNode node, int kind) { + try { + switch (kind) { + case ICElement.C_NAMESPACE: + return; + case ICElement.C_CLASS: + if (node instanceof PDOMCPPClassType + && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_class) + types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); + return; + case ICElement.C_STRUCT: + if (node instanceof PDOMCPPClassType + && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_struct) + types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); + return; + case ICElement.C_UNION: + if (node instanceof PDOMCPPClassType + && ((PDOMCPPClassType)node).getKey() == ICPPClassType.k_union) + types.add(new PDOMTypeInfo((PDOMBinding)node, kind, project)); + return; + case ICElement.C_ENUMERATION: + return; + case ICElement.C_TYPEDEF: + return; + } + } catch (DOMException e) { + CCorePlugin.log(e); + } + } + } + /** * Returns all types in the workspace. */ public static ITypeInfo[] getAllTypes() { - final Collection fAllTypes = new ArrayList(); - TypeSearchScope workspaceScope = new TypeSearchScope(true); - ICProject[] projects = workspaceScope.getEnclosingProjects(); - ITypeInfoVisitor visitor = new ITypeInfoVisitor() { - public boolean visit(ITypeInfo info) { - fAllTypes.add(info); - return true; + try { + List types = new ArrayList(); + IPDOMManager pdomManager = CCorePlugin.getPDOMManager(); + + ICProject[] projects = CoreModel.getDefault().getCModel().getCProjects(); + for (int i = 0; i < projects.length; ++i) { + ICProject project = projects[i]; + CTypesCollector cCollector = new CTypesCollector(ITypeInfo.KNOWN_TYPES, types, project); + CPPTypesCollector cppCollector = new CPPTypesCollector(ITypeInfo.KNOWN_TYPES, types, project); + + PDOM pdom = (PDOM)pdomManager.getPDOM(project); + PDOMLinkage cLinkage = pdom.getLinkage(GCCLanguage.getDefault()); + cLinkage.accept(cCollector); + PDOMLinkage cppLinkage = pdom.getLinkage(GPPLanguage.getDefault()); + cppLinkage.accept(cppCollector); } - public boolean shouldContinue() { return true; } - }; - for (int i = 0; i < projects.length; ++i) { -// TypeCacheManager.getInstance().getCache(projects[i]).accept(visitor); + + return (ITypeInfo[])types.toArray(new ITypeInfo[types.size()]); + } catch (CoreException e) { + CCorePlugin.log(e); + return new ITypeInfo[0]; } - return (ITypeInfo[]) fAllTypes.toArray(new ITypeInfo[fAllTypes.size()]); } /** diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java index fab26aa8d5e..25d34d150f5 100644 --- a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java @@ -11,10 +11,13 @@ package org.eclipse.cdt.core.browser; +import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility; import org.eclipse.cdt.internal.core.pdom.dom.PDOMBinding; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; +import org.eclipse.core.runtime.CoreException; /** * @author Doug Schaefer @@ -24,10 +27,12 @@ public class PDOMTypeInfo implements ITypeInfo { private final PDOMBinding binding; private final int elementType; + private final ICProject project; - public PDOMTypeInfo(PDOMBinding binding, int elementType) { + public PDOMTypeInfo(PDOMBinding binding, int elementType, ICProject project) { this.binding = binding; this.elementType = elementType; + this.project = project; } public void addDerivedReference(ITypeReference location) { @@ -71,11 +76,12 @@ public class PDOMTypeInfo implements ITypeInfo { } public ICProject getEnclosingProject() { - throw new PDOMNotImplementedError(); + return project; } public ITypeInfo getEnclosingType() { - throw new PDOMNotImplementedError(); + // TODO not sure + return null; } public ITypeInfo getEnclosingType(int[] kinds) { @@ -83,11 +89,13 @@ public class PDOMTypeInfo implements ITypeInfo { } public String getName() { - throw new PDOMNotImplementedError(); + return binding.getName(); } public IQualifiedTypeName getQualifiedTypeName() { - throw new PDOMNotImplementedError(); + String bindingName = binding.getName(); + // TODO really do qualified type names + return new QualifiedTypeName(bindingName); } public ITypeReference[] getReferences() { @@ -95,7 +103,13 @@ public class PDOMTypeInfo implements ITypeInfo { } public ITypeReference getResolvedReference() { - throw new PDOMNotImplementedError(); + try { + PDOMName name = binding.getFirstDefinition(); + return name != null ? new PDOMTypeReference(name, project) : null; + } catch (CoreException e) { + CCorePlugin.log(e); + return null; + } } public ITypeInfo getRootNamespace(boolean includeGlobalNamespace) { diff --git a/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java new file mode 100644 index 00000000000..a4393b78f38 --- /dev/null +++ b/core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java @@ -0,0 +1,90 @@ +/******************************************************************************* + * 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.core.browser; + +import org.eclipse.cdt.core.model.CoreModel; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICProject; +import org.eclipse.cdt.core.model.ITranslationUnit; +import org.eclipse.cdt.core.model.IWorkingCopy; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMName; +import org.eclipse.cdt.internal.core.pdom.dom.PDOMNotImplementedError; +import org.eclipse.core.resources.IProject; +import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.IPath; +import org.eclipse.core.runtime.Path; + +/** + * @author Doug Schaefer + * + */ +public class PDOMTypeReference implements ITypeReference { + + private final PDOMName name; + private final ICProject project; + private final IPath path; + + public PDOMTypeReference(PDOMName name, ICProject project) { + this.name = name; + this.project = project; + this.path = new Path(name.getFileLocation().getFileName()); + } + + public ICElement[] getCElements() { + throw new PDOMNotImplementedError(); + } + + public int getLength() { + return name.getFileLocation().getNodeLength(); + } + + public IPath getLocation() { + throw new PDOMNotImplementedError(); + } + + public int getOffset() { + return name.getFileLocation().getNodeOffset(); + } + + public IPath getPath() { + return path; + } + + public IProject getProject() { + throw new PDOMNotImplementedError(); + } + + public IPath getRelativeIncludePath(IProject project) { + throw new PDOMNotImplementedError(); + } + + public IPath getRelativePath(IPath relativeToPath) { + throw new PDOMNotImplementedError(); + } + + public IResource getResource() { + throw new PDOMNotImplementedError(); + } + + public ITranslationUnit getTranslationUnit() { + return CoreModel.getDefault().createTranslationUnitFrom(project, path); + } + + public IWorkingCopy getWorkingCopy() { + throw new PDOMNotImplementedError(); + } + + public boolean isLineNumber() { + return name.getFileLocation().getNodeLength() == -1; + } + +} |