mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-28 11:25:35 +02:00
Got Open Type working on top of the PDOM.
This commit is contained in:
parent
6870b4d629
commit
6f82c41296
5 changed files with 243 additions and 18 deletions
|
@ -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()]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
|
@ -61,6 +61,12 @@ public class GCCLanguage extends PlatformObject implements ILanguage {
|
|||
// Must match the id in the extension
|
||||
public static final String ID = CCorePlugin.PLUGIN_ID + ".gcc"; //$NON-NLS-1$
|
||||
|
||||
private static final GCCLanguage myDefault = new GCCLanguage();
|
||||
|
||||
public static GCCLanguage getDefault() {
|
||||
return myDefault;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return ID;
|
||||
}
|
||||
|
|
|
@ -59,6 +59,12 @@ public class GPPLanguage extends PlatformObject implements ILanguage {
|
|||
|
||||
protected static final GPPScannerExtensionConfiguration CPP_GNU_SCANNER_EXTENSION = new GPPScannerExtensionConfiguration();
|
||||
public static final String ID = CCorePlugin.PLUGIN_ID + ".g++"; //$NON-NLS-1$
|
||||
|
||||
private static final GPPLanguage myDefault = new GPPLanguage();
|
||||
|
||||
public static GPPLanguage getDefault() {
|
||||
return myDefault;
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return ID;
|
||||
|
|
Loading…
Add table
Reference in a new issue