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 extends InspectionProfileEntry> 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 extends DomElement> values) {
+ private static void diagnoseNegativeIndex2(T t,
+ DomElement parent,
+ AbstractDomChildrenDescription description,
+ List extends DomElement> 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