From bd9a1483cfec1c9ecc44c4817da51fe58c9cb88e Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 23 Nov 2012 22:44:17 +0100 Subject: [PATCH] allow non-navigatable messages in problems view (IDEA-95581 Show project structure errors in the problems window) add language-level validation for module cycles --- .../com/intellij/compiler/ProblemsView.java | 9 +++----- .../compiler/impl/ProblemsViewImpl.java | 9 ++++++-- .../server/AutoMakeMessageHandler.java | 4 +++- .../jps/incremental/java/JavaBuilder.java | 23 +++++++++++++++++-- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/ProblemsView.java b/java/compiler/impl/src/com/intellij/compiler/ProblemsView.java index 7963493c7c6b..3948ac75e95a 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ProblemsView.java +++ b/java/compiler/impl/src/com/intellij/compiler/ProblemsView.java @@ -56,16 +56,13 @@ public abstract class ProblemsView { public abstract void clearOldMessages(CompileScope scope, UUID currentSessionId); - public abstract void addMessage(int type, @NotNull String[] text, @Nullable String groupName, @NotNull Navigatable navigatable, @Nullable String exportTextPrefix, @Nullable String rendererTextPrefix, @NotNull UUID sessionId); + public abstract void addMessage(int type, @NotNull String[] text, @Nullable String groupName, @Nullable Navigatable navigatable, @Nullable String exportTextPrefix, @Nullable String rendererTextPrefix, @NotNull UUID sessionId); public final void addMessage(CompilerMessage message, @NotNull UUID sessionId) { final VirtualFile file = message.getVirtualFile(); Navigatable navigatable = message.getNavigatable(); - if (navigatable == null) { - if (file == null) { - return; // both navigatable and file must not be null - } - navigatable = new OpenFileDescriptor(myProject, file, -1, -1); + if (navigatable == null && file != null) { + navigatable = new OpenFileDescriptor(myProject, file, -1, -1); } final CompilerMessageCategory category = message.getCategory(); final int type = CompilerTask.translateCategory(category); diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java index e962c21cf219..bd0641932d1e 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/ProblemsViewImpl.java @@ -123,7 +123,7 @@ public class ProblemsViewImpl extends ProblemsView{ public void addMessage(final int type, @NotNull final String[] text, @Nullable final String groupName, - @NotNull final Navigatable navigatable, + @Nullable final Navigatable navigatable, @Nullable final String exportTextPrefix, @Nullable final String rendererTextPrefix, @Nullable final UUID sessionId) { myViewUpdater.execute(new Runnable() { @@ -134,7 +134,12 @@ public class ProblemsViewImpl extends ProblemsView{ if (group != null && !sessionId.equals(group.getData())) { structure.removeElement(group); } - myPanel.addMessage(type, text, groupName, navigatable, exportTextPrefix, rendererTextPrefix, sessionId); + if (navigatable != null) { + myPanel.addMessage(type, text, groupName, navigatable, exportTextPrefix, rendererTextPrefix, sessionId); + } + else { + myPanel.addMessage(type, text, null, -1, -1, sessionId); + } } }); } diff --git a/java/compiler/impl/src/com/intellij/compiler/server/AutoMakeMessageHandler.java b/java/compiler/impl/src/com/intellij/compiler/server/AutoMakeMessageHandler.java index 58fd8cf229de..05bfe722e3ba 100644 --- a/java/compiler/impl/src/com/intellij/compiler/server/AutoMakeMessageHandler.java +++ b/java/compiler/impl/src/com/intellij/compiler/server/AutoMakeMessageHandler.java @@ -110,7 +110,9 @@ class AutoMakeMessageHandler extends DefaultMessageHandler { @Override public void handleFailure(UUID sessionId, CmdlineRemoteProto.Message.Failure failure) { - CompilerManager.NOTIFICATION_GROUP.createNotification("Auto make failure: " + failure.getDescription(), MessageType.INFO); + final String msg = "Auto make failure: " + failure.getDescription(); + CompilerManager.NOTIFICATION_GROUP.createNotification(msg, MessageType.INFO); + ProblemsView.SERVICE.getInstance(myProject).addMessage(new CompilerMessageImpl(myProject, CompilerMessageCategory.ERROR, msg), sessionId); } @Override diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index a9543efda22e..7dd9f023d069 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -2,7 +2,9 @@ package org.jetbrains.jps.incremental.java; import com.intellij.execution.process.BaseOSProcessHandler; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -273,12 +275,29 @@ public class JavaBuilder extends ModuleLevelBuilder { profile = context.getAnnotationProcessingProfile(modules.iterator().next()); } else { + // perform cycle-related validations + final JpsJavaExtensionService javaExt = JpsJavaExtensionService.getInstance(); + Pair pair = null; + for (JpsModule module : modules) { + final LanguageLevel moduleLevel = javaExt.getLanguageLevel(module); + if (pair == null) { + pair = Pair.create(module.getName(), moduleLevel); // first value + } + else { + if (!Comparing.equal(pair.getSecond(), moduleLevel)) { + final String message = "Modules " + pair.getFirst()+ " and " +module.getName() + " must have the same language level because of cyclic dependencies between them"; + diagnosticSink.report(new PlainMessageDiagnostic(Diagnostic.Kind.ERROR, message)); + return true; + } + } + } + // check that all chunk modules are excluded from annotation processing for (JpsModule module : modules) { final ProcessorConfigProfile prof = context.getAnnotationProcessingProfile(module); if (prof.isEnabled()) { - String message = "Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [" + chunk.getName() + "] are excluded from annotation processing"; - context.processMessage(new CompilerMessage(BUILDER_NAME, BuildMessage.Kind.ERROR, message)); + final String message = "Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [" + chunk.getName() + "] are excluded from annotation processing"; + diagnosticSink.report(new PlainMessageDiagnostic(Diagnostic.Kind.ERROR, message)); return true; } }