blob: a021ef6611d9c46c6ddd34dcea60d66714ee415b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2008 Oracle. 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:
* Oracle - initial API and implementation
******************************************************************************/
package org.eclipse.jpt.core.internal.utility.jdt;
import java.util.List;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.FieldDeclaration;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jpt.core.utility.TextRange;
import org.eclipse.jpt.core.utility.jdt.AnnotationEditFormatter;
import org.eclipse.jpt.core.utility.jdt.Type;
import org.eclipse.jpt.utility.CommandExecutorProvider;
/**
* Adapt and extend a JDT type.
*/
public class JDTType
extends JDTMember
implements Type
{
/**
* constructor for the compilation unit's primary type
*/
public JDTType(
TypeDeclaration typeDeclaration, // exclude annotations and enums
ICompilationUnit compilationUnit,
CommandExecutorProvider modifySharedDocumentCommandExecutorProvider) {
this(typeDeclaration, compilationUnit, modifySharedDocumentCommandExecutorProvider, DefaultAnnotationEditFormatter.instance());
}
/**
* constructor for the compilation unit's primary type
*/
public JDTType(
TypeDeclaration typeDeclaration, // exclude annotations and enums
ICompilationUnit compilationUnit,
CommandExecutorProvider modifySharedDocumentCommandExecutorProvider,
AnnotationEditFormatter annotationEditFormatter) {
this(null, typeDeclaration, 1, compilationUnit, modifySharedDocumentCommandExecutorProvider, annotationEditFormatter);
}
/**
* constructor for nested types
*/
public JDTType(
Type declaringType,
TypeDeclaration typeDeclaration, // exclude annotations and enums
int occurrence,
ICompilationUnit compilationUnit,
CommandExecutorProvider modifySharedDocumentCommandExecutorProvider) {
this(declaringType, typeDeclaration, occurrence, compilationUnit, modifySharedDocumentCommandExecutorProvider, DefaultAnnotationEditFormatter.instance());
}
/**
* constructor for nested types
*/
public JDTType(
Type declaringType,
TypeDeclaration typeDeclaration, // exclude annotations and enums
int occurrence,
ICompilationUnit compilationUnit,
CommandExecutorProvider modifySharedDocumentCommandExecutorProvider,
AnnotationEditFormatter annotationEditFormatter) {
super(declaringType, typeDeclaration.getName().getFullyQualifiedName(), occurrence, compilationUnit, modifySharedDocumentCommandExecutorProvider, annotationEditFormatter);
}
/**
* constructor for testing
*/
public JDTType(Type declaringType, String name, int occurrence, ICompilationUnit compilationUnit) {
super(declaringType, name, occurrence, compilationUnit, CommandExecutorProvider.Default.instance(), DefaultAnnotationEditFormatter.instance());
}
// ********** Member/Type implementation **********
public ITypeBinding getBinding(CompilationUnit astRoot) {
return this.getBodyDeclaration(astRoot).resolveBinding();
}
/**
* find the type's body declaration in the specified AST
*/
public TypeDeclaration getBodyDeclaration(CompilationUnit astRoot) {
Type declaringType = this.getDeclaringType();
return (declaringType == null) ?
this.getTopLevelTypeDeclaration(astRoot)
:
this.getNestedTypeDeclaration(declaringType.getBodyDeclaration(astRoot));
}
public boolean isPersistable(CompilationUnit astRoot) {
ITypeBinding binding = this.getBinding(astRoot);
return (binding == null) ? false : JPTTools.typeIsPersistable(binding);
}
public TextRange getNameTextRange(CompilationUnit astRoot) {
return new ASTNodeTextRange(this.getBodyDeclaration(astRoot).getName());
}
public TypeDeclaration[] getTypes(CompilationUnit astRoot) {
return this.getBodyDeclaration(astRoot).getTypes();
}
public FieldDeclaration[] getFields(CompilationUnit astRoot) {
return this.getBodyDeclaration(astRoot).getFields();
}
public MethodDeclaration[] getMethods(CompilationUnit astRoot) {
return this.getBodyDeclaration(astRoot).getMethods();
}
// ********** internal **********
/**
* return the first top-level type in the specified AST with a matching name
*/
protected TypeDeclaration getTopLevelTypeDeclaration(CompilationUnit astRoot) {
return this.getTypeDeclaration(types(astRoot));
}
protected TypeDeclaration getTypeDeclaration(List<TypeDeclaration> typeDeclarations) {
return this.getTypeDeclaration(typeDeclarations.toArray(new TypeDeclaration[typeDeclarations.size()]));
}
/**
* return the nested type with a matching name and occurrence
*/
protected TypeDeclaration getNestedTypeDeclaration(TypeDeclaration declaringTypeDeclaration) {
return this.getTypeDeclaration(declaringTypeDeclaration.getTypes());
}
/**
* return the type declaration corresponding to the type from the specified
* set of type declarations (match name and occurrence)
*/
protected TypeDeclaration getTypeDeclaration(TypeDeclaration[] typeDeclarations) {
String name = this.getName_();
int occurrence = this.getOccurrence();
int count = 0;
for (TypeDeclaration typeDeclaration : typeDeclarations) {
if (typeDeclaration.getName().getFullyQualifiedName().equals(name)) {
count++;
if (count == occurrence) {
return typeDeclaration;
}
}
}
// return null if the type is no longer in the source code;
// this can happen when the context model has not yet
// been synchronized with the resource model but is still
// asking for an ASTNode (e.g. during a selection event)
return null;
}
// minimize scope of suppressed warnings
@SuppressWarnings("unchecked")
protected static List<TypeDeclaration> types(CompilationUnit astRoot) {
return astRoot.types();
}
}