Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDoug Schaefer2006-04-21 14:57:50 +0000
committerDoug Schaefer2006-04-21 14:57:50 +0000
commit6f82c412965382024bff1a0af75556a033ddae58 (patch)
tree847be56667cdd003a7a0402fc57010798dbc19dc /core/org.eclipse.cdt.core/browser
parent6870b4d62993fb8c3e2c367a9b35cf86a46b6500 (diff)
downloadorg.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')
-rw-r--r--core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/AllTypesCache.java133
-rw-r--r--core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeInfo.java26
-rw-r--r--core/org.eclipse.cdt.core/browser/org/eclipse/cdt/core/browser/PDOMTypeReference.java90
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;
+ }
+
+}

Back to the top