package org.visage.ideaplugin.parsing;
import com.intellij.lang.annotation.AnnotationHolder;
import com.intellij.lang.annotation.ExternalAnnotator;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import org.visage.api.VisagecTask;
import org.visage.api.tree.UnitTree;
import org.visage.ideaplugin.VisageCompiler;
import org.visage.tools.api.VisagecTool;
import javax.tools.*;
import java.io.IOException;
import java.net.URI;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
/**
* @author David Kaspar
*/
public class VisageAnnotator implements ExternalAnnotator {
public void annotate (final PsiFile file, final AnnotationHolder holder) {
if (file == null)
return;
final VirtualFile virtualFile = file.getVirtualFile ();
Module module = VfsUtil.getModuleForFile (file.getProject (), virtualFile);
if (module == null)
return;
VisagecTool instance = new VisagecTool();
DiagnosticListener<FileObject> diagnosticListener = new DiagnosticListener<FileObject>() {
public void report (Diagnostic<? extends FileObject> diagnostic) {
switch (diagnostic.getKind ()) {
case ERROR:
holder.createErrorAnnotation (new TextRange ((int) diagnostic.getStartPosition (), (int) diagnostic.getEndPosition ()), diagnostic.getMessage (Locale.getDefault ()));
break;
case MANDATORY_WARNING:
case WARNING:
holder.createWarningAnnotation (new TextRange ((int) diagnostic.getStartPosition (), (int) diagnostic.getEndPosition ()), diagnostic.getMessage (Locale.getDefault ()));
break;
default:
holder.createInfoAnnotation (new TextRange ((int) diagnostic.getStartPosition (), (int) diagnostic.getEndPosition ()), diagnostic.getMessage (Locale.getDefault ()));
break;
}
}
};
StandardJavaFileManager fileManager = instance.getStandardFileManager(diagnosticListener, null, null);
URI uri = URI.create (virtualFile.getUrl ());
JavaFileObject compiledFile = new SimpleJavaFileObject(uri, JavaFileObject.Kind.SOURCE) {
public URI toUri () {
return uri;
}
public Kind getKind () {
return Kind.SOURCE;
}
public CharSequence getCharContent (boolean ignoreEncodingErrors) throws IOException {
return file.getText ();
}
};
List<String> commandLine = VisageCompiler.createCommandLine (ModuleRootManager.getInstance (module));
try {
VisagecTask task = instance.getTask(null, fileManager, diagnosticListener, commandLine, Collections.singleton (compiledFile));
Iterable<? extends UnitTree> result1 = task.parse();
Iterable<? extends UnitTree> result2 = task.analyze();
} catch (IOException e) {
e.printStackTrace (); // TODO
}
// UnitTree t = result2.iterator().next();
}
}