diff --git a/.idea/artifacts/jps.xml b/.idea/artifacts/jps.xml new file mode 100644 index 000000000000..dfbf48d9121b --- /dev/null +++ b/.idea/artifacts/jps.xml @@ -0,0 +1,27 @@ + + + $PROJECT_DIR$/out/artifacts/jps + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/artifacts/jps_plugins.xml b/.idea/artifacts/jps_plugins.xml new file mode 100644 index 000000000000..fee03eee74f7 --- /dev/null +++ b/.idea/artifacts/jps_plugins.xml @@ -0,0 +1,12 @@ + + + $PROJECT_DIR$/out/artifacts/jps + + + + + + + + + \ No newline at end of file diff --git a/.idea/artifacts/jps_sources.xml b/.idea/artifacts/jps_sources.xml new file mode 100644 index 000000000000..2cd42352db97 --- /dev/null +++ b/.idea/artifacts/jps_sources.xml @@ -0,0 +1,15 @@ + + + $PROJECT_DIR$/out/artifacts/jps + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml index 1f2298ba989d..c95d45fbe908 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -56,9 +56,15 @@ - - - + + + + + + + + + diff --git a/.idea/runConfigurations/JPS_tests.xml b/.idea/runConfigurations/JPS_tests.xml new file mode 100644 index 000000000000..c60f67c434ce --- /dev/null +++ b/.idea/runConfigurations/JPS_tests.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java index 95f450575d7a..d454f2d99151 100644 --- a/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java +++ b/java/java-impl/src/com/intellij/refactoring/move/moveClassesOrPackages/JavaMoveClassesOrPackagesHandler.java @@ -246,7 +246,7 @@ public class JavaMoveClassesOrPackagesHandler extends MoveHandlerDelegate { final Module module = LangDataKeys.TARGET_MODULE.getData(dataContext); if (module != null) { final PsiDirectory[] directories = ((PsiPackage)targetContainer).getDirectories(GlobalSearchScope.moduleScope(module)); - if (directories.length > 0) { + if (directories.length == 1) { return directories[0]; } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java index 902ae2547824..0ae871c7447f 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/ConflictsUtil.java @@ -21,6 +21,7 @@ package com.intellij.refactoring.util; import com.intellij.psi.*; +import com.intellij.psi.impl.source.resolve.FileContextUtil; import com.intellij.psi.util.PsiFormatUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.refactoring.RefactoringBundle; @@ -37,9 +38,16 @@ public class ConflictsUtil { public static PsiElement getContainer(PsiElement place) { PsiElement parent = place; while (true) { - if (parent instanceof PsiMember && !(parent instanceof PsiTypeParameter)) + if (parent instanceof PsiMember && !(parent instanceof PsiTypeParameter)) { return parent; - if (parent instanceof PsiFile) return parent; + } + if (parent instanceof PsiFile) { + PsiElement host = FileContextUtil.getFileContext((PsiFile)parent); + if (host == null) { + return parent; + } + parent = host; + } parent = parent.getParent(); } } diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 610bcdf579d0..b1bef4267f30 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -901,7 +901,7 @@ public class RefactoringUtil { @Nullable public static PsiMethod getChainedConstructor(PsiMethod constructor) { final PsiCodeBlock constructorBody = constructor.getBody(); - LOG.assertTrue(constructorBody != null); + if (constructorBody == null) return null; final PsiStatement[] statements = constructorBody.getStatements(); if (statements.length == 1 && statements[0] instanceof PsiExpressionStatement) { final PsiExpression expression = ((PsiExpressionStatement)statements[0]).getExpression(); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterAbstractConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterAbstractConstructor.java new file mode 100644 index 000000000000..cd0507ff3c9a --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/afterAbstractConstructor.java @@ -0,0 +1,11 @@ +// "Add constructor parameter" "true" +public enum La { + ; + private String s; + + private La(String s) { + this.s = s; + } + + private La(int a, String s); +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeAbstractConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeAbstractConstructor.java new file mode 100644 index 000000000000..626f7c630337 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createConstructorParameterFromField/beforeAbstractConstructor.java @@ -0,0 +1,10 @@ +// "Add constructor parameter" "true" +public enum La { + ; + private String s; + + private La() { + } + + private La(int a); +} diff --git a/jps/jps-tests.iml b/jps/jps-tests.iml new file mode 100644 index 000000000000..38b2f30cb1e4 --- /dev/null +++ b/jps/jps-tests.iml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/jps/model/src/org/jetbrains/jps/Library.groovy b/jps/model/src/org/jetbrains/jps/Library.groovy index 474e0d7ad1e3..4e5fc5fffa82 100644 --- a/jps/model/src/org/jetbrains/jps/Library.groovy +++ b/jps/model/src/org/jetbrains/jps/Library.groovy @@ -23,11 +23,11 @@ class Library extends LazyInitializeableObject implements ClasspathItem { Closure lazyInit = { def meta = new InitializingExpando() meta.classpath = {Object[] arg -> - arg.each { classpath << it } + arg.each { classpath << it.toString() } } meta.src = {Object[] arg -> - arg.each { sourceRoots << it } + arg.each { sourceRoots << it.toString() } } initializer.delegate = meta diff --git a/jps/model/src/org/jetbrains/jps/Module.groovy b/jps/model/src/org/jetbrains/jps/Module.groovy index ae7baafcb8f1..bf21d1ce0a1a 100644 --- a/jps/model/src/org/jetbrains/jps/Module.groovy +++ b/jps/model/src/org/jetbrains/jps/Module.groovy @@ -58,19 +58,19 @@ class Module extends LazyInitializeableObject implements ClasspathItem {//}, Com } meta.content = {Object[] arg -> - arg.each { contentRoots << it} + arg.each { contentRoots << it.toString() } } meta.src = {Object[] arg -> - arg.each { sourceRoots << it } + arg.each { sourceRoots << it.toString() } } meta.testSrc = {Object[] arg -> - arg.each { testRoots << it } + arg.each { testRoots << it.toString() } } meta.exclude = {Object[] arg -> - arg.each { excludes << it } + arg.each { excludes << it.toString() } } initializer.delegate = meta diff --git a/jps/plugins/gwt/jps-gwt.iml b/jps/plugins/gwt/jps-gwt.iml index b5a325a384ba..621daa2f0ea8 100644 --- a/jps/plugins/gwt/jps-gwt.iml +++ b/jps/plugins/gwt/jps-gwt.iml @@ -11,15 +11,7 @@ - - - - - - - - - + diff --git a/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java b/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java index 0a1d17892aba..0375f1105c49 100644 --- a/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java +++ b/jps/plugins/gwt/testSrc/org/jetbrains/jps/gwt/GwtModulesSearcherTest.java @@ -5,7 +5,6 @@ import junit.framework.TestCase; import java.util.Arrays; import java.util.HashSet; import java.util.List; -import java.util.Set; /** * @author nik diff --git a/jps/plugins/jpa/jps-jpa.iml b/jps/plugins/jpa/jps-jpa.iml index f8fe61eb4d9e..9d7005eff21a 100644 --- a/jps/plugins/jpa/jps-jpa.iml +++ b/jps/plugins/jpa/jps-jpa.iml @@ -4,6 +4,7 @@ + diff --git a/jps/testData/jpaTest/jpaTest.iml b/jps/plugins/jpa/testData/jpaTest/jpaTest.iml similarity index 100% rename from jps/testData/jpaTest/jpaTest.iml rename to jps/plugins/jpa/testData/jpaTest/jpaTest.iml diff --git a/jps/testData/jpaTest/jpaTest.ipr b/jps/plugins/jpa/testData/jpaTest/jpaTest.ipr similarity index 100% rename from jps/testData/jpaTest/jpaTest.ipr rename to jps/plugins/jpa/testData/jpaTest/jpaTest.ipr diff --git a/jps/testData/jpaTest/src/META-INF/persistence.xml b/jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml similarity index 100% rename from jps/testData/jpaTest/src/META-INF/persistence.xml rename to jps/plugins/jpa/testData/jpaTest/src/META-INF/persistence.xml diff --git a/jps/testSrc/org/jetbrains/jps/JpaTest.groovy b/jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy similarity index 89% rename from jps/testSrc/org/jetbrains/jps/JpaTest.groovy rename to jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy index 32d2ff15ffab..11255f751ab0 100644 --- a/jps/testSrc/org/jetbrains/jps/JpaTest.groovy +++ b/jps/plugins/jpa/testSrc/org/jetbrains/jps/JpaTest.groovy @@ -5,7 +5,7 @@ package org.jetbrains.jps */ class JpaTest extends JpsBuildTestCase { public void testOverwriteArtifacts() throws Exception { - doTest("testData/jpaTest/jpaTest.ipr", null, { + doTest("plugins/jpa/testData/jpaTest/jpaTest.ipr", null, { dir("artifacts") { dir("jpaTest") { dir("WEB-INF") { diff --git a/jps/src/org/jetbrains/jps/ProjectBuilder.groovy b/jps/src/org/jetbrains/jps/ProjectBuilder.groovy index 29a397ba907b..22b5ead3770d 100644 --- a/jps/src/org/jetbrains/jps/ProjectBuilder.groovy +++ b/jps/src/org/jetbrains/jps/ProjectBuilder.groovy @@ -94,11 +94,12 @@ class ProjectBuilder { if (chunk.elements.size() > 1) { File outputDir if (targetFolder != null) { - def basePath = tests ? new File(targetFolder, "test").absolutePath : new File(targetFolder, "production").absolutePath + def basePath = forTests ? new File(targetFolder, "test").absolutePath : new File(targetFolder, "production").absolutePath + def name = chunk.name if (name.length() > 100) { name = name.substring(0, 100) + "_etc" } - outputDir = new File(basePath, name).absolutePath + outputDir = new File(basePath, name) } else { outputDir = new File(forTests ? chunk.representativeModule().testOutputPath : chunk.representativeModule().outputPath) diff --git a/jps/src/org/jetbrains/jps/builders/StandardBuilders.groovy b/jps/src/org/jetbrains/jps/builders/StandardBuilders.groovy index 9c326160a20f..babacca78d33 100644 --- a/jps/src/org/jetbrains/jps/builders/StandardBuilders.groovy +++ b/jps/src/org/jetbrains/jps/builders/StandardBuilders.groovy @@ -60,7 +60,9 @@ class JavacBuilder implements ModuleBuilder, ModuleCycleBuilder { params.debug = String.valueOf(debugInfo); params.nowarn = String.valueOf(nowarn); params.deprecation = String.valueOf(deprecation); - params.verbose = "true" + if (state.projectWrapper != null) { + params.verbose = "true" + } def javacExecutable = getJavacExecutable(module) if (javacExecutable != null) { @@ -279,9 +281,9 @@ class GroovyStubGenerator implements ModuleBuilder { } class JetBrainsInstrumentations implements ModuleBuilder { - class CustomFormInstrumenter extends + static class CustomFormInstrumenter extends FormInstrumenter { - final List formFiles; + final List formFiles; final ModuleBuildState state; @Override @@ -304,7 +306,7 @@ class JetBrainsInstrumentations implements ModuleBuilder { throw new RuntimeException(msg); } - CustomFormInstrumenter(final File destDir, final List nestedFormPathList, final List ff, final ModuleBuildState s) { + CustomFormInstrumenter(final File destDir, final List nestedFormPathList, final List ff, final ModuleBuildState s) { super(destDir, nestedFormPathList); formFiles = ff; state = s; diff --git a/jps/testSrc/org/jetbrains/jps/ModuleInitTest.groovy b/jps/testSrc/org/jetbrains/jps/ModuleInitTest.groovy index dd20ae33ff73..7ff8e118e50e 100644 --- a/jps/testSrc/org/jetbrains/jps/ModuleInitTest.groovy +++ b/jps/testSrc/org/jetbrains/jps/ModuleInitTest.groovy @@ -4,7 +4,7 @@ class ModuleInitTest extends JpsBuildTestCase { public void testBasePath() { Project project = loadProject("testData/moduleCycle/moduleCycle.ipr", [:]); for (def name: ['module1', 'module2']) { - assertTrue(project.modules[name].basePath.endsWith(File.separator + name)); + assertTrue(project.modules[name].basePath.endsWith("/" + name)); } } } diff --git a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java index 3e723b6d87e2..c38b1e3f54be 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java @@ -76,7 +76,7 @@ public class StubBasedPsiElementBase extends ASTDelegateP FileElement treeElement = file.getTreeElement(); StubTree stubTree = file.getStubTree(); if (treeElement != null) { - throw new AssertionError("this="+this+"; file.isPhysical="+file.isPhysical() + "; node=" + myNode + "; file=" + file + "; tree=" + treeElement + "; stubTree=" + stubTree); + return notBoundInExistingAst(file, treeElement, stubTree); } final FileElement fileElement = file.loadTreeElement(); node = myNode; @@ -104,6 +104,26 @@ public class StubBasedPsiElementBase extends ASTDelegateP return node; } + private ASTNode notBoundInExistingAst(PsiFileImpl file, FileElement treeElement, StubTree stubTree) { + String message = "this=" + this + + "; file.isPhysical=" + file.isPhysical() + + "; node=" + myNode + + "; file=" + file + + "; tree=" + treeElement + + "; stubTree=" + stubTree; + PsiElement each = this; + while (each != null) { + message += "\n each=" + each + " of class " + each.getClass(); + if (each instanceof StubBasedPsiElementBase) { + message += "; node=" + ((StubBasedPsiElementBase)each).myNode + "; stub=" + ((StubBasedPsiElementBase)each).myStub; + each = ((StubBasedPsiElementBase)each).getParentByStub(); + } else { + break; + } + } + throw new AssertionError(message); + } + public void setNode(final ASTNode node) { myNode = node; } diff --git a/platform/icons/src/general/divider.png b/platform/icons/src/general/divider.png new file mode 100644 index 000000000000..ea797b974d88 Binary files /dev/null and b/platform/icons/src/general/divider.png differ diff --git a/platform/icons/src/general/locate.png b/platform/icons/src/general/locate.png new file mode 100644 index 000000000000..82ba59505afe Binary files /dev/null and b/platform/icons/src/general/locate.png differ diff --git a/platform/lang-api/src/com/intellij/codeInspection/InspectionProfileEntry.java b/platform/lang-api/src/com/intellij/codeInspection/InspectionProfileEntry.java index 61a2c8020a73..07eab0479b42 100644 --- a/platform/lang-api/src/com/intellij/codeInspection/InspectionProfileEntry.java +++ b/platform/lang-api/src/com/intellij/codeInspection/InspectionProfileEntry.java @@ -21,6 +21,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.util.ResourceUtil; import com.intellij.util.xmlb.SerializationFilter; import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters; @@ -66,12 +67,20 @@ public abstract class InspectionProfileEntry { public abstract String getDisplayName(); /** + * This method is not supposed to be overridden. * @return short name that is used in two cases: \inspectionDescriptions\<short_name>.html resource may contain short inspection * description to be shown in "Inspect Code..." dialog and also provide some file name convention when using offline * inspection or export to HTML function. Should be unique among all inspections. + * @see InspectionEP#shortName */ @NonNls @NotNull - public abstract String getShortName(); + public String getShortName() { + return getShortName(getClass()); + } + + public static String getShortName(Class aClass) { + return StringUtil.trimEnd(aClass.getSimpleName(), "Inspection"); + } /** * @return highlighting level for this inspection tool that is used in default settings. diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java index 8551a333416c..04f26ab11815 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateBuilderImpl.java @@ -192,7 +192,7 @@ public class TemplateBuilderImpl implements TemplateBuilder { int start = 0; for (final RangeMarker element : myElements) { int offset = element.getStartOffset() - containerStart; - LOG.assertTrue(start <= offset,"container: " + myContainerElement.getClass() + " markers: " + + LOG.assertTrue(start <= offset,"container: " + myContainerElement + " markers: " + StringUtil.join(myElements, new Function() { @Override public String fun(RangeMarker rangeMarker) { diff --git a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java index 4123e2f6736b..2a9609e47a9a 100644 --- a/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java +++ b/platform/lang-impl/src/com/intellij/codeInspection/ex/InspectionToolWrapper.java @@ -40,12 +40,16 @@ public abstract class InspectionToolWrapper{ @@ -36,6 +38,6 @@ public class DependencyNodeComparator implements Comparator refErrorLanguage = new Ref(); final Ref refProcessCanceled = new Ref(); final Ref dumbModeOccurred = new Ref(); + final Ref anyException = new Ref(); final Runnable findUsagesRunnable = new Runnable() { @Override @@ -170,6 +171,9 @@ public abstract class BaseRefactoringProcessor { catch (IndexNotReadyException e) { dumbModeOccurred.set(Boolean.TRUE); } + catch (Throwable e) { + anyException.set(Boolean.TRUE); + } } }; @@ -191,6 +195,10 @@ public abstract class BaseRefactoringProcessor { return; } + if (!anyException.isNull()) { + //do not proceed if find usages fails + return; + } assert !refUsages.isNull(): "Null usages from processor " + this; if (!preprocessUsages(refUsages)) return; final UsageInfo[] usages = refUsages.get(); diff --git a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java index ef10be43254e..87711a25bdc9 100644 --- a/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java +++ b/platform/lang-impl/src/com/intellij/refactoring/move/moveFilesOrDirectories/MoveFilesOrDirectoriesUtil.java @@ -83,7 +83,7 @@ public class MoveFilesOrDirectoriesUtil { try { final VirtualFile virtualFile = file.getVirtualFile(); - assert virtualFile != null; + LOG.assertTrue(virtualFile != null, file); virtualFile.move(manager, newDirectory.getVirtualFile()); } catch (IOException e) { diff --git a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java index f90b2f9dc8e9..6997d30dbed7 100644 --- a/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java +++ b/platform/platform-api/src/com/intellij/ide/util/treeView/AbstractTreeUi.java @@ -3261,16 +3261,6 @@ public class AbstractTreeUi { } - private boolean isValid(DefaultMutableTreeNode node) { - if (node == null) return false; - final Object object = node.getUserObject(); - if (object instanceof NodeDescriptor) { - return isValid((NodeDescriptor)object); - } - - return false; - } - private boolean isValid(NodeDescriptor descriptor) { return descriptor != null && isValid(getElementFromDescriptor(descriptor)); } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java index 24bb21a9c8fa..3f09393c3616 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/InternalDecorator.java @@ -334,6 +334,10 @@ public final class InternalDecorator extends JPanel implements Queryable, TypeSa }, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT); } + public void setTitleActions(AnAction[] actions) { + myHeader.setAdditionalTitleActions(actions); + } + private static class InnerPanelBorder implements Border { private final ToolWindow myWindow; diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java index 73b627a60a5c..141317e87c2c 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowHeader.java @@ -63,6 +63,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { private static final Icon ourHideDownIcon = IconLoader.getIcon("/general/hideDownPart.png"); private static final Icon ourSettingsIcon = IconLoader.getIcon("/general/gear.png"); + private static final Icon ourSeparatorIcon = IconLoader.getIcon("/general/divider.png"); private ToolWindow myToolWindow; private WindowInfoImpl myInfo; @@ -70,6 +71,8 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { private BufferedImage myImage; private BufferedImage myActiveImage; private ToolWindowType myImageType; + private JPanel myButtonPanel; + private final ToolWindowHeader.ActionButton myGearButton; public ToolWindowHeader(final ToolWindowImpl toolWindow, WindowInfoImpl info, @NotNull final Producer gearProducer) { setLayout(new BorderLayout()); @@ -106,12 +109,13 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { eastPanel.setBorder(BorderFactory.createEmptyBorder(0, 3, 0, 3)); add(eastPanel, BorderLayout.EAST); - eastPanel.add(new ActionButton(new AnAction() { + myGearButton = new ActionButton(new AnAction() { @Override public void actionPerformed(AnActionEvent e) { final InputEvent inputEvent = e.getInputEvent(); final ActionPopupMenu popupMenu = - ((ActionManagerImpl)ActionManager.getInstance()).createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, gearProducer.produce(), new MenuItemPresentationFactory(true)); + ((ActionManagerImpl)ActionManager.getInstance()) + .createActionPopupMenu(ToolWindowContentUi.POPUP_PLACE, gearProducer.produce(), new MenuItemPresentationFactory(true)); int x = 0; int y = 0; @@ -122,9 +126,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { popupMenu.getComponent().show(inputEvent.getComponent(), x, y); } - }, ourSettingsIcon)); - - eastPanel.add(Box.createHorizontalStrut(3)); + }, ourSettingsIcon); myHideButton = new ActionButton(new HideAction() { @Override @@ -137,7 +139,7 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { sideHidden(); } }, - ourHideLeftSideIcon, null, null + ourHideLeftSideIcon, null, null ) { @Override protected Icon getActiveIcon() { @@ -150,7 +152,8 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { } }; - eastPanel.add(myHideButton); + addDefaultActions(eastPanel); + myButtonPanel = eastPanel; addMouseListener(new PopupHandler() { public void invokePopup(final Component comp, final int x, final int y) { @@ -180,6 +183,13 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { setBorder(BorderFactory.createEmptyBorder(TabsUtil.TABS_BORDER, 1, TabsUtil.TABS_BORDER, 1)); } + private void addDefaultActions(JPanel eastPanel) { + eastPanel.add(myGearButton); + eastPanel.add(Box.createHorizontalStrut(6)); + eastPanel.add(myHideButton); + eastPanel.add(Box.createHorizontalStrut(1)); + } + @Override public void dispose() { removeAll(); @@ -192,7 +202,23 @@ public abstract class ToolWindowHeader extends JPanel implements Disposable { myHideButton.updateTooltip(); } } - + + public void setAdditionalTitleActions(AnAction[] actions) { + myButtonPanel.removeAll(); + boolean actionAdded = false; + for (AnAction action : actions) { + if (action == null) continue; + myButtonPanel.add(new ActionButton(action, action.getTemplatePresentation().getIcon())); + myButtonPanel.add(Box.createHorizontalStrut(7)); + actionAdded = true; + } + if (actionAdded) { + myButtonPanel.add(new JLabel(ourSeparatorIcon)); + myButtonPanel.add(Box.createHorizontalStrut(6)); + } + addDefaultActions(myButtonPanel); + } + private static Icon getHideToolWindowIcon(ToolWindow toolWindow) { ToolWindowAnchor anchor = toolWindow.getAnchor(); if (anchor == ToolWindowAnchor.BOTTOM) { diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java index 7b25a70d32b6..3e302e59735f 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/ToolWindowImpl.java @@ -434,7 +434,7 @@ public final class ToolWindowImpl implements ToolWindowEx { } public void showContentPopup(InputEvent inputEvent) { - myContentUI.showContentPopup(inputEvent); + myContentUI.toggleContentPopup(inputEvent); } @Override diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java index 0267330d2410..868c303cb024 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ContentComboLabel.java @@ -52,7 +52,7 @@ public class ContentComboLabel extends BaseLabel { super.processMouseEvent(e); if (UIUtil.isActionClick(e)) { - myUi.showContentPopup(e); + myUi.toggleContentPopup(e); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java index f546e5eeafab..491c441c4cc9 100644 --- a/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java +++ b/platform/platform-impl/src/com/intellij/openapi/wm/impl/content/ToolWindowContentUi.java @@ -21,7 +21,7 @@ import com.intellij.ide.actions.ShowContentAction; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.ActionManagerImpl; import com.intellij.openapi.actionSystem.impl.MenuItemPresentationFactory; -import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.ui.popup.ListPopup; import com.intellij.openapi.ui.popup.ListSeparator; import com.intellij.openapi.ui.popup.PopupStep; import com.intellij.openapi.ui.popup.util.BaseListPopupStep; @@ -34,6 +34,7 @@ import com.intellij.ui.awt.RelativeRectangle; import com.intellij.ui.content.*; import com.intellij.ui.content.tabs.PinToolwindowTabAction; import com.intellij.ui.content.tabs.TabbedContentAction; +import com.intellij.ui.popup.list.ListPopupImpl; import com.intellij.ui.switcher.SwitchProvider; import com.intellij.ui.switcher.SwitchTarget; import com.intellij.util.ui.UIUtil; @@ -76,6 +77,7 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh ContentLayout myComboLayout = new ComboContentLayout(this); private ToolWindowContentUiType myType = ToolWindowContentUiType.TABBED; + private boolean myShouldNotShowPopup; public ToolWindowContentUi(ToolWindowImpl window) { myWindow = window; @@ -420,7 +422,11 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh return getCurrentLayout() == layout; } - public void showContentPopup(InputEvent inputEvent) { + public void toggleContentPopup(InputEvent inputEvent) { + if (myShouldNotShowPopup) { + myShouldNotShowPopup = false; + return; + } BaseListPopupStep step = new BaseListPopupStep(null, myManager.getContents()) { @Override public PopupStep onChosen(Content selectedValue, boolean finalChoice) { @@ -453,8 +459,21 @@ public class ToolWindowContentUi extends JPanel implements ContentUI, PropertyCh }; step.setDefaultOptionIndex(Arrays.asList(myManager.getContents()).indexOf(myManager.getSelectedContent())); - getCurrentLayout().showContentPopup(JBPopupFactory.getInstance().createListPopup(step)); - + final ListPopup popup = new ListPopupImpl(step) { + @Override + public void cancel(InputEvent e) { + super.cancel(e); + if (e instanceof MouseEvent) { + final MouseEvent me = (MouseEvent)e; + final Component component = SwingUtilities.getDeepestComponentAt(e.getComponent(), me.getX(), me.getY()); + if (UIUtil.isActionClick(me) && component instanceof ContentComboLabel && + SwingUtilities.isDescendingFrom(component, ToolWindowContentUi.this)) { + myShouldNotShowPopup = true; + } + } + } + }; + getCurrentLayout().showContentPopup(popup); } public List getTargets(boolean onlyVisible, boolean originalProvider) { 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 10dc319a7e46..f30c4362fd6b 100644 --- a/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java +++ b/platform/testFramework/src/com/intellij/testFramework/fixtures/impl/CodeInsightTestFixtureImpl.java @@ -68,6 +68,7 @@ import com.intellij.openapi.editor.markup.GutterIconRenderer; import com.intellij.openapi.editor.markup.RangeHighlighter; import com.intellij.openapi.extensions.ExtensionPoint; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.extensions.ExtensionsArea; import com.intellij.openapi.fileEditor.*; import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider; @@ -152,6 +153,7 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig @NonNls private static final String XXX = "XXX"; private final FileTreeAccessFilter myJavaFilesFilter = new FileTreeAccessFilter(); private boolean myAllowDirt; + private final Map myExtensions = new HashMap(); public CodeInsightTestFixtureImpl(IdeaProjectTestFixture projectFixture, TempDirTestFixture tempDirTestFixture) { myProjectFixture = projectFixture; @@ -1024,6 +1026,10 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig DaemonCodeAnalyzerSettings.getInstance().setImportHintEnabled(false); ensureIndexesUpToDate(getProject()); ((StartupManagerImpl)StartupManagerEx.getInstanceEx(getProject())).runPostStartupActivities(); + LocalInspectionEP[] extensions = Extensions.getExtensions(LocalInspectionEP.LOCAL_INSPECTION); + for (LocalInspectionEP extension : extensions) { + myExtensions.put(extension.shortName, extension); + } } @Override @@ -1057,9 +1063,15 @@ public class CodeInsightTestFixtureImpl extends BaseFixture implements CodeInsig HighlightDisplayKey.register(shortName, tool.getDisplayName(), id); } myAvailableTools.put(shortName, tool); - myAvailableLocalTools.put(shortName, tool instanceof LocalInspectionTool ? - new LocalInspectionToolWrapper((LocalInspectionTool)tool) : - (InspectionTool)tool); + InspectionTool inspectionTool; + if (tool instanceof LocalInspectionTool) { + LocalInspectionEP ep = myExtensions.get(tool.getShortName()); + inspectionTool = new LocalInspectionToolWrapper((LocalInspectionTool)tool, ep); + } + else { + inspectionTool = (InspectionTool)tool; + } + myAvailableLocalTools.put(shortName, inspectionTool); } private void configureInspections(final InspectionProfileEntry[] tools) { diff --git a/plugins/devkit/devkit.iml b/plugins/devkit/devkit.iml index 996d0202eb8c..e9caa7d79161 100644 --- a/plugins/devkit/devkit.iml +++ b/plugins/devkit/devkit.iml @@ -25,6 +25,7 @@ + diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java index 3134de7f1fb7..e043f207ba3e 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java @@ -14,7 +14,6 @@ import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.JDOMUtil; import com.intellij.openapi.util.Ref; import com.intellij.openapi.vcs.VcsException; @@ -37,7 +36,6 @@ import git4idea.i18n.GitBundle; import git4idea.ui.GitUIUtil; import org.jetbrains.plugins.github.ui.GithubShareDialog; -import javax.swing.*; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -98,17 +96,14 @@ public class GithubShareAction extends DumbAwareAction { final GithubSettings settings = GithubSettings.getInstance(); final String password = settings.getPassword(); - final boolean privateRepoAllowed; - try { - privateRepoAllowed = GithubUtil.accessToGithubWithModalProgress(project, new Computable() { - @Override - public Boolean compute() { - ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - return GithubUtil.isPrivateRepoAllowed(settings.getHost(), settings.getLogin(), password); - } - }); - } - catch (GithubUtil.CancelledException ex) { + final Boolean privateRepoAllowed = GithubUtil.accessToGithubWithModalProgress(project, new Computable() { + @Override + public Boolean compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); + return GithubUtil.isPrivateRepoAllowed(settings.getHost(), settings.getLogin(), password); + } + }); + if (privateRepoAllowed == null) { return; } final GithubShareDialog shareDialog = new GithubShareDialog(project, names, privateRepoAllowed); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java index b9cf47431b05..3be5b107733e 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java @@ -66,31 +66,21 @@ public class GithubUtil { return url.startsWith("https://") ? url.substring(8) : url.startsWith("http://") ? url.substring(7) : url.startsWith("git@") ? url.substring(4) : url; } - public static T accessToGithubWithModalProgress(final Project project, final Computable computable) throws CancelledException { + public static T accessToGithubWithModalProgress(final Project project, final Computable computable) { final Ref result = new Ref(); ProgressManager.getInstance().run(new Task.Modal(project, "Access to GitHub", true) { public void run(@NotNull ProgressIndicator indicator) { result.set(computable.compute()); } - - @Override - public void onCancel() { - throw new CancelledException(); - } }); return result.get(); } - public static void accessToGithubWithModalProgress(final Project project, final Runnable runnable) throws CancelledException { + public static void accessToGithubWithModalProgress(final Project project, final Runnable runnable) { ProgressManager.getInstance().run(new Task.Modal(project, "Access to GitHub", true) { public void run(@NotNull ProgressIndicator indicator) { runnable.run(); } - - @Override - public void onCancel() { - throw new CancelledException(); - } }); } @@ -246,8 +236,6 @@ public class GithubUtil { }); } - public static class CancelledException extends RuntimeException {} - /** * Shows GitHub login settings if credentials are wrong or empty and return the list of all the watched repos by user * @param project @@ -263,20 +251,15 @@ public class GithubUtil { } } // Otherwise our credentials are valid and they are successfully stored in settings - try { - final GithubSettings settings = GithubSettings.getInstance(); - final String validPassword = settings.getPassword(); - return accessToGithubWithModalProgress(project, new Computable>() { - @Override - public List compute() { - ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); - return getAvailableRepos(settings.getHost(), settings.getLogin(), validPassword, ownOnly); - } - }); - } - catch (CancelledException e) { - return null; - } + final GithubSettings settings = GithubSettings.getInstance(); + final String validPassword = settings.getPassword(); + return accessToGithubWithModalProgress(project, new Computable>() { + @Override + public List compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Extracting info about available repositories"); + return getAvailableRepos(settings.getHost(), settings.getLogin(), validPassword, ownOnly); + } + }); } /** @@ -288,17 +271,14 @@ public class GithubUtil { public static RepositoryInfo getDetailedRepositoryInfo(final Project project, final String owner, final String name) { final GithubSettings settings = GithubSettings.getInstance(); final String password = settings.getPassword(); - final boolean validCredentials; - try { - validCredentials = accessToGithubWithModalProgress(project, new Computable() { - @Override - public Boolean compute() { - ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); - return testConnection(settings.getHost(), settings.getLogin(), password); - } - }); - } - catch (CancelledException e) { + final Boolean validCredentials = accessToGithubWithModalProgress(project, new Computable() { + @Override + public Boolean compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Trying to login to GitHub"); + return testConnection(settings.getHost(), settings.getLogin(), password); + } + }); + if (validCredentials == null) { return null; } if (!validCredentials){ @@ -309,19 +289,14 @@ public class GithubUtil { } } // Otherwise our credentials are valid and they are successfully stored in settings - try { - final String validPassword = settings.getPassword(); - return accessToGithubWithModalProgress(project, new Computable() { - @Override - public RepositoryInfo compute() { - ProgressManager.getInstance().getProgressIndicator().setText("Extracting detailed info about repository ''" + name + "''"); - return getDetailedRepoInfo(settings.getHost(), settings.getLogin(), validPassword, owner, name); - } - }); - } - catch (CancelledException e) { - return null; - } + final String validPassword = settings.getPassword(); + return accessToGithubWithModalProgress(project, new Computable() { + @Override + public RepositoryInfo compute() { + ProgressManager.getInstance().getProgressIndicator().setText("Extracting detailed info about repository ''" + name + "''"); + return getDetailedRepoInfo(settings.getHost(), settings.getLogin(), validPassword, owner, name); + } + }); } @Nullable diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties index f5e53960a867..5f9d36c8c1ca 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/GroovyIntentionsBundle.properties @@ -5,8 +5,8 @@ intention.category.comments=Comments intention.category.groovy.style=Groovy-style intention.category.control.flow=Control Flow demorgans.law.intention.family.name=DeMorgan's Law -demorgans.intention.name1=Replace \\&\\& with || -demorgans.intention.name2=Replace || with \\&\\& +demorgans.intention.name1=Replace ''\\&\\&'' with ''||'' +demorgans.intention.name2=Replace ''||'' with ''\\&\\&'' merge.if.and.intention.name=Merge if's merge.if.and.intention.family.name=Merge Nested Ifs To ANDed Condition make.closure.call.explicit.intention.name=Make closure call explicit @@ -32,9 +32,9 @@ convert.integer.to.octal.intention.name=Convert to octal convert.integer.to.octal.intention.family.name=Convert To Octal convert.integer.to.binary.intention.name=Convert to binary convert.integer.to.binary.intention.family.name=Convert To Binary -flip.comparison.intention.name=Flip {0} to {1} -negate.comparison.intention.name=Negate {0} to {1} -flip.smth.intention.name=Flip {0} +flip.comparison.intention.name=Flip ''{0}'' to ''{1}'' +negate.comparison.intention.name=Negate ''{0}'' to ''{1}'' +flip.smth.intention.name=Flip ''{0}'' merge.else.if.intention.name=Merge else-if merge.else.if.intention.family.name=Merge Else If split.else.if.intention.name=Split else-if @@ -43,7 +43,7 @@ split.if.intention.name=Split into 2 if's split.if.intention.family.name=Split into 2 if's invert.if.intention.name=Invert If Condition invert.if.intention.family.name=Invert If Condition -flip.conditional.intention.name=Flip ?: +flip.conditional.intention.name=Flip ''?:'' flip.conditional.intention.family.name=Flip Conditional conditional.to.elvis.intention.name=Convert Conditional to Elvis conditional.to.elvis.intention.family.name=Convert Conditional diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/FlipComparisonIntention.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/FlipComparisonIntention.java index 639c3db3b54e..1517bb072ac5 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/FlipComparisonIntention.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/intentions/control/FlipComparisonIntention.java @@ -37,6 +37,10 @@ public class FlipComparisonIntention extends MutablyNamedIntention { final String comparison = ComparisonUtils.getStringForComparison(tokenType); final String flippedComparison = ComparisonUtils.getFlippedComparison(tokenType); + if (comparison.equals(flippedComparison)) { + return GroovyIntentionsBundle.message("flip.smth.intention.name", comparison); + } + return GroovyIntentionsBundle.message("flip.comparison.intention.name", comparison, flippedComparison); } diff --git a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java index a58bc2d06605..822325d1ab13 100644 --- a/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java +++ b/plugins/junit_rt/src/com/intellij/junit4/JUnit4TestRunnerUtil.java @@ -15,7 +15,6 @@ */ package com.intellij.junit4; -import com.intellij.rt.execution.junit.JUnitForkedStarter; import org.junit.Ignore; import org.junit.internal.AssumptionViolatedException; import org.junit.internal.requests.ClassRequest; @@ -82,13 +81,10 @@ public class JUnit4TestRunnerUtil { allClasses = JUnit46ClassesRequestBuilder.getClassesRequest(suiteName, classes); } catch (ClassNotFoundException e) { - try { - Class.forName("org.junit.internal.requests.ClassesRequest"); - allClasses = JUnit4ClassesRequestBuilder.getClassesRequest(suiteName, classes); - } - catch (ClassNotFoundException e1) { - allClasses = JUnit45ClassesRequestBuilder.getClassesRequest(suiteName, classes); - } + allClasses = getClassRequestsUsing44API(suiteName, classes); + } + catch (NoSuchMethodError e) { + allClasses = getClassRequestsUsing44API(suiteName, classes); } return classMethods.isEmpty() ? allClasses : allClasses.filterWith(new Filter() { @@ -160,6 +156,18 @@ public class JUnit4TestRunnerUtil { return result.size() == 1 ? Request.aClass((Class)result.get(0)) : Request.classes(getArrayOfClasses(result)); } + private static Request getClassRequestsUsing44API(String suiteName, Class[] classes) { + Request allClasses; + try { + Class.forName("org.junit.internal.requests.ClassesRequest"); + allClasses = JUnit4ClassesRequestBuilder.getClassesRequest(suiteName, classes); + } + catch (ClassNotFoundException e1) { + allClasses = JUnit45ClassesRequestBuilder.getClassesRequest(suiteName, classes); + } + return allClasses; + } + private static void appendTestClass(Vector result, String className) { final Class aClass = loadTestClass(className); if (!result.contains(aClass)) { //do not append classes twice: rerun failed tests from one test suite diff --git a/resources/src/META-INF/IdeaPlugin.xml b/resources/src/META-INF/IdeaPlugin.xml index cb291100c94c..67cf4dc7faa9 100644 --- a/resources/src/META-INF/IdeaPlugin.xml +++ b/resources/src/META-INF/IdeaPlugin.xml @@ -430,7 +430,7 @@ - implements DomAnchor(parentAnchor, description, index); } - private static void diagnoseNegativeIndex(T t, - DomElement parent, - AbstractDomChildrenDescription description, - List values) { + private static void diagnoseNegativeIndex2(T t, + DomElement parent, + AbstractDomChildrenDescription description, + List values) { final XmlTag parentTag = parent.getXmlTag(); StringBuilder diag = new StringBuilder("Index<0: description=" + description + "\nparent=" + parent + "\nt=" + t + "\nvalues=" + values + "\n"); - for (DomElement value : values) { + for (int i = 0, size = values.size(); i < size; i++) { + DomElement value = values.get(i); if (value.toString().equals(t.toString())) { - diag.append(" hasSame, same=" + (value == t) + + final XmlElement tElement = t.getXmlElement(); + final XmlElement valElement = value.getXmlElement(); + diag.append(" hasSame, i=" + i + + "; same=" + (value == t) + ", equal=" + value.equals(t) + ", equal2=" + t.equals(value) + - ", sameElements=" + (t.getXmlElement() == value.getXmlElement()) + + ", t.physical=" + (tElement == null ? "null" : String.valueOf(tElement.isPhysical())) + + ", value.physical=" + (valElement == null ? "null" : String.valueOf(valElement.isPhysical())) + + ", sameElements=" + (tElement == value.getXmlElement()) + "\n"); + if (tElement != null && valElement != null) { + diag.append(" sameFile=" + (tElement.getContainingFile() == valElement.getContainingFile()) + + ", sameParent=" + (tElement.getParent() == valElement.getParent()) + + "\n"); + } } } @@ -106,7 +117,7 @@ public abstract class DomAnchorImpl implements DomAnchor= totalCount) { return null; @@ -117,7 +117,7 @@ public class DomSemContributor extends SemContributor { final DomManagerImpl myDomManager = parent.getManager(); final IndexedElementInvocationHandler handler = new IndexedElementInvocationHandler(parent.createEvaluatedXmlName(description.getXmlName()), (FixedChildDescriptionImpl)description, index, - new PhysicalDomParentStrategy(tag, myDomManager), myDomManager, namespace); + new PhysicalDomParentStrategy(tag, myDomManager), myDomManager); tag.putUserData(DomManagerImpl.CACHED_DOM_HANDLER, handler); return handler; } diff --git a/xml/dom-impl/src/com/intellij/util/xml/impl/IndexedElementInvocationHandler.java b/xml/dom-impl/src/com/intellij/util/xml/impl/IndexedElementInvocationHandler.java index d75843d5ed05..2e5bbe6a069a 100644 --- a/xml/dom-impl/src/com/intellij/util/xml/impl/IndexedElementInvocationHandler.java +++ b/xml/dom-impl/src/com/intellij/util/xml/impl/IndexedElementInvocationHandler.java @@ -20,17 +20,14 @@ import java.util.List; public class IndexedElementInvocationHandler extends DomInvocationHandler{ private static final Logger LOG = Logger.getInstance("#com.intellij.util.xml.impl.IndexedElementInvocationHandler"); private final int myIndex; - private String myNamespace; public IndexedElementInvocationHandler(final EvaluatedXmlName tagName, final FixedChildDescriptionImpl description, final int index, final DomParentStrategy strategy, - final DomManagerImpl manager, - final String namespace) { + final DomManagerImpl manager) { super(description.getType(), strategy, tagName, description, manager, strategy.getXmlElement() != null); myIndex = index; - myNamespace = namespace; } @SuppressWarnings({"EqualsWhichDoesntCheckParameterClass"}) @@ -49,9 +46,7 @@ public class IndexedElementInvocationHandler extends DomInvocationHandler tags = DomImplUtil.findSubTags(tag, getXmlName(), parentHandler.getFile()); if (tags.size() <= myIndex) return null; - final XmlTag childTag = tags.get(myIndex); - myNamespace = childTag.getNamespace(); - return childTag; + return tags.get(myIndex); } protected XmlTag setEmptyXmlTag() { @@ -62,9 +57,7 @@ public class IndexedElementInvocationHandler extends DomInvocationHandler tags = DomImplUtil.findSubTags(parent.getXmlTag(), getXmlName(), xmlFile); if (tags.size() > myIndex) { - final XmlTag tag = tags.get(myIndex); - myNamespace = tag.getNamespace(); - return tag; + return tags.get(myIndex); } final XmlTag[] newTag = new XmlTag[1]; @@ -79,7 +72,6 @@ public class IndexedElementInvocationHandler extends DomInvocationHandler