1
0
Fork 0
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:
Chris Wiebe 2004-09-16 01:06:03 +00:00
parent 91db3fc755
commit e550ac872f
2 changed files with 126 additions and 44 deletions

View file

@ -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

View file

@ -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) {