package com.siberika.idea.pascal.compiler; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.compiler.CompilationStatusListener; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompileTask; import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.compiler.CompilerMessage; import com.intellij.openapi.compiler.CompilerMessageCategory; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.search.FilenameIndex; import com.intellij.psi.search.GlobalSearchScope; import com.siberika.idea.pascal.PascalBundle; import com.siberika.idea.pascal.PascalFileType; import com.siberika.idea.pascal.module.PascalModuleType; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * Author: George Bakhtadze * Date: 19/05/2015 */ public class Task implements CompileTask { @Override public boolean execute(CompileContext context) { CompilerManager.getInstance(context.getProject()).addCompilationStatusListener(new MyListener()); checkMainFile(context); return true; } private void checkMainFile(CompileContext context) { Project prj = context.getProject(); Collection<Module> modules = com.intellij.openapi.module.ModuleUtil.getModulesOfType(prj, PascalModuleType.getInstance()); for (Module module : modules) { if (null == PascalModuleType.getMainFile(module)) { msg(context, PascalBundle.message("compile.no.mainfile", module.getName())); VirtualFile file = retrieveMainFile(module); if (file != null) { PascalModuleType.setMainFile(module, file); msg(context, PascalBundle.message("compile.mainfile.found", file.getName())); } else { msg(context, PascalBundle.message("compile.mainfile.notfound")); } } } } private void msg(CompileContext context, String message) { context.addMessage(CompilerMessageCategory.WARNING, message, null, -1, -1); } private VirtualFile retrieveMainFile(final Module module) { return ApplicationManager.getApplication().runReadAction(new Computable<VirtualFile>() { @Override public VirtualFile compute() { List<String> extensions = new ArrayList<String>(PascalFileType.PROGRAM_EXTENSIONS.size() + PascalFileType.UNIT_EXTENSIONS.size()); extensions.addAll(PascalFileType.PROGRAM_EXTENSIONS); extensions.addAll(PascalFileType.UNIT_EXTENSIONS); for (String extension : extensions) { Collection<VirtualFile> files = FilenameIndex.getAllFilesByExt(module.getProject(), extension, GlobalSearchScope.moduleScope(module)); if (!files.isEmpty()) { return files.iterator().next(); } } return null; } }); } private static class MyListener implements CompilationStatusListener { @Override public void compilationFinished(boolean aborted, int errors, int warnings, CompileContext compileContext) { CompilerManager.getInstance(compileContext.getProject()).removeCompilationStatusListener(this); for (CompilerMessage message : compileContext.getMessages(CompilerMessageCategory.ERROR)) { Navigatable nav = message.getNavigatable(); if ((nav != null) && (nav.canNavigateToSource())) { message.getNavigatable().navigate(true); break; } } } @Override public void fileGenerated(String outputRoot, String relativePath) { } } }