我正在寻找将org.eclipse.jdt.core.dom.ITypeBinding
实例转换为org.eclipse.jdt.core.dom.Type
实例的一般方法。虽然我觉得应该有一些API调用来做到这一点,但我找不到一个。
根据具体类型,似乎有多种方法可以手动执行此操作。
在没有所有这些特殊情况的情况下,是否有任何通用方法可以获取ITypeBinding
并获得Type
?取String
并返回Type
也是可以接受的。
更新
从目前为止的回复来看,似乎我必须处理所有这些特殊情况。这是第一次尝试这样做。我确信这不是完全正确的,所以我很感激审查:
public static Type typeFromBinding(AST ast, ITypeBinding typeBinding) {
if( ast == null )
throw new NullPointerException("ast is null");
if( typeBinding == null )
throw new NullPointerException("typeBinding is null");
if( typeBinding.isPrimitive() ) {
return ast.newPrimitiveType(
PrimitiveType.toCode(typeBinding.getName()));
}
if( typeBinding.isCapture() ) {
ITypeBinding wildCard = typeBinding.getWildcard();
WildcardType capType = ast.newWildcardType();
ITypeBinding bound = wildCard.getBound();
if( bound != null ) {
capType.setBound(typeFromBinding(ast, bound)),
wildCard.isUpperbound());
}
return capType;
}
if( typeBinding.isArray() ) {
Type elType = typeFromBinding(ast, typeBinding.getElementType());
return ast.newArrayType(elType, typeBinding.getDimensions());
}
if( typeBinding.isParameterizedType() ) {
ParameterizedType type = ast.newParameterizedType(
typeFromBinding(ast, typeBinding.getErasure()));
@SuppressWarnings("unchecked")
List<Type> newTypeArgs = type.typeArguments();
for( ITypeBinding typeArg : typeBinding.getTypeArguments() ) {
newTypeArgs.add(typeFromBinding(ast, typeArg));
}
return type;
}
// simple or raw type
String qualName = typeBinding.getQualifiedName();
if( "".equals(qualName) ) {
throw new IllegalArgumentException("No name for type binding.");
}
return ast.newSimpleType(ast.newName(qualName));
}
答案 0 :(得分:2)
我刚刚找到了一个可能更好的替代解决方案。您可以使用org.eclipse.jdt.core.dom.rewrite.ImportRewrite来管理编译单元的import语句。使用类型addImport(ITypeBinding,AST),您可以创建一个新的Type节点,将现有导入考虑在内,并在必要时添加新的导入。
答案 1 :(得分:0)
我不确定你想用&#39; Type&#39;对象或为什么需要它。
如果您需要说明TypeBinding的声明节点,即现有的Type节点 - 您可以使用http://wiki.eclipse.org/JDT/FAQ#From_an_IBinding_to_its_declaring_ASTNode
但是,如果您需要使用新的ASTNode来通过ASTRewrite修改源代码,那么您必须自己手工制作并处理所有情况。请注意,您不需要处理&#39; Type&#39;的所有子类型。在所有情况下,例如UnionType(Java 7)仅与catch块相关。