package org.projectusus.core.filerelations.model;
import org.eclipse.core.resources.IFile;
import org.eclipse.jdt.core.dom.ITypeBinding;
import org.projectusus.core.project2.UsusProjectSupport;
public class TypeBindingChecker {
private static final String JAVA_FILE_EXTENSION = "java"; //$NON-NLS-1$
public WrappedTypeBinding checkForRelevanceAndWrap( ITypeBinding typeBinding ) {
ITypeBinding relevantBinding = findRelevantBinding( typeBinding );
IFile underlyingResource = checkUnderlyingResource( relevantBinding );
if( relevantBinding != null && underlyingResource != null ) {
return new WrappedTypeBinding( underlyingResource, relevantBinding );
}
return null;
}
private ITypeBinding findRelevantBinding( ITypeBinding typeBinding ) {
ITypeBinding binding = typeBinding;
if( binding == null || binding.isPrimitive() ) {
return null;
}
binding = binding.getErasure();
if( binding == null || binding.isPrimitive() ) {
return null;
}
if( binding.isTypeVariable() || binding.isCapture() || binding.isWildcardType() ) {
return null;
}
if( binding.isAnonymous() ) {
return findRelevantBinding( binding.getDeclaringClass() );
}
return binding;
}
private IFile checkUnderlyingResource( ITypeBinding binding ) {
if( binding == null ) {
return null;
}
try {
IFile resource = (IFile)binding.getJavaElement().getUnderlyingResource();
if( isJavaFile( resource ) && isInsideUsusProject( resource ) ) {
return resource;
}
} catch( Throwable t ) {
// ignore
}
return null;
}
private boolean isInsideUsusProject( IFile underlyingResource ) {
return UsusProjectSupport.asUsusProject( underlyingResource.getProject() ).isUsusProject();
}
private boolean isJavaFile( IFile underlyingResource ) {
return underlyingResource != null && underlyingResource.getFileExtension().equals( JAVA_FILE_EXTENSION );
}
}