package de.ovgu.cide.typing.jdt;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.dom.CompilationUnit;
import cide.gparser.ParseException;
import de.ovgu.cide.features.FeatureModelNotFoundException;
import de.ovgu.cide.features.source.ColoredSourceFile;
import de.ovgu.cide.language.jdt.JDTLanguageExtension;
import de.ovgu.cide.language.jdt.JDTParserWrapper;
import de.ovgu.cide.typing.model.AbstractFileBasedTypingProvider;
import de.ovgu.cide.typing.model.ITypingCheck;
import de.ovgu.cide.typing.model.ITypingProvider;
public class JDTTypingProvider extends AbstractFileBasedTypingProvider
implements ITypingProvider {
protected JDTTypingProvider(IProject project) {
super(project);
bindingColorCache = new BindingProjectColorCache(JavaCore
.create(project));
}
public void updateAll(IProgressMonitor monitor) {
getBindingColors().clear();
super.updateAll(monitor);
}
private final BindingProjectColorCache bindingColorCache;
public BindingProjectColorCache getBindingColors() {
return bindingColorCache;
}
@Override
protected boolean matchFileForUpdate(ColoredSourceFile coloredSourceFile) {
return coloredSourceFile != null
&& coloredSourceFile.isColored()
&& coloredSourceFile.getLanguageExtension().getId().equals(
JDTLanguageExtension.LANGUAGE_EXTENSION_ID);
}
@Override
protected Set<ITypingCheck> checkFile(ColoredSourceFile file) {
IFile resource = file.getResource();
CompilationUnit e_ast;
try {
e_ast = JDTParserWrapper.parseJavaFile(resource);
} catch (ParseException e) {
e.printStackTrace();
// if in doubt no error
return Collections.EMPTY_SET;
}
// when (re)parsing a file, update the color cache
getBindingColors().updateASTColors(e_ast, file);
// generate all necessary checks
Set<ITypingCheck> result = new HashSet<ITypingCheck>();
e_ast.accept(new JDTCheckGenerator(file, this, result));
return result;
}
private void updateFileColorCache(Collection<ColoredSourceFile> files) {
for (ColoredSourceFile file : files) {
if (file.getProject() != getProject())
continue;
if (!file.isColored())
continue;
if (!matchFileForUpdate(file))
continue;
IJavaElement javaElement = JavaCore.create(file.getResource());
if (javaElement instanceof ICompilationUnit)
getBindingColors().rebuildFile((ICompilationUnit) javaElement,
file);
}
}
public void prepareReevaluation(Collection<ColoredSourceFile> files,
IProgressMonitor monitor) {
updateFileColorCache(files);
}
public void prepareReevaluationAll(IProgressMonitor monitor) {
try {
getBindingColors().rebuildEntireProject();
} catch (JavaModelException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FeatureModelNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}