package org.xpect.ui.scoping;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.WorkingCopyOwner;
import org.eclipse.jdt.internal.core.DefaultWorkingCopyOwner;
import org.eclipse.xtext.common.types.access.AbstractTypeProviderFactory;
import org.eclipse.xtext.common.types.access.IJvmTypeProvider;
import org.eclipse.xtext.common.types.access.impl.ClasspathTypeProvider;
import org.eclipse.xtext.common.types.access.jdt.IJavaProjectProvider;
import org.eclipse.xtext.common.types.access.jdt.IJdtTypeProvider;
import org.eclipse.xtext.common.types.access.jdt.IWorkingCopyOwnerProvider;
import org.eclipse.xtext.common.types.access.jdt.JdtTypeProvider;
import org.eclipse.xtext.resource.XtextResourceSet;
import com.google.inject.Inject;
@SuppressWarnings("restriction")
public class ClasspathOrJdtBasedTypeScopeProviderFactory extends AbstractTypeProviderFactory {
@Inject
private ClassLoader classLoader;
@Inject
private IJavaProjectProvider javaProjectProvider;
@Inject
private IWorkingCopyOwnerProvider wcProvider;
protected ClasspathTypeProvider createClasspathTypeProvider(ResourceSet resourceSet) {
return new ClasspathTypeProvider(getClassLoader(resourceSet), resourceSet, null /* getIndexedJvmTypeAccess() */);
}
protected IJdtTypeProvider createJdtTypeProvider(IJavaProject javaProject, ResourceSet resourceSet) {
if (javaProject == null)
throw new IllegalStateException();
WorkingCopyOwner owner;
if (wcProvider == null)
owner = DefaultWorkingCopyOwner.PRIMARY;
else
owner = wcProvider.getWorkingCopyOwner(javaProject, resourceSet);
return new JdtTypeProvider(javaProject, resourceSet, getIndexedJvmTypeAccess(), owner);
}
public IJvmTypeProvider createTypeProvider(ResourceSet resourceSet) {
if (resourceSet == null)
throw new IllegalArgumentException("resourceSet may not be null.");
IJavaProject javaProject = javaProjectProvider.getJavaProject(resourceSet);
if (javaProject != null)
return createJdtTypeProvider(javaProject, resourceSet);
return createClasspathTypeProvider(resourceSet);
}
public ClassLoader getClassLoader(ResourceSet resourceSet) {
if (resourceSet instanceof XtextResourceSet) {
XtextResourceSet xtextResourceSet = (XtextResourceSet) resourceSet;
Object ctx = xtextResourceSet.getClasspathURIContext();
if (ctx != null) {
if (ctx instanceof Class<?>) {
return ((Class<?>) ctx).getClassLoader();
}
if (!(ctx instanceof ClassLoader)) {
return ctx.getClass().getClassLoader();
}
return (ClassLoader) ctx;
}
}
return classLoader;
}
}