mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-13 11:15:38 +02:00
2004-09-15 Chris Wiebe
add getTypes and getAllTypes methods * browser/org/eclipse/cdt/core/browser/TypeUtil.java
This commit is contained in:
parent
91db3fc755
commit
e550ac872f
2 changed files with 126 additions and 44 deletions
|
@ -1,3 +1,8 @@
|
|||
2004-09-15 Chris Wiebe
|
||||
|
||||
add getTypes and getAllTypes methods
|
||||
* browser/org/eclipse/cdt/core/browser/TypeUtil.java
|
||||
|
||||
2004-09-02 Chris Wiebe
|
||||
|
||||
add method to get global namespace
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
/*
|
||||
* Created on Jul 5, 2004
|
||||
*
|
||||
* TODO To change the template for this generated file go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
*/
|
||||
/*******************************************************************************
|
||||
* Copyright (c) 2004 QNX Software Systems and others.
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Common Public License v1.0
|
||||
* which accompanies this distribution, and is available at
|
||||
* http://www.eclipse.org/legal/cpl-v10.html
|
||||
*
|
||||
* Contributors:
|
||||
* QNX Software Systems - initial API and implementation
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.core.browser;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
@ -12,45 +16,55 @@ import java.util.List;
|
|||
import org.eclipse.cdt.core.browser.typehierarchy.ITypeHierarchy;
|
||||
import org.eclipse.cdt.core.model.CModelException;
|
||||
import org.eclipse.cdt.core.model.ICElement;
|
||||
import org.eclipse.cdt.core.model.ICElementVisitor;
|
||||
import org.eclipse.cdt.core.model.IEnumeration;
|
||||
import org.eclipse.cdt.core.model.IMember;
|
||||
import org.eclipse.cdt.core.model.IMethodDeclaration;
|
||||
import org.eclipse.cdt.core.model.INamespace;
|
||||
import org.eclipse.cdt.core.model.IParent;
|
||||
import org.eclipse.cdt.core.model.IStructure;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
import org.eclipse.cdt.core.parser.ast.ASTAccessVisibility;
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
|
||||
/**
|
||||
* @author CWiebe
|
||||
*
|
||||
* TODO To change the template for this generated type comment go to
|
||||
* Window - Preferences - Java - Code Style - Code Templates
|
||||
*/
|
||||
public class TypeUtil {
|
||||
|
||||
public static boolean isDeclaredType(ICElement elem) {
|
||||
public static boolean isDeclaringType(ICElement elem) {
|
||||
int type = elem.getElementType();
|
||||
return (type == ICElement.C_CLASS
|
||||
|| type == ICElement.C_STRUCT
|
||||
|| type == ICElement.C_ENUMERATION
|
||||
|| type == ICElement.C_UNION
|
||||
|| type == ICElement.C_TYPEDEF
|
||||
|| type == ICElement.C_NAMESPACE);
|
||||
|| type == ICElement.C_STRUCT
|
||||
|| type == ICElement.C_ENUMERATION
|
||||
|| type == ICElement.C_UNION
|
||||
|| type == ICElement.C_TYPEDEF
|
||||
|| type == ICElement.C_NAMESPACE);
|
||||
}
|
||||
|
||||
public static ICElement getDeclaringContainerType(ICElement elem) {
|
||||
while (elem != null) {
|
||||
if (elem instanceof IStructure
|
||||
|| elem instanceof INamespace
|
||||
|| elem instanceof IEnumeration) {
|
||||
return elem;
|
||||
}
|
||||
elem = elem.getParent();
|
||||
}
|
||||
public static boolean isMemberType(ICElement elem) {
|
||||
int type = elem.getElementType();
|
||||
if (type == ICElement.C_CLASS
|
||||
|| type == ICElement.C_STRUCT
|
||||
|| type == ICElement.C_ENUMERATION
|
||||
|| type == ICElement.C_UNION
|
||||
|| type == ICElement.C_TYPEDEF
|
||||
|| type == ICElement.C_NAMESPACE)
|
||||
return true;
|
||||
return elem instanceof IMember;
|
||||
}
|
||||
|
||||
return null;
|
||||
/**
|
||||
* Returns the type in which this member is declared, or <code>null</code>
|
||||
* if this member is not declared in a type (for example, a top-level type).
|
||||
* This is a handle-only method.
|
||||
*
|
||||
* @return the type in which this member is declared, or <code>null</code>
|
||||
* if this member is not declared in a type (for example, a top-level type)
|
||||
*/
|
||||
public static ICElement getDeclaringType(ICElement elem) {
|
||||
if (!isMemberType(elem))
|
||||
return null;
|
||||
ICElement parent = elem.getParent();
|
||||
while (parent != null && !(parent instanceof ITranslationUnit)) {
|
||||
if (isDeclaringType(parent))
|
||||
return parent;
|
||||
parent = parent.getParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static ICElement getDeclaringClass(ICElement type) {
|
||||
|
@ -89,21 +103,84 @@ public class TypeUtil {
|
|||
return (type.getElementType() == ICElement.C_NAMESPACE);
|
||||
}
|
||||
|
||||
public static ICElement[] getTypes(ICElement elem) {
|
||||
final List typeList = new ArrayList(3);
|
||||
try {
|
||||
elem.accept(new ICElementVisitor() {
|
||||
public boolean visit(ICElement element) throws CoreException {
|
||||
// TODO Auto-generated method stub
|
||||
if (element instanceof IStructure) {
|
||||
typeList.add(element);
|
||||
}
|
||||
return false;
|
||||
}});
|
||||
} catch (CoreException e) {
|
||||
/**
|
||||
* Returns the top-level types declared in the given translation unit
|
||||
* in the order in which they appear in the source.
|
||||
*
|
||||
* @param tu the translation unit
|
||||
* @return the top-level types declared in the given translation unit
|
||||
* @throws CModelException if this element does not exist or if an
|
||||
* exception occurs while accessing its corresponding resource
|
||||
*/
|
||||
public static ICElement[] getTypes(ITranslationUnit tu) throws CModelException {
|
||||
List typeList = new ArrayList();
|
||||
ICElement[] children = tu.getChildren();
|
||||
for (int i = 0; i < children.length; ++i) {
|
||||
if (isDeclaringType(children[i]))
|
||||
typeList.add(children[i]);
|
||||
}
|
||||
return (ICElement[])typeList.toArray(new ICElement[typeList.size()]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all types declared in the given translation unit in the order
|
||||
* in which they appear in the source.
|
||||
* This includes all top-level types and nested member types.
|
||||
* It does NOT include local types (types defined in methods).
|
||||
*
|
||||
* @return the array of top-level and member types defined in the given translation unit, in declaration order.
|
||||
* @throws CModelException if this element does not exist or if an
|
||||
* exception occurs while accessing its corresponding resource
|
||||
*/
|
||||
public static ICElement[] getAllTypes(ITranslationUnit tu) throws CModelException {
|
||||
ICElement[] types = getTypes(tu);
|
||||
ArrayList allTypes = new ArrayList(types.length);
|
||||
ArrayList typesToTraverse = new ArrayList(types.length);
|
||||
for (int i = 0; i < types.length; i++) {
|
||||
typesToTraverse.add(types[i]);
|
||||
}
|
||||
while (!typesToTraverse.isEmpty()) {
|
||||
ICElement type = (ICElement) typesToTraverse.get(0);
|
||||
typesToTraverse.remove(type);
|
||||
allTypes.add(type);
|
||||
types = getTypes(type);
|
||||
for (int i = 0; i < types.length; i++) {
|
||||
typesToTraverse.add(types[i]);
|
||||
}
|
||||
}
|
||||
return (ICElement[])allTypes.toArray(new ICElement[allTypes.size()]);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the immediate member types declared by the given element.
|
||||
* The results are listed in the order in which they appear in the source file.
|
||||
*
|
||||
* @param elem the element
|
||||
* @exception CModelException if this element does not exist or if an
|
||||
* exception occurs while accessing its corresponding resource.
|
||||
* @return the immediate member types declared by this type
|
||||
*/
|
||||
public static ICElement[] getTypes(ICElement elem) throws CModelException {
|
||||
List typeList = new ArrayList();
|
||||
if (isDeclaringType(elem) && elem instanceof IParent) {
|
||||
ICElement[] children = ((IParent)elem).getChildren();
|
||||
for (int i = 0; i < children.length; ++i) {
|
||||
if (isDeclaringType(children[i]))
|
||||
typeList.add(children[i]);
|
||||
}
|
||||
}
|
||||
return (ICElement[])typeList.toArray(new ICElement[typeList.size()]);
|
||||
}
|
||||
|
||||
public static ITranslationUnit getTranslationUnit(ICElement elem) {
|
||||
while (elem != null) {
|
||||
if (elem instanceof ITranslationUnit)
|
||||
return (ITranslationUnit)elem;
|
||||
elem = elem.getParent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO move method to CModelUtil
|
||||
public static IQualifiedTypeName getFullyQualifiedName(ICElement type) {
|
||||
|
|
Loading…
Add table
Reference in a new issue