From 85836a05060d98ffeded903e4afd2a016f721f9d Mon Sep 17 00:00:00 2001 From: Kirill Kalishev Date: Fri, 30 Oct 2009 10:19:32 +0300 Subject: [PATCH 01/21] TreeUi: runAfterUpdate moved to getReady() --- .../src/com/intellij/ide/util/treeView/AbstractTreeUpdater.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUpdater.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUpdater.java index d1f06adb5e05..3b35ae4dd74b 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUpdater.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUpdater.java @@ -237,7 +237,7 @@ public class AbstractTreeUpdater implements Disposable, Activatable { } }; - invokeLater(runnable); + myTreeBuilder.getReady(this).doWhenDone(runnable); } } From f55d8f9f4a47328f976a4ffd9417b1ec92bd8413 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Thu, 29 Oct 2009 12:40:25 +0300 Subject: [PATCH 02/21] do not create recursive element visitor for each tool for injected PSI --- .../daemon/impl/LocalInspectionsPass.java | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java index d9e4d1588473..b09bc0095ec1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/LocalInspectionsPass.java @@ -470,22 +470,23 @@ public class LocalInspectionsPass extends ProgressableTextEditorHighlightingPass InspectionManager inspectionManager = InspectionManager.getInstance(injectedPsi.getProject()); final ProblemsHolder problemsHolder = new ProblemsHolder(inspectionManager, injectedPsi); final PsiElement host = injectedPsi.getContext(); - for (LocalInspectionTool tool : tools) { - if (host != null && InspectionManagerEx.inspectionResultSuppressed(host, tool)) { - continue; - } - final PsiElementVisitor visitor = tool.buildVisitor(problemsHolder, true); - assert !(visitor instanceof PsiRecursiveElementVisitor) : "The visitor returned from LocalInspectionTool.buildVisitor() must not be recursive. "+tool; - injectedPsi.accept(new PsiRecursiveElementWalkingVisitor() { - @Override public void visitElement(PsiElement element) { + + final PsiElement[] elements = getElementsIntersectingRange(injectedPsi, 0, injectedPsi.getTextLength()); + if (elements.length != 0) { + for (LocalInspectionTool tool : tools) { + if (host != null && InspectionManagerEx.inspectionResultSuppressed(host, tool)) { + continue; + } + final PsiElementVisitor visitor = tool.buildVisitor(problemsHolder, true); + assert !(visitor instanceof PsiRecursiveElementVisitor) : "The visitor returned from LocalInspectionTool.buildVisitor() must not be recursive. "+tool; + for (PsiElement element : elements) { element.accept(visitor); - super.visitElement(element); + } + List problems = problemsHolder.getResults(); + if (problems != null && !problems.isEmpty()) { + InjectedPsiInspectionResult res = new InjectedPsiInspectionResult(tool, injectedPsi, new SmartList(problems)); + result.add(res); } - }); - List problems = problemsHolder.getResults(); - if (problems != null && !problems.isEmpty()) { - InjectedPsiInspectionResult res = new InjectedPsiInspectionResult(tool, injectedPsi, new SmartList(problems)); - result.add(res); } } } From b9c9f28a926de16755671277bc0ca1881d7309ce Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 30 Oct 2009 09:47:22 +0300 Subject: [PATCH 03/21] IDEADEV-41088 --- .../daemon/impl/analysis/AnnotationsHighlightUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java index fc9510218389..3adb241fd2e1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/AnnotationsHighlightUtil.java @@ -148,7 +148,7 @@ public class AnnotationsHighlightUtil { if (annotation == annotationToCheck) continue; PsiJavaCodeReferenceElement nameRef = annotation.getNameReferenceElement(); if (nameRef == null) continue; - PsiClass aClass = (PsiClass)nameRef.resolve(); + PsiElement aClass = nameRef.resolve(); if (resolved.equals(aClass)) { return HighlightInfo.createHighlightInfo(HighlightInfoType.ERROR, element, JavaErrorMessages.message("annotation.duplicate.annotation")); } From a1ca84ccfbb5b82f974e773865852b6add5762a7 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 30 Oct 2009 11:09:31 +0300 Subject: [PATCH 04/21] injection tests --- .../ExpectedHighlightingData.java | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java b/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java index 542338300654..0dc64e18c254 100644 --- a/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java +++ b/platform/testFramework/src/com/intellij/testFramework/ExpectedHighlightingData.java @@ -101,7 +101,7 @@ public class ExpectedHighlightingData { PsiFile file) { myFile = file; myText = document.getText(); - highlightingTypes = new THashMap(); + highlightingTypes = new LinkedHashMap(); highlightingTypes.put(ERROR_MARKER, new ExpectedHighlightingSet(HighlightInfoType.ERROR, HighlightSeverity.ERROR, false, true)); highlightingTypes.put(WARNING_MARKER, new ExpectedHighlightingSet(HighlightInfoType.WARNING, HighlightSeverity.WARNING, false, checkWarnings)); highlightingTypes.put(INFORMATION_MARKER, new ExpectedHighlightingSet(HighlightInfoType.INFO, HighlightSeverity.INFO, false, checkWeakWarnings)); @@ -185,10 +185,7 @@ public class ExpectedHighlightingData { String text = document.getText(); final Set markers = highlightingTypes.keySet(); - String typesRegex = ""; - for (String marker : markers) { - typesRegex += (typesRegex.length() == 0 ? "" : "|") + "(?:" + marker + ")"; - } + String typesRegex = "(?:"+StringUtil.join(markers, ")|(?:")+")"; // er... // any code then (with optional descr="...") then any code then then any code @@ -196,7 +193,7 @@ public class ExpectedHighlightingData { //"(.+?)).*"; Pattern p = Pattern.compile(pat, Pattern.DOTALL); Out: - for (; ;) { + while (true) { Matcher m = p.matcher(text); if (!m.matches()) break; int startOffset = m.start(1); @@ -209,7 +206,7 @@ public class ExpectedHighlightingData { startOffset = m.start(1); expectedHighlightingSet = highlightingTypes.get(marker); } - int pos=3; + int pos = 3; @NonNls String descr = m.group(pos++); if (descr == null) { // no descr means any string by default @@ -241,20 +238,19 @@ public class ExpectedHighlightingData { final Matcher matcher2 = pat2.matcher(rest); LOG.assertTrue(matcher2.matches(), "Cannot find closing "); content = matcher2.group(1); - endOffset = m.start(pos-1) + matcher2.start(2); + endOffset = m.start(pos - 1) + matcher2.start(2); } else { // content = ""; - endOffset = m.start(pos-1); + endOffset = m.start(pos - 1); } document.replaceString(startOffset, endOffset, content); TextAttributes forcedAttributes = null; if (foregroundColor != null) { - forcedAttributes = new TextAttributes(Color.decode(foregroundColor), Color.decode(backgroundColor), - Color.decode(effectColor), EffectType.valueOf(effectType), - Integer.parseInt(fontType)); + forcedAttributes = new TextAttributes(Color.decode(foregroundColor), Color.decode(backgroundColor), Color.decode(effectColor), + EffectType.valueOf(effectType), Integer.parseInt(fontType)); } TextRange textRange = new TextRange(startOffset, startOffset + content.length()); @@ -273,9 +269,9 @@ public class ExpectedHighlightingData { } - HighlightInfo highlightInfo = new HighlightInfo(forcedAttributes, type, textRange.getStartOffset(), textRange.getEndOffset(), descr, - descr, expectedHighlightingSet.severity, expectedHighlightingSet.endOfLine, null, - false); + HighlightInfo highlightInfo = + new HighlightInfo(forcedAttributes, type, textRange.getStartOffset(), textRange.getEndOffset(), descr, descr, + expectedHighlightingSet.severity, expectedHighlightingSet.endOfLine, null, false); expectedHighlightingSet.infos.add(highlightInfo); text = document.getText(); } From ee9716c9e61a4e0b4ec7e973a78763ecea3d9e69 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 30 Oct 2009 11:22:14 +0300 Subject: [PATCH 05/21] ModifableRootModel is not created if only ModuleRootModel is needed --- .../openapi/roots/ui/configuration/ModuleEditor.java | 8 ++++++++ .../roots/ui/configuration/ModulesConfigurator.java | 4 ++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java index 082be71429f9..02a10416ee55 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModuleEditor.java @@ -27,6 +27,7 @@ import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ModuleRootModel; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.impl.ModuleRootManagerImpl; import com.intellij.openapi.roots.libraries.Library; @@ -144,6 +145,13 @@ public abstract class ModuleEditor implements Place.Navigator, Disposable { return myModifiableRootModelProxy; } + public ModuleRootModel getRootModel() { + if (myModifiableRootModel != null) { + return getModifiableRootModelProxy(); + } + return ModuleRootManager.getInstance(myModule); + } + public boolean isModified() { for (ModuleConfigurationEditor moduleElementsEditor : myEditors) { if (moduleElementsEditor.isModified()) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java index 5005d8fc7cc9..4b1f04bdead8 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ModulesConfigurator.java @@ -151,11 +151,11 @@ public class ModulesConfigurator implements ModulesProvider, ModuleEditor.Change final ModuleEditor editor = getModuleEditor(module); ModuleRootModel rootModel = null; if (editor != null) { - rootModel = editor.getModifiableRootModel(); + rootModel = editor.getRootModel(); } if (rootModel == null && getModule(module.getName()) != null) { createModuleEditor(module); - rootModel = getModuleEditor(module).getModifiableRootModel(); + rootModel = getModuleEditor(module).getRootModel(); } return rootModel; From d4b9033653e19d6a898467467d6328b245bff326 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 30 Oct 2009 11:27:29 +0300 Subject: [PATCH 06/21] highlight test --- .../psi/impl/source/resolve/ClassResolverProcessor.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java b/java/java-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java index d70ea89767bc..2ee48785b5e6 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/resolve/ClassResolverProcessor.java @@ -93,7 +93,9 @@ public class ClassResolverProcessor extends BaseScopeProcessor implements NameHi } private static boolean isOnDemand(PsiElement fileContext, PsiClass psiClass) { - if (fileContext instanceof PsiImportStatementBase && ((PsiImportStatementBase)fileContext).isOnDemand()) return true; + if (fileContext instanceof PsiImportStatementBase) { + return ((PsiImportStatementBase)fileContext).isOnDemand(); + } String fqn = psiClass.getQualifiedName(); if (fqn == null) return false; return "java.lang".equals(StringUtil.getPackageName(fqn)); From 9b59c10d2f98e43e6900095cca311f8312b4f9a0 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Fri, 30 Oct 2009 11:47:06 +0300 Subject: [PATCH 07/21] cleanup --- .../codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java | 2 +- .../testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java index df53d7956fa7..084803b292c7 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/daemon/impl/DaemonCodeAnalyzerImpl.java @@ -593,7 +593,7 @@ public class DaemonCodeAnalyzerImpl extends DaemonCodeAnalyzer implements JDOMEx @NotNull @TestOnly - public static List getFileLeveleHighlights(Project project,PsiFile file ) { + public static List getFileLevelHighlights(Project project,PsiFile file ) { return UpdateHighlightersUtil.getFileLeveleHighlights(project, file); } } diff --git a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java index 2b8286963839..af0e7cf89ce0 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -1133,7 +1133,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig PsiElement element = file.findElementAt(editor.getCaretModel().getOffset()); List result = new ArrayList(); - List infos = DaemonCodeAnalyzerImpl.getFileLeveleHighlights(file.getProject(), file); + List infos = DaemonCodeAnalyzerImpl.getFileLevelHighlights(file.getProject(), file); for (HighlightInfo info : infos) { for (Pair pair : info.quickFixActionRanges) { HighlightInfo.IntentionActionDescriptor actionInGroup = pair.first; From 1b2d5b35dc733c7864bbe73a44abc7176a7f1d94 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 30 Oct 2009 12:55:43 +0300 Subject: [PATCH 08/21] ELMethodSignature inspection fixed --- .../src/com/intellij/xml/index/ResourceRelevance.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/xml/impl/src/com/intellij/xml/index/ResourceRelevance.java b/xml/impl/src/com/intellij/xml/index/ResourceRelevance.java index 28ab829df842..f1833e5ab1d2 100644 --- a/xml/impl/src/com/intellij/xml/index/ResourceRelevance.java +++ b/xml/impl/src/com/intellij/xml/index/ResourceRelevance.java @@ -30,11 +30,11 @@ import java.util.List; */ public enum ResourceRelevance { - MAPPED, - SOURCE, - LIBRARY, + NONE, STANDARD, - NONE; + LIBRARY, + SOURCE, + MAPPED; public static ResourceRelevance getRelevance(VirtualFile file, Module module, ProjectFileIndex fileIndex) { Module moduleForFile = fileIndex.getModuleForFile(file); From 8982cb360f46841fc313074577724c87c8136d33 Mon Sep 17 00:00:00 2001 From: nik Date: Fri, 30 Oct 2009 14:38:23 +0300 Subject: [PATCH 09/21] obsolete code removed --- .../ant/j2ee/CompositeBuildTarget.java | 1 - .../DefaultExplodedAndJarBuildGenerator.java | 55 ------------------- .../make/ExplodedAndJarBuildGenerator.java | 11 ---- .../compiler/make/BuildParticipantBase.java | 36 ++++++------ 4 files changed, 20 insertions(+), 83 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/CompositeBuildTarget.java b/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/CompositeBuildTarget.java index d793eebe1014..46fdb2a75163 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/CompositeBuildTarget.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/CompositeBuildTarget.java @@ -41,7 +41,6 @@ public class CompositeBuildTarget extends CompositeGenerator { final String depends, @Nullable String jarPath) { final File moduleBaseDir = parameters.getChunk().getBaseDir(); - final Module containingModule = parameters.getContainingModule(); final Target buildTarget = new Target(targetName, depends, targetDescription, null); final BuildConfiguration buildConfiguration = parameters.getBuildConfiguration(); diff --git a/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/DefaultExplodedAndJarBuildGenerator.java b/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/DefaultExplodedAndJarBuildGenerator.java index ac490077f162..e27520f60659 100644 --- a/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/DefaultExplodedAndJarBuildGenerator.java +++ b/java/compiler/impl/src/com/intellij/compiler/ant/j2ee/DefaultExplodedAndJarBuildGenerator.java @@ -21,7 +21,6 @@ import com.intellij.compiler.make.ExplodedAndJarBuildGenerator; import com.intellij.compiler.make.MakeUtil; import com.intellij.openapi.compiler.make.*; import com.intellij.openapi.module.Module; -import com.intellij.openapi.util.Ref; import com.intellij.util.SmartList; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -105,58 +104,4 @@ public class DefaultExplodedAndJarBuildGenerator extends ExplodedAndJarBuildGene } - - @NotNull - public ZipFileSet[] generateTagsForJarTarget(@NotNull final BuildInstruction instruction, @NotNull final ExplodedAndJarTargetParameters parameters, - final Ref tempDirUsed) - throws Exception { - final List zipFileSetTags = new SmartList(); - final String tempDirProperty = BuildProperties.getTempDirForModuleProperty(parameters.getContainingModule().getName()); - final File moduleBaseDir = parameters.getChunk().getBaseDir(); - instruction.accept(new BuildInstructionVisitor() { - public boolean visitFileCopyInstruction(FileCopyInstruction instruction) throws RuntimeException { - if (instruction.isExternalDependencyInstruction()) return true; - final File sourceFile = instruction.getFile(); - final Module instructionModule = instruction.getModule(); - final String sourceLocation = GenerationUtils.toRelativePath(sourceFile.getPath(), moduleBaseDir, instructionModule, - parameters.getGenerationOptions()); - final ZipFileSet fileSet = new ZipFileSet(sourceLocation, instruction.getOutputRelativePath(), instruction.isDirectory()); - - zipFileSetTags.add(fileSet); - return true; - } - - public boolean visitJarAndCopyBuildInstruction(JarAndCopyBuildInstruction instruction) throws RuntimeException { - if (instruction.isExternalDependencyInstruction()) return true; - tempDirUsed.set(true); - final String jarName = new File(instruction.getOutputRelativePath()).getName(); - final String destJarPath = BuildProperties.propertyRef(tempDirProperty)+"/"+jarName; - - zipFileSetTags.add(new ZipFileSet(destJarPath, instruction.getOutputRelativePath(), false)); - return true; - } - - }); - return zipFileSetTags.toArray(new ZipFileSet[zipFileSetTags.size()]); - } - - @NotNull - public Tag[] generateJarBuildPrepareTags(@NotNull final BuildInstruction instruction, @NotNull final ExplodedAndJarTargetParameters parameters) - throws Exception { - final List prepareTags = new SmartList(); - final String tempDirProperty = BuildProperties.getTempDirForModuleProperty(parameters.getContainingModule().getName()); - final File moduleBaseDir = parameters.getChunk().getBaseDir(); - instruction.accept(new BuildInstructionVisitor() { - - public boolean visitJarAndCopyBuildInstruction(JarAndCopyBuildInstruction instruction) throws RuntimeException { - if (instruction.isExternalDependencyInstruction()) return true; - final String jarName = new File(instruction.getOutputRelativePath()).getName(); - final String destJarPath = BuildProperties.propertyRef(tempDirProperty)+"/"+jarName; - prepareTags.add(generateJarTag(instruction, destJarPath, moduleBaseDir, parameters.getGenerationOptions())); - return true; - } - - }); - return prepareTags.toArray(new Tag[prepareTags.size()]); - } } diff --git a/java/compiler/impl/src/com/intellij/compiler/make/ExplodedAndJarBuildGenerator.java b/java/compiler/impl/src/com/intellij/compiler/make/ExplodedAndJarBuildGenerator.java index 0fe4aa104d7a..a4e462a14c3d 100644 --- a/java/compiler/impl/src/com/intellij/compiler/make/ExplodedAndJarBuildGenerator.java +++ b/java/compiler/impl/src/com/intellij/compiler/make/ExplodedAndJarBuildGenerator.java @@ -37,15 +37,4 @@ public abstract class ExplodedAndJarBuildGenerator { return null; } - @Nullable - public ZipFileSet[] generateTagsForJarTarget(@NotNull BuildInstruction instruction, @NotNull ExplodedAndJarTargetParameters parameters, - final Ref tempDirUsed) throws Exception { - return null; - } - - @Nullable - public Tag[] generateJarBuildPrepareTags(@NotNull BuildInstruction instruction, @NotNull ExplodedAndJarTargetParameters parameters) throws Exception { - return null; - } - } diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java index 7511a6698a82..909800187653 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/make/BuildParticipantBase.java @@ -56,22 +56,7 @@ public abstract class BuildParticipantBase extends BuildParticipant { final ConfigFile[] deploymentDescriptors = getDeploymentDescriptors(); ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { - for (ConfigFile descriptor : deploymentDescriptors) { - VirtualFile virtualFile = descriptor.getVirtualFile(); - if (virtualFile != null) { - ConfigFileMetaData metaData = descriptor.getMetaData(); - final File file = VfsUtil.virtualToIoFile(virtualFile); - final String fileName; - if (metaData.isFileNameFixed()) { - fileName = metaData.getFileName(); - } - else { - fileName = virtualFile.getName(); - } - instructions.addFileCopyInstruction(file, false, myModule, metaData.getDirectoryPath() + "/" + fileName, null); - } - - } + registerDescriptorCopyingInstructions(BuildParticipantBase.this.myModule, deploymentDescriptors, instructions); final CustomConfigFile[] customDescriptors = getCustomDescriptors(); @@ -87,6 +72,25 @@ public abstract class BuildParticipantBase extends BuildParticipant { }); } + public static void registerDescriptorCopyingInstructions(Module module, ConfigFile[] deploymentDescriptors, BuildRecipe instructions) { + for (ConfigFile descriptor : deploymentDescriptors) { + VirtualFile virtualFile = descriptor.getVirtualFile(); + if (virtualFile != null) { + ConfigFileMetaData metaData = descriptor.getMetaData(); + final File file = VfsUtil.virtualToIoFile(virtualFile); + final String fileName; + if (metaData.isFileNameFixed()) { + fileName = metaData.getFileName(); + } + else { + fileName = virtualFile.getName(); + } + instructions.addFileCopyInstruction(file, false, module, metaData.getDirectoryPath() + "/" + fileName, null); + } + + } + } + protected CustomConfigFile[] getCustomDescriptors() { return CustomConfigFile.EMPTY_ARRAY; } From 9d73ebc9918c16f4c3a6037cd22fd220ef461179 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 30 Oct 2009 14:46:05 +0300 Subject: [PATCH 10/21] execute index update in non-cancellable section (fixing notAClass exception) --- .../util/indexing/FileBasedIndex.java | 117 +++++++++++------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java index cf9a0e8c8d2f..93ce6f2c0d53 100644 --- a/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java +++ b/platform/lang-impl/src/com/intellij/util/indexing/FileBasedIndex.java @@ -1038,51 +1038,66 @@ public class FileBasedIndex implements ApplicationComponent { } } - // returns false if doc was not indexed because the file does not fit in scope - private boolean indexUnsavedDocument(final Document document, final ID requestedIndexId, Project project, GlobalSearchScope filter) throws StorageException { - final VirtualFile vFile = myFileDocumentManager.getFile(document); - if (!(vFile instanceof VirtualFileWithId) || !vFile.isValid()) { - return true; - } - if (filter != null && !filter.accept(vFile)) { - return false; - } - final PsiFile dominantContentFile = findDominantPsiForDocument(document, project); - - DocumentContent content; - if (dominantContentFile != null && dominantContentFile.getModificationStamp() != document.getModificationStamp()) { - content = new PsiContent(document, dominantContentFile); - } - else { - content = new AuthenticContent(document); - } - - final long currentDocStamp = content.getModificationStamp(); - if (currentDocStamp != myLastIndexedDocStamps.getAndSet(document, requestedIndexId, currentDocStamp).longValue()) { - final FileContent newFc = new FileContent(vFile, content.getText(), vFile.getCharset()); - - if (dominantContentFile != null) { - dominantContentFile.putUserData(PsiFileImpl.BUILDING_STUB, true); - newFc.putUserData(PSI_FILE, dominantContentFile); - } - - if (content instanceof AuthenticContent) { - newFc.putUserData(EDITOR_HIGHLIGHTER, document instanceof DocumentImpl - ? ((DocumentImpl)document).getEditorHighlighterForCachesBuilding() : null); - } - - if (getInputFilter(requestedIndexId).acceptInput(vFile)) { - newFc.putUserData(PROJECT, project); - final int inputId = Math.abs(getFileId(vFile)); - getIndex(requestedIndexId).update(inputId, newFc); - } - - if (dominantContentFile != null) { - dominantContentFile.putUserData(PsiFileImpl.BUILDING_STUB, null); - } - } +// returns false if doc was not indexed because the file does not fit in scope +private boolean indexUnsavedDocument(final Document document, final ID requestedIndexId, final Project project, + GlobalSearchScope filter) throws StorageException { + final VirtualFile vFile = myFileDocumentManager.getFile(document); + if (!(vFile instanceof VirtualFileWithId) || !vFile.isValid()) { return true; } + if (filter != null && !filter.accept(vFile)) { + return false; + } + final PsiFile dominantContentFile = findDominantPsiForDocument(document, project); + + final DocumentContent content; + if (dominantContentFile != null && dominantContentFile.getModificationStamp() != document.getModificationStamp()) { + content = new PsiContent(document, dominantContentFile); + } + else { + content = new AuthenticContent(document); + } + + final long currentDocStamp = content.getModificationStamp(); + if (currentDocStamp != myLastIndexedDocStamps.getAndSet(document, requestedIndexId, currentDocStamp).longValue()) { + final Ref exRef = new Ref(null); + ProgressManager.getInstance().executeNonCancelableSection(new Runnable() { + public void run() { + try { + final FileContent newFc = new FileContent(vFile, content.getText(), vFile.getCharset()); + + if (dominantContentFile != null) { + dominantContentFile.putUserData(PsiFileImpl.BUILDING_STUB, true); + newFc.putUserData(PSI_FILE, dominantContentFile); + } + + if (content instanceof AuthenticContent) { + newFc.putUserData(EDITOR_HIGHLIGHTER, document instanceof DocumentImpl + ? ((DocumentImpl)document).getEditorHighlighterForCachesBuilding() : null); + } + + if (getInputFilter(requestedIndexId).acceptInput(vFile)) { + newFc.putUserData(PROJECT, project); + final int inputId = Math.abs(getFileId(vFile)); + getIndex(requestedIndexId).update(inputId, newFc); + } + + if (dominantContentFile != null) { + dominantContentFile.putUserData(PsiFileImpl.BUILDING_STUB, null); + } + } + catch (StorageException e) { + exRef.set(e); + } + } + }); + final StorageException storageException = exRef.get(); + if (storageException != null) { + throw storageException; + } + } + return true; +} public static final Key PSI_FILE = new Key("PSI for stubs"); public static final Key EDITOR_HIGHLIGHTER = new Key("Editor"); @@ -1257,7 +1272,21 @@ public class FileBasedIndex implements ApplicationComponent { final UpdatableIndex index = getIndex(indexId); assert index != null; - index.update(inputId, currentFC); + final Ref exRef = new Ref(null); + ProgressManager.getInstance().executeNonCancelableSection(new Runnable() { + public void run() { + try { + index.update(inputId, currentFC); + } + catch (StorageException e) { + exRef.set(e); + } + } + }); + final StorageException storageException = exRef.get(); + if (storageException != null) { + throw storageException; + } ApplicationManager.getApplication().runReadAction(new Runnable() { public void run() { if (file.isValid()) { From be0668c7b48b9e9ed68b947459220a56e1fd35ef Mon Sep 17 00:00:00 2001 From: "Anton.Makeev" Date: Fri, 30 Oct 2009 15:22:35 +0300 Subject: [PATCH 11/21] Maven: correctly resolve dependencies with properties in parent and coordinates declaration --- .../maven/project/MavenProjectReader.java | 9 ++-- .../idea/maven/DependenciesImportingTest.java | 46 +++++++++++++++++++ .../jetbrains/idea/maven/MavenTestCase.java | 1 + .../maven/project/MavenProjectReaderTest.java | 22 +++++++++ 4 files changed, 74 insertions(+), 4 deletions(-) diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java index 68e914c02b2c..a8fc06fde40e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectReader.java @@ -19,7 +19,6 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; -import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.impl.source.parsing.xml.XmlBuilder; @@ -53,6 +52,8 @@ import java.io.File; import java.io.IOException; import java.util.*; +import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces; + public class MavenProjectReader { private static final String UNKNOWN = MavenId.UNKNOWN_VALUE; @@ -453,8 +454,8 @@ public class MavenProjectReader { } private boolean resolveInheritance(final MavenGeneralSettings generalSettings, - Model model, - VirtualFile file, + final Model model, + final VirtualFile file, final List activeProfiles, final Set recursionGuard, final MavenProjectReaderProjectLocator locator) { @@ -528,7 +529,7 @@ public class MavenProjectReader { Properties context = MavenEmbedderFactory.collectSystemProperties(); ProjectBuilderConfiguration config = new DefaultProjectBuilderConfiguration().setExecutionProperties(context); - model = interpolator.interpolate(model, basedir, config, false); + model = interpolator.interpolate(ModelUtils.cloneModel(model), basedir, config, false); } catch (ModelInterpolationException e) { MavenLog.LOG.warn(e); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/DependenciesImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/DependenciesImportingTest.java index 7217959e98ab..cf37de561928 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/DependenciesImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/DependenciesImportingTest.java @@ -297,6 +297,52 @@ public class DependenciesImportingTest extends MavenImportingTestCase { assertModuleModuleDeps("m1", "m2"); } + public void testInterModuleDependenciesIfThereArePropertiesInArtifactHeaderDefinedInParent() throws Exception { + createProjectPom("${groupProp}" + + "parent" + + "${versionProp}" + + "pom" + + + "" + + " test" + + " 1" + + "" + + + "" + + " m1" + + " m2" + + ""); + + createModulePom("m1", + "" + + " ${groupProp}" + + " parent" + + " ${versionProp}" + + "" + + "m1" + + + "" + + " " + + " ${groupProp}" + + " m2" + + " ${versionProp}" + + " " + + ""); + + createModulePom("m2", + "" + + " ${groupProp}" + + " parent" + + " ${versionProp}" + + "" + + "m2"); + + importProject(); + assertModules("parent", "m1", "m2"); + + assertModuleModuleDeps("m1", "m2"); + } + public void testDependencyOnSelf() throws Exception { importProject("test" + "project" + diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java index 92ae22feb07f..227cc81c5aee 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/MavenTestCase.java @@ -32,6 +32,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; +import org.intellij.lang.annotations.Language; import org.jetbrains.idea.maven.embedder.MavenConsole; import org.jetbrains.idea.maven.project.*; import org.jetbrains.idea.maven.utils.MavenProgressIndicator; diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java index 87d65a1ce89e..69d7f012fd95 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenProjectReaderTest.java @@ -737,6 +737,28 @@ public class MavenProjectReaderTest extends MavenTestCase { assertEquals("value", p.getName()); } + public void testPropertiesFromParentInParentSection() throws Exception { + createProjectPom("${groupProp}" + + "parent" + + "${versionProp}" + + + "" + + " test" + + " 1" + + ""); + + VirtualFile module = createModulePom("module", + "" + + " ${groupProp}" + + " parent" + + " ${versionProp}" + + "" + + "module"); + + org.apache.maven.project.MavenProject p = readProject(module); + assertEquals("test:module:1", p.getGroupId() + ":" + p.getArtifactId() + ":" + p.getVersion()); + } + public void testInheritingSettingsFromParentAndAlignCorrectly() throws Exception { createProjectPom("test" + "parent" + From df43b9e443666d14d1859c9cca0d7bbd41d47785 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 30 Oct 2009 15:43:35 +0300 Subject: [PATCH 12/21] optimization: less calls to configuration.isExcludedFromCompilation(file) --- .../impl/TranslatingCompilerFilesMonitor.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java index bf8174d7f8ea..c43bbd4bc3fb 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java @@ -169,18 +169,22 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { if (_forceCompile || pathsToRecompile != null && !pathsToRecompile.isEmpty()) { while (scopeSrcIterator.hasNext()) { final VirtualFile file = scopeSrcIterator.next(); - if (!file.isValid() || configuration.isExcludedFromCompilation(file) || !compiler.isCompilableFile(file, context)) { + if (!file.isValid()) { continue; } final int fileId = getFileId(file); if (_forceCompile) { - toCompile.add(file); - if (pathsToRecompile == null || !pathsToRecompile.contains(fileId)) { - addSourceForRecompilation(projectId, file, null); + if (compiler.isCompilableFile(file, context) && !configuration.isExcludedFromCompilation(file)) { + toCompile.add(file); + if (pathsToRecompile == null || !pathsToRecompile.contains(fileId)) { + addSourceForRecompilation(projectId, file, null); + } } } else if (pathsToRecompile.contains(fileId)) { - toCompile.add(file); + if (compiler.isCompilableFile(file, context) && !configuration.isExcludedFromCompilation(file)) { + toCompile.add(file); + } } } } From f32d00b44d9d46578f4b46b47e8857c012da1610 Mon Sep 17 00:00:00 2001 From: Eugene Kudelevsky Date: Fri, 30 Oct 2009 16:27:55 +0300 Subject: [PATCH 13/21] shorten log filter titles (IDEA-25473) --- .../diagnostic/logging/LogSearchComponent.form | 14 +++++++++++--- .../src/messages/DiagnosticBundle.properties | 9 +++++---- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogSearchComponent.form b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogSearchComponent.form index 23b6edb96dbf..700fbcbc4387 100644 --- a/platform/lang-impl/src/com/intellij/diagnostic/logging/LogSearchComponent.form +++ b/platform/lang-impl/src/com/intellij/diagnostic/logging/LogSearchComponent.form @@ -1,6 +1,6 @@
- + @@ -10,7 +10,7 @@ - + @@ -18,7 +18,7 @@ - + @@ -29,6 +29,14 @@ + + + + + + + + diff --git a/platform/platform-resources-en/src/messages/DiagnosticBundle.properties b/platform/platform-resources-en/src/messages/DiagnosticBundle.properties index ce8992946b9b..e6c12801c95b 100644 --- a/platform/platform-resources-en/src/messages/DiagnosticBundle.properties +++ b/platform/platform-resources-en/src/messages/DiagnosticBundle.properties @@ -56,8 +56,9 @@ log.monitor.edit.aliases.title=Edit Log Files Aliases log.monitor.edit.aliases.name=&Alias: log.monitor.edit.aliases.location=&Log File Location: log.monitor.edit.aliases.show.all.checkbox.title=&Show All Files Coverable By Pattern -log.console.filter.show.errors=Show errors only -log.console.filter.show.errors.and.warnings=Show errors and warnings -log.console.filter.show.all=Show all +log.console.filter.show.errors=errors +log.console.filter.show.errors.and.warnings=warnings +log.console.filter.show.all=all title.submitting.error.report=Submitting error report -log.console.filter.show.errors.warnings.and.infos=Show errors, warnings and infos \ No newline at end of file +log.console.filter.show.errors.warnings.and.infos=infos +log.console.filter.show.prefix=Show \ No newline at end of file From 066324e6ef672f0b64a678c40e0f5832e4c8b3ba Mon Sep 17 00:00:00 2001 From: Gregory Shrago Date: Fri, 30 Oct 2009 17:41:24 +0300 Subject: [PATCH 14/21] nondisposed libraries fix --- .../intellij/util/ui/classpath/SimpleClasspathPanel.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/util/ui/classpath/SimpleClasspathPanel.java b/platform/lang-impl/src/com/intellij/util/ui/classpath/SimpleClasspathPanel.java index aa6db97240f2..05ee68ba51fa 100644 --- a/platform/lang-impl/src/com/intellij/util/ui/classpath/SimpleClasspathPanel.java +++ b/platform/lang-impl/src/com/intellij/util/ui/classpath/SimpleClasspathPanel.java @@ -163,12 +163,14 @@ public class SimpleClasspathPanel extends JPanel { list.scrollRectToVisible(cellRect); } - private static Collection ensureApplicationLevel(final Library library, final Set existingFiles) { + private static Collection ensureApplicationLevel(final Library library, final Set existingFiles, + final Disposable parentDisposable) { if (library.getTable() == null || !LibraryTablesRegistrar.APPLICATION_LEVEL.equals(library.getTable().getTableLevel())) { final ArrayList result = new ArrayList(); for (VirtualFile file : library.getFiles(OrderRootType.CLASSES)) { if (!existingFiles.add(file)) continue; final Library newLibrary = LibraryTableImplUtil.createModuleLevelLibrary(null, null); + Disposer.register(parentDisposable, newLibrary); final Library.ModifiableModel libModel = newLibrary.getModifiableModel(); libModel.addRoot(file, OrderRootType.CLASSES); libModel.commit(); @@ -264,7 +266,7 @@ public class SimpleClasspathPanel extends JPanel { final List libraries = dialog.getSelectedLibraries(); final ArrayList result = new ArrayList(); for (Library o : libraries) { - result.addAll(ensureApplicationLevel(o, existingFiles)); + result.addAll(ensureApplicationLevel(o, existingFiles, myDisposable)); } return result; } From 677f91daff4a7caf1104499e597310d9a5952f72 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Fri, 30 Oct 2009 21:18:18 +0300 Subject: [PATCH 15/21] dubugger: consider search scope from run configuration when navigating from exception trace hyperlinks (IDEADEV-41133) --- .../intellij/compiler/impl/CompileDriver.java | 3 +- .../debugger/engine/DebugProcessImpl.java | 9 +++ .../debugger/impl/DebuggerSession.java | 4 +- .../debugger/ui/DebuggerSessionTab.java | 6 +- .../execution/filters/ExceptionFilter.java | 9 ++- .../configurations/CommandLineState.java | 2 +- .../execution/impl/ConsoleViewImpl.java | 59 ++++++++++--------- 7 files changed, 57 insertions(+), 35 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index cce777214891..f63641d9a7f6 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -478,7 +478,8 @@ public class CompileDriver { // in case another project was opened in the frame while the compiler was working (See SCR# 28591) statusBar.setInfo(statusMessage); if (duration > ONE_MINUTE_MS) { - ToolWindowManager.getInstance(myProject).notifyByBalloon(ToolWindowId.MESSAGES_WINDOW, MessageType.INFO, statusMessage); + final MessageType messageType = errorCount > 0 ? MessageType.ERROR : warningCount > 0 ? MessageType.WARNING : MessageType.INFO; + ToolWindowManager.getInstance(myProject).notifyByBalloon(ToolWindowId.MESSAGES_WINDOW, messageType, statusMessage); } } if (_status != ExitStatus.UP_TO_DATE && compileContext.getMessageCount(null) > 0) { diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java index 478dc3bd8065..5a61e615206f 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/DebugProcessImpl.java @@ -46,8 +46,11 @@ import com.intellij.execution.CantRunException; import com.intellij.execution.ExecutionException; import com.intellij.execution.ExecutionResult; import com.intellij.execution.Executor; +import com.intellij.execution.configurations.CommandLineState; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.execution.configurations.RunProfileState; +import com.intellij.execution.filters.ExceptionFilter; +import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.process.ProcessListener; @@ -1621,6 +1624,12 @@ public abstract class DebugProcessImpl implements DebugProcess { try { synchronized (myProcessListeners) { + if (state instanceof CommandLineState) { + final TextConsoleBuilder consoleBuilder = ((CommandLineState)state).getConsoleBuilder(); + if (consoleBuilder != null) { + consoleBuilder.addFilter(new ExceptionFilter(session.getSearchScope())); + } + } myExecutionResult = state.execute(executor, runner); if (myExecutionResult == null) { fail(); diff --git a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java index c40f7e2f8915..a2e37db95d34 100644 --- a/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java +++ b/java/debugger/impl/src/com/intellij/debugger/impl/DebuggerSession.java @@ -341,11 +341,10 @@ public class DebuggerSession implements AbstractDebuggerSession { @Nullable protected ExecutionResult attach(@NotNull final Executor executor, @NotNull final ProgramRunner runner, final ModuleRunProfile profile, final RunProfileState state, final RemoteConnection remoteConnection, final boolean pollConnection) throws ExecutionException { - final ExecutionResult executionResult = myDebugProcess.attachVirtualMachine(executor, runner, this, state, remoteConnection, pollConnection); final String addressDisplayName = DebuggerBundle.getAddressDisplayName(remoteConnection); final String transportName = DebuggerBundle.getTransportName(remoteConnection); final Module[] modules = profile.getModules(); - if (modules == null || modules.length == 0) { + if (modules.length == 0) { mySearchScope = GlobalSearchScope.allScope(getProject()); } else { @@ -356,6 +355,7 @@ public class DebuggerSession implements AbstractDebuggerSession { } mySearchScope = scope; } + final ExecutionResult executionResult = myDebugProcess.attachVirtualMachine(executor, runner, this, state, remoteConnection, pollConnection); getContextManager().setState(SESSION_EMPTY_CONTEXT, STATE_WAITING_ATTACH, EVENT_START_WAIT_ATTACH, DebuggerBundle.message("status.waiting.attach", addressDisplayName, transportName)); return executionResult; } diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java index 04809be06b06..23fed950326e 100644 --- a/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java +++ b/java/debugger/impl/src/com/intellij/debugger/ui/DebuggerSessionTab.java @@ -33,6 +33,8 @@ import com.intellij.debugger.ui.impl.watch.*; import com.intellij.execution.*; import com.intellij.execution.configurations.RunProfile; import com.intellij.execution.executors.DefaultDebugExecutor; +import com.intellij.execution.filters.ExceptionFilter; +import com.intellij.execution.filters.TextConsoleBuilder; import com.intellij.execution.filters.TextConsoleBuilderFactory; import com.intellij.execution.runners.ExecutionEnvironment; import com.intellij.execution.runners.ProgramRunner; @@ -511,7 +513,9 @@ public class DebuggerSessionTab extends DebuggerLogConsoleManagerBase implements public void addThreadDump(List threads) { final Project project = getProject(); - final ConsoleView consoleView = TextConsoleBuilderFactory.getInstance().createBuilder(project).getConsole(); + final TextConsoleBuilder consoleBuilder = TextConsoleBuilderFactory.getInstance().createBuilder(project); + consoleBuilder.addFilter(new ExceptionFilter(myDebuggerSession.getSearchScope())); + final ConsoleView consoleView = consoleBuilder.getConsole(); final DefaultActionGroup toolbarActions = new DefaultActionGroup(); final ThreadDumpPanel panel = new ThreadDumpPanel(project, consoleView, toolbarActions, threads); diff --git a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java index 6d4cd562f3ff..18b846685bd9 100644 --- a/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java +++ b/java/execution/openapi/src/com/intellij/execution/filters/ExceptionFilter.java @@ -39,9 +39,16 @@ public class ExceptionFilter implements Filter, DumbAware { private static final String AT_PREFIX = AT + " "; private static final String STANDALONE_AT = " " + AT + " "; private static final TextAttributes HYPERLINK_ATTRIBUTES = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES); + private final GlobalSearchScope mySearchScope; public ExceptionFilter(@NotNull final Project project) { myProject = project; + mySearchScope = GlobalSearchScope.allScope(myProject); + } + + public ExceptionFilter(@NotNull final GlobalSearchScope scope) { + myProject = scope.getProject(); + mySearchScope = scope; } public Result applyFilter(final String line, final int textEndOffset) { @@ -81,7 +88,7 @@ public class ExceptionFilter implements Filter, DumbAware { try{ final int lineNumber = Integer.parseInt(lineString); final PsiManager manager = PsiManager.getInstance(myProject); - PsiClass aClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(className, GlobalSearchScope.allScope(myProject)); + PsiClass aClass = JavaPsiFacade.getInstance(manager.getProject()).findClass(className, mySearchScope); if (aClass == null) return null; final PsiFile file = (PsiFile) aClass.getContainingFile().getNavigationElement(); if (file == null) return null; diff --git a/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java b/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java index 8f37a41fb1ff..15ac3bf74bf0 100644 --- a/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java +++ b/platform/lang-api/src/com/intellij/execution/configurations/CommandLineState.java @@ -73,7 +73,7 @@ public abstract class CommandLineState implements RunnableState { return new AnAction[]{new PauseOutputAction(console, processHandler)}; } - protected TextConsoleBuilder getConsoleBuilder() { + public TextConsoleBuilder getConsoleBuilder() { return myConsoleBuilder; } diff --git a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java index 8b315495d664..be38bcbad49c 100644 --- a/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java +++ b/platform/lang-impl/src/com/intellij/execution/impl/ConsoleViewImpl.java @@ -181,7 +181,8 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } }; - private final CompositeFilter myMessageFilter; + private final CompositeFilter myPredefinedMessageFilter; + private final CompositeFilter myCustomFilter; private ArrayList myHistory = new ArrayList(); private int myHistorySize = 20; @@ -239,12 +240,11 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ myProject = project; myFileType = fileType; - myMessageFilter = new CompositeFilter(project); - final ConsoleFilterProvider[] filterProviders = Extensions.getExtensions(ConsoleFilterProvider.FILTER_PROVIDERS); - for (ConsoleFilterProvider filterProvider : filterProviders) { - final Filter[] defaultFilters = filterProvider.getDefaultFilters(project); - for (Filter filter : defaultFilters) { - addMessageFilter(filter); + myCustomFilter = new CompositeFilter(project); + myPredefinedMessageFilter = new CompositeFilter(project); + for (ConsoleFilterProvider filterProvider : Extensions.getExtensions(ConsoleFilterProvider.FILTER_PROVIDERS)) { + for (Filter filter : filterProvider.getDefaultFilters(project)) { + myPredefinedMessageFilter.addFilter(filter); } } @@ -533,7 +533,7 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } public void addMessageFilter(final Filter filter) { - myMessageFilter.addFilter(filter); + myCustomFilter.addFilter(filter); } public void printHyperlink(final String hyperlinkText, final HyperlinkInfo info) { @@ -782,28 +782,29 @@ public final class ConsoleViewImpl extends JPanel implements ConsoleView, Observ } private void highlightHyperlinks(final int line1, final int line2){ - if (myMessageFilter != null){ - ApplicationManager.getApplication().assertIsDispatchThread(); - PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - final Document document = myEditor.getDocument(); - final CharSequence chars = document.getCharsSequence(); - final TextAttributes hyperlinkAttributes = getHyperlinkAttributes(); + ApplicationManager.getApplication().assertIsDispatchThread(); + PsiDocumentManager.getInstance(myProject).commitAllDocuments(); + final Document document = myEditor.getDocument(); + final CharSequence chars = document.getCharsSequence(); + final TextAttributes hyperlinkAttributes = getHyperlinkAttributes(); - for(int line = line1; line <= line2; line++) { - if (line < 0) continue; - final int startOffset = document.getLineStartOffset(line); - int endOffset = document.getLineEndOffset(line); - if (endOffset < document.getTextLength()){ - endOffset++; // add '\n' - } - final String text = chars.subSequence(startOffset, endOffset).toString(); - final Filter.Result result = myMessageFilter.applyFilter(text, endOffset); - if (result != null){ - final int highlightStartOffset = result.highlightStartOffset; - final int highlightEndOffset = result.highlightEndOffset; - final HyperlinkInfo hyperlinkInfo = result.hyperlinkInfo; - addHyperlink(highlightStartOffset, highlightEndOffset, result.highlightAttributes, hyperlinkInfo, hyperlinkAttributes); - } + for(int line = line1; line <= line2; line++) { + if (line < 0) continue; + final int startOffset = document.getLineStartOffset(line); + int endOffset = document.getLineEndOffset(line); + if (endOffset < document.getTextLength()){ + endOffset++; // add '\n' + } + final String text = chars.subSequence(startOffset, endOffset).toString(); + Filter.Result result = myCustomFilter.applyFilter(text, endOffset); + if (result == null) { + result = myPredefinedMessageFilter.applyFilter(text, endOffset); + } + if (result != null){ + final int highlightStartOffset = result.highlightStartOffset; + final int highlightEndOffset = result.highlightEndOffset; + final HyperlinkInfo hyperlinkInfo = result.hyperlinkInfo; + addHyperlink(highlightStartOffset, highlightEndOffset, result.highlightAttributes, hyperlinkInfo, hyperlinkAttributes); } } } From dcb52cc6bf68c06653aaafbdae02a40e985e67eb Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 30 Oct 2009 14:00:01 +0300 Subject: [PATCH 16/21] return to usage view if user discard to make read only files writable (IDEADEV-41109) --- .../src/com/intellij/usages/impl/UsageViewImpl.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java index bcf026ef7206..506d95256237 100644 --- a/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java +++ b/platform/usageView/src/com/intellij/usages/impl/UsageViewImpl.java @@ -864,12 +864,14 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra return myUsageSearcherFactory != null; } - private void checkReadonlyUsages() { + private boolean checkReadonlyUsages() { final Set readOnlyUsages = getReadOnlyUsagesFiles(); if (!readOnlyUsages.isEmpty()) { - ReadonlyStatusHandler.getInstance(myProject).ensureFilesWritable(readOnlyUsages.toArray(new VirtualFile[readOnlyUsages.size()])); + return + !ReadonlyStatusHandler.getInstance(myProject).ensureFilesWritable(readOnlyUsages.toArray(new VirtualFile[readOnlyUsages.size()])).hasReadonlyFiles(); } + return true; } private Set getReadOnlyUsages() { @@ -1268,7 +1270,7 @@ public class UsageViewImpl implements UsageView, UsageModelTracker.UsageModelTra } public void run() { - checkReadonlyUsages(); + if (!checkReadonlyUsages()) return; PsiDocumentManager.getInstance(myProject).commitAllDocuments(); if (myCannotMakeString != null && myChangesDetected) { if (canPerformReRun() && allTargetsAreValid()) { From 5e1816f6fc1ba57589a6dc18f0328d899fd3186a Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 30 Oct 2009 16:07:05 +0300 Subject: [PATCH 17/21] stop tests run if ignored tests present --- .../junit2/states/TestStateUpdater.java | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/plugins/junit/src/com/intellij/execution/junit2/states/TestStateUpdater.java b/plugins/junit/src/com/intellij/execution/junit2/states/TestStateUpdater.java index 958b05b0daea..50c1c62c57ab 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/states/TestStateUpdater.java +++ b/plugins/junit/src/com/intellij/execution/junit2/states/TestStateUpdater.java @@ -90,6 +90,7 @@ public class TestStateUpdater implements PacketConsumer { state.setMagitude(myInstanceMagnitude); state.initializeFrom(reader); testProxy.setState(state); + complete(testProxy); } public void setMagnitude(final int magnitude) { @@ -105,21 +106,25 @@ public class TestStateUpdater implements PacketConsumer { } testProxy.setState(state); testProxy.setStatistics(new Statistics(reader)); - final int magnitude = state.getMagnitude(); + complete(testProxy); + } + } - TestProxy parent = testProxy.getParent(); - TestProxy child = testProxy; - while (parent != null) { - final List children = parent.getChildren(); - final TestState parentState = parent.getState(); - LOG.assertTrue(parentState instanceof SuiteState); - if (child.equals(children.get(children.size() - 1))) { - ((SuiteState)parentState).setRunning(false); - } - ((SuiteState)parentState).updateMagnitude(magnitude); - child = parent; - parent = parent.getParent(); + private static void complete(TestProxy testProxy) { + final int magnitude = testProxy.getState().getMagnitude(); + + TestProxy parent = testProxy.getParent(); + TestProxy child = testProxy; + while (parent != null) { + final List children = parent.getChildren(); + final TestState parentState = parent.getState(); + LOG.assertTrue(parentState instanceof SuiteState); + if (child.equals(children.get(children.size() - 1))) { + ((SuiteState)parentState).setRunning(false); } + ((SuiteState)parentState).updateMagnitude(magnitude); + child = parent; + parent = parent.getParent(); } } From bff6a8afb32d2a44710607b160aaa547b5dc9012 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 30 Oct 2009 20:42:48 +0300 Subject: [PATCH 18/21] NPE --- .../openapi/src/com/intellij/codeInsight/AnnotationUtil.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java b/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java index 35479714e097..8f072750f153 100644 --- a/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java +++ b/java/openapi/src/com/intellij/codeInsight/AnnotationUtil.java @@ -244,7 +244,10 @@ public class AnnotationUtil { fqns = new ArrayList(); final PsiAnnotation[] annos = modList.getAnnotations(); for (PsiAnnotation anno : annos) { - fqns.add(anno.getQualifiedName()); + final String qName = anno.getQualifiedName(); + if (qName != null) { + fqns.add(qName); + } } if (fqns.isEmpty()) return false; } From dbfca0a56d0441756cf4f95069611a5edc13d669 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 30 Oct 2009 20:45:35 +0300 Subject: [PATCH 19/21] hide equivalent conflict messages from user (IDEADEV-40456) --- .../com/intellij/refactoring/ui/ConflictsDialog.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java b/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java index de0f0cda0e4d..32778e1dcca5 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java +++ b/platform/lang-impl/src/com/intellij/refactoring/ui/ConflictsDialog.java @@ -40,9 +40,8 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; +import java.util.LinkedHashSet; import java.util.regex.Pattern; public class ConflictsDialog extends DialogWrapper{ @@ -55,7 +54,7 @@ public class ConflictsDialog extends DialogWrapper{ public ConflictsDialog(Project project, MultiMap conflictDescriptions) { super(project, true); myProject = project; - List conflicts = new ArrayList(); + final LinkedHashSet conflicts = new LinkedHashSet(); for (String conflict : conflictDescriptions.values()) { conflicts.add(conflict); @@ -182,7 +181,8 @@ public class ConflictsDialog extends DialogWrapper{ } private UsagePresentation getPresentation(final UsagePresentation usagePresentation, PsiElement element) { - final String conflictDescription = " (" + Pattern.compile("<[^<>]*>").matcher(StringUtil.join(myElementConflictDescription.get(element), "\n")).replaceAll("") + ")"; + final Collection elementConflicts = new LinkedHashSet(myElementConflictDescription.get(element)); + final String conflictDescription = " (" + Pattern.compile("<[^<>]*>").matcher(StringUtil.join(elementConflicts, "\n")).replaceAll("") + ")"; return new UsagePresentation() { @NotNull public TextChunk[] getText() { @@ -207,7 +207,7 @@ public class ConflictsDialog extends DialogWrapper{ } private class DescriptionOnlyUsage implements Usage { - private final String myConflictDescription = Pattern.compile("<[^<>]*>").matcher(StringUtil.join(myElementConflictDescription.get(null), "\n")).replaceAll(""); + private final String myConflictDescription = Pattern.compile("<[^<>]*>").matcher(StringUtil.join(new LinkedHashSet(myElementConflictDescription.get(null)), "\n")).replaceAll(""); @NotNull public UsagePresentation getPresentation() { From 20265708b82ac5b40c5c6dce6d3e160fa07f0c69 Mon Sep 17 00:00:00 2001 From: anna Date: Fri, 30 Oct 2009 20:46:08 +0300 Subject: [PATCH 20/21] retarget conflict --- .../intellij/refactoring/memberPushDown/PushDownConflicts.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java index c233598aa2d6..e0dcbe78bc33 100644 --- a/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java +++ b/java/java-impl/src/com/intellij/refactoring/memberPushDown/PushDownConflicts.java @@ -99,7 +99,7 @@ public class PushDownConflicts { } if (!InheritanceUtil.isInheritorOrSelf(aClass, targetClass, true)) { - myConflicts.putValue(aClass, RefactoringBundle.message("pushed.members.will.not.be.visible.from.certain.call.sites")); + myConflicts.putValue(referenceExpression, RefactoringBundle.message("pushed.members.will.not.be.visible.from.certain.call.sites")); break Members; } } From 37fea9bcbd95757b410725263afbe682de377271 Mon Sep 17 00:00:00 2001 From: "alexey.chmutov" Date: Sat, 31 Oct 2009 03:50:41 +0300 Subject: [PATCH 21/21] SQL: dialect lexers (step 1) --- lib/foundrylogic-vpp-2.2.1.jar | Bin 0 -> 25537 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/foundrylogic-vpp-2.2.1.jar diff --git a/lib/foundrylogic-vpp-2.2.1.jar b/lib/foundrylogic-vpp-2.2.1.jar new file mode 100644 index 0000000000000000000000000000000000000000..cd6bd53b5f210a980602069dca37f90ddcf2ab39 GIT binary patch literal 25537 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 z zv*Nzo32<}@6E;MVFK1UDGy#Yy8+9Yx>}3xq4A1vz;YsvPb+u(19w{OY&(rovHD^;Ca8;OPCSsQgYI*Z%njm&qy z+RZYR5m^lcv3cZI*#V%rn7Oj)D%Omn3p%rKu$Qc=@3AO7KCj)<0;d#W`? zm?(PE=8|&O!RYGf!0o0!se0zb@XlP5ZjYy!3XV984Od`ykI%?MoqL^B&1lP79)Zmd z9^dd(*JSY`Sf;$YEc%2Gzi9fCs%zG30&1T%TwTE2%UEsYVgQLS&npjcVxZhdm~(m< zY|sqM=JWl-Gl;huW$ULYnR`Q&gYg8-{oamDd#fk7eedH-I4ud1+HfULN?I^dx-;~- zyv4T8+U8&yrgu`Q=apD<1-F?Uweohq(kU?=g_N6g$B=

*Lhb1%u~$HLctq%B-}S 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 XB>>`|Mf|9_puOae5c%UY{PFF7D#Cfq literal 0 HcmV?d00001