diff options
author | Tor Norbye <tnorbye@google.com> | 2013-08-15 14:06:37 -0700 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-08-15 14:06:37 -0700 |
commit | a3c36999a717e0d9923378ca5e0ae1160118c1e6 (patch) | |
tree | eda7fde5565d08649c0f5952e957a5ff4b2070d5 /plugins | |
parent | d1129abbe4dc0ce9bbad9118a35a85dbebc8758f (diff) | |
download | idea-a3c36999a717e0d9923378ca5e0ae1160118c1e6.tar.gz |
Snapshot 13baaa319cd568c4e19b9232b24f2002f2631688 from master branch of git://git.jetbrains.org/idea/community.git
Change-Id: I2ede7fef748e781ed425346a4e03e721bf4d2610
Diffstat (limited to 'plugins')
324 files changed, 2345 insertions, 1320 deletions
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties index e0b804182b35..7da4e0620beb 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/InspectionGadgetsBundle.properties @@ -742,7 +742,7 @@ misordered.assert.equals.parameters.display.name=Misordered 'assertEquals()' arg unnecessary.constructor.display.name=Redundant no-arg constructor method.name.same.as.parent.name.display.name=Method name same as parent class name java.lang.reflect.display.name=Use of 'java.lang.reflect' -while.can.be.foreach.display.name='while' loop replaceable with 'for each' +while.can.be.foreach.display.name='while' loop replaceable with 'foreach' big.decimal.equals.display.name='equals()' called on java.math.BigDecimal wait.not.in.synchronized.context.display.name='wait()' while not synchronized implicit.call.to.super.display.name=Implicit call to 'super()' @@ -761,7 +761,7 @@ chained.method.call.display.name=Chained method calls notify.not.in.synchronized.context.display.name='notify()' or 'notifyAll()' while not synchronized safe.lock.display.name=Lock acquired but not safely unlocked system.run.finalizers.on.exit.display.name=Call to 'System.runFinalizersOnExit()' -for.can.be.foreach.display.name='for' loop replaceable with 'for each' +for.can.be.foreach.display.name='for' loop replaceable with 'foreach' type.parameter.extends.object.display.name=Type parameter explicitly extends 'java.lang.Object' marker.interface.display.name=Marker interface limited.scope.inner.class.display.name=Limited-scope inner class @@ -994,8 +994,8 @@ for.loop.replaceable.by.while.problem.descriptor=<code>#ref</code> loop statemen unnecessary.default.problem.descriptor=<code>#ref</code> branch is unnecessary #loc unnecessary.boxing.problem.descriptor=Unnecessary boxing <code>#ref</code> #loc unnecessary.unboxing.problem.descriptor=Unnecessary unboxing <code>#ref</code> #loc -for.can.be.foreach.problem.descriptor=<code>#ref</code> loop replaceable with 'for each' #loc -while.can.be.foreach.problem.descriptor=<code>#ref</code> loop replaceable with 'for each' #loc +for.can.be.foreach.problem.descriptor=<code>#ref</code> loop replaceable with 'foreach' #loc +while.can.be.foreach.problem.descriptor=<code>#ref</code> loop replaceable with 'foreach' #loc too.broad.scope.problem.descriptor=Scope of variable <code>#ref</code> is too broad #loc return.this.problem.descriptor=Return of <code>#ref</code> #loc constant.on.lhs.of.comparison.problem.descriptor=<code>#ref</code>: constant on left side of comparison #loc @@ -1201,7 +1201,7 @@ for.loop.with.missing.component.problem.descriptor5=<code>#ref</code> statement for.loop.with.missing.component.problem.descriptor6=<code>#ref</code> statement lacks condition and update #loc for.loop.with.missing.component.problem.descriptor7=<code>#ref</code> statement lacks initializer, condition and update #loc if.statement.with.identical.branches.collapse.quickfix=Collapse 'if' statement -foreach.replace.quickfix=Replace with 'for each' +foreach.replace.quickfix=Replace with 'foreach' unnecessary.boxing.remove.quickfix=Remove boxing unnecessary.unboxing.remove.quickfix=Remove unboxing misordered.assert.equals.parameters.flip.quickfix=Flip compared arguments diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/InspectionGadgetsFix.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/InspectionGadgetsFix.java index 4ad523c1a662..1aa6827a32c5 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/InspectionGadgetsFix.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/InspectionGadgetsFix.java @@ -127,7 +127,7 @@ public abstract class InspectionGadgetsFix implements LocalQuickFix { final Project project = statement.getProject(); final CodeStyleManager styleManager = CodeStyleManager.getInstance(project); final JavaCodeStyleManager javaStyleManager = JavaCodeStyleManager.getInstance(project); - if (FileTypeUtils.isInJsp(statement)) { + if (FileTypeUtils.isInServerPageFile(statement)) { final PsiDocumentManager documentManager = PsiDocumentManager.getInstance(project); final PsiFile jspFile = PsiUtilCore.getTemplateLanguageFile(statement); if (jspFile == null) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EmptyStatementBodyInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EmptyStatementBodyInspection.java index 722c2d1396d1..5e3b4c4d185c 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EmptyStatementBodyInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/bugs/EmptyStatementBodyInspection.java @@ -106,7 +106,7 @@ public class EmptyStatementBodyInspection extends BaseInspection { } private void checkLoopStatement(PsiLoopStatement statement) { - if (FileTypeUtils.isInJsp(statement)) { + if (FileTypeUtils.isInServerPageFile(statement)) { return; } final PsiStatement body = statement.getBody(); @@ -119,7 +119,7 @@ public class EmptyStatementBodyInspection extends BaseInspection { @Override public void visitIfStatement(@NotNull PsiIfStatement statement) { super.visitIfStatement(statement); - if (FileTypeUtils.isInJsp(statement)) { + if (FileTypeUtils.isInServerPageFile(statement)) { return; } final PsiStatement thenBranch = statement.getThenBranch(); @@ -140,7 +140,7 @@ public class EmptyStatementBodyInspection extends BaseInspection { @Override public void visitSwitchStatement(PsiSwitchStatement statement) { super.visitSwitchStatement(statement); - if (FileTypeUtils.isInJsp(statement)) { + if (FileTypeUtils.isInServerPageFile(statement)) { return; } final PsiCodeBlock body = statement.getBody(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryContinueInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryContinueInspection.java index 05b4bb65b334..36a0dc906022 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryContinueInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryContinueInspection.java @@ -70,7 +70,7 @@ public class UnnecessaryContinueInspection extends BaseInspection { @Override public void visitContinueStatement(@NotNull PsiContinueStatement statement) { - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } final PsiStatement continuedStatement = statement.findContinuedStatement(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryReturnInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryReturnInspection.java index 42d07b5fce94..5c8f1df3857b 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryReturnInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/controlflow/UnnecessaryReturnInspection.java @@ -80,7 +80,7 @@ public class UnnecessaryReturnInspection extends BaseInspection { @Override public void visitReturnStatement(@NotNull PsiReturnStatement statement) { super.visitReturnStatement(statement); - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } if (statement.getReturnValue() != null) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java index ca336ff2cdfa..07b77868fcce 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/dataflow/TooBroadScopeInspectionBase.java @@ -216,7 +216,7 @@ public class TooBroadScopeInspectionBase extends BaseInspection { return; } } - if (insertionPoint != null && FileTypeUtils.isInJsp(insertionPoint)) { + if (insertionPoint != null && FileTypeUtils.isInServerPageFile(insertionPoint)) { PsiElement elementBefore = insertionPoint.getPrevSibling(); elementBefore = PsiTreeUtil.skipSiblingsBackward(elementBefore, PsiWhiteSpace.class); if (elementBefore instanceof PsiDeclarationStatement) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyCatchBlockInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyCatchBlockInspection.java index f5db89a1e4c9..207e5e790c9b 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyCatchBlockInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyCatchBlockInspection.java @@ -119,7 +119,7 @@ public class EmptyCatchBlockInspection extends BaseInspection { @Override public void visitTryStatement(@NotNull PsiTryStatement statement) { super.visitTryStatement(statement); - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } if (m_ignoreTestCases && TestUtils.isInTestCode(statement)) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyFinallyBlockInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyFinallyBlockInspection.java index d2e428efa669..41ed5757eee9 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyFinallyBlockInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyFinallyBlockInspection.java @@ -150,7 +150,7 @@ public class EmptyFinallyBlockInspection extends BaseInspection { public void visitTryStatement( @NotNull PsiTryStatement statement) { super.visitTryStatement(statement); - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } final PsiCodeBlock finallyBlock = statement.getFinallyBlock(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyTryBlockInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyTryBlockInspection.java index 346d07f11bf8..57003f5f4a0a 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyTryBlockInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/errorhandling/EmptyTryBlockInspection.java @@ -54,7 +54,7 @@ public class EmptyTryBlockInspection extends BaseInspection { @Override public void visitTryStatement(@NotNull PsiTryStatement statement) { super.visitTryStatement(statement); - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } final PsiCodeBlock finallyBlock = statement.getTryBlock(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/JavaLangImportInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/JavaLangImportInspection.java index 691ccef9331f..36c31ac74792 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/JavaLangImportInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/JavaLangImportInspection.java @@ -60,7 +60,7 @@ public class JavaLangImportInspection extends BaseInspection { if (!(aClass.getParent() instanceof PsiJavaFile)) { return; } - if (FileTypeUtils.isInJsp(aClass.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(aClass.getContainingFile())) { return; } final PsiJavaFile file = (PsiJavaFile)aClass.getContainingFile(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/OnDemandImportInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/OnDemandImportInspection.java index 0115add4d475..d9d9dd9445c2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/OnDemandImportInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/OnDemandImportInspection.java @@ -51,7 +51,7 @@ public class OnDemandImportInspection extends BaseInspection { return; } final PsiJavaFile file = (PsiJavaFile)parent; - if (FileTypeUtils.isInJsp(aClass.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(aClass.getContainingFile())) { return; } if (!file.getClasses()[0].equals(aClass)) { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SamePackageImportInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SamePackageImportInspection.java index 5764a3022f83..579a20bd8861 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SamePackageImportInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SamePackageImportInspection.java @@ -59,7 +59,7 @@ public class SamePackageImportInspection extends BaseInspection { if (!(parent instanceof PsiJavaFile)) { return; } - if (FileTypeUtils.isInJsp(importList)) { + if (FileTypeUtils.isInServerPageFile(importList)) { return; } final PsiJavaFile javaFile = (PsiJavaFile)parent; diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SingleClassImportInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SingleClassImportInspection.java index f358ed0421f3..91692ab21eb2 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SingleClassImportInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/SingleClassImportInspection.java @@ -54,7 +54,7 @@ public class SingleClassImportInspection extends BaseInspection { if (!(aClass.getParent() instanceof PsiJavaFile)) { return; } - if (FileTypeUtils.isInJsp(aClass.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(aClass.getContainingFile())) { return; } final PsiJavaFile file = (PsiJavaFile)aClass.getParent(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/UnusedImportInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/UnusedImportInspection.java index 3df4e44f2f99..49c58d15ba56 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/UnusedImportInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/imports/UnusedImportInspection.java @@ -58,7 +58,7 @@ public class UnusedImportInspection extends BaseInspection { @Override public void visitJavaFile(PsiJavaFile file) { - if (FileTypeUtils.isInJsp(file)) { + if (FileTypeUtils.isInServerPageFile(file)) { return; } final PsiClass[] classes = file.getClasses(); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/PrivateMemberAccessBetweenOuterAndInnerClassInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/PrivateMemberAccessBetweenOuterAndInnerClassInspection.java index f62c0bb899f4..da421765b2ea 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/PrivateMemberAccessBetweenOuterAndInnerClassInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/j2me/PrivateMemberAccessBetweenOuterAndInnerClassInspection.java @@ -170,7 +170,7 @@ public class PrivateMemberAccessBetweenOuterAndInnerClassInspection @Override public void visitNewExpression(PsiNewExpression expression) { - if (FileTypeUtils.isInJsp(expression)) { + if (FileTypeUtils.isInServerPageFile(expression)) { return; } super.visitNewExpression(expression); @@ -214,7 +214,7 @@ public class PrivateMemberAccessBetweenOuterAndInnerClassInspection @Override public void visitReferenceExpression( @NotNull PsiReferenceExpression expression) { - if (FileTypeUtils.isInJsp(expression)) { + if (FileTypeUtils.isInServerPageFile(expression)) { // disable for jsp files IDEADEV-12957 return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java index 96567a0c06d0..c7c734b55f93 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javabeans/ClassWithoutConstructorInspection.java @@ -104,7 +104,7 @@ public class ClassWithoutConstructorInspection extends BaseInspection { public void visitClass(@NotNull PsiClass aClass) { // no call to super, so it doesn't drill down if (aClass.isInterface() || aClass.isEnum() || - aClass.isAnnotationType() || FileTypeUtils.isInJsp(aClass)) { + aClass.isAnnotationType() || FileTypeUtils.isInServerPageFile(aClass)) { return; } if (aClass instanceof PsiTypeParameter || diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java index 5d6f7139b2f2..0befc94fb7ad 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/jdk/AutoUnboxingInspection.java @@ -57,19 +57,6 @@ public class AutoUnboxingInspection extends BaseInspection { s_unboxingMethods.put("char", "charValue"); } - @NonNls static final Set<String> unboxableTypes = new HashSet(9); - static { - unboxableTypes.add(CommonClassNames.JAVA_LANG_BYTE); - unboxableTypes.add(CommonClassNames.JAVA_LANG_SHORT); - unboxableTypes.add(CommonClassNames.JAVA_LANG_INTEGER); - unboxableTypes.add(CommonClassNames.JAVA_LANG_LONG); - unboxableTypes.add(CommonClassNames.JAVA_LANG_FLOAT); - unboxableTypes.add(CommonClassNames.JAVA_LANG_DOUBLE); - unboxableTypes.add(CommonClassNames.JAVA_LANG_BOOLEAN); - unboxableTypes.add(CommonClassNames.JAVA_LANG_CHARACTER); - unboxableTypes.add(CommonClassNames.JAVA_LANG_OBJECT); - } - @Override @NotNull public String getDisplayName() { @@ -384,7 +371,7 @@ public class AutoUnboxingInspection extends BaseInspection { if (TypeConversionUtil.isPrimitiveAndNotNull(expressionType)) { return; } - if (!isUnboxable(expressionType)) { + if (!TypeConversionUtil.isAssignableFromPrimitiveWrapper(expressionType)) { return; } final PsiType expectedType = ExpectedTypeUtils.findExpectedType(expression, false, true); @@ -393,14 +380,5 @@ public class AutoUnboxingInspection extends BaseInspection { } registerError(expression, expression); } - - private static boolean isUnboxable(PsiType type) { - if (!(type instanceof PsiClassType)) { - return false; - } - final PsiClassType classType = (PsiClassType)type; - final PsiClass aClass = classType.resolve(); - return aClass != null && unboxableTypes.contains(aClass.getQualifiedName()); - } } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java index a969b2f6e43e..98ec40b4dd99 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2011 Bas Leijdekkers + * Copyright 2010-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,23 +27,19 @@ import org.jetbrains.annotations.NotNull; import java.util.Set; -public class ExpectedExceptionNeverThrownInspection - extends BaseInspection { +public class ExpectedExceptionNeverThrownInspection extends BaseInspection { @Nls @NotNull @Override public String getDisplayName() { - return InspectionGadgetsBundle.message( - "expected.exception.never.thrown.display.name"); + return InspectionGadgetsBundle.message("expected.exception.never.thrown.display.name"); } @NotNull @Override protected String buildErrorString(Object... infos) { final PsiMethod method = (PsiMethod)infos[0]; - return InspectionGadgetsBundle.message( - "expected.exception.never.thrown.problem.descriptor", - method.getName()); + return InspectionGadgetsBundle.message("expected.exception.never.thrown.problem.descriptor", method.getName()); } @Override @@ -51,19 +47,16 @@ public class ExpectedExceptionNeverThrownInspection return new ExpectedExceptionNeverThrownVisitor(); } - private static class ExpectedExceptionNeverThrownVisitor - extends BaseInspectionVisitor { + private static class ExpectedExceptionNeverThrownVisitor extends BaseInspectionVisitor { @Override public void visitMethod(PsiMethod method) { super.visitMethod(method); - final PsiAnnotation annotation = - AnnotationUtil.findAnnotation(method, "org.junit.Test"); + final PsiAnnotation annotation = AnnotationUtil.findAnnotation(method, "org.junit.Test"); if (annotation == null) { return; } - final PsiAnnotationParameterList parameterList = - annotation.getParameterList(); + final PsiAnnotationParameterList parameterList = annotation.getParameterList(); final PsiNameValuePair[] attributes = parameterList.getAttributes(); PsiAnnotationMemberValue value = null; for (PsiNameValuePair attribute : attributes) { @@ -79,22 +72,19 @@ public class ExpectedExceptionNeverThrownInspection if (body == null) { return; } - final PsiClassObjectAccessExpression classObjectAccessExpression = - (PsiClassObjectAccessExpression)value; - final PsiTypeElement operand = - classObjectAccessExpression.getOperand(); + final PsiClassObjectAccessExpression classObjectAccessExpression = (PsiClassObjectAccessExpression)value; + final PsiTypeElement operand = classObjectAccessExpression.getOperand(); final PsiType type = operand.getType(); if (!(type instanceof PsiClassType)) { return; } final PsiClassType classType = (PsiClassType)type; final PsiClass aClass = classType.resolve(); - if (InheritanceUtil.isInheritor(aClass, - CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION)) { + if (InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_RUNTIME_EXCEPTION) || + InheritanceUtil.isInheritor(aClass, CommonClassNames.JAVA_LANG_ERROR)) { return; } - final Set<PsiClassType> exceptionsThrown = - ExceptionUtils.calculateExceptionsThrown(body); + final Set<PsiClassType> exceptionsThrown = ExceptionUtils.calculateExceptionsThrown(body); if (exceptionsThrown.contains(classType)) { return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/FileTypeUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/FileTypeUtils.java index 7f07a6bcad31..788812176db3 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/FileTypeUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/FileTypeUtils.java @@ -20,7 +20,7 @@ import com.intellij.psi.ServerPageFile; import com.intellij.psi.util.PsiUtilCore; public class FileTypeUtils { - public static boolean isInJsp(PsiElement file) { + public static boolean isInServerPageFile(PsiElement file) { return PsiUtilCore.getTemplateLanguageFile(file) instanceof ServerPageFile; } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java index 591f3266d920..2d1dfe539a43 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/ImportUtils.java @@ -124,7 +124,7 @@ public class ImportUtils { return false; } field = containingClass.findFieldByName(shortName, true); - if (field != null && PsiUtil.isAccessible(field, containingClass, null)) { + if (field != null && PsiUtil.isAccessible(containingClass.getProject(), field, containingClass, null)) { return false; } } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java index 0d83164dff0e..da190753b191 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/psiutils/WeakestTypeFinder.java @@ -15,6 +15,7 @@ */ package com.siyeh.ig.psiutils; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Comparing; import com.intellij.psi.*; import com.intellij.psi.search.GlobalSearchScope; @@ -531,11 +532,12 @@ public class WeakestTypeFinder { } @Nullable - private static PsiClass getVisibleInheritor(PsiClass superClass, PsiElement context) { + private static PsiClass getVisibleInheritor(@NotNull PsiClass superClass, PsiElement context) { final Query<PsiClass> search = DirectClassInheritorsSearch.search(superClass, context.getResolveScope()); + Project project = superClass.getProject(); for (PsiClass aClass : search) { if (superClass.isInheritor(aClass, true)) { - if (PsiUtil.isAccessible(aClass, context, null)) { + if (PsiUtil.isAccessible(project, aClass, context, null)) { return aClass; } else { diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/security/DesignForExtensionInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/security/DesignForExtensionInspection.java index 04052a32324d..7df6ad23aacd 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/security/DesignForExtensionInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/security/DesignForExtensionInspection.java @@ -47,7 +47,7 @@ public class DesignForExtensionInspection extends BaseInspection { @Override public void visitMethod(PsiMethod method) { - if (FileTypeUtils.isInJsp(method)) { + if (FileTypeUtils.isInServerPageFile(method)) { // IDEADEV-25538 return; } diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/EqualsCalledOnEnumConstantInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/EqualsCalledOnEnumConstantInspection.java index 08adf0c66e43..a134ce56f388 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/EqualsCalledOnEnumConstantInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/style/EqualsCalledOnEnumConstantInspection.java @@ -1,5 +1,5 @@ /* - * Copyright 2008 Bas Leijdekkers + * Copyright 2008-2013 Bas Leijdekkers * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import com.intellij.codeInspection.ProblemDescriptor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; -import com.intellij.util.IncorrectOperationException; +import com.intellij.psi.util.TypeConversionUtil; import com.siyeh.InspectionGadgetsBundle; import com.siyeh.ig.BaseInspection; import com.siyeh.ig.BaseInspectionVisitor; @@ -35,15 +35,13 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { @Nls @NotNull public String getDisplayName() { - return InspectionGadgetsBundle.message( - "equals.called.on.enum.constant.display.name"); + return InspectionGadgetsBundle.message("equals.called.on.enum.constant.display.name"); } @Override @NotNull protected String buildErrorString(Object... infos) { - return InspectionGadgetsBundle.message( - "equals.called.on.enum.constant.problem.descriptor"); + return InspectionGadgetsBundle.message("equals.called.on.enum.constant.problem.descriptor"); } @Override @@ -56,19 +54,16 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { return new EqualsCalledOnEnumValueFix(); } - private static class EqualsCalledOnEnumValueFix - extends InspectionGadgetsFix { + private static class EqualsCalledOnEnumValueFix extends InspectionGadgetsFix { @Override @NotNull public String getName() { - return InspectionGadgetsBundle.message( - "equals.called.on.enum.constant.quickfix"); + return InspectionGadgetsBundle.message("equals.called.on.enum.constant.quickfix"); } @Override - protected void doFix(Project project, ProblemDescriptor descriptor) - throws IncorrectOperationException { + protected void doFix(Project project, ProblemDescriptor descriptor) { final PsiElement element = descriptor.getPsiElement(); final PsiElement parent = element.getParent(); if (parent == null) { @@ -78,18 +73,14 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { if (!(grandParent instanceof PsiMethodCallExpression)) { return; } - final PsiMethodCallExpression methodCallExpression = - (PsiMethodCallExpression)grandParent; - final PsiExpressionList argumentList = - methodCallExpression.getArgumentList(); + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)grandParent; + final PsiExpressionList argumentList = methodCallExpression.getArgumentList(); final PsiExpression[] arguments = argumentList.getExpressions(); if (arguments.length > 1) { return; } - final PsiReferenceExpression methodExpression = - methodCallExpression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); + final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); + final PsiExpression qualifier = methodExpression.getQualifierExpression(); if (qualifier == null) { return; } @@ -99,8 +90,7 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { final PsiPrefixExpression prefixExpression; if (greatGrandParent instanceof PsiPrefixExpression) { prefixExpression = (PsiPrefixExpression)greatGrandParent; - final IElementType tokenType = - prefixExpression.getOperationTokenType(); + final IElementType tokenType = prefixExpression.getOperationTokenType(); not = JavaTokenType.EXCL == tokenType; } else { @@ -121,8 +111,7 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { replaceExpression(prefixExpression, newExpression.toString()); } else { - replaceExpression(methodCallExpression, - newExpression.toString()); + replaceExpression(methodCallExpression, newExpression.toString()); } } } @@ -132,22 +121,25 @@ public class EqualsCalledOnEnumConstantInspection extends BaseInspection { return new EqualsCalledOnEnumValueVisitor(); } - private static class EqualsCalledOnEnumValueVisitor - extends BaseInspectionVisitor { + private static class EqualsCalledOnEnumValueVisitor extends BaseInspectionVisitor { @Override - public void visitMethodCallExpression( - @NotNull PsiMethodCallExpression expression) { + public void visitMethodCallExpression(@NotNull PsiMethodCallExpression expression) { super.visitMethodCallExpression(expression); if (!MethodCallUtils.isEqualsCall(expression)) { return; } - final PsiReferenceExpression methodExpression = - expression.getMethodExpression(); - final PsiExpression qualifier = - methodExpression.getQualifierExpression(); - if (!TypeUtils.expressionHasTypeOrSubtype(qualifier, - CommonClassNames.JAVA_LANG_ENUM)) { + final PsiReferenceExpression methodExpression = expression.getMethodExpression(); + final PsiExpression qualifier = methodExpression.getQualifierExpression(); + if (qualifier == null || !TypeUtils.expressionHasTypeOrSubtype(qualifier, CommonClassNames.JAVA_LANG_ENUM)) { + return; + } + final PsiExpressionList argumentList = expression.getArgumentList(); + final PsiExpression[] arguments = argumentList.getExpressions(); + final PsiType comparedTypeErasure = TypeConversionUtil.erasure(qualifier.getType()); + final PsiType comparisonTypeErasure = TypeConversionUtil.erasure(arguments[0].getType()); + if (comparedTypeErasure == null || comparisonTypeErasure == null || + !TypeConversionUtil.areTypesConvertible(comparedTypeErasure, comparisonTypeErasure)) { return; } registerMethodCallError(expression, expression); diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/EmptySynchronizedStatementInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/EmptySynchronizedStatementInspection.java index 5707639cadbb..43060f727079 100644 --- a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/EmptySynchronizedStatementInspection.java +++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/threading/EmptySynchronizedStatementInspection.java @@ -52,7 +52,7 @@ public class EmptySynchronizedStatementInspection extends BaseInspection { public void visitSynchronizedStatement( @NotNull PsiSynchronizedStatement statement) { super.visitSynchronizedStatement(statement); - if (FileTypeUtils.isInJsp(statement.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(statement.getContainingFile())) { return; } final PsiCodeBlock body = statement.getBody(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassInTopLevelPackageInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassInTopLevelPackageInspection.java index c55b406145c3..9b5861c3b660 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassInTopLevelPackageInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassInTopLevelPackageInspection.java @@ -70,7 +70,7 @@ public class ClassInTopLevelPackageInspection extends BaseInspection { @Override public void visitClass(@NotNull PsiClass aClass) { // no call to super, so that it doesn't drill down to inner classes - if (FileTypeUtils.isInJsp(aClass)) { + if (FileTypeUtils.isInServerPageFile(aClass)) { return; } if (ClassUtils.isInnerClass(aClass)) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassNameDiffersFromFileNameInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassNameDiffersFromFileNameInspection.java index e8c9f4305a95..cd7c3c0f7a26 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassNameDiffersFromFileNameInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/ClassNameDiffersFromFileNameInspection.java @@ -71,7 +71,7 @@ public class ClassNameDiffersFromFileNameInspection extends BaseInspection { @Override public void visitClass(@NotNull PsiClass aClass) { // no call to super, so that it doesn't drill down to inner classes - if (FileTypeUtils.isInJsp(aClass)) { + if (FileTypeUtils.isInServerPageFile(aClass)) { return; } final PsiElement parent = aClass.getParent(); diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java index fce8f899721c..85b42f1ebd4b 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/classlayout/EmptyClassInspection.java @@ -126,7 +126,7 @@ public class EmptyClassInspection extends BaseInspection { @Override public void visitClass(@NotNull PsiClass aClass) { //don't call super, to prevent drilldown - if (FileTypeUtils.isInJsp(aClass.getContainingFile())) { + if (FileTypeUtils.isInServerPageFile(aClass.getContainingFile())) { return; } if (aClass.isInterface() || aClass.isEnum() || aClass.isAnnotationType()) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/imports/StaticImportInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/imports/StaticImportInspection.java index def9d4ffbd87..167e8007f640 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/imports/StaticImportInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/imports/StaticImportInspection.java @@ -277,7 +277,7 @@ public class StaticImportInspection extends BaseInspection { return; } final PsiJavaFile file = (PsiJavaFile)parent; - if (FileTypeUtils.isInJsp(file)) { + if (FileTypeUtils.isInServerPageFile(file)) { return; } if (!file.getClasses()[0].equals(aClass)) { diff --git a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java index b2feda02fc0e..b659021e92a5 100644 --- a/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java +++ b/plugins/InspectionGadgets/src/com/siyeh/ig/migration/WhileCanBeForeachInspection.java @@ -104,13 +104,30 @@ public class WhileCanBeForeachInspection extends BaseInspection { } final PsiReferenceExpression methodExpression = initializer.getMethodExpression(); final PsiExpression collection = methodExpression.getQualifierExpression(); + final PsiType collectionType; if (collection == null) { + final PsiClass aClass = PsiTreeUtil.getParentOfType(whileStatement, PsiClass.class); + if (aClass == null) { + return; + } + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(whileStatement.getProject()); + collectionType = factory.createType(aClass); + } + else { + collectionType = collection.getType(); + } + if (collectionType == null) { return; } - final PsiType contentType = getContentType(collection.getType(), collection); + final PsiType contentType = getContentType(collectionType, CommonClassNames.JAVA_LANG_ITERABLE, whileStatement); if (contentType == null) { return; } + final PsiType iteratorType = iterator.getType(); + final PsiType iteratorContentType = getContentType(iteratorType, "java.util.Iterator", whileStatement); + if (iteratorContentType == null) { + return; + } final Project project = whileStatement.getProject(); final PsiStatement firstStatement = getFirstStatement(body); final boolean isDeclaration = isIteratorNextDeclaration(firstStatement, iterator, contentType); @@ -130,28 +147,28 @@ public class WhileCanBeForeachInspection extends BaseInspection { if (collection instanceof PsiReferenceExpression) { final PsiJavaCodeReferenceElement referenceElement = (PsiJavaCodeReferenceElement)collection; final String collectionName = referenceElement.getReferenceName(); - contentVariableName = createNewVariableName(whileStatement, contentType, collectionName); + contentVariableName = createNewVariableName(whileStatement, iteratorContentType, collectionName); } else { - contentVariableName = createNewVariableName(whileStatement, contentType, null); + contentVariableName = createNewVariableName(whileStatement, iteratorContentType, null); } statementToSkip = null; } - final CodeStyleSettings codeStyleSettings = CodeStyleSettingsManager.getSettings(project); @NonNls final StringBuilder out = new StringBuilder(); out.append("for("); - if (codeStyleSettings.GENERATE_FINAL_PARAMETERS) { + if (CodeStyleSettingsManager.getSettings(project).GENERATE_FINAL_PARAMETERS) { out.append("final "); } - final PsiType iteratorContentType = getContentType(iterator.getType(), iterator); - if (iteratorContentType == null) { - return; - } out.append(iteratorContentType.getCanonicalText()).append(' ').append(contentVariableName).append(": "); if (!TypeConversionUtil.isAssignable(iteratorContentType, contentType)) { out.append("(java.lang.Iterable<").append(iteratorContentType.getCanonicalText()).append(">)"); } - out.append(collection.getText()).append(')'); + if (collection == null) { + out.append("this"); + } else { + out.append(collection.getText()); + } + out.append(')'); replaceIteratorNext(body, contentVariableName, iterator, contentType, statementToSkip, out); final Query<PsiReference> query = ReferencesSearch.search(iterator, iterator.getUseScope()); @@ -187,24 +204,41 @@ public class WhileCanBeForeachInspection extends BaseInspection { } @Nullable - private static PsiType getContentType(PsiType type, PsiElement context) { + private static PsiType getContentType(PsiType type, String containerClassName, PsiElement context) { if (!(type instanceof PsiClassType)) { return null; } final PsiClassType classType = (PsiClassType)type; - final PsiType[] parameters = classType.getParameters(); - if (parameters.length == 1) { - final PsiType parameterType = parameters[0]; - if (parameterType instanceof PsiCapturedWildcardType) { - final PsiCapturedWildcardType wildcardType = (PsiCapturedWildcardType)parameterType; - final PsiType bound = wildcardType.getUpperBound(); - if (bound != null) { - return bound; + final PsiClassType.ClassResolveResult resolveResult = classType.resolveGenerics(); + final PsiClass aClass = resolveResult.getElement(); + final Project project = context.getProject(); + + if (aClass == null) { + return null; + } + final PsiClass iterableClass = JavaPsiFacade.getInstance(project).findClass(containerClassName, aClass.getResolveScope()); + if (iterableClass == null) { + return null; + } + final PsiSubstitutor substitutor1 = resolveResult.getSubstitutor(); + final PsiSubstitutor substitutor = TypeConversionUtil.getClassSubstitutor(iterableClass, aClass, substitutor1); + if (substitutor == null) { + return null; + } + PsiType parameterType = substitutor.substitute(iterableClass.getTypeParameters()[0]); + if (parameterType instanceof PsiCapturedWildcardType) { + parameterType = ((PsiCapturedWildcardType)parameterType).getWildcard(); + } + if (parameterType != null) { + if (parameterType instanceof PsiWildcardType) { + if (((PsiWildcardType)parameterType).isExtends()) { + return ((PsiWildcardType)parameterType).getBound(); + } + else { + return null; } } - else if (parameterType != null) { - return parameterType; - } + return parameterType; } return TypeUtils.getObjectType(context); } @@ -320,7 +354,7 @@ public class WhileCanBeForeachInspection extends BaseInspection { baseName = "value"; } } - if (baseName == null || baseName.length() == 0) { + if (baseName == null || baseName.isEmpty()) { baseName = "value"; } return codeStyleManager.suggestUniqueVariableName(baseName, scope, true); @@ -395,19 +429,24 @@ public class WhileCanBeForeachInspection extends BaseInspection { return false; } final PsiExpression qualifier = initialMethodExpression.getQualifierExpression(); - if (qualifier == null) { + if (qualifier instanceof PsiSuperExpression) { return false; } - final PsiType qualifierType = qualifier.getType(); - if (!(qualifierType instanceof PsiClassType)) { - return false; + final PsiClass qualifierClass; + if (qualifier != null) { + final PsiType qualifierType = qualifier.getType(); + if (!(qualifierType instanceof PsiClassType)) { + return false; + } + qualifierClass = ((PsiClassType)qualifierType).resolve(); + } + else { + qualifierClass = PsiTreeUtil.getParentOfType(whileStatement, PsiClass.class); } - final PsiClass qualifierClass = ((PsiClassType)qualifierType).resolve(); if (qualifierClass == null) { return false; } - if (!InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_LANG_ITERABLE) && - !InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_UTIL_COLLECTION)) { + if (!InheritanceUtil.isInheritor(qualifierClass, CommonClassNames.JAVA_LANG_ITERABLE)) { return false; } final PsiExpression condition = whileStatement.getCondition(); diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.after.java new file mode 100644 index 000000000000..66bed9bde7a0 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.after.java @@ -0,0 +1,12 @@ +package com.siyeh.igfixes.migration.while_can_be_foreach; + +import java.util.Iterator; +import java.util.List; + +class Cast { + void m(List ss) { + for (String s : (Iterable<String>) ss) { + System.out.println(s); + } + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.java new file mode 100644 index 000000000000..8552ddaa3fd3 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/Cast.java @@ -0,0 +1,13 @@ +package com.siyeh.igfixes.migration.while_can_be_foreach; + +import java.util.Iterator; +import java.util.List; + +class Cast { + void m(List ss) { + final Iterator<String> iterator = ss.iterator(); + while<caret> (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.after.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.after.java new file mode 100644 index 000000000000..436a4597e100 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.after.java @@ -0,0 +1,18 @@ +package com.siyeh.igfixes.migration.while_can_be_foreach; + +import java.util.Iterator; +import java.util.List; + +class This implements Iterable { + + void m() { + for (Object o : this) { + System.out.println(o); + } + } + + @Override + public Iterator iterator() { + return null; + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.java b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.java new file mode 100644 index 000000000000..90134d288d86 --- /dev/null +++ b/plugins/InspectionGadgets/test/com/siyeh/igfixes/migration/while_can_be_foreach/This.java @@ -0,0 +1,19 @@ +package com.siyeh.igfixes.migration.while_can_be_foreach; + +import java.util.Iterator; +import java.util.List; + +class This implements Iterable { + + void m() { + final Iterator iterator = iterator(); + <caret>while (iterator.hasNext()) { + System.out.println(iterator.next()); + } + } + + @Override + public Iterator iterator() { + return null; + } +} diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java index cc872129b63e..a39bd53e4407 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/AutoUnboxing.java @@ -54,8 +54,9 @@ public class AutoUnboxing { } } - void m(Object o, Boolean b) { + void m(Object o, Boolean b, Number n) { if ((boolean) o) {} if ((boolean) b) {} + if ((int)n) {} } } diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml index b42d1de62abf..431f5ca55078 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/jdk/auto_unboxing/expected.xml @@ -98,4 +98,12 @@ <problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Auto-unboxing</problem_class> <description>Auto-unboxing <code>b</code> #loc</description> </problem> + + <problem> + <file>AutoUnboxing.java</file> + <line>60</line> + <problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Auto-unboxing</problem_class> + <description>Auto-unboxing <code>n</code> #loc</description> + </problem> + </problems>
\ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/while_can_be_foreach/WhileCanBeForeachInspection.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/while_can_be_foreach/WhileCanBeForeachInspection.java index 58b0d2f61df3..9452d00db652 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/while_can_be_foreach/WhileCanBeForeachInspection.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/migration/while_can_be_foreach/WhileCanBeForeachInspection.java @@ -99,3 +99,25 @@ public class WhileCanBeForeachInspection { } } } +class Base implements Iterable<String> { + @Override + public Iterator<String> iterator() { + return null; + } +} + +class Sub extends Base { + @Override + public Iterator<String> iterator() { + ArrayList<String> strings = new ArrayList<String>(); + Iterator<String> superIterator = super.iterator(); + + while (superIterator.hasNext()) { + String str = superIterator.next(); + + strings.add(str + str); + } + + return strings.iterator(); + } +}
\ No newline at end of file diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/equals_called_on_enum_constant/EqualsCalled.java b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/equals_called_on_enum_constant/EqualsCalled.java index 72cd8bf7f181..195c38b8e6e6 100644 --- a/plugins/InspectionGadgets/test/com/siyeh/igtest/style/equals_called_on_enum_constant/EqualsCalled.java +++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/style/equals_called_on_enum_constant/EqualsCalled.java @@ -13,3 +13,12 @@ public class EqualsCalled { A.equals(1); } } +class Main { + enum Suit { + SPADES, HEARTS, DIAMONDS, CLUBS + } + + private boolean equalsType(Suit suit, String type) { + return suit.equals(type); + } +} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java new file mode 100644 index 000000000000..0b2d7d2f9e5e --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/fixes/migration/WhileCanBeForeachFixTest.java @@ -0,0 +1,38 @@ +/* + * Copyright 2000-2012 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ig.fixes.migration; + +import com.siyeh.InspectionGadgetsBundle; +import com.siyeh.ig.IGQuickFixesTestCase; +import com.siyeh.ig.migration.UnnecessaryBoxingInspection; +import com.siyeh.ig.migration.WhileCanBeForeachInspection; + +public class WhileCanBeForeachFixTest extends IGQuickFixesTestCase { + @Override + protected void setUp() throws Exception { + super.setUp(); + myFixture.enableInspections(new WhileCanBeForeachInspection()); + myDefaultHint = InspectionGadgetsBundle.message("foreach.replace.quickfix"); + } + + public void testThis() { doTest(); } + public void testCast() { doTest(); } + + @Override + protected String getRelativePath() { + return "migration/while_can_be_foreach"; + } +} diff --git a/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspectionTest.java b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspectionTest.java new file mode 100644 index 000000000000..e057666843c8 --- /dev/null +++ b/plugins/InspectionGadgets/testsrc/com/siyeh/ig/junit/ExpectedExceptionNeverThrownInspectionTest.java @@ -0,0 +1,47 @@ +/** + * (c) 2013 Desert Island BV + * created: 14 08 2013 + */ +package com.siyeh.ig.junit; + +import com.intellij.codeInspection.LocalInspectionTool; +import com.siyeh.ig.LightInspectionTestCase; + +/** + * @author Bas Leijdekkers + */ +public class ExpectedExceptionNeverThrownInspectionTest extends LightInspectionTestCase { + @Override + protected LocalInspectionTool getInspection() { + return new ExpectedExceptionNeverThrownInspection(); + } + + @Override + protected String[] getEnvironmentClasses() { + return new String[] {"package org.junit; " + + "public @interface Test {\n" + + " java.lang.Class<? extends java.lang.Throwable> expected() default org.junit.Test.None.class;" + + "}"}; + } + + public void testSimple() { + doTest("class X {" + + " @org.junit.Test(expected=/*Expected 'java.io.IOException' never thrown in body of 'test()'*/java.io.IOException/**/.class)" + + " public void test() {}" + + "}"); + } + + public void testError() { + doTest("class X {" + + " @org.junit.Test(expected = Error.class)" + + " public void test() {}" + + "}"); + } + + public void testRuntimeException() { + doTest("class X {" + + " @org.junit.Test(expected = IllegalArgumentException.class)" + + " public void test() {}" + + "}"); + } +} diff --git a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java index 75fead477579..14222289e26c 100644 --- a/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java +++ b/plugins/IntelliLang/IntelliLang-tests/test/org/intellij/plugins/intelliLang/ReferenceInjectionTest.java @@ -6,7 +6,7 @@ import com.intellij.psi.PsiManager; import com.intellij.psi.PsiReference; import com.intellij.psi.impl.PsiModificationTrackerImpl; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase; +import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; import org.intellij.plugins.intelliLang.inject.InjectLanguageAction; import org.intellij.plugins.intelliLang.inject.UnInjectLanguageAction; import org.intellij.plugins.intelliLang.references.FileReferenceInjector; @@ -18,7 +18,7 @@ import org.jdom.Element; * @author Dmitry Avdeev * Date: 02.08.13 */ -public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestCase { +public class ReferenceInjectionTest extends LightCodeInsightFixtureTestCase { public void testInjectReference() throws Exception { @@ -87,11 +87,20 @@ public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestC assertNull(getInjectedReferences()); } + public void testInjectByAnnotation() throws Exception { + myFixture.configureByText("Foo.java", "class Foo {\n" + + " @org.intellij.lang.annotations.Language(\"file-reference\")\n" + + " String bar() {\n" + + " return \"<error descr=\"Cannot resolve file 'unknown.file'\">unknown.file</error>\";\n" + + " } \n" + + "}"); + myFixture.testHighlighting(); + } + private PsiReference[] getInjectedReferences() { PsiElement element = myFixture.getFile().findElementAt(myFixture.getCaretOffset()); element = PsiTreeUtil.getParentOfType(element, PsiLanguageInjectionHost.class); assertNotNull(element); - element.getReferences(); return InjectedReferencesContributor.getInjectedReferences(element); } @@ -106,9 +115,4 @@ public class ReferenceInjectionTest extends LightPlatformCodeInsightFixtureTestC myFixture.disableInspections(new InjectedReferencesInspection()); super.tearDown(); } - - @Override - protected boolean isWriteActionRequired() { - return false; - } } diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java index b2f1360b59d9..32378d0bc46c 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/ConcatenationInjector.java @@ -28,6 +28,7 @@ import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.injection.ReferenceInjector; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.search.LocalSearchScope; import com.intellij.psi.search.searches.ReferencesSearch; @@ -374,8 +375,15 @@ public class ConcatenationInjector implements ConcatenationAwareInjector { } private void processInjectionWithContext(BaseInjection injection, boolean settingsAvailable) { - final Language language = InjectedLanguage.findLanguageById(injection.getInjectedLanguageId()); - if (language == null) return; + Language language = InjectedLanguage.findLanguageById(injection.getInjectedLanguageId()); + if (language == null) { + ReferenceInjector injector = ReferenceInjector.findById(injection.getInjectedLanguageId()); + if (injector != null) { + language = injector.toLanguage(); + } + else return; + } + final boolean separateFiles = !injection.isSingleFile() && StringUtil.isNotEmpty(injection.getValuePattern()); final Ref<Boolean> unparsableRef = Ref.create(myUnparsable); diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java index 7bf11d2cdb65..a45393313a21 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/JavaLanguageInjectionSupport.java @@ -19,6 +19,7 @@ package org.intellij.plugins.intelliLang.inject.java; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.daemon.impl.quickfix.OrderEntryFix; import com.intellij.lang.Language; +import com.intellij.lang.injection.MultiHostRegistrar; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.Result; @@ -40,10 +41,7 @@ import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.ui.SimpleColoredText; import com.intellij.ui.SimpleTextAttributes; -import com.intellij.util.ArrayUtil; -import com.intellij.util.Consumer; -import com.intellij.util.NullableFunction; -import com.intellij.util.PlatformIcons; +import com.intellij.util.*; import com.intellij.util.containers.ContainerUtil; import gnu.trove.THashSet; import org.intellij.plugins.intelliLang.AdvancedSettingsUI; @@ -103,7 +101,7 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo public boolean addInjectionInPlace(final Language language, final PsiLanguageInjectionHost psiElement) { if (!isMine(psiElement)) return false; - return doInjectInJava(psiElement.getProject(), psiElement, language.getID()); + return doInjectInJava(psiElement.getProject(), psiElement, psiElement, language.getID()); } public boolean removeInjectionInPlace(final PsiLanguageInjectionHost psiElement) { @@ -141,7 +139,8 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo if (injectionsMap.isEmpty() || !annotations.isEmpty()) return false; final BaseInjection originalInjection = injectionsMap.keySet().iterator().next(); - final MethodParameterInjection methodParameterInjection = createFrom(psiElement.getProject(), originalInjection, injectionsMap.get(originalInjection).first, false); + final MethodParameterInjection methodParameterInjection = createFrom(psiElement.getProject(), originalInjection, + injectionsMap.get(originalInjection).first, false); final MethodParameterInjection copy = methodParameterInjection.copy(); final BaseInjection newInjection = showInjectionUI(project, methodParameterInjection); if (newInjection != null) { @@ -182,43 +181,66 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo else return new BaseInjection(JAVA_SUPPORT_ID); } - private static boolean doInjectInJava(final Project project, final PsiElement host, final String languageId) { - final PsiElement target = ContextComputationProcessor.getTopLevelInjectionTarget(host); + private static boolean doInjectInJava(final Project project, + final PsiElement psiElement, + PsiLanguageInjectionHost host, + final String languageId) { + final PsiElement target = ContextComputationProcessor.getTopLevelInjectionTarget(psiElement); final PsiElement parent = target.getParent(); if (parent instanceof PsiReturnStatement || parent instanceof PsiMethod || parent instanceof PsiNameValuePair) { - return doInjectInJavaMethod(project, findPsiMethod(parent), -1, languageId); + return doInjectInJavaMethod(project, findPsiMethod(parent), -1, host, languageId); } else if (parent instanceof PsiExpressionList && parent.getParent() instanceof PsiCallExpression) { - return doInjectInJavaMethod(project, findPsiMethod(parent), findParameterIndex(target, (PsiExpressionList)parent), languageId); + return doInjectInJavaMethod(project, findPsiMethod(parent), findParameterIndex(target, (PsiExpressionList)parent), host, languageId); } else if (parent instanceof PsiAssignmentExpression) { final PsiExpression psiExpression = ((PsiAssignmentExpression)parent).getLExpression(); if (psiExpression instanceof PsiReferenceExpression) { final PsiElement element = ((PsiReferenceExpression)psiExpression).resolve(); if (element != null) { - return doInjectInJava(project, element, languageId); + return doInjectInJava(project, element, host, languageId); } } } else if (parent instanceof PsiVariable) { - if (doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, languageId)) return true; + if (doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, host, languageId)) return true; } else if (target instanceof PsiVariable) { - if (doAddLanguageAnnotation(project, (PsiModifierListOwner)target, languageId)) return true; + if (doAddLanguageAnnotation(project, (PsiModifierListOwner)target, host, languageId)) return true; } return false; } - public static boolean doAddLanguageAnnotation(final Project project, final PsiModifierListOwner modifierListOwner, final String languageId) { - if (!Configuration.getProjectInstance(project).getAdvancedConfiguration().isSourceModificationAllowed()) return false; + public static boolean doAddLanguageAnnotation(final Project project, + final PsiModifierListOwner modifierListOwner, + @NotNull PsiLanguageInjectionHost host, + final String languageId) { if (modifierListOwner.getModifierList() == null || !PsiUtil.isLanguageLevel5OrHigher(modifierListOwner)) return false; - if (!OrderEntryFix.isAnnotationsJarInPath(ModuleUtilCore.findModuleForPsiElement(modifierListOwner))) { + final Configuration.AdvancedConfiguration configuration = Configuration.getProjectInstance(project).getAdvancedConfiguration(); + if (!configuration.isSourceModificationAllowed()) { // todo add languageId comment + host.putUserData(InjectLanguageAction.FIX_KEY, new Processor<PsiLanguageInjectionHost>() { + @Override + public boolean process(PsiLanguageInjectionHost host) { + boolean allowed = configuration.isSourceModificationAllowed(); + configuration.setSourceModificationAllowed(true); + try { + return doInjectInJava(project, host, host, languageId); + } + finally { + configuration.setSourceModificationAllowed(allowed); + } + } + }); + return false; } - new WriteCommandAction(project, modifierListOwner.getContainingFile()) { + if (!OrderEntryFix.ensureAnnotationsJarInPath(ModuleUtilCore.findModuleForPsiElement(modifierListOwner))) { + return false; + } + new WriteCommandAction(modifierListOwner.getProject(), modifierListOwner.getContainingFile()) { protected void run(final Result result) throws Throwable { JVMElementFactory factory = JVMElementFactories.getFactory(modifierListOwner.getLanguage(), modifierListOwner.getProject()); if (factory == null) { @@ -243,19 +265,21 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo public static boolean doInjectInJavaMethod(@NotNull final Project project, @Nullable final PsiMethod psiMethod, final int parameterIndex, - @NotNull final String languageId) { + @NotNull PsiLanguageInjectionHost host, @NotNull final String languageId) { if (psiMethod == null) return false; if (parameterIndex < -1) return false; if (parameterIndex >= psiMethod.getParameterList().getParametersCount()) return false; final PsiModifierList methodModifiers = psiMethod.getModifierList(); if (methodModifiers.hasModifierProperty(PsiModifier.PRIVATE) || methodModifiers.hasModifierProperty(PsiModifier.PACKAGE_LOCAL)) { - return doAddLanguageAnnotation(project, parameterIndex >= 0? psiMethod.getParameterList().getParameters()[parameterIndex] : psiMethod, languageId); + return doAddLanguageAnnotation(project, parameterIndex >= 0? psiMethod.getParameterList().getParameters()[parameterIndex] : psiMethod, + host, languageId); } final PsiClass containingClass = psiMethod.getContainingClass(); assert containingClass != null; final PsiModifierList classModifiers = containingClass.getModifierList(); if (classModifiers != null && (classModifiers.hasModifierProperty(PsiModifier.PRIVATE) || classModifiers.hasModifierProperty(PsiModifier.PACKAGE_LOCAL))) { - return doAddLanguageAnnotation(project, parameterIndex >= 0? psiMethod.getParameterList().getParameters()[parameterIndex] : psiMethod, languageId); + return doAddLanguageAnnotation(project, parameterIndex >= 0? psiMethod.getParameterList().getParameters()[parameterIndex] : psiMethod, + host, languageId); } final String className = containingClass.getQualifiedName(); @@ -427,7 +451,8 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo if (!visitedSignatures.add(methodInfo.getMethodSignature())) continue; if (isInjectable(method.getReturnType(), method.getProject())) { final int parameterIndex = -1; - int index = ArrayUtil.find(injection.getInjectionPlaces(), new InjectionPlace(compiler.compileElementPattern(getPatternStringForJavaPlace(method, parameterIndex)), true)); + int index = ArrayUtilRt.find(injection.getInjectionPlaces(), new InjectionPlace( + compiler.compileElementPattern(getPatternStringForJavaPlace(method, parameterIndex)), true)); final InjectionPlace place = index > -1 ? injection.getInjectionPlaces()[index] : null; methodInfo.setReturnFlag(place != null && place.isEnabled() || includeAllPlaces); add = true; @@ -436,7 +461,9 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo for (int i = 0; i < parameters.length; i++) { final PsiParameter p = parameters[i]; if (isInjectable(p.getType(), p.getProject())) { - int index = ArrayUtil.find(injection.getInjectionPlaces(), new InjectionPlace(compiler.compileElementPattern(getPatternStringForJavaPlace(method, i)), true)); + int index = ArrayUtilRt.find(injection.getInjectionPlaces(), + new InjectionPlace(compiler.compileElementPattern(getPatternStringForJavaPlace(method, i)), + true)); final InjectionPlace place = index > -1 ? injection.getInjectionPlaces()[index] : null; methodInfo.getParamFlags()[i] = place != null && place.isEnabled() || includeAllPlaces; add = true; @@ -519,6 +546,11 @@ public class JavaLanguageInjectionSupport extends AbstractLanguageInjectionSuppo } @Override + public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) { + + } + + @Override public String getHelpId() { return "reference.settings.injection.language.injection.settings.java.parameter"; } diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java index 1cd96284c005..c6cc44a12198 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/LanguageReference.java @@ -17,18 +17,19 @@ package org.intellij.plugins.intelliLang.inject.java; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; -import com.intellij.lang.Language; -import com.intellij.openapi.fileTypes.FileType; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiLiteralExpression; +import com.intellij.psi.injection.Injectable; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.ui.EmptyIcon; +import org.intellij.plugins.intelliLang.inject.InjectLanguageAction; import org.intellij.plugins.intelliLang.inject.InjectedLanguage; import org.intellij.plugins.intelliLang.util.StringLiteralReference; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * Provides completion for available Language-IDs in * <pre>@Language("[ctrl-space]")</pre> @@ -50,22 +51,13 @@ final class LanguageReference extends StringLiteralReference { @NotNull public Object[] getVariants() { - final String[] ids = InjectedLanguage.getAvailableLanguageIDs(); - return ContainerUtil.map2Array(ids, LookupElement.class, new Function<String, LookupElement>() { - public LookupElement fun(String s) { - final Language l = InjectedLanguage.findLanguageById(s); - assert l != null; - - final FileType ft = l.getAssociatedFileType(); - if (ft != null) { - return LookupElementBuilder.create(s).withIcon(ft.getIcon()).withTypeText(ft.getDescription()); -// } else if (l == StdLanguages.EL) { -// // IDEA-10012 -// return new LanguageLookupValue(s, StdFileTypes.JSP.getIcon(), "Expression Language"); - } - return LookupElementBuilder.create(s).withIcon(EmptyIcon.ICON_16); + List<Injectable> list = InjectLanguageAction.getAllInjectables(); + return ContainerUtil.map2Array(list, LookupElement.class, new Function<Injectable, LookupElement>() { + @Override + public LookupElement fun(Injectable injectable) { + return LookupElementBuilder.create(injectable.getId()).withIcon(injectable.getIcon()).withTailText( + "(" + injectable.getDisplayName() + ")", true); } }); } - } diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/UnknownLanguageID.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/UnknownLanguageID.java index 0fb9b31883e9..8e33447dba20 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/UnknownLanguageID.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/inject/java/validation/UnknownLanguageID.java @@ -19,8 +19,8 @@ import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; -import com.intellij.lang.Language; import com.intellij.psi.*; +import com.intellij.psi.injection.ReferenceInjector; import com.intellij.psi.util.PsiTreeUtil; import org.intellij.plugins.intelliLang.Configuration; import org.intellij.plugins.intelliLang.inject.InjectedLanguage; @@ -68,8 +68,7 @@ public class UnknownLanguageID extends LocalInspectionTool { final Object id = JavaPsiFacade.getInstance(expression.getProject()). getConstantEvaluationHelper().computeConstantExpression(expression); if (id instanceof String) { - final Language language = InjectedLanguage.findLanguageById((String)id); - if (language == null) { + if (InjectedLanguage.findLanguageById((String)id) == null && ReferenceInjector.findById((String)id) == null) { holder.registerProblem(expression, "Unknown language '" + id + "'", ProblemHighlightType.LIKE_UNKNOWN_SYMBOL); } } diff --git a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java index 2397b47701e5..0b4360c34a81 100644 --- a/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java +++ b/plugins/IntelliLang/java-support/org/intellij/plugins/intelliLang/util/AnnotationUtilEx.java @@ -44,7 +44,7 @@ public class AnnotationUtilEx { * @see AnnotationUtilEx#getAnnotatedElementFor(com.intellij.psi.PsiElement, LookupType) */ public enum LookupType { - PREFER_CONTEXT, PREFER_DECLARATION, CONTEXT_ONLY, DECLRARATION_ONLY + PREFER_CONTEXT, PREFER_DECLARATION, CONTEXT_ONLY, DECLARATION_ONLY } /** @@ -55,13 +55,13 @@ public class AnnotationUtilEx { @Nullable public static PsiModifierListOwner getAnnotatedElementFor(@Nullable PsiElement element, LookupType type) { while (element != null) { - if (type == LookupType.PREFER_DECLARATION || type == LookupType.DECLRARATION_ONLY) { + if (type == LookupType.PREFER_DECLARATION || type == LookupType.DECLARATION_ONLY) { if (element instanceof PsiReferenceExpression) { final PsiElement e = ((PsiReferenceExpression)element).resolve(); if (e instanceof PsiModifierListOwner) { return (PsiModifierListOwner)e; } - if (type == LookupType.DECLRARATION_ONLY) { + if (type == LookupType.DECLARATION_ONLY) { return null; } } @@ -105,7 +105,7 @@ public class AnnotationUtilEx { // If no annotation has been found through the usage context, check if the element // (i.e. the element the reference refers to) is annotated itself - if (type != LookupType.DECLRARATION_ONLY) { + if (type != LookupType.DECLARATION_ONLY) { if (element instanceof PsiReferenceExpression) { final PsiElement e = ((PsiReferenceExpression)element).resolve(); if (e instanceof PsiModifierListOwner) { @@ -186,7 +186,7 @@ public class AnnotationUtilEx { * <p/> * The <code>annotationName</code> parameter is a pair of the target annotation class' fully qualified name as a * String and as a Set. This is done for performance reasons because the Set is required by the - * {@link com.intellij.codeInsight.AnnotationUtil} utility class and allows to avoid unecessary object constructions. + * {@link com.intellij.codeInsight.AnnotationUtil} utility class and allows to avoid unnecessary object constructions. */ @NotNull public static PsiAnnotation[] getAnnotationFrom(PsiModifierListOwner owner, @@ -206,7 +206,7 @@ public class AnnotationUtilEx { * <p/> * The <code>annotationName</code> parameter is a pair of the target annotation class' fully qualified name as a * String and as a Set. This is done for performance reasons because the Set is required by the - * {@link com.intellij.codeInsight.AnnotationUtil} utility class and allows to avoid unecessary object constructions. + * {@link com.intellij.codeInsight.AnnotationUtil} utility class and allows to avoid unnecessary object constructions. */ public static PsiAnnotation[] getAnnotationsFromImpl(PsiModifierListOwner owner, diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/AbstractLanguageInjectionSupport.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/AbstractLanguageInjectionSupport.java index bcfd9c5c2b8a..80e5577f9aa7 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/AbstractLanguageInjectionSupport.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/AbstractLanguageInjectionSupport.java @@ -17,6 +17,7 @@ package org.intellij.plugins.intelliLang.inject; import com.intellij.lang.Language; +import com.intellij.lang.injection.MultiHostRegistrar; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.fileTypes.FileTypeManager; @@ -62,6 +63,9 @@ public abstract class AbstractLanguageInjectionSupport extends LanguageInjection return InjectorUtils.findCommentInjection(host, "comment", commentRef); } + public void getLanguagesToInject(@NotNull MultiHostRegistrar registrar, @NotNull PsiElement context) { + } + public boolean addInjectionInPlace(final Language language, final PsiLanguageInjectionHost psiElement) { return false; } diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java index 6ff3d9856996..0d6a2be57bf5 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/InjectLanguageAction.java @@ -17,27 +17,31 @@ package org.intellij.plugins.intelliLang.inject; import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer; import com.intellij.codeInsight.hint.HintManager; +import com.intellij.codeInsight.hint.QuestionAction; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.ide.util.PropertiesComponent; import com.intellij.injected.editor.EditorWindow; import com.intellij.lang.Language; import com.intellij.lang.injection.InjectedLanguageManager; +import com.intellij.openapi.actionSystem.ActionManager; +import com.intellij.openapi.actionSystem.IdeActions; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.popup.JBPopup; import com.intellij.openapi.ui.popup.PopupChooserBuilder; import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiLanguageInjectionHost; -import com.intellij.psi.PsiManager; +import com.intellij.psi.*; import com.intellij.psi.impl.PsiModificationTrackerImpl; +import com.intellij.psi.injection.Injectable; +import com.intellij.psi.injection.ReferenceInjector; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.ui.ColoredListCellRendererWrapper; import com.intellij.ui.SimpleTextAttributes; @@ -48,9 +52,7 @@ import com.intellij.util.IncorrectOperationException; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import org.intellij.plugins.intelliLang.Configuration; -import com.intellij.psi.injection.Injectable; import org.intellij.plugins.intelliLang.references.InjectedReferencesContributor; -import com.intellij.psi.injection.ReferenceInjector; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,6 +66,7 @@ import java.util.List; public class InjectLanguageAction implements IntentionAction { @NonNls private static final String INJECT_LANGUAGE_FAMILY = "Inject Language/Reference"; public static final String LAST_INJECTED_LANGUAGE = "LAST_INJECTED_LANGUAGE"; + public static final Key<Processor<PsiLanguageInjectionHost>> FIX_KEY = Key.create("inject fix key"); public static List<Injectable> getAllInjectables() { Language[] languages = InjectedLanguage.getAvailableLanguages(); @@ -120,12 +123,13 @@ public class InjectLanguageAction implements IntentionAction { }); } - public static void invokeImpl(Project project, Editor editor, PsiFile file, Injectable injectable) { + public static void invokeImpl(Project project, Editor editor, final PsiFile file, Injectable injectable) { final PsiLanguageInjectionHost host = findInjectionHost(editor, file); if (host == null) return; if (defaultFunctionalityWorked(host, injectable.getId())) return; try { + host.putUserData(FIX_KEY, null); Language language = injectable.toLanguage(); for (LanguageInjectionSupport support : InjectorUtils.getActiveInjectionSupports()) { if (support.isApplicableTo(host) && support.addInjectionInPlace(language, host)) { @@ -133,7 +137,26 @@ public class InjectLanguageAction implements IntentionAction { } } if (TemporaryPlacesRegistry.getInstance(project).getLanguageInjectionSupport().addInjectionInPlace(language, host)) { - HintManager.getInstance().showInformationHint(editor, StringUtil.escapeXml(language.getDisplayName()) + " was temporarily injected"); + final Processor<PsiLanguageInjectionHost> data = host.getUserData(FIX_KEY); + String text = StringUtil.escapeXml(language.getDisplayName()) + " was temporarily injected."; + if (data != null) { + if (!ApplicationManager.getApplication().isUnitTestMode()) { + final SmartPsiElementPointer<PsiLanguageInjectionHost> pointer = + SmartPointerManager.getInstance(project).createSmartPsiElementPointer(host); + final TextRange range = host.getTextRange(); + HintManager.getInstance().showQuestionHint(editor, text + "<br>Do you want to insert annotation? " + KeymapUtil + .getFirstKeyboardShortcutText(ActionManager.getInstance().getAction(IdeActions.ACTION_SHOW_INTENTION_ACTIONS)), + range.getStartOffset(), range.getEndOffset(), new QuestionAction() { + @Override + public boolean execute() { + return data.process(pointer.getElement()); + } + }); + } + } + else { + HintManager.getInstance().showInformationHint(editor, text); + } } } finally { diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/config/ui/ValueRegExpAnnotator.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/config/ui/ValueRegExpAnnotator.java index 2db97ef0c5fe..81a47321d0f6 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/config/ui/ValueRegExpAnnotator.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/inject/config/ui/ValueRegExpAnnotator.java @@ -26,6 +26,7 @@ import org.intellij.lang.regexp.psi.RegExpBranch; import org.intellij.lang.regexp.psi.RegExpGroup; import org.intellij.lang.regexp.psi.RegExpPattern; import org.intellij.lang.regexp.psi.RegExpRecursiveElementVisitor; +import org.jetbrains.annotations.NotNull; /** * Annotator that is used to validate the "Value-Pattern" textfield: The regex entered there should contain exactly @@ -42,7 +43,7 @@ public class ValueRegExpAnnotator implements Annotator { public ValueRegExpAnnotator() { } - public void annotate(PsiElement psiElement, AnnotationHolder holder) { + public void annotate(@NotNull PsiElement psiElement, @NotNull AnnotationHolder holder) { if (psiElement instanceof RegExpFile && psiElement.getCopyableUserData(KEY) == Boolean.TRUE) { final PsiElement pattern = psiElement.getFirstChild(); if (!(pattern instanceof RegExpPattern)) { diff --git a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java index 69d781992881..0ee07affca98 100644 --- a/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java +++ b/plugins/IntelliLang/src/org/intellij/plugins/intelliLang/references/InjectedReferencesContributor.java @@ -16,12 +16,15 @@ package org.intellij.plugins.intelliLang.references; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.*; +import com.intellij.psi.impl.source.tree.injected.InjectedLanguageUtil; +import com.intellij.psi.impl.source.tree.injected.InjectedReferenceVisitor; import com.intellij.psi.injection.ReferenceInjector; -import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; +import com.intellij.util.SmartList; import org.intellij.plugins.intelliLang.Configuration; import org.intellij.plugins.intelliLang.inject.InjectedLanguage; import org.intellij.plugins.intelliLang.inject.InjectorUtils; @@ -31,6 +34,7 @@ import org.intellij.plugins.intelliLang.inject.config.BaseInjection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -48,6 +52,7 @@ public class InjectedReferencesContributor extends PsiReferenceContributor { @Nullable public static PsiReference[] getInjectedReferences(PsiElement element) { + element.getReferences(); return element.getUserData(INJECTED_REFERENCES); } @@ -56,40 +61,53 @@ public class InjectedReferencesContributor extends PsiReferenceContributor { registrar.registerReferenceProvider(PlatformPatterns.psiElement(), new PsiReferenceProvider() { @NotNull @Override - public PsiReference[] getReferencesByElement(@NotNull PsiElement element, @NotNull ProcessingContext context) { + public PsiReference[] getReferencesByElement(@NotNull final PsiElement element, @NotNull final ProcessingContext context) { ReferenceInjector[] extensions = ReferenceInjector.EXTENSION_POINT_NAME.getExtensions(); - PsiReference[] references = new PsiReference[0]; + final List<PsiReference> references = new SmartList<PsiReference>(); Configuration configuration = Configuration.getProjectInstance(element.getProject()); - boolean injected = false; + final Ref<Boolean> injected = new Ref<Boolean>(Boolean.FALSE); for (ReferenceInjector injector : extensions) { Collection<BaseInjection> injections = configuration.getInjectionsByLanguageId(injector.getId()); for (BaseInjection injection : injections) { if (injection.acceptForReference(element)) { - injected = true; + injected.set(Boolean.TRUE); LanguageInjectionSupport support = InjectorUtils.findInjectionSupport(injection.getSupportId()); element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, support); List<TextRange> area = injection.getInjectedArea(element); for (TextRange range : area) { - references = ArrayUtil.mergeArrays(references, injector.getReferences(element, context, range)); + references.addAll(Arrays.asList(injector.getReferences(element, context, range))); } } } } if (element instanceof PsiLanguageInjectionHost) { - TemporaryPlacesRegistry registry = TemporaryPlacesRegistry.getInstance(element.getProject()); + final TemporaryPlacesRegistry registry = TemporaryPlacesRegistry.getInstance(element.getProject()); InjectedLanguage language = registry.getLanguageFor((PsiLanguageInjectionHost)element, element.getContainingFile()); if (language != null) { ReferenceInjector injector = ReferenceInjector.findById(language.getID()); if (injector != null) { - injected = true; + injected.set(Boolean.TRUE); element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, registry.getLanguageInjectionSupport()); TextRange range = ElementManipulators.getValueTextRange(element); - references = ArrayUtil.mergeArrays(references, injector.getReferences(element, context, range)); + references.addAll(Arrays.asList(injector.getReferences(element, context, range))); } } + else { + InjectedLanguageUtil.enumerate(element, element.getContainingFile(), false, new InjectedReferenceVisitor() { + @Override + public void visitInjectedReference(@NotNull ReferenceInjector injector, @NotNull List<PsiLanguageInjectionHost.Shred> places) { + injected.set(Boolean.TRUE); + element.putUserData(LanguageInjectionSupport.INJECTOR_SUPPORT, registry.getLanguageInjectionSupport()); + for (PsiLanguageInjectionHost.Shred place : places) { + references.addAll(Arrays.asList(injector.getReferences(element, context, place.getRangeInsideHost()))); + } + } + }); + } } - element.putUserData(INJECTED_REFERENCES, injected ? references : null); - return references; + PsiReference[] array = references.toArray(new PsiReference[references.size()]); + element.putUserData(INJECTED_REFERENCES, injected.get() ? array : null); + return array; } }); } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/braces/RemoveBracesIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/braces/RemoveBracesIntention.java index 658665d46555..b977e1c43cfd 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/braces/RemoveBracesIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/braces/RemoveBracesIntention.java @@ -15,9 +15,9 @@ */ package com.siyeh.ipp.braces; -import com.intellij.openapi.vfs.newvfs.impl.StubVirtualFile; import com.intellij.psi.*; import com.intellij.util.IncorrectOperationException; +import com.siyeh.ig.psiutils.FileTypeUtils; import com.siyeh.ipp.base.PsiElementPredicate; import org.jetbrains.annotations.NotNull; @@ -40,7 +40,7 @@ public class RemoveBracesIntention extends BaseBracesIntention { final PsiFile file = statement.getContainingFile(); //this intention doesn't work in JSP files, as it can't tell about tags // inside the braces - return !JspPsiUtil.isInJspFile(file); + return !FileTypeUtils.isInServerPageFile(file); } }; } diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfPredicate.java index e3b8c7a02edd..5fe305e286cc 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/conditional/ReplaceConditionalWithIfPredicate.java @@ -17,6 +17,7 @@ package com.siyeh.ipp.conditional; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; +import com.siyeh.ig.psiutils.FileTypeUtils; import com.siyeh.ipp.base.PsiElementPredicate; class ReplaceConditionalWithIfPredicate implements PsiElementPredicate { @@ -30,7 +31,7 @@ class ReplaceConditionalWithIfPredicate implements PsiElementPredicate { if (parent instanceof PsiExpressionStatement) { return false; } - if (JspPsiUtil.isInJspFile(element)) { + if (FileTypeUtils.isInServerPageFile(element)) { return false; } final PsiMember member = PsiTreeUtil.getParentOfType(element, PsiMember.class); diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/enumswitch/CreateEnumSwitchBranchesIntention.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/enumswitch/CreateEnumSwitchBranchesIntention.java index c82d84242192..59d1f366d1f6 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/enumswitch/CreateEnumSwitchBranchesIntention.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/enumswitch/CreateEnumSwitchBranchesIntention.java @@ -22,7 +22,9 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class CreateEnumSwitchBranchesIntention extends Intention { @@ -34,6 +36,7 @@ public class CreateEnumSwitchBranchesIntention extends Intention { public void processIntention(@NotNull PsiElement element) { if (element instanceof PsiWhiteSpace) { element = element.getPrevSibling(); + assert element != null; } final PsiSwitchStatement switchStatement = (PsiSwitchStatement)element; final PsiCodeBlock body = switchStatement.getBody(); @@ -50,62 +53,105 @@ public class CreateEnumSwitchBranchesIntention extends Intention { return; } final PsiField[] fields = enumClass.getFields(); - final List<String> missingEnumElements = new ArrayList<String>(fields.length); + final List<PsiEnumConstant> missingEnumElements = new ArrayList<PsiEnumConstant>(fields.length); for (final PsiField field : fields) { - if (field instanceof PsiEnumConstant) { - missingEnumElements.add(field.getName()); + if (!(field instanceof PsiEnumConstant)) { + continue; } + final PsiEnumConstant enumConstant = (PsiEnumConstant)field; + missingEnumElements.add(enumConstant); } - if (body != null) { - final PsiStatement[] statements = body.getStatements(); - for (final PsiStatement statement : statements) { - if (!(statement instanceof PsiSwitchLabelStatement)) { - continue; - } - final PsiSwitchLabelStatement labelStatement = (PsiSwitchLabelStatement)statement; - final PsiExpression value = labelStatement.getCaseValue(); - if (!(value instanceof PsiReferenceExpression)) { - continue; - } - final PsiReferenceExpression reference = (PsiReferenceExpression)value; - final PsiElement resolved = reference.resolve(); - if (!(resolved instanceof PsiEnumConstant)) { - continue; - } - final PsiEnumConstant enumConstant = (PsiEnumConstant)resolved; - missingEnumElements.remove(enumConstant.getName()); + if (body == null) { + // replace entire switch statement if no code block is present + @NonNls final StringBuilder newStatementText = new StringBuilder(); + newStatementText.append("switch(").append(switchExpression.getText()).append("){"); + for (PsiEnumConstant missingEnumElement : missingEnumElements) { + newStatementText.append("case ").append(missingEnumElement.getName()).append(": break;"); + } + newStatementText.append('}'); + replaceStatement(newStatementText.toString(), switchStatement); + return; + } + final Map<PsiEnumConstant, PsiEnumConstant> nextEnumConstants = new HashMap<PsiEnumConstant, PsiEnumConstant>(fields.length); + PsiEnumConstant previous = null; + for (PsiEnumConstant enumConstant : missingEnumElements) { + if (previous != null) { + nextEnumConstants.put(previous, enumConstant); } + previous = enumConstant; + } + final PsiStatement[] statements = body.getStatements(); + for (final PsiStatement statement : statements) { + missingEnumElements.remove(findEnumConstant(statement)); } - @NonNls final StringBuilder newStatementText = new StringBuilder(); - newStatementText.append("switch(").append(switchExpression.getText()).append("){"); - if (body != null) { - int position = 0; - final PsiElement[] children = body.getChildren(); - for (position = 1; position < children.length - 1; position++) { - final PsiElement child = children[position]; - if (child instanceof PsiSwitchLabelStatement) { - final PsiSwitchLabelStatement switchLabelStatement = (PsiSwitchLabelStatement)child; - if (switchLabelStatement.isDefaultCase()) { - break; - } + PsiEnumConstant nextEnumConstant = getNextEnumConstant(nextEnumConstants, missingEnumElements); + PsiElement bodyElement = body.getFirstBodyElement(); + while (bodyElement != null) { + while (nextEnumConstant != null && findEnumConstant(bodyElement) == nextEnumConstant) { + addSwitchLabelStatementBefore(missingEnumElements.get(0), bodyElement); + missingEnumElements.remove(0); + if (missingEnumElements.isEmpty()) { + break; } - newStatementText.append(child.getText()); + nextEnumConstant = getNextEnumConstant(nextEnumConstants, missingEnumElements); } - appendMissingEnumCases(missingEnumElements, newStatementText); - for (; position< children.length - 1; position++) { - newStatementText.append(children[position].getText()); + if (isDefaultSwitchLabelStatement(bodyElement)) { + for (PsiEnumConstant missingEnumElement : missingEnumElements) { + addSwitchLabelStatementBefore(missingEnumElement, bodyElement); + } + missingEnumElements.clear(); + break; + } + bodyElement = bodyElement.getNextSibling(); + } + if (!missingEnumElements.isEmpty()) { + final PsiElement lastChild = body.getLastChild(); + for (PsiEnumConstant missingEnumElement : missingEnumElements) { + addSwitchLabelStatementBefore(missingEnumElement, lastChild); } } - else { - appendMissingEnumCases(missingEnumElements, newStatementText); + } + + private static void addSwitchLabelStatementBefore(PsiEnumConstant missingEnumElement, PsiElement anchor) { + final PsiElement parent = anchor.getParent(); + final PsiElementFactory factory = JavaPsiFacade.getElementFactory(anchor.getProject()); + final PsiStatement caseStatement = factory.createStatementFromText("case " + missingEnumElement.getName() + ":", anchor); + parent.addBefore(caseStatement, anchor); + final PsiStatement breakStatement = factory.createStatementFromText("break;", anchor); + parent.addBefore(breakStatement, anchor); + } + + private static PsiEnumConstant findEnumConstant(PsiElement element) { + if (!(element instanceof PsiSwitchLabelStatement)) { + return null; + } + final PsiSwitchLabelStatement switchLabelStatement = (PsiSwitchLabelStatement)element; + final PsiExpression value = switchLabelStatement.getCaseValue(); + if (!(value instanceof PsiReferenceExpression)) { + return null; + } + final PsiReferenceExpression referenceExpression = (PsiReferenceExpression)value; + final PsiElement target = referenceExpression.resolve(); + if (!(target instanceof PsiEnumConstant)) { + return null; + } + return (PsiEnumConstant)target; + } + + private static PsiEnumConstant getNextEnumConstant(Map<PsiEnumConstant, PsiEnumConstant> nextEnumConstants, + List<PsiEnumConstant> missingEnumElements) { + PsiEnumConstant nextEnumConstant = nextEnumConstants.get(missingEnumElements.get(0)); + while (missingEnumElements.contains(nextEnumConstant)) { + nextEnumConstant = nextEnumConstants.get(nextEnumConstant); } - newStatementText.append('}'); - replaceStatement(newStatementText.toString(), switchStatement); + return nextEnumConstant; } - private static void appendMissingEnumCases(List<String> missingEnumElements, @NonNls StringBuilder newStatementText) { - for (String missingEnumElement : missingEnumElements) { - newStatementText.append("case ").append(missingEnumElement).append(": break;"); + private static boolean isDefaultSwitchLabelStatement(PsiElement element) { + if (!(element instanceof PsiSwitchLabelStatement)) { + return false; } + final PsiSwitchLabelStatement switchLabelStatement = (PsiSwitchLabelStatement)element; + return switchLabelStatement.isDefaultCase(); } }
\ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/BeforeDefault_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/BeforeDefault_after.java index 7a69b04e6403..be209306e2b4 100644 --- a/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/BeforeDefault_after.java +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/BeforeDefault_after.java @@ -4,15 +4,15 @@ class BeforeDefault { enum Status { ACTIVE, INACTIVE, ERROR } private void foo (Status status) { - switch (status) { - case ACTIVE: - break; - case INACTIVE: - break; - case ERROR: - break; - default: - throw new IllegalArgumentException("Unknown Status " + status); - } + switch (status) { + case ACTIVE: + break; + case INACTIVE: + break; + case ERROR: + break; + default: + throw new IllegalArgumentException("Unknown Status " + status); + } } }
\ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple.java new file mode 100644 index 000000000000..a96ac718cdbb --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple.java @@ -0,0 +1,10 @@ +class Main { + enum Status { ACTIVE, INACTIVE, ERROR } + + private void foo (Status status) { + switch<caret> (status) { + case ERROR: + break; + } + } +}
\ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple_after.java new file mode 100644 index 000000000000..3bdf9e5f632f --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/enumswitch/Multiple_after.java @@ -0,0 +1,14 @@ +class Main { + enum Status { ACTIVE, INACTIVE, ERROR } + + private void foo (Status status) { + switch (status) { + case ACTIVE: + break; + case INACTIVE: + break; + case ERROR: + break; + } + } +}
\ No newline at end of file diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/enumswitch/EnumSwitchBranchesIntentionTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/enumswitch/EnumSwitchBranchesIntentionTest.java index b8ae35f25f74..0cee31ba1abd 100644 --- a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/enumswitch/EnumSwitchBranchesIntentionTest.java +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/enumswitch/EnumSwitchBranchesIntentionTest.java @@ -18,10 +18,14 @@ package com.siyeh.ipp.enumswitch; import com.siyeh.IntentionPowerPackBundle; import com.siyeh.ipp.IPPTestCase; +/** + * @see CreateEnumSwitchBranchesIntention + */ public class EnumSwitchBranchesIntentionTest extends IPPTestCase { public void testWithoutBraces() { doTest(); } public void testBeforeDefault() { doTest(); } + public void testMultiple() { doTest(); } public void testNoActionAfterBraces() { assertIntentionNotAvailable(); } @Override diff --git a/plugins/android/lib/guava-13.0.1.jar b/plugins/android/lib/guava-13.0.1.jar Binary files differdeleted file mode 100644 index 09c5449115df..000000000000 --- a/plugins/android/lib/guava-13.0.1.jar +++ /dev/null diff --git a/plugins/android/lib/jarutils.jar b/plugins/android/lib/jarutils.jar Binary files differdeleted file mode 100644 index 1259ccfd6e44..000000000000 --- a/plugins/android/lib/jarutils.jar +++ /dev/null diff --git a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java index 8e7ae3a0cff0..1534e16bd7cf 100644 --- a/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java +++ b/plugins/ant/src/com/intellij/lang/ant/config/impl/AntConfigurationImpl.java @@ -830,7 +830,7 @@ public class AntConfigurationImpl extends AntConfigurationBase implements Persis return; } if (configName != null) { - for (RunConfiguration configuration : runManager.getConfigurations(type)) { + for (RunConfiguration configuration : runManager.getConfigurationsList(type)) { if (configName.equals(configuration.getName())) { final List<AntBeforeRunTask> tasks = runManager.getBeforeRunTasks(configuration, AntBeforeRunTaskProvider.ID); if (!tasks.isEmpty()) { diff --git a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/ui/experts/SelectLocationStep.java b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/ui/experts/SelectLocationStep.java index e53fb4ecb704..3cb19b6200db 100644 --- a/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/ui/experts/SelectLocationStep.java +++ b/plugins/cvs/cvs-plugin/src/com/intellij/cvsSupport2/ui/experts/SelectLocationStep.java @@ -29,6 +29,7 @@ import com.intellij.openapi.fileChooser.ex.FileDrop; import com.intellij.openapi.fileChooser.ex.FileTextFieldImpl; import com.intellij.openapi.fileChooser.ex.LocalFsFinder; import com.intellij.openapi.fileChooser.impl.FileChooserFactoryImpl; +import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.vfs.VfsUtil; @@ -295,8 +296,8 @@ public abstract class SelectLocationStep extends WizardStep { } protected void onSetActive(final boolean active) { - final String tooltip = AnAction.createTooltipText(ActionsBundle.message("action.FileChooser.TogglePathShowing.text"), - ActionManager.getInstance().getAction("FileChooser.TogglePathShowing")); + final String tooltip = KeymapUtil.createTooltipText(ActionsBundle.message("action.FileChooser.TogglePathShowing.text"), + ActionManager.getInstance().getAction("FileChooser.TogglePathShowing")); setToolTipText(tooltip); } diff --git a/plugins/devkit/src/run/PluginRunConfigurationEditor.java b/plugins/devkit/src/run/PluginRunConfigurationEditor.java index 8b4ae5bdf778..a5165334b1df 100644 --- a/plugins/devkit/src/run/PluginRunConfigurationEditor.java +++ b/plugins/devkit/src/run/PluginRunConfigurationEditor.java @@ -185,7 +185,4 @@ public class PluginRunConfigurationEditor extends SettingsEditor<PluginRunConfig public RawCommandLineEditor getProgramParameters() { return myProgramParameters.getComponent(); } - - public void disposeEditor() { - } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubCreatePullRequestAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubCreatePullRequestAction.java index 472be8864dd7..99bf9aff7edd 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubCreatePullRequestAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubCreatePullRequestAction.java @@ -15,6 +15,7 @@ */ package org.jetbrains.plugins.github; +import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.components.ServiceManager; @@ -24,28 +25,45 @@ import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; +import com.intellij.openapi.ui.DialogWrapper; +import com.intellij.openapi.ui.Splitter; import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vcs.VcsException; +import com.intellij.openapi.vcs.changes.Change; +import com.intellij.openapi.vcs.changes.ui.ChangesBrowser; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.ui.TabbedPaneImpl; +import com.intellij.util.Consumer; import com.intellij.util.Function; import com.intellij.util.ThrowableConsumer; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.HashSet; +import com.intellij.util.ui.UIUtil; import git4idea.DialogManager; +import git4idea.GitCommit; import git4idea.GitLocalBranch; +import git4idea.GitRemoteBranch; +import git4idea.changes.GitChangeUtils; import git4idea.commands.Git; import git4idea.commands.GitCommandResult; +import git4idea.history.GitHistoryUtils; import git4idea.repo.GitRemote; import git4idea.repo.GitRepository; +import git4idea.ui.GitCommitListPanel; +import icons.Git4ideaIcons; import icons.GithubIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.github.api.*; import org.jetbrains.plugins.github.ui.GithubCreatePullRequestDialog; +import javax.swing.*; +import java.awt.*; import java.io.IOException; -import java.util.ArrayList; +import java.util.*; import java.util.List; import static org.jetbrains.plugins.github.GithubUtil.setVisibleEnabled; @@ -69,11 +87,6 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { return; } - if (!GithubSettings.getInstance().isAuthConfigured()) { - setVisibleEnabled(e, false, false); - return; - } - final GitRepository gitRepository = GithubUtil.getGitRepository(project, file); if (gitRepository == null) { setVisibleEnabled(e, false, false); @@ -108,6 +121,7 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, "Can't find git repository"); return; } + repository.update(); final Pair<GitRemote, String> remote = GithubUtil.findGithubRemote(repository); if (remote == null) { @@ -136,9 +150,24 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { if (info == null) { return; } + final Set<RemoteBranch> branches = getAvailableBranchesFromGit(repository); + branches.addAll(info.getBranches()); - String suggestedBranch = info.getRepo().getParent() == null ? null : info.getRepo().getParent().getUserName() + ":master"; - final GithubCreatePullRequestDialog dialog = new GithubCreatePullRequestDialog(project, info.getBranches(), suggestedBranch); + GithubRepo parent = info.getRepo().getParent(); + String suggestedBranch = parent == null ? null : parent.getUserName() + ":" + parent.getDefaultBranch(); + Collection<String> suggestions = ContainerUtil.map(branches, new Function<RemoteBranch, String>() { + @Override + public String fun(RemoteBranch remoteBranch) { + return remoteBranch.getReference(); + } + }); + Consumer<String> showDiff = new Consumer<String>() { + @Override + public void consume(String s) { + showDiffByRef(project, s, branches, repository, currentBranch.getName()); + } + }; + final GithubCreatePullRequestDialog dialog = new GithubCreatePullRequestDialog(project, suggestions, suggestedBranch, showDiff); DialogManager.show(dialog); if (!dialog.isOK()) { return; @@ -155,9 +184,20 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { return; } - LOG.info("Performing create request"); - indicator.setText("Performing create request..."); - GithubPullRequest request = createPullRequest(project, info, dialog, currentBranch.getName(), upstreamUserAndRepo); + String from = info.getRepo().getUserName() + ":" + currentBranch.getName(); + String onto = dialog.getTargetBranch(); + GithubAuthData auth = info.getAuthData(); + + GithubFullPath targetRepo = findTargetRepository(project, auth, onto, info.getRepo(), upstreamUserAndRepo, branches); + if (targetRepo == null) { + GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, "Can't find repository for specified branch: " + onto); + return; + } + + LOG.info("Creating pull request"); + indicator.setText("Creating pull request..."); + GithubPullRequest request = + createPullRequest(project, auth, targetRepo, dialog.getRequestTitle(), dialog.getDescription(), from, onto); if (request == null) { return; } @@ -185,7 +225,7 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { reposRef.set(GithubApiUtil.getDetailedRepoInfo(authData, userAndRepo.getUser(), userAndRepo.getRepository())); } }); - List<String> branches = loadAvailableBranches(project, auth, reposRef.get(), upstreamUserAndRepo); + List<RemoteBranch> branches = loadAvailableBranchesFromGithub(project, auth, reposRef.get(), upstreamUserAndRepo); githubInfoRef.set(new GithubInfo(auth, reposRef.get(), branches)); } catch (IOException e) { @@ -204,43 +244,22 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { } @Nullable - private static GithubPullRequest createPullRequest(@NotNull Project project, - @NotNull GithubInfo info, - @NotNull final GithubCreatePullRequestDialog dialog, - @NotNull final String headBranch, - @Nullable final GithubFullPath upstreamPath) { - GithubAuthData auth = info.getAuthData(); - GithubRepoDetailed repo = info.getRepo(); - - String from = repo.getUserName() + ":" + headBranch; - String onto = dialog.getTargetBranch(); - - GithubFullPath target = getTargetRepository(project, auth, onto, repo, upstreamPath); - if (target == null) { - GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, "Can't find repository for specified branch: " + onto); - return null; - } - - try { - return GithubApiUtil - .createPullRequest(auth, target.getUser(), target.getRepository(), dialog.getRequestTitle(), dialog.getDescription(), from, onto); - } - catch (IOException e) { - GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, e); - return null; - } - } - - @Nullable - private static GithubFullPath getTargetRepository(@NotNull Project project, - @NotNull GithubAuthData auth, - @NotNull String onto, - @NotNull GithubRepoDetailed repo, - @Nullable GithubFullPath upstreamPath) { + private static GithubFullPath findTargetRepository(@NotNull Project project, + @NotNull GithubAuthData auth, + @NotNull String onto, + @NotNull GithubRepoDetailed repo, + @Nullable GithubFullPath upstreamPath, + @NotNull Collection<RemoteBranch> branches) { String targetUser = onto.substring(0, onto.indexOf(':')); @Nullable GithubRepo parent = repo.getParent(); @Nullable GithubRepo source = repo.getSource(); + for (RemoteBranch branch : branches) { + if (StringUtil.equalsIgnoreCase(targetUser, branch.getUser()) && branch.getRepo() != null) { + return new GithubFullPath(branch.getUser(), branch.getRepo()); + } + } + if (isRepoOwner(targetUser, repo)) { return repo.getFullPath(); } @@ -281,11 +300,47 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { return StringUtil.equalsIgnoreCase(user, repo.getUserName()); } - private static List<String> loadAvailableBranches(@NotNull final Project project, - @NotNull final GithubAuthData auth, - @NotNull final GithubRepoDetailed repo, - @Nullable final GithubFullPath upstreamPath) { - List<String> result = new ArrayList<String>(); + @Nullable + private static GithubPullRequest createPullRequest(@NotNull Project project, + @NotNull GithubAuthData auth, + @NotNull GithubFullPath targetRepo, + @NotNull String title, + @NotNull String description, + @NotNull String from, + @NotNull String onto) { + try { + return GithubApiUtil.createPullRequest(auth, targetRepo.getUser(), targetRepo.getRepository(), title, description, from, onto); + } + catch (IOException e) { + GithubNotifications.showError(project, CANNOT_CREATE_PULL_REQUEST, e); + return null; + } + } + + @NotNull + private static Set<RemoteBranch> getAvailableBranchesFromGit(@NotNull GitRepository gitRepository) { + Set<RemoteBranch> result = new HashSet<RemoteBranch>(); + for (GitRemoteBranch remoteBranch : gitRepository.getBranches().getRemoteBranches()) { + for (String url : remoteBranch.getRemote().getUrls()) { + if (GithubUrlUtil.isGithubUrl(url)) { + GithubFullPath path = GithubUrlUtil.getUserAndRepositoryFromRemoteUrl(url); + if (path != null) { + result.add(new RemoteBranch(path.getUser(), remoteBranch.getNameForRemoteOperations(), path.getRepository(), + remoteBranch.getNameForLocalOperations())); + break; + } + } + } + } + return result; + } + + @NotNull + private static List<RemoteBranch> loadAvailableBranchesFromGithub(@NotNull final Project project, + @NotNull final GithubAuthData auth, + @NotNull final GithubRepoDetailed repo, + @Nullable final GithubFullPath upstreamPath) { + List<RemoteBranch> result = new ArrayList<RemoteBranch>(); try { final GithubRepo parent = repo.getParent(); final GithubRepo source = repo.getSource(); @@ -311,13 +366,13 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { } @NotNull - private static List<String> getBranches(@NotNull GithubAuthData auth, @NotNull final String user, @NotNull String repo) + private static List<RemoteBranch> getBranches(@NotNull GithubAuthData auth, @NotNull final String user, @NotNull final String repo) throws IOException { List<GithubBranch> branches = GithubApiUtil.getRepoBranches(auth, user, repo); - return ContainerUtil.map(branches, new Function<GithubBranch, String>() { + return ContainerUtil.map(branches, new Function<GithubBranch, RemoteBranch>() { @Override - public String fun(GithubBranch branch) { - return user + ":" + branch.getName(); + public RemoteBranch fun(GithubBranch branch) { + return new RemoteBranch(user, branch.getName(), repo); } }); } @@ -336,12 +391,244 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { return StringUtil.equalsIgnoreCase(repo1.getUser(), repo2.getUserName()); } + private static void showDiffByRef(@NotNull Project project, + @Nullable String ref, + @NotNull Set<RemoteBranch> branches, + @NotNull GitRepository gitRepository, + @NotNull String currentBranch) { + RemoteBranch branch = findRemoteBranch(branches, ref); + if (branch == null || branch.getLocalBranch() == null) { + GithubNotifications.showErrorDialog(project, "Can't show diff", "Can't find local branch"); + return; + } + String targetBranch = branch.getLocalBranch(); + + DiffInfo info = getDiffInfo(project, gitRepository, currentBranch, targetBranch); + if (info == null) { + GithubNotifications.showErrorDialog(project, "Can't show diff", "Can't get diff info"); + return; + } + + GithubCreatePullRequestDiffDialog dialog = new GithubCreatePullRequestDiffDialog(project, info); + dialog.show(); + } + + @Nullable + private static RemoteBranch findRemoteBranch(@NotNull Set<RemoteBranch> branches, @Nullable String ref) { + if (ref == null) { + return null; + } + List<String> list = StringUtil.split(ref, ":"); + if (list.size() != 2) { + return null; + } + for (RemoteBranch branch : branches) { + if (StringUtil.equalsIgnoreCase(list.get(0), branch.getUser()) && StringUtil.equals(list.get(1), branch.getBranch())) { + return branch; + } + } + + return null; + } + + @Nullable + private static DiffInfo getDiffInfo(@NotNull final Project project, + @NotNull final GitRepository repository, + @NotNull final String currentBranch, + @NotNull final String targetBranch) { + final Ref<DiffInfo> infoRef = new Ref<DiffInfo>(); + ProgressManager.getInstance().run(new Task.Modal(project, "Access to GitHub", true) { + public void run(@NotNull ProgressIndicator indicator) { + try { + List<GitCommit> commits = GitHistoryUtils.history(project, repository.getRoot(), targetBranch + ".."); + Collection<Change> diff = + GitChangeUtils.getDiff(repository.getProject(), repository.getRoot(), targetBranch, currentBranch, null); + infoRef.set(new DiffInfo(targetBranch, currentBranch, commits, diff)); + } + catch (VcsException e) { + LOG.info(e); + } + } + }); + return infoRef.get(); + } + + private static class GithubCreatePullRequestDiffDialog extends DialogWrapper { + @NotNull private final Project myProject; + @NotNull private final DiffInfo myInfo; + private JPanel myLogPanel; + + public GithubCreatePullRequestDiffDialog(@NotNull Project project, @NotNull DiffInfo info) { + super(project, false); + myProject = project; + myInfo = info; + setTitle(String.format("Comparing %s with %s", info.getFrom(), info.getTo())); + setModal(false); + init(); + } + + @Override + protected JComponent createCenterPanel() { + myLogPanel = new GithubCreatePullRequestLogPanel(myProject, myInfo); + JPanel diffPanel = new GithubCreatePullRequestDiffPanel(myProject, myInfo); + + TabbedPaneImpl tabbedPane = new TabbedPaneImpl(SwingConstants.TOP); + tabbedPane.addTab("Log", Git4ideaIcons.Branch, myLogPanel); + tabbedPane.addTab("Diff", AllIcons.Actions.Diff, diffPanel); + tabbedPane.setKeyboardNavigation(TabbedPaneImpl.DEFAULT_PREV_NEXT_SHORTCUTS); + return tabbedPane; + } + + @NotNull + @Override + protected Action[] createActions() { + return new Action[0]; + } + + @Override + protected String getDimensionServiceKey() { + return "Github.CreatePullRequestDiffDialog"; + } + } + + private static class GithubCreatePullRequestDiffPanel extends JPanel { + + private final Project myProject; + private final DiffInfo myInfo; + + public GithubCreatePullRequestDiffPanel(@NotNull Project project, @NotNull DiffInfo info) { + super(new BorderLayout(UIUtil.DEFAULT_VGAP, UIUtil.DEFAULT_HGAP)); + myProject = project; + myInfo = info; + + add(createCenterPanel()); + } + + private JComponent createCenterPanel() { + List<Change> diff = new ArrayList<Change>(myInfo.getDiff()); + final ChangesBrowser changesBrowser = + new ChangesBrowser(myProject, null, diff, null, false, true, null, ChangesBrowser.MyUseCase.COMMITTED_CHANGES, null); + changesBrowser.setChangesToDisplay(diff); + return changesBrowser; + } + } + + private static class GithubCreatePullRequestLogPanel extends JPanel { + private final Project myProject; + private final DiffInfo myInfo; + + private GitCommitListPanel myCommitPanel; + + GithubCreatePullRequestLogPanel(@NotNull Project project, @NotNull DiffInfo info) { + super(new BorderLayout(UIUtil.DEFAULT_HGAP, UIUtil.DEFAULT_VGAP)); + myProject = project; + myInfo = info; + + add(createCenterPanel()); + } + + private JComponent createCenterPanel() { + final ChangesBrowser changesBrowser = new ChangesBrowser(myProject, null, Collections.<Change>emptyList(), null, false, true, null, + ChangesBrowser.MyUseCase.COMMITTED_CHANGES, null); + + myCommitPanel = + new GitCommitListPanel(myInfo.getCommits(), String.format("Branch %s is fully merged to %s", myInfo.getFrom(), myInfo.getTo())); + addSelectionListener(myCommitPanel, changesBrowser); + + myCommitPanel.registerDiffAction(changesBrowser.getDiffAction()); + + Splitter rootPanel = new Splitter(false, 0.7f); + rootPanel.setSecondComponent(changesBrowser); + rootPanel.setFirstComponent(myCommitPanel); + + return rootPanel; + } + + private static void addSelectionListener(@NotNull GitCommitListPanel sourcePanel, @NotNull final ChangesBrowser changesBrowser) { + sourcePanel.addListSelectionListener(new Consumer<GitCommit>() { + @Override + public void consume(GitCommit commit) { + changesBrowser.setChangesToDisplay(commit.getChanges()); + } + }); + } + + } + + private static class RemoteBranch { + @NotNull final String myUser; + @NotNull final String myBranch; + + @Nullable final String myRepo; + @Nullable final String myLocalBranch; + + private RemoteBranch(@NotNull String user, @NotNull String branch) { + this(user, branch, null, null); + } + + private RemoteBranch(@NotNull String user, @NotNull String branch, @NotNull String repo) { + this(user, branch, repo, null); + } + + public RemoteBranch(@NotNull String user, @NotNull String branch, @Nullable String repo, @Nullable String localBranch) { + myUser = user; + myBranch = branch; + myRepo = repo; + myLocalBranch = localBranch; + } + + @NotNull + public String getReference() { + return myUser + ":" + myBranch; + } + + @NotNull + public String getUser() { + return myUser; + } + + @NotNull + public String getBranch() { + return myBranch; + } + + @Nullable + public String getRepo() { + return myRepo; + } + + @Nullable + public String getLocalBranch() { + return myLocalBranch; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + RemoteBranch that = (RemoteBranch)o; + + if (!StringUtil.equalsIgnoreCase(myUser, that.myUser)) return false; + if (!StringUtil.equalsIgnoreCase(myBranch, that.myBranch)) return false; + + return true; + } + + @Override + public int hashCode() { + int result = myUser.hashCode(); + result = 31 * result + myBranch.hashCode(); + return result; + } + } + private static class GithubInfo { @NotNull private final GithubRepoDetailed myRepo; @NotNull private final GithubAuthData myAuthData; - @NotNull private final List<String> myBranches; + @NotNull private final List<RemoteBranch> myBranches; - private GithubInfo(@NotNull GithubAuthData authData, @NotNull GithubRepoDetailed repo, @NotNull List<String> branches) { + private GithubInfo(@NotNull GithubAuthData authData, @NotNull GithubRepoDetailed repo, @NotNull List<RemoteBranch> branches) { myAuthData = authData; myRepo = repo; myBranches = branches; @@ -358,8 +645,42 @@ public class GithubCreatePullRequestAction extends DumbAwareAction { } @NotNull - public List<String> getBranches() { + public List<RemoteBranch> getBranches() { return myBranches; } } + + private static class DiffInfo { + @NotNull private final List<GitCommit> commits; + @NotNull private final Collection<Change> diff; + @NotNull private final String from; + @NotNull private final String to; + + private DiffInfo(@NotNull String from, @NotNull String to, @NotNull List<GitCommit> commits, @NotNull Collection<Change> diff) { + this.commits = commits; + this.diff = diff; + this.from = from; + this.to = to; + } + + @NotNull + public List<GitCommit> getCommits() { + return commits; + } + + @NotNull + public Collection<Change> getDiff() { + return diff; + } + + @NotNull + public String getFrom() { + return from; + } + + @NotNull + public String getTo() { + return to; + } + } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java index bdbf6b0dc635..a9edef5d2e9b 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubRebaseAction.java @@ -72,11 +72,6 @@ public class GithubRebaseAction extends DumbAwareAction { return; } - if (!GithubSettings.getInstance().isAuthConfigured()) { - setVisibleEnabled(e, false, false); - return; - } - final GitRepository gitRepository = GithubUtil.getGitRepository(project, file); if (gitRepository == null) { setVisibleEnabled(e, false, false); diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java index ebe8d6fb8831..5b599b2d700e 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubSettings.java @@ -76,7 +76,7 @@ public class GithubSettings implements PersistentStateComponent<GithubSettings.S @Nullable public String getLogin() { - return StringUtil.notNullize(myState.LOGIN); + return myState.LOGIN; } @NotNull diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java index 233079fc341a..3893969c1a32 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubShareAction.java @@ -421,6 +421,11 @@ public class GithubShareAction extends DumbAwareAction { sink.put(VcsDataKeys.COMMIT_MESSAGE_CONTROL, myCommitMessagePanel); } } + + @Override + protected String getDimensionServiceKey() { + return "Github.UntrackedFilesDialog"; + } } private static class GithubInfo { diff --git a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java index b961d421cd0b..da71c4a854c0 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/GithubUtil.java @@ -115,18 +115,13 @@ public class GithubUtil { @NotNull String host, @NotNull ThrowableConvertor<GithubAuthData, T, IOException> task) throws IOException { GithubSettings settings = GithubSettings.getInstance(); - GithubAuthData auth; - if (settings.getAuthType() == GithubAuthData.AuthType.BASIC && - StringUtil.equalsIgnoreCase(GithubUrlUtil.getApiUrl(host), GithubUrlUtil.getApiUrl(settings.getHost()))) { - auth = settings.getAuthData(); - } - else { - auth = GithubAuthData.createAnonymous(); - } + GithubAuthData auth = null; try { - if (auth.getAuthType() != GithubAuthData.AuthType.BASIC) { + if (settings.getAuthType() != GithubAuthData.AuthType.BASIC || + !StringUtil.equalsIgnoreCase(GithubUrlUtil.getApiUrl(host), GithubUrlUtil.getApiUrl(settings.getHost()))) { throw new GithubAuthenticationException("Bad authentication type"); } + auth = settings.getAuthData(); return task.convert(auth); } catch (GithubAuthenticationException e) { diff --git a/plugins/github/src/org/jetbrains/plugins/github/api/GithubApiUtil.java b/plugins/github/src/org/jetbrains/plugins/github/api/GithubApiUtil.java index d83eec467cf7..50da928fd7d2 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/api/GithubApiUtil.java +++ b/plugins/github/src/org/jetbrains/plugins/github/api/GithubApiUtil.java @@ -89,7 +89,8 @@ public class GithubApiUtil { @NotNull HttpVerb verb) throws IOException { HttpMethod method = null; try { - method = doREST(auth, path, requestBody, headers, verb); + String uri = GithubUrlUtil.getApiUrl(auth.getHost()) + path; + method = doREST(auth, uri, requestBody, headers, verb); checkStatusCode(method); @@ -127,12 +128,11 @@ public class GithubApiUtil { @NotNull private static HttpMethod doREST(@NotNull final GithubAuthData auth, - @NotNull String path, + @NotNull final String uri, @Nullable final String requestBody, @NotNull final Collection<Header> headers, @NotNull final HttpVerb verb) throws IOException { HttpClient client = getHttpClient(auth.getBasicAuth()); - String uri = GithubUrlUtil.getApiUrl(auth.getHost()) + path; return GithubSslSupport.getInstance() .executeSelfSignedCertificateAwareRequest(client, uri, new ThrowableConvertor<String, HttpMethod, IOException>() { @Override @@ -221,7 +221,8 @@ public class GithubApiUtil { return method.getStatusText() + " - " + error.getMessage(); } } - catch (IOException ignore) { + catch (IOException e) { + LOG.info(e); } return method.getStatusText(); } @@ -373,7 +374,8 @@ public class GithubApiUtil { public static Collection<String> getTokenScopes(@NotNull GithubAuthData auth) throws IOException { HttpMethod method = null; try { - method = doREST(auth, "/user", null, Collections.<Header>emptyList(), HttpVerb.HEAD); + String uri = GithubUrlUtil.getApiUrl(auth.getHost()) + "/user"; + method = doREST(auth, uri, null, Collections.<Header>emptyList(), HttpVerb.HEAD); checkStatusCode(method); diff --git a/plugins/github/src/org/jetbrains/plugins/github/api/GithubErrorMessageRaw.java b/plugins/github/src/org/jetbrains/plugins/github/api/GithubErrorMessageRaw.java index 35b39c3f914e..1471a5a8d37f 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/api/GithubErrorMessageRaw.java +++ b/plugins/github/src/org/jetbrains/plugins/github/api/GithubErrorMessageRaw.java @@ -17,15 +17,36 @@ package org.jetbrains.plugins.github.api; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author Aleksey Pivovarov */ @SuppressWarnings("UnusedDeclaration") class GithubErrorMessageRaw { - @Nullable private String message; + @Nullable public String message; + @Nullable public List<Error> errors; + + private static class Error { + @Nullable public String resource; + @Nullable public String field; + @Nullable public String code; + @Nullable public String message; + } @Nullable public String getMessage() { - return message; + if (errors == null) { + return message; + } + else { + StringBuilder s = new StringBuilder(message); + for (Error e : errors) { + s.append("<br/>").append("[").append(e.resource).append(";").append(e.field).append("]").append(e.code).append(": ") + .append(e.message); + } + return s.toString(); + } } } + diff --git a/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepository.java b/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepository.java index d2d8700c00fd..8cac25696e5f 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepository.java +++ b/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepository.java @@ -37,10 +37,10 @@ public class GithubRepository extends BaseRepositoryImpl { private static final Logger LOG = GithubUtil.LOG; private Pattern myPattern = Pattern.compile("($^)"); - private String myRepoAuthor = ""; - private String myRepoName = ""; - private String myUser = ""; - private String myToken = ""; + @NotNull private String myRepoAuthor = ""; + @NotNull private String myRepoName = ""; + @NotNull private String myUser = ""; + @NotNull private String myToken = ""; { setUrl(GithubApiUtil.DEFAULT_GITHUB_HOST); @@ -216,32 +216,36 @@ public class GithubRepository extends BaseRepositoryImpl { return new GithubRepository(this); } + @NotNull public String getRepoName() { return myRepoName; } - public void setRepoName(String repoName) { + public void setRepoName(@NotNull String repoName) { myRepoName = repoName; myPattern = Pattern.compile("(" + StringUtil.escapeToRegexp(repoName) + "\\-\\d+):\\s+"); } + @NotNull public String getRepoAuthor() { - return !StringUtil.isEmpty(myRepoAuthor) ? myRepoAuthor : getUsername(); + return myRepoAuthor; } - public void setRepoAuthor(String repoAuthor) { + public void setRepoAuthor(@NotNull String repoAuthor) { myRepoAuthor = repoAuthor; } + @NotNull public String getUser() { return myUser; } - public void setUser(String user) { + public void setUser(@NotNull String user) { myUser = user; } @Transient + @NotNull public String getToken() { return myToken; } diff --git a/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepositoryEditor.java b/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepositoryEditor.java index df1fd7f38515..663f6a7758b1 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepositoryEditor.java +++ b/plugins/github/src/org/jetbrains/plugins/github/tasks/GithubRepositoryEditor.java @@ -7,6 +7,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.text.StringUtil; import com.intellij.tasks.config.BaseRepositoryEditor; +import com.intellij.ui.DocumentAdapter; import com.intellij.ui.components.JBLabel; import com.intellij.util.Consumer; import com.intellij.util.ThrowableConvertor; @@ -51,19 +52,9 @@ public class GithubRepositoryEditor extends BaseRepositoryEditor<GithubRepositor myRepoAuthor.setText(repository.getRepoAuthor()); myRepoName.setText(repository.getRepoName()); - DocumentListener buttonUpdater = new DocumentListener() { + DocumentListener buttonUpdater = new DocumentAdapter() { @Override - public void insertUpdate(DocumentEvent e) { - updateTokenButton(); - } - - @Override - public void removeUpdate(DocumentEvent e) { - updateTokenButton(); - } - - @Override - public void changedUpdate(DocumentEvent e) { + protected void textChanged(DocumentEvent e) { updateTokenButton(); } }; diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreateGistDialog.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreateGistDialog.java index 4e9a70a83559..a1efdcff2b2b 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreateGistDialog.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreateGistDialog.java @@ -69,7 +69,12 @@ public class GithubCreateGistDialog extends DialogWrapper { @Override protected String getHelpId() { - return "create.gist.dialog"; + return "github.create.gist.dialog"; + } + + @Override + protected String getDimensionServiceKey() { + return "Github.CreateGistDialog"; } @Override diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestDialog.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestDialog.java index 32e6184040b5..0c9d6daecd25 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestDialog.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestDialog.java @@ -19,6 +19,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.ValidationInfo; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; @@ -26,7 +27,6 @@ import org.jetbrains.plugins.github.GithubSettings; import javax.swing.*; import java.util.Collection; -import java.util.List; import java.util.regex.Pattern; /** @@ -36,9 +36,12 @@ public class GithubCreatePullRequestDialog extends DialogWrapper { private final GithubCreatePullRequestPanel myGithubCreatePullRequestPanel; private static final Pattern GITHUB_REPO_PATTERN = Pattern.compile("[a-zA-Z0-9_.-]+:[a-zA-Z0-9_.-]+"); - public GithubCreatePullRequestDialog(@NotNull final Project project, @NotNull List<String> branches, @Nullable String suggestedBranch) { + public GithubCreatePullRequestDialog(@NotNull final Project project, + @NotNull Collection<String> branches, + @Nullable String suggestedBranch, + @NotNull Consumer<String> showDiff) { super(project, true); - myGithubCreatePullRequestPanel = new GithubCreatePullRequestPanel(); + myGithubCreatePullRequestPanel = new GithubCreatePullRequestPanel(showDiff); myGithubCreatePullRequestPanel.setBranches(branches); @@ -61,9 +64,14 @@ public class GithubCreatePullRequestDialog extends DialogWrapper { return myGithubCreatePullRequestPanel.getPreferredComponent(); } - @NotNull - protected Action[] createActions() { - return new Action[]{getOKAction(), getCancelAction()}; + @Override + protected String getHelpId() { + return "github.create.pull.request.dialog"; + } + + @Override + protected String getDimensionServiceKey() { + return "Github.CreatePullRequestDialog"; } @NotNull @@ -95,12 +103,13 @@ public class GithubCreatePullRequestDialog extends DialogWrapper { } if (!GITHUB_REPO_PATTERN.matcher(getTargetBranch()).matches()) { - return new ValidationInfo("Branch must be specified like 'username:branch'", myGithubCreatePullRequestPanel.getComboBox()); + return new ValidationInfo("Branch must be specified like 'username:branch'", myGithubCreatePullRequestPanel.getBranchEditor()); } return null; } + @TestOnly public void setRequestTitle(String title) { myGithubCreatePullRequestPanel.setTitle(title); } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.form index e5dda901b53e..46864f055405 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.form @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.plugins.github.ui.GithubCreatePullRequestPanel"> - <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> + <grid id="27dc6" binding="myPanel" layout-manager="GridLayoutManager" row-count="4" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1"> <margin top="0" left="0" bottom="0" right="0"/> <constraints> <xy x="20" y="20" width="500" height="400"/> @@ -34,7 +34,7 @@ </component> <component id="996e9" class="javax.swing.JTextField" binding="myTitleTextField"> <constraints> - <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> + <grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="6" anchor="8" fill="1" indent="0" use-parent-layout="false"> <preferred-size width="150" height="-1"/> </grid> </constraints> @@ -51,7 +51,7 @@ </component> <scrollpane id="61e54" class="com.intellij.ui.components.JBScrollPane"> <constraints> - <grid row="3" column="0" row-span="1" col-span="2" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"> + <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="7" hsize-policy="7" anchor="0" fill="3" indent="0" use-parent-layout="false"> <minimum-size width="150" height="50"/> </grid> </constraints> @@ -64,6 +64,14 @@ </component> </children> </scrollpane> + <component id="90c93" class="javax.swing.JButton" binding="myShowDiffButton"> + <constraints> + <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/> + </constraints> + <properties> + <text value="Show Diff"/> + </properties> + </component> </children> </grid> </form> diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.java index a178024d1911..e4a4521bb89b 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubCreatePullRequestPanel.java @@ -18,10 +18,13 @@ package org.jetbrains.plugins.github.ui; import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.SortedComboBoxModel; +import com.intellij.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; import java.util.Collection; import java.util.Comparator; @@ -34,8 +37,9 @@ public class GithubCreatePullRequestPanel { private ComboBox myBranchComboBox; private SortedComboBoxModel<String> myBranchModel; private JPanel myPanel; + private JButton myShowDiffButton; - public GithubCreatePullRequestPanel() { + public GithubCreatePullRequestPanel(@NotNull final Consumer<String> showDiff) { myDescriptionTextArea.setBorder(BorderFactory.createEtchedBorder()); myBranchModel = new SortedComboBoxModel<String>(new Comparator<String>() { @Override @@ -44,6 +48,12 @@ public class GithubCreatePullRequestPanel { } }); myBranchComboBox.setModel(myBranchModel); + myShowDiffButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + showDiff.consume(getBranch()); + } + }); } @NotNull @@ -67,6 +77,9 @@ public class GithubCreatePullRequestPanel { return; } + if (myBranchModel.indexOf(branch) == -1) { + myBranchModel.add(branch); + } myBranchComboBox.setSelectedItem(branch); } @@ -84,7 +97,7 @@ public class GithubCreatePullRequestPanel { return myTitleTextField; } - public JComboBox getComboBox() { + public JComponent getBranchEditor() { return myBranchComboBox; } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form index eedbe5e17b00..ba0af8547b25 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.form @@ -53,15 +53,6 @@ </constraints> <properties/> </component> - <component id="f851a" class="javax.swing.JComboBox" binding="myAuthTypeComboBox"> - <constraints> - <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="8" fill="1" indent="0" use-parent-layout="false"/> - </constraints> - <properties> - <model/> - <toolTipText value=""/> - </properties> - </component> <component id="b466f" class="javax.swing.JCheckBox" binding="mySavePasswordCheckBox"> <constraints> <grid row="1" column="2" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"> @@ -105,6 +96,12 @@ <text value="Login:"/> </properties> </component> + <component id="548fc" class="com.intellij.openapi.ui.ComboBox" binding="myAuthTypeComboBox"> + <constraints> + <grid row="1" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/> + </constraints> + <properties/> + </component> </children> </grid> </form> diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java index ea565e03c5c9..bebf6f76d52b 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubLoginPanel.java @@ -16,8 +16,11 @@ package org.jetbrains.plugins.github.ui; import com.intellij.ide.BrowserUtil; +import com.intellij.openapi.ui.ComboBox; +import com.intellij.openapi.util.Condition; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.HyperlinkAdapter; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.table.ComponentsListFocusTraversalPolicy; import org.jetbrains.annotations.NotNull; @@ -46,7 +49,7 @@ public class GithubLoginPanel { private JPasswordField myPasswordField; private JTextPane mySignupTextField; private JCheckBox mySavePasswordCheckBox; - private JComboBox myAuthTypeComboBox; + private ComboBox myAuthTypeComboBox; private JLabel myPasswordLabel; private JLabel myLoginLabel; @@ -87,7 +90,7 @@ public class GithubLoginPanel { myLoginLabel.setVisible(true); myLoginTextField.setVisible(true); } - if (AUTH_TOKEN.equals(item)) { + else if (AUTH_TOKEN.equals(item)) { myPasswordLabel.setText("Token:"); mySavePasswordCheckBox.setText("Save token"); myLoginLabel.setVisible(false); @@ -102,8 +105,8 @@ public class GithubLoginPanel { List<Component> order = new ArrayList<Component>(); order.add(myHostTextField); - order.add(myLoginTextField); order.add(myAuthTypeComboBox); + order.add(myLoginTextField); order.add(myPasswordField); order.add(mySavePasswordCheckBox); myPane.setFocusTraversalPolicyProvider(true); @@ -174,7 +177,7 @@ public class GithubLoginPanel { } public JComponent getPreferrableFocusComponent() { - return myLoginTextField; + return myLoginTextField.isVisible() ? myLoginTextField : myPasswordField; } @NotNull @@ -196,7 +199,12 @@ public class GithubLoginPanel { @NotNull @Override protected List<Component> getOrderedComponents() { - return myOrder; + return ContainerUtil.filter(myOrder, new Condition<Component>() { + @Override + public boolean value(Component component) { + return component.isVisible() && component.isEnabled(); + } + }); } } } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form index cc283855bc64..c0d2af8512d8 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.form @@ -76,14 +76,11 @@ </constraints> <properties/> </component> - <component id="be50e" class="javax.swing.JComboBox" binding="myAuthTypeComboBox"> + <component id="5a680" class="com.intellij.openapi.ui.ComboBox" binding="myAuthTypeComboBox"> <constraints> - <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false"/> + <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="1" indent="0" use-parent-layout="false"/> </constraints> - <properties> - <model/> - <toolTipText value=""/> - </properties> + <properties/> </component> </children> </grid> diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java index 54e1f61b1a14..778079772617 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSettingsPanel.java @@ -17,9 +17,11 @@ package org.jetbrains.plugins.github.ui; import com.intellij.ide.BrowserUtil; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.ui.ComboBox; import com.intellij.openapi.ui.Messages; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.ui.DocumentAdapter; import com.intellij.ui.HyperlinkAdapter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -56,7 +58,7 @@ public class GithubSettingsPanel { private JPanel myPane; private JButton myTestButton; private JTextField myHostTextField; - private JComboBox myAuthTypeComboBox; + private ComboBox myAuthTypeComboBox; private JLabel myLoginLabel; private boolean myCredentialsModified; @@ -98,46 +100,21 @@ public class GithubSettingsPanel { } }); - myPasswordField.getDocument().addDocumentListener(new DocumentListener() { + myPasswordField.getDocument().addDocumentListener(new DocumentAdapter() { @Override - public void insertUpdate(DocumentEvent e) { - myCredentialsModified = true; - } - - @Override - public void removeUpdate(DocumentEvent e) { - myCredentialsModified = true; - } - - @Override - public void changedUpdate(DocumentEvent e) { + protected void textChanged(DocumentEvent e) { myCredentialsModified = true; } }); - DocumentListener passwordEraser = new DocumentListener() { + DocumentListener passwordEraser = new DocumentAdapter() { @Override - public void insertUpdate(DocumentEvent e) { - if (!myCredentialsModified) { - erasePassword(); - } - } - - @Override - public void removeUpdate(DocumentEvent e) { - if (!myCredentialsModified) { - erasePassword(); - } - } - - @Override - public void changedUpdate(DocumentEvent e) { + protected void textChanged(DocumentEvent e) { if (!myCredentialsModified) { erasePassword(); } } }; - myHostTextField.getDocument().addDocumentListener(passwordEraser); myLoginTextField.getDocument().addDocumentListener(passwordEraser); @@ -163,7 +140,7 @@ public class GithubSettingsPanel { myLoginLabel.setVisible(true); myLoginTextField.setVisible(true); } - if (AUTH_TOKEN.equals(item)) { + else if (AUTH_TOKEN.equals(item)) { myLoginLabel.setVisible(false); myLoginTextField.setVisible(false); } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubShareDialog.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubShareDialog.java index c1b84c5908ef..5c94dc9dcd0d 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubShareDialog.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubShareDialog.java @@ -32,17 +32,17 @@ public class GithubShareDialog extends DialogWrapper { updateOkButton(); } - @NotNull - protected Action[] createActions() { - return new Action[] {getOKAction(), getCancelAction(), getHelpAction()}; - } - @Override protected String getHelpId() { return "github.share"; } @Override + protected String getDimensionServiceKey() { + return "Github.ShareDialog"; + } + + @Override protected JComponent createCenterPanel() { return myGithubSharePanel.getPanel(); } diff --git a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.java b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.java index 9324ec0bcf64..647a811320b8 100644 --- a/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.java +++ b/plugins/github/src/org/jetbrains/plugins/github/ui/GithubSharePanel.java @@ -1,8 +1,9 @@ package org.jetbrains.plugins.github.ui; +import com.intellij.ui.DocumentAdapter; + import javax.swing.*; import javax.swing.event.DocumentEvent; -import javax.swing.event.DocumentListener; /** * @author oleg @@ -17,19 +18,9 @@ public class GithubSharePanel { public GithubSharePanel(final GithubShareDialog githubShareDialog) { myGithubShareDialog = githubShareDialog; - myRepositoryTextField.getDocument().addDocumentListener(new DocumentListener() { - @Override - public void insertUpdate(final DocumentEvent e) { - myGithubShareDialog.updateOkButton(); - } - - @Override - public void removeUpdate(final DocumentEvent e) { - myGithubShareDialog.updateOkButton(); - } - + myRepositoryTextField.getDocument().addDocumentListener(new DocumentAdapter() { @Override - public void changedUpdate(final DocumentEvent e) { + protected void textChanged(DocumentEvent e) { myGithubShareDialog.updateOkButton(); } }); diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistTestBase.java b/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistTestBase.java index 0450fdc3fb34..b564267f91a8 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistTestBase.java +++ b/plugins/github/test/org/jetbrains/plugins/github/GithubCreateGistTestBase.java @@ -17,7 +17,6 @@ package org.jetbrains.plugins.github; import com.intellij.openapi.util.Clock; import com.intellij.openapi.util.Comparing; -import com.intellij.util.containers.HashMap; import com.intellij.util.text.DateFormatUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.github.api.GithubApiUtil; @@ -27,7 +26,6 @@ import org.jetbrains.plugins.github.test.GithubTest; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Map; import static org.jetbrains.plugins.github.api.GithubGist.FileContent; diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTest.java b/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTest.java index 53843019d3f2..0d24130ea4ac 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTest.java +++ b/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTest.java @@ -34,6 +34,7 @@ public class GithubCreatePullRequestTest extends GithubCreatePullRequestTestBase GithubCreatePullRequestAction.createPullRequest(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully created pull request", null); + initGitChecks(); checkRemoteConfigured(); checkLastCommitPushed(); } @@ -49,6 +50,7 @@ public class GithubCreatePullRequestTest extends GithubCreatePullRequestTestBase GithubCreatePullRequestAction.createPullRequest(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully created pull request", null); + initGitChecks(); checkRemoteConfigured(); checkLastCommitPushed(); } @@ -64,6 +66,7 @@ public class GithubCreatePullRequestTest extends GithubCreatePullRequestTestBase GithubCreatePullRequestAction.createPullRequest(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully created pull request", null); + initGitChecks(); checkRemoteConfigured(); checkLastCommitPushed(); } diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTestBase.java b/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTestBase.java index 49ac861aa7be..939fd8e49efd 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTestBase.java +++ b/plugins/github/test/org/jetbrains/plugins/github/GithubCreatePullRequestTestBase.java @@ -20,12 +20,9 @@ import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.util.Clock; import com.intellij.testFramework.VfsTestUtil; import com.intellij.util.text.DateFormatUtil; -import git4idea.GitUtil; import git4idea.actions.GitInit; import git4idea.commands.Git; import git4idea.repo.GitRepository; -import git4idea.repo.GitRepositoryManager; -import git4idea.test.GitExecutor; import git4idea.test.TestDialogHandler; import org.jetbrains.plugins.github.test.GithubTest; import org.jetbrains.plugins.github.ui.GithubCreatePullRequestDialog; @@ -40,13 +37,11 @@ import static git4idea.test.GitExecutor.git; public abstract class GithubCreatePullRequestTestBase extends GithubTest { protected static final String PROJECT_URL = "https://github.com/ideatest1/PullRequestTest"; protected String BRANCH_NAME; - protected GitRepositoryManager myGitRepositoryManager; @Override public void setUp() throws Exception { super.setUp(); - myGitRepositoryManager = GitUtil.getRepositoryManager(myProject); Random rnd = new Random(); long time = Clock.getTime(); BRANCH_NAME = "branch_" + getTestName(false) + "_" + DateFormatUtil.formatDate(time).replace('/', '-') + "_" + rnd.nextLong(); @@ -91,7 +86,6 @@ public abstract class GithubCreatePullRequestTestBase extends GithubTest { protected void createBranch() { git("branch " + BRANCH_NAME); git("checkout " + BRANCH_NAME); - GitInit.refreshAndConfigureVcsMappings(myProject, myProjectRoot, myProjectRoot.getPath()); } protected void createChanges() { @@ -99,20 +93,4 @@ public abstract class GithubCreatePullRequestTestBase extends GithubTest { git("add file.txt"); git("commit -m changes"); } - - protected void checkRemoteConfigured() { - final GitRepository gitRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); - assertNotNull(gitRepository); - - assertNotNull("GitHub remote is not configured", GithubUtil.findGithubRemoteUrl(gitRepository)); - } - - protected void checkLastCommitPushed() { - final GitRepository gitRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); - assertNotNull(gitRepository); - - String hash = GitExecutor.git(gitRepository, "log -1 --pretty=%h"); - String ans = GitExecutor.git(gitRepository, "branch --contains " + hash + " -a"); - assertTrue(ans.contains("remotes/origin/")); - } } diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTest.java b/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTest.java index 3a5eddab15f4..756fabc6a713 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTest.java +++ b/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTest.java @@ -3,6 +3,10 @@ package org.jetbrains.plugins.github; import com.intellij.notification.NotificationType; import com.intellij.openapi.components.ServiceManager; import git4idea.commands.Git; +import org.jetbrains.plugins.github.api.GithubApiUtil; +import org.jetbrains.plugins.github.api.GithubRepoDetailed; + +import java.io.IOException; import static com.intellij.dvcs.test.Executor.cd; import static git4idea.test.GitExecutor.git; @@ -21,6 +25,7 @@ public class GithubShareProjectTest extends GithubShareProjectTestBase { GithubShareAction.shareProjectOnGithub(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully shared project on GitHub", null); + initGitChecks(); checkGitExists(); checkGithubExists(); checkRemoteConfigured(); @@ -53,6 +58,7 @@ public class GithubShareProjectTest extends GithubShareProjectTestBase { GithubShareAction.shareProjectOnGithub(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully shared project on GitHub", null); + initGitChecks(); checkGitExists(); checkGithubExists(); checkRemoteConfigured(); @@ -71,6 +77,7 @@ public class GithubShareProjectTest extends GithubShareProjectTestBase { GithubShareAction.shareProjectOnGithub(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully shared project on GitHub", null); + initGitChecks(); checkGitExists(); checkGithubExists(); checkRemoteConfigured(); @@ -84,9 +91,15 @@ public class GithubShareProjectTest extends GithubShareProjectTestBase { GithubShareAction.shareProjectOnGithub(myProject, myProjectRoot); checkNotification(NotificationType.INFORMATION, "Successfully created empty repository on GitHub", null); + initGitChecks(); checkGitExists(); checkGithubExists(); checkRemoteConfigured(); } + protected void checkGithubExists() throws IOException { + GithubAuthData auth = myGitHubSettings.getAuthData(); + GithubRepoDetailed githubInfo = GithubApiUtil.getDetailedRepoInfo(auth, myLogin1, PROJECT_NAME); + assertNotNull("GitHub repository does not exist", githubInfo); + } } diff --git a/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTestBase.java b/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTestBase.java index ab969e9154dc..4eee8e1439f4 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTestBase.java +++ b/plugins/github/test/org/jetbrains/plugins/github/GithubShareProjectTestBase.java @@ -20,11 +20,8 @@ import com.intellij.openapi.util.Clock; import com.intellij.util.text.DateFormatUtil; import git4idea.GitUtil; import git4idea.repo.GitRepository; -import git4idea.repo.GitRepositoryManager; -import git4idea.test.GitExecutor; import git4idea.test.TestDialogHandler; import org.jetbrains.plugins.github.api.GithubApiUtil; -import org.jetbrains.plugins.github.api.GithubRepoDetailed; import org.jetbrains.plugins.github.test.GithubTest; import org.jetbrains.plugins.github.ui.GithubShareDialog; @@ -36,13 +33,11 @@ import java.util.Random; */ public abstract class GithubShareProjectTestBase extends GithubTest { protected String PROJECT_NAME; - protected GitRepositoryManager myGitRepositoryManager; @Override public void setUp() throws Exception { super.setUp(); - myGitRepositoryManager = GitUtil.getRepositoryManager(myProject); Random rnd = new Random(); long time = Clock.getTime(); PROJECT_NAME = "new_project_from_" + getTestName(false) + "_" + DateFormatUtil.formatDate(time).replace('/', '-') + "_" + rnd.nextLong(); @@ -86,31 +81,4 @@ public abstract class GithubShareProjectTestBase extends GithubTest { } }); } - - protected void checkGithubExists() throws IOException { - GithubAuthData auth = myGitHubSettings.getAuthData(); - GithubRepoDetailed githubInfo = GithubApiUtil.getDetailedRepoInfo(auth, myLogin1, PROJECT_NAME); - assertNotNull("GitHub repository does not exist", githubInfo); - } - - protected void checkGitExists() { - final GitRepository gitRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); - assertNotNull("Git repository does not exist", gitRepository); - } - - protected void checkRemoteConfigured() { - final GitRepository gitRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); - assertNotNull(gitRepository); - - assertNotNull("GitHub remote is not configured", GithubUtil.findGithubRemoteUrl(gitRepository)); - } - - protected void checkLastCommitPushed() { - final GitRepository gitRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); - assertNotNull(gitRepository); - - String hash = GitExecutor.git(gitRepository, "log -1 --pretty=%h"); - String ans = GitExecutor.git(gitRepository, "branch --contains " + hash + " -a"); - assertTrue(ans.contains("remotes/origin/master")); - } } diff --git a/plugins/github/test/org/jetbrains/plugins/github/test/GithubTest.java b/plugins/github/test/org/jetbrains/plugins/github/test/GithubTest.java index ee5233c8057e..ab83293ed73b 100644 --- a/plugins/github/test/org/jetbrains/plugins/github/test/GithubTest.java +++ b/plugins/github/test/org/jetbrains/plugins/github/test/GithubTest.java @@ -27,12 +27,15 @@ import com.intellij.testFramework.VfsTestUtil; import com.intellij.testFramework.fixtures.IdeaProjectTestFixture; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; import git4idea.DialogManager; +import git4idea.GitUtil; import git4idea.Notificator; import git4idea.commands.GitHttpAuthService; import git4idea.commands.GitHttpAuthenticator; import git4idea.config.GitConfigUtil; import git4idea.config.GitVcsSettings; import git4idea.remote.GitHttpAuthTestService; +import git4idea.repo.GitRepository; +import git4idea.repo.GitRepositoryManager; import git4idea.test.GitExecutor; import git4idea.test.GitTestUtil; import git4idea.test.TestDialogManager; @@ -41,6 +44,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.github.GithubAuthData; import org.jetbrains.plugins.github.GithubSettings; +import org.jetbrains.plugins.github.GithubUtil; import static org.junit.Assume.assumeNotNull; @@ -63,6 +67,9 @@ public abstract class GithubTest extends UsefulTestCase { @NotNull protected Project myProject; @NotNull protected VirtualFile myProjectRoot; + @Nullable protected GitRepository myRepository; + @NotNull protected GitRepositoryManager myGitRepositoryManager; + @NotNull protected GitVcsSettings myGitSettings; @NotNull protected GithubSettings myGitHubSettings; @NotNull private GitHttpAuthTestService myHttpAuthService; @@ -143,6 +150,28 @@ public abstract class GithubTest extends UsefulTestCase { } } + protected void initGitChecks() { + myRepository = myGitRepositoryManager.getRepositoryForFile(myProjectRoot); + } + + protected void checkGitExists() { + assertNotNull("Git repository does not exist", myRepository); + } + + protected void checkRemoteConfigured() { + assertNotNull(myRepository); + + assertNotNull("GitHub remote is not configured", GithubUtil.findGithubRemoteUrl(myRepository)); + } + + protected void checkLastCommitPushed() { + assertNotNull(myRepository); + + String hash = GitExecutor.git(myRepository, "log -1 --pretty=%h"); + String ans = GitExecutor.git(myRepository, "branch --contains " + hash + " -a"); + assertTrue(ans.contains("remotes/origin")); + } + @Override protected void setUp() throws Exception { final String host = System.getenv("idea.test.github.host"); @@ -178,6 +207,8 @@ public abstract class GithubTest extends UsefulTestCase { myDialogManager = (TestDialogManager)ServiceManager.getService(DialogManager.class); myNotificator = (TestNotificator)ServiceManager.getService(myProject, Notificator.class); myHttpAuthService = (GitHttpAuthTestService)ServiceManager.getService(GitHttpAuthService.class); + + myGitRepositoryManager = GitUtil.getRepositoryManager(myProject); } @Override @@ -190,4 +221,5 @@ public abstract class GithubTest extends UsefulTestCase { super.tearDown(); } + } diff --git a/plugins/google-app-engine/source/com/intellij/appengine/actions/AppEngineUploader.java b/plugins/google-app-engine/source/com/intellij/appengine/actions/AppEngineUploader.java index 5e2d5ead054d..803bdc389454 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/actions/AppEngineUploader.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/actions/AppEngineUploader.java @@ -71,6 +71,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiFile; import com.intellij.remoteServer.runtime.deployment.DeploymentRuntime; import com.intellij.remoteServer.runtime.deployment.ServerRuntimeInstance; +import com.intellij.remoteServer.runtime.log.LoggingHandler; import com.intellij.util.net.HttpConfigurable; import com.intellij.util.xml.GenericDomValue; import org.jetbrains.annotations.NotNull; @@ -93,9 +94,10 @@ public class AppEngineUploader { private final String myEmail; private final String myPassword; private final ServerRuntimeInstance.DeploymentOperationCallback myCallback; + private final LoggingHandler myLoggingHandler; private AppEngineUploader(Project project, Artifact artifact, AppEngineFacet appEngineFacet, AppEngineSdk sdk, String email, - String password, ServerRuntimeInstance.DeploymentOperationCallback callback) { + String password, ServerRuntimeInstance.DeploymentOperationCallback callback, @Nullable LoggingHandler loggingHandler) { myProject = project; myArtifact = artifact; myAppEngineFacet = appEngineFacet; @@ -103,13 +105,14 @@ public class AppEngineUploader { myEmail = email; myPassword = password; myCallback = callback; + myLoggingHandler = loggingHandler; } @Nullable public static AppEngineUploader createUploader(@NotNull Project project, @NotNull Artifact artifact, @Nullable AppEngineServerConfiguration configuration, - ServerRuntimeInstance.DeploymentOperationCallback callback) { + @NotNull ServerRuntimeInstance.DeploymentOperationCallback callback, @Nullable LoggingHandler loggingHandler) { final String explodedPath = artifact.getOutputPath(); if (explodedPath == null) { callback.errorOccurred("Output path isn't specified for '" + artifact.getName() + "' artifact"); @@ -170,7 +173,7 @@ public class AppEngineUploader { password = dialog.getPassword(); } - return new AppEngineUploader(project, artifact, appEngineFacet, sdk, email, password, callback); + return new AppEngineUploader(project, artifact, appEngineFacet, sdk, email, password, callback, loggingHandler); } public void startUploading() { @@ -240,32 +243,40 @@ public class AppEngineUploader { return; } - final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); - final ConsoleView console = TextConsoleBuilderFactory.getInstance().createBuilder(myProject).getConsole(); - final RunnerLayoutUi ui = RunnerLayoutUi.Factory.getInstance(myProject).create("Upload", "Upload Application", "Upload Application", myProject); - final DefaultActionGroup group = new DefaultActionGroup(); - ui.getOptions().setLeftToolbar(group, ActionPlaces.UNKNOWN); - ui.addContent(ui.createContent("upload", console.getComponent(), "Upload Application", null, console.getPreferredFocusableComponent())); - final ProcessHandler processHandler = new OSProcessHandler(process, commandLine.getCommandLineString()); - processHandler.addProcessListener(new MyProcessListener(processHandler, console)); - console.attachToProcess(processHandler); - final RunContentDescriptor contentDescriptor = new RunContentDescriptor(console, processHandler, ui.getComponent(), "Upload Application"); - group.add(ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM)); - group.add(new CloseAction(executor, contentDescriptor, myProject)); + if (myLoggingHandler == null) { + final Executor executor = DefaultRunExecutor.getRunExecutorInstance(); + final ConsoleView console = TextConsoleBuilderFactory.getInstance().createBuilder(myProject).getConsole(); + final RunnerLayoutUi ui = RunnerLayoutUi.Factory.getInstance(myProject).create("Upload", "Upload Application", "Upload Application", myProject); + final DefaultActionGroup group = new DefaultActionGroup(); + ui.getOptions().setLeftToolbar(group, ActionPlaces.UNKNOWN); + ui.addContent(ui.createContent("upload", console.getComponent(), "Upload Application", null, console.getPreferredFocusableComponent())); + + processHandler.addProcessListener(new MyProcessListener(processHandler, console, null)); + console.attachToProcess(processHandler); + final RunContentDescriptor contentDescriptor = new RunContentDescriptor(console, processHandler, ui.getComponent(), "Upload Application"); + group.add(ActionManager.getInstance().getAction(IdeActions.ACTION_STOP_PROGRAM)); + group.add(new CloseAction(executor, contentDescriptor, myProject)); - ExecutionManager.getInstance(myProject).getContentManager().showRunContent(executor, contentDescriptor); + ExecutionManager.getInstance(myProject).getContentManager().showRunContent(executor, contentDescriptor); + } + else { + processHandler.addProcessListener(new MyProcessListener(processHandler, null, myLoggingHandler)); + myLoggingHandler.attachToProcess(processHandler); + } processHandler.startNotify(); } private class MyProcessListener extends ProcessAdapter { private boolean myPasswordEntered; private final ProcessHandler myProcessHandler; - private final ConsoleView myConsole; + @Nullable private final ConsoleView myConsole; + @Nullable private final LoggingHandler myLoggingHandler; - public MyProcessListener(ProcessHandler processHandler, ConsoleView console) { + public MyProcessListener(ProcessHandler processHandler, @Nullable ConsoleView console, @Nullable LoggingHandler loggingHandler) { myProcessHandler = processHandler; myConsole = console; + myLoggingHandler = loggingHandler; } @Override @@ -278,16 +289,26 @@ public class AppEngineUploader { final PrintWriter input = new PrintWriter(processInput); input.println(myPassword); input.flush(); - myConsole.print(StringUtil.repeatSymbol('*', myPassword.length()) + "\n", ConsoleViewContentType.USER_INPUT); + String message = StringUtil.repeatSymbol('*', myPassword.length()) + "\n"; + if (myConsole != null) { + myConsole.print(message, ConsoleViewContentType.USER_INPUT); + } + else if (myLoggingHandler != null) { + myLoggingHandler.print(message); + } } } } @Override public void processTerminated(ProcessEvent event) { - if (event.getExitCode() == 0) { + int exitCode = event.getExitCode(); + if (exitCode == 0) { myCallback.succeeded(new DeploymentRuntime()); } + else { + myCallback.errorOccurred("Process terminated with exit code " + exitCode); + } } } } diff --git a/plugins/google-app-engine/source/com/intellij/appengine/actions/UploadApplicationAction.java b/plugins/google-app-engine/source/com/intellij/appengine/actions/UploadApplicationAction.java index fe7f71dbb51b..f243a799b9a8 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/actions/UploadApplicationAction.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/actions/UploadApplicationAction.java @@ -70,7 +70,7 @@ public class UploadApplicationAction extends AnAction { public void errorOccurred(@NotNull String errorMessage) { Messages.showErrorDialog(project, errorMessage, CommonBundle.getErrorTitle()); } - }); + }, null); if (uploader != null) { uploader.startUploading(); } diff --git a/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineCloudType.java b/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineCloudType.java index b69b47a034fe..855ed7a64dfe 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineCloudType.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineCloudType.java @@ -22,7 +22,6 @@ import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.options.UnnamedConfigurable; import com.intellij.openapi.project.Project; import com.intellij.packaging.artifacts.Artifact; -import com.intellij.packaging.artifacts.ArtifactPointerManager; import com.intellij.remoteServer.ServerType; import com.intellij.remoteServer.configuration.deployment.*; import com.intellij.remoteServer.runtime.Deployment; @@ -38,7 +37,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.util.ArrayList; import java.util.List; /** @@ -83,7 +81,7 @@ public class AppEngineCloudType extends ServerType<AppEngineServerConfiguration> @NotNull @Override - public DeploymentConfigurator createDeployer(Project project) { + public DeploymentConfigurator createDeploymentConfigurator(Project project) { return new AppEngineDeploymentConfigurator(project); } @@ -134,12 +132,7 @@ public class AppEngineCloudType extends ServerType<AppEngineServerConfiguration> @Override public List<DeploymentSource> getAvailableDeploymentSources() { List<Artifact> artifacts = AppEngineUtil.collectWebArtifacts(myProject, true); - List<DeploymentSource> sources = new ArrayList<DeploymentSource>(); - ArtifactPointerManager pointerManager = ArtifactPointerManager.getInstance(myProject); - for (Artifact artifact : artifacts) { - sources.add(DeploymentSourceUtil.getInstance().createArtifactDeploymentSource(pointerManager.createPointer(artifact))); - } - return sources; + return DeploymentSourceUtil.getInstance().createArtifactDeploymentSources(myProject, artifacts); } @NotNull @@ -165,10 +158,6 @@ public class AppEngineCloudType extends ServerType<AppEngineServerConfiguration> public void connect(@NotNull final ConnectionCallback<DummyDeploymentConfiguration> callback) { callback.connected(new AppEngineRuntimeInstance(myConfiguration)); } - - @Override - public void disconnect() { - } } private static class AppEngineRuntimeInstance extends ServerRuntimeInstance<DummyDeploymentConfiguration> { @@ -183,7 +172,7 @@ public class AppEngineCloudType extends ServerType<AppEngineServerConfiguration> Artifact artifact = ((ArtifactDeploymentSource)task.getSource()).getArtifact(); if (artifact == null) return; - AppEngineUploader uploader = AppEngineUploader.createUploader(task.getProject(), artifact, myConfiguration, callback); + AppEngineUploader uploader = AppEngineUploader.createUploader(task.getProject(), artifact, myConfiguration, callback, task.getLoggingHandler()); if (uploader != null) { uploader.startUploading(); } @@ -193,5 +182,9 @@ public class AppEngineCloudType extends ServerType<AppEngineServerConfiguration> public void computeDeployments(@NotNull ComputeDeploymentsCallback deployments) { deployments.succeeded(ContainerUtil.<Deployment>emptyList()); } + + @Override + public void disconnect() { + } } } diff --git a/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineServerConfiguration.java b/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineServerConfiguration.java index 9291f376fc7d..4576fb41bdde 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineServerConfiguration.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/cloud/AppEngineServerConfiguration.java @@ -15,16 +15,13 @@ */ package com.intellij.appengine.cloud; -import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.remoteServer.configuration.ServerConfiguration; -import com.intellij.util.xmlb.XmlSerializerUtil; +import com.intellij.remoteServer.configuration.ServerConfigurationBase; import com.intellij.util.xmlb.annotations.Attribute; -import org.jetbrains.annotations.Nullable; /** * @author nik */ -public class AppEngineServerConfiguration extends ServerConfiguration implements PersistentStateComponent<AppEngineServerConfiguration> { +public class AppEngineServerConfiguration extends ServerConfigurationBase<AppEngineServerConfiguration> { private String myEmail; @Attribute("email") @@ -35,20 +32,4 @@ public class AppEngineServerConfiguration extends ServerConfiguration implements public void setEmail(String email) { myEmail = email; } - - @Nullable - @Override - public AppEngineServerConfiguration getState() { - return this; - } - - @Override - public void loadState(AppEngineServerConfiguration state) { - XmlSerializerUtil.copyBean(state, this); - } - - @Override - public PersistentStateComponent<?> getSerializer() { - return this; - } } diff --git a/plugins/gradle/gradle.iml b/plugins/gradle/gradle.iml index b0e85e51a131..510f93a768eb 100644 --- a/plugins/gradle/gradle.iml +++ b/plugins/gradle/gradle.iml @@ -25,233 +25,15 @@ <orderEntry type="module-library" exported=""> <library name="Gradle"> <CLASSES> - <root url="jar://$MODULE_DIR$/lib/gradle-base-services-1.7.jar!/" /> - <root url="jar://$MODULE_DIR$/lib/gradle-core-1.7.jar!/" /> - <root url="jar://$MODULE_DIR$/lib/gradle-messaging-1.7.jar!/" /> - <root url="jar://$MODULE_DIR$/lib/gradle-tooling-api-1.7.jar!/" /> - <root url="jar://$MODULE_DIR$/lib/gradle-wrapper-1.7.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/gradle-base-services-1.8-20130730220035+0000.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/gradle-core-1.8-20130730220035+0000.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/gradle-messaging-1.8-20130730220035+0000.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/gradle-tooling-api-1.8-20130730220035+0000.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/gradle-wrapper-1.8-20130730220035+0000.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/buildSrc/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/buildSrc/src/test/resources" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ui/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ui/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ui/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/cli/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/cpp/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/cpp/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ear/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/main/resources" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/idea/IdeaIntegrationTest/canCreateAndDeleteMetaData/api/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/eclipse/EclipseIntegrationTest/canCreateAndDeleteMetaData/api/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/eclipse/EclipseIntegrationTest/canCreateAndDeleteMetaData/api/src/integTest/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/eclipse/EclipseIntegrationTest/canCreateAndDeleteMetaData/webAppJava6/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/eclipse/EclipseIntegrationTest/canCreateAndDeleteMetaData/groovyproject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ide/src/integTest/resources/org/gradle/plugins/ide/eclipse/EclipseIntegrationTest/canCreateAndDeleteMetaData/webAppWithVars/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ivy/src/main/java/org/gradle/api/publish/ivy/tasks" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ivy/src/main/java/org/gradle/api/publish/ivy/plugins" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/ivy/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core/src/testFixtures/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/ear/earWithWar/war/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/ear/earCustomized/war/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/base/prod/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/base/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/onlyif/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/onlyif/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/apiAndImpl/src/api/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/apiAndImpl/src/impl/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/apiAndImpl/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/quickstart/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/shared/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/buildSrc/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/buildSrc/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/services/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/services/webservice/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/multiproject/services/webservice/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/testListener/src/test/java/org/gradle" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/customizedLayout/src/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/customizedLayout/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/withIntegrationTests/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/withIntegrationTests/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/java/withIntegrationTests/src/integration-test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/antlr/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/maven/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/maven/pomGeneration/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/scala/mixedJavaAndScala/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/scala/mixedJavaAndScala/src/main/scala" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/sonar/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/sonar/quickstart/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/multiproject/testproject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/multiproject/testproject/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/multiproject/testproject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/multiproject/testproject/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/multiproject/groovycDetector/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/mixedJavaAndGroovy/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/groovy/mixedJavaAndGroovy/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/signing/maven/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/signing/conditional/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/junit/categories/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/jacoco/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/jacoco/quickstart/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/jacoco/application/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/groups/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/suitexmlbuilder/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/suitexmlbuilder/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/java-jdk14-passing/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/java-jdk14-passing/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/java-jdk15-passing/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testng/java-jdk15-passing/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testReport/core/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/testing/testReport/util/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/ant/useExternalAntTaskWithConfig/src" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/java/sourceSets/src/intTest/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/api/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/shared/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/services/personService/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/java/services/personService/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/webDist/date/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/webDist/hello/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/javaWithCustomConf/api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/userguide/multiproject/dependencies/javaWithCustomConf/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/ivypublish/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/ivypublish/subproject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/idea/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/model/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/eclipse/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/runBuild/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/customModel/plugin/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/toolingApi/customModel/tooling/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/application/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/codeQuality/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/sonarRunner/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/sonarRunner/quickstart/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/maven-publish/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/maven-publish/javaProject/subproject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/buildDashboard/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/webApplication/customised/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/webApplication/customised/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/webApplication/quickstart/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/docs/src/samples/clientModuleDependencies/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/osgi/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/osgi/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/antlr/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/jetty/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/maven/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/maven/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/scala/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/scala/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/scala/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/scala/src/integTest/resources/org/gradle/scala/compile/jdk6/ZincScalaCompilerJdk6IntegrationTest/compilesJavaCodeIncrementally/src/main/scala" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/scala/src/integTest/resources/org/gradle/scala/compile/IncrementalScalaCompileIntegrationTest/recompilesSourceWhenPropertiesChange/src/main/scala" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/nested/nested2/nestedProject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/nested/nested2/nestedProject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/skippedProject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/skippedProject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/customizedProject/src" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/customizedProject/test" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/javaProjectWithJacoco/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/sonar/runner/SonarRunnerSmokeIntegrationTest/shared/javaProjectWithJacoco/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/nested/nested2/nestedProject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/nested/nested2/nestedProject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/skippedProject/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/skippedProject/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/customizedProject/src" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/customizedProject/test" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/javaProjectWithJacoco/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/sonar/src/integTest/resources/org/gradle/api/plugins/sonar/SonarSmokeIntegrationTest/shared/javaProjectWithJacoco/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/jacoco/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/native/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesDependentClasses/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesDependentClasses" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesSourceWhenPropertiesChange/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesDependentClassesAcrossProjectBoundaries/app/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesDependentClassesAcrossProjectBoundaries/lib/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/java/compile/IncrementalJavaCompileIntegrationTest/recompilesDependentClassesAcrossProjectBoundaries" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/groovy/compile/GroovyCompilerIntegrationSpec/canUseThirdPartyAstTransform/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/groovy/compile/GroovyCompilerIntegrationSpec/canUseAstTransformThatReferencesGroovyTestCase/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/groovy/compile/ApiGroovyCompilerIntegrationSpec/canJointCompileWithJavaCompilerExecutable/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/groovy/compile/BasicGroovyCompilerIntegrationSpec/compileBadJavaCode/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/groovy/compile/IncrementalGroovyCompileIntegrationTest/recompilesSourceWhenPropertiesChange/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/compile/daemon/ParallelCompilerDaemonIntegrationTest/shared" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/javadoc/JavadocIntegrationTest/handlesTagsAndTaglets/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/javadoc/JavadocIntegrationTest/handlesTagsAndTaglets/src/taglet/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/javadoc/JavadocIntegrationTest/canCombineLocalOptionWithOtherOptions/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/javadoc/JavadocIntegrationTest/canCombineLocalOptionWithOtherOptions/src/taglet/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources/org/gradle/testing/junit/JUnitIntegrationTest/junit3Tests/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/integTest/resources" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/plugins/src/testFixtures/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/publish/src/main/groovy/org/gradle/api/publish/plugins" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/publish/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/wrapper/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/wrapper/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/announce/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/launcher/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/launcher/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/open-api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/open-api/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core-impl/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/core-impl/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/messaging/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/messaging/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/reporting/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/ExecIntegrationTest/shared/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/ProjectLayoutIntegrationTest/canUseANonStandardBuildDir/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/ProjectLayoutIntegrationTest/canUseANonStandardBuildDir/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/IncrementalTestIntegrationTest/shared/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/IncrementalTestIntegrationTest/doesNotRunStaleTests/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/IncrementalTestIntegrationTest/executesTestsWhenSourceChanges/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/IncrementalTestIntegrationTest/executesTestsWhenSourceChanges" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/integ-test/src/integTest/resources/org/gradle/integtests/IncrementalTestIntegrationTest/executesTestsWhenTestFrameworkChanges/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/javascript/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/testjar/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/testjar/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/multiModule/webinar-api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/multiModule/webinar-impl/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/multiModule/webinar-impl/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/singleModule/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/singleModule/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/enforcerplugin/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/flatmultimodule/webinar-api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/flatmultimodule/webinar-impl/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-setup/src/integTest/resources/org/gradle/buildsetup/plugins/MavenConversionIntegrationTest/flatmultimodule/webinar-impl/src/test/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/diagnostics/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/diagnostics/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/diagnostics/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/performance/src/configPlugin" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/performance/src/testFixtures/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/tooling-api/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/tooling-api/src/integTest/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/code-quality/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/language-jvm/src/main/groovy/org/gradle/language/jvm/tasks" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/language-jvm/src/main/groovy/org/gradle/language/jvm/plugins" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/language-jvm/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/base-services/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/base-services/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/language-base/src/main/groovy/org/gradle/language/base/plugins" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/language-base/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-comparison/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-comparison/src/integTest/resources/org/gradle/api/plugins/buildcomparison/gradle/BuildComparisonIntegrationSpec/compareArchives/source/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/build-comparison/src/integTest/resources/org/gradle/api/plugins/buildcomparison/gradle/BuildComparisonIntegrationSpec/compareArchives/target/src/main/java" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/internal-testing/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/base-services-groovy/src/main/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/base-services-groovy/src/test/groovy" /> - <root url="jar://$MODULE_DIR$/lib/gradle-1.7-src.zip!/gradle-1.7/subprojects/internal-integ-testing/src/main/groovy" /> + <root url="jar://$MODULE_DIR$/lib/gradle-1.8-20130730220035+0000-src.zip!/" /> </SOURCES> </library> </orderEntry> diff --git a/plugins/gradle/lib/gradle-1.7-src.zip b/plugins/gradle/lib/gradle-1.7-src.zip Binary files differdeleted file mode 100644 index d35500bc95a1..000000000000 --- a/plugins/gradle/lib/gradle-1.7-src.zip +++ /dev/null diff --git a/plugins/gradle/lib/gradle-1.8-20130730220035+0000-src.zip b/plugins/gradle/lib/gradle-1.8-20130730220035+0000-src.zip Binary files differnew file mode 100644 index 000000000000..52be3d139426 --- /dev/null +++ b/plugins/gradle/lib/gradle-1.8-20130730220035+0000-src.zip diff --git a/plugins/gradle/lib/gradle-base-services-1.7.jar b/plugins/gradle/lib/gradle-base-services-1.8-20130730220035+0000.jar Binary files differindex 2593b2bf4ef7..3eb0bb7e1cfd 100644 --- a/plugins/gradle/lib/gradle-base-services-1.7.jar +++ b/plugins/gradle/lib/gradle-base-services-1.8-20130730220035+0000.jar diff --git a/plugins/gradle/lib/gradle-core-1.7.jar b/plugins/gradle/lib/gradle-core-1.8-20130730220035+0000.jar Binary files differindex e9b7019743c9..a184975e0055 100644 --- a/plugins/gradle/lib/gradle-core-1.7.jar +++ b/plugins/gradle/lib/gradle-core-1.8-20130730220035+0000.jar diff --git a/plugins/gradle/lib/gradle-messaging-1.7.jar b/plugins/gradle/lib/gradle-messaging-1.8-20130730220035+0000.jar Binary files differindex 4cbb72cd29f1..f76ab9ec59f0 100644 --- a/plugins/gradle/lib/gradle-messaging-1.7.jar +++ b/plugins/gradle/lib/gradle-messaging-1.8-20130730220035+0000.jar diff --git a/plugins/gradle/lib/gradle-tooling-api-1.7.jar b/plugins/gradle/lib/gradle-tooling-api-1.8-20130730220035+0000.jar Binary files differindex 0695d3434175..48e428c34b87 100644 --- a/plugins/gradle/lib/gradle-tooling-api-1.7.jar +++ b/plugins/gradle/lib/gradle-tooling-api-1.8-20130730220035+0000.jar diff --git a/plugins/gradle/lib/gradle-wrapper-1.7.jar b/plugins/gradle/lib/gradle-wrapper-1.7.jar Binary files differdeleted file mode 100644 index cda194d2af6d..000000000000 --- a/plugins/gradle/lib/gradle-wrapper-1.7.jar +++ /dev/null diff --git a/plugins/gradle/lib/gradle-wrapper-1.8-20130730220035+0000.jar b/plugins/gradle/lib/gradle-wrapper-1.8-20130730220035+0000.jar Binary files differnew file mode 100644 index 000000000000..17d29fc5b1fb --- /dev/null +++ b/plugins/gradle/lib/gradle-wrapper-1.8-20130730220035+0000.jar diff --git a/plugins/gradle/resources/i18n/GradleBundle.properties b/plugins/gradle/resources/i18n/GradleBundle.properties index 7a46d916619c..8252d8be0262 100644 --- a/plugins/gradle/resources/i18n/GradleBundle.properties +++ b/plugins/gradle/resources/i18n/GradleBundle.properties @@ -14,4 +14,4 @@ gradle.home.setting.type.explicit.incorrect=Gradle location is incorrect.\nLocat gradle.toolwindow.text.no.linked.project=\nThere is no linked Gradle project\nYou can {@action Gradle.LinkToProject} one. gradle.action.open.script.text=Open linked Gradle project -gradle.action.open.script.description=Allows to open project file of the linked Gradle project at the editor +gradle.action.open.script.description=Allows to open project file of the linked Gradle project at the editor
\ No newline at end of file diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java index e0a1304e2f26..732e7025418e 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/GradleManager.java @@ -58,12 +58,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.config.GradleSettingsListenerAdapter; import org.jetbrains.plugins.gradle.remote.GradleJavaHelper; -import org.jetbrains.plugins.gradle.service.task.GradleTaskManager; import org.jetbrains.plugins.gradle.service.GradleInstallationManager; import org.jetbrains.plugins.gradle.service.project.GradleAutoImportAware; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolver; import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverExtension; import org.jetbrains.plugins.gradle.service.settings.GradleConfigurable; +import org.jetbrains.plugins.gradle.service.task.GradleTaskManager; import org.jetbrains.plugins.gradle.settings.*; import org.jetbrains.plugins.gradle.util.GradleBundle; import org.jetbrains.plugins.gradle.util.GradleConstants; @@ -73,6 +73,7 @@ import javax.swing.*; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; +import java.net.URL; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -173,7 +174,7 @@ implements ExternalSystemConfigurableAware, ExternalSystemUiAware, ExternalSyste settings.getGradleVmOptions()); for (GradleProjectResolverExtension extension : RESOLVER_EXTENSIONS.getValue()) { - result.addResolverExtensionClass(extension.getClass().getName()); + result.addResolverExtensionClass(ClassHolder.from(extension.getClass())); } String javaHome = myJavaHelper.getJdkHome(pair.first); if (!StringUtil.isEmpty(javaHome)) { @@ -186,7 +187,7 @@ implements ExternalSystemConfigurableAware, ExternalSystemUiAware, ExternalSyste } @Override - public void enhanceParameters(@NotNull SimpleJavaParameters parameters) throws ExecutionException { + public void enhanceRemoteProcessing(@NotNull SimpleJavaParameters parameters) throws ExecutionException { PathsList classPath = parameters.getClassPath(); // Gradle i18n bundle. @@ -225,10 +226,14 @@ implements ExternalSystemConfigurableAware, ExternalSystemUiAware, ExternalSyste } for (GradleProjectResolverExtension extension : RESOLVER_EXTENSIONS.getValue()) { - extension.enhanceParameters(parameters); + extension.enhanceRemoteProcessing(parameters); } } + @Override + public void enhanceLocalProcessing(@NotNull List<URL> urls) { + } + @NotNull @Override public Class<? extends ExternalSystemProjectResolver<GradleExecutionSettings>> getProjectResolverClass() { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java index 19e0fcc25b89..caf662d722bc 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleExecutionHelper.java @@ -74,10 +74,10 @@ public class GradleExecutionHelper { } @SuppressWarnings("IOResourceOpenedButNotSafelyClosed") - private static void prepare(@NotNull LongRunningOperation operation, - @NotNull final ExternalSystemTaskId id, - @Nullable GradleExecutionSettings settings, - @NotNull final ExternalSystemTaskNotificationListener listener) + public static void prepare(@NotNull LongRunningOperation operation, + @NotNull final ExternalSystemTaskId id, + @Nullable GradleExecutionSettings settings, + @NotNull final ExternalSystemTaskNotificationListener listener) { if (settings == null) { return; @@ -108,6 +108,9 @@ public class GradleExecutionHelper { try { return f.fun(connection); } + catch (ExternalSystemException e) { + throw e; + } catch (Throwable e) { throw new ExternalSystemException(e); } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java index 79010b8797ba..8dde4a838c78 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolver.java @@ -29,15 +29,13 @@ import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.plugins.gradle.remote.impl.GradleLibraryNamesMixer; +import org.jetbrains.plugins.gradle.settings.ClassHolder; import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings; import org.jetbrains.plugins.gradle.util.GradleConstants; import org.jetbrains.plugins.gradle.util.GradleUtil; import java.io.File; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author Denis Zhdanov @@ -51,8 +49,9 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad private final GradleLibraryNamesMixer myLibraryNamesMixer = new GradleLibraryNamesMixer(); - @Nullable private Pair<List<String>, List<GradleProjectResolverExtension>> myCachedExtensions; - + @Nullable + private Pair<List<ClassHolder<? extends GradleProjectResolverExtension>>, List<GradleProjectResolverExtension>> myCachedExtensions; + @Nullable @Override public DataNode<ProjectData> resolveProjectInfo(@NotNull final ExternalSystemTaskId id, @@ -63,19 +62,23 @@ public class GradleProjectResolver implements ExternalSystemProjectResolver<Grad throws ExternalSystemException, IllegalArgumentException, IllegalStateException { if (settings != null) { - List<String> extensionClassNames = settings.getResolverExtensions(); - if (myCachedExtensions == null || !myCachedExtensions.first.equals(extensionClassNames)) { - List<String> classNames = ContainerUtilRt.newArrayList(extensionClassNames); + List<ClassHolder<? extends GradleProjectResolverExtension>> extensionClasses = settings.getResolverExtensions(); + if (myCachedExtensions == null || !myCachedExtensions.first.equals(extensionClasses)) { List<GradleProjectResolverExtension> extensions = ContainerUtilRt.newArrayList(); - for (String className : classNames) { + for (ClassHolder<? extends GradleProjectResolverExtension> holder : extensionClasses) { try { - extensions.add((GradleProjectResolverExtension)Class.forName(className).newInstance()); + final GradleProjectResolverExtension extension = holder.getTargetClass().newInstance(); + extensions.add(extension); } - catch (Exception e) { - throw new IllegalArgumentException(String.format("Can't instantiate project resolve extension for class '%s'", className), e); + catch (Throwable e) { + throw new IllegalArgumentException( + String.format("Can't instantiate project resolve extension for class '%s'", holder.getTargetClassName()), + e + ); } } - myCachedExtensions = Pair.create(classNames, extensions); + List<ClassHolder<? extends GradleProjectResolverExtension>> key = ContainerUtilRt.newArrayList(extensionClasses); + myCachedExtensions = Pair.create(key, extensions); } for (GradleProjectResolverExtension extension : myCachedExtensions.second) { DataNode<ProjectData> result = extension.resolveProjectInfo(id, projectPath, downloadLibraries, settings, listener); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java index df3b0fb17d2f..ff99e9c65ef1 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/GradleProjectResolverExtension.java @@ -30,7 +30,7 @@ import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings; * * @author Denis Zhdanov * @since 4/17/13 11:24 AM - * @see GradleManager#enhanceParameters(SimpleJavaParameters) sample enhanceParameters() implementation + * @see GradleManager#enhanceRemoteProcessing(SimpleJavaParameters) sample enhanceParameters() implementation */ public interface GradleProjectResolverExtension extends ParametersEnhancer, ExternalSystemProjectResolver<GradleExecutionSettings> { diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/wizard/GradleProjectImportBuilder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/wizard/GradleProjectImportBuilder.java index e4a6ff411198..cfb51f93c4ec 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/wizard/GradleProjectImportBuilder.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/wizard/GradleProjectImportBuilder.java @@ -21,7 +21,6 @@ import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; import com.intellij.openapi.externalSystem.service.project.wizard.AbstractExternalProjectImportBuilder; -import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsManager; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.*; @@ -46,8 +45,8 @@ import java.util.List; */ public class GradleProjectImportBuilder extends AbstractExternalProjectImportBuilder<ImportFromGradleControl> { - public GradleProjectImportBuilder(@NotNull ExternalSystemSettingsManager settingsManager, @NotNull ProjectDataManager dataManager) { - super(settingsManager, dataManager, new ImportFromGradleControl(), GradleConstants.SYSTEM_ID); + public GradleProjectImportBuilder(@NotNull ProjectDataManager dataManager) { + super(dataManager, new ImportFromGradleControl(), GradleConstants.SYSTEM_ID); } @NotNull diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java index 7bf0b99a0905..a710fc8f027a 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/settings/GradleProjectSettingsControl.java @@ -24,6 +24,7 @@ import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.ui.components.JBLabel; import com.intellij.ui.components.JBRadioButton; @@ -171,7 +172,7 @@ public class GradleProjectSettingsControl extends AbstractExternalProjectSetting @Override @Nullable protected String applyExtraSettings(@NotNull GradleProjectSettings settings) { - String gradleHomePath = myGradleHomePathField.getText(); + String gradleHomePath = FileUtil.toCanonicalPath(myGradleHomePathField.getText()); if (myGradleHomeModifiedByUser) { if (StringUtil.isEmpty(gradleHomePath)) { settings.setGradleHome(null); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/ClassHolder.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/ClassHolder.java new file mode 100644 index 000000000000..97c30bc3b3ac --- /dev/null +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/ClassHolder.java @@ -0,0 +1,88 @@ +/* + * Copyright 2000-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.jetbrains.plugins.gradle.settings; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.io.Serializable; + +/** + * Holds information about target class. + * + * @author Denis Zhdanov + * @since 8/15/13 2:52 PM + */ +public class ClassHolder<T> implements Serializable { + + private static final long serialVersionUID = 1L; + + @NotNull private final String myClassName; + + @Nullable private transient Class<T> myTargetClass; + + /** + * @param targetClass class to use + */ + @SuppressWarnings("NullableProblems") + public ClassHolder(@NotNull Class<T> targetClass) { + myTargetClass = targetClass; + myClassName = myTargetClass.getName(); + } + + @NotNull + public static <T> ClassHolder<T> from(@NotNull Class<T> clazz) { + return new ClassHolder<T>(clazz); + } + + @SuppressWarnings("unchecked") + @NotNull + public Class<T> getTargetClass() throws ClassNotFoundException { + if (myTargetClass == null) { + // We're not afraid of race condition here as the class will be loaded by the same class loader. + myTargetClass = (Class<T>)Class.forName(myClassName); + } + return myTargetClass; + } + + @NotNull + public String getTargetClassName() { + return myClassName; + } + + @Override + public int hashCode() { + return myClassName.hashCode(); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + ClassHolder holder = (ClassHolder)o; + + if (!myClassName.equals(holder.myClassName)) return false; + if (myTargetClass != null ? !myTargetClass.equals(holder.myTargetClass) : holder.myTargetClass != null) return false; + + return true; + } + + @Override + public String toString() { + return myClassName; + } +} diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExecutionSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExecutionSettings.java index e95285f5d6ce..71f334db5c70 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExecutionSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleExecutionSettings.java @@ -21,6 +21,7 @@ import com.intellij.openapi.util.SystemInfo; import com.intellij.util.containers.ContainerUtilRt; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.gradle.service.project.GradleProjectResolverExtension; import java.util.List; @@ -34,7 +35,7 @@ public class GradleExecutionSettings extends ExternalSystemExecutionSettings { private static final long serialVersionUID = 1L; - @NotNull private final List<String> myResolverExtensions = ContainerUtilRt.newArrayList(); + @NotNull private final List<ClassHolder<? extends GradleProjectResolverExtension>> myResolverExtensions = ContainerUtilRt.newArrayList(); @Nullable private final String myGradleHome; @Nullable private final String myServiceDirectory; @@ -83,12 +84,12 @@ public class GradleExecutionSettings extends ExternalSystemExecutionSettings { } @NotNull - public List<String> getResolverExtensions() { + public List<ClassHolder<? extends GradleProjectResolverExtension>> getResolverExtensions() { return myResolverExtensions; } - public void addResolverExtensionClass(@NotNull String className) { - myResolverExtensions.add(className); + public void addResolverExtensionClass(@NotNull ClassHolder<? extends GradleProjectResolverExtension> holder) { + myResolverExtensions.add(holder); } /** diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java index 3da23b6c2c46..c5e1025099a2 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java @@ -1,6 +1,7 @@ package org.jetbrains.plugins.gradle.settings; import com.intellij.openapi.components.*; +import com.intellij.openapi.externalSystem.service.project.PlatformFacade; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; @@ -16,8 +17,8 @@ public class GradleLocalSettings extends AbstractExternalSystemLocalSettings implements PersistentStateComponent<AbstractExternalSystemLocalSettings.State> { - public GradleLocalSettings(@NotNull Project project) { - super(GradleConstants.SYSTEM_ID, project); + public GradleLocalSettings(@NotNull Project project, @NotNull PlatformFacade facade) { + super(GradleConstants.SYSTEM_ID, project, facade); } @NotNull diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java index 703c2db430e2..63cd133690e6 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/util/GradleUtil.java @@ -12,6 +12,7 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.containers.Stack; import org.gradle.tooling.model.GradleProject; +import org.gradle.tooling.model.GradleScript; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -171,6 +172,27 @@ public class GradleUtil { */ @NotNull public static String getConfigPath(@NotNull GradleProject subProject, @NotNull String rootProjectPath) { + try { + GradleScript script = subProject.getBuildScript(); + if (script != null) { + File file = script.getSourceFile(); + if (file != null) { + if (file.isFile()) { + // The file points to 'build.gradle' at the moment but we keep it's parent dir path instead. + file = file.getParentFile(); + } + return ExternalSystemApiUtil.toCanonicalPath(file.getCanonicalPath()); + } + } + } + catch (Exception e) { + // As said by gradle team: 'One thing I'm interested in is whether you have any thoughts about how the tooling API should + // deal with missing details from the model - for example, when asking for details about the build scripts when using + // a version of Gradle that does not supply that information. Currently, you'll get a `UnsupportedOperationException` + // when you call the `getBuildScript()` method'. + // + // So, just ignore it and assume that the user didn't define any custom build file name. + } File rootProjectParent = new File(rootProjectPath).getParentFile(); StringBuilder buffer = new StringBuilder(FileUtil.toCanonicalPath(rootProjectParent.getAbsolutePath())); Stack<String> stack = ContainerUtilRt.newStack(); diff --git a/plugins/groovy/src/META-INF/plugin.xml b/plugins/groovy/src/META-INF/plugin.xml index bbf316d743df..44e1faf56d4a 100644 --- a/plugins/groovy/src/META-INF/plugin.xml +++ b/plugins/groovy/src/META-INF/plugin.xml @@ -198,9 +198,7 @@ <testGenerator language="Groovy" implementationClass="org.jetbrains.plugins.groovy.testIntegration.GroovyTestGenerator"/> <constructorBodyGenerator language="Groovy" implementationClass="org.jetbrains.plugins.groovy.annotator.intentions.dynamic.GrConstructorBodyGenerator"/> - <!-- In Android Studio, we don't want editor notifications to setup Groovy Path when *.gradle files are opened. This is a temporary - hack to remove this until we figure out how to disable it just for gradle scripts. - <editorNotificationProvider implementation="org.jetbrains.plugins.groovy.annotator.ConfigureGroovyLibraryNotificationProvider"/> --> + <editorNotificationProvider implementation="org.jetbrains.plugins.groovy.annotator.ConfigureGroovyLibraryNotificationProvider"/> <refactoring.introduceParameterMethodUsagesProcessor implementation="org.jetbrains.plugins.groovy.refactoring.introduce.parameter.java2groovy.GroovyIntroduceParameterMethodUsagesProcessor"/> <refactoring.changeSignatureUsageProcessor diff --git a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java index 564677a2936f..bd0122fbf2e6 100644 --- a/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java +++ b/plugins/groovy/src/org/intellij/plugins/intelliLang/inject/groovy/GroovyLanguageInjectionSupport.java @@ -81,29 +81,29 @@ public class GroovyLanguageInjectionSupport extends AbstractLanguageInjectionSup if (!isStringLiteral(psiElement)) return false; - return doInject(language.getID(), psiElement); + return doInject(language.getID(), psiElement, psiElement); } - private static boolean doInject(String languageId, PsiElement host) { - final PsiElement target = getTopLevelInjectionTarget(host); + private static boolean doInject(String languageId, PsiElement psiElement, PsiLanguageInjectionHost host) { + final PsiElement target = getTopLevelInjectionTarget(psiElement); final PsiElement parent = target.getParent(); - final Project project = host.getProject(); + final Project project = psiElement.getProject(); if (parent instanceof GrReturnStatement) { final GrControlFlowOwner owner = ControlFlowUtils.findControlFlowOwner(parent); if (owner instanceof GrOpenBlock && owner.getParent() instanceof GrMethod) { - return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (PsiMethod)owner.getParent(), -1, languageId); + return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (PsiMethod)owner.getParent(), -1, host, languageId); } } else if (parent instanceof GrMethod) { - return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (GrMethod)parent, -1, languageId); + return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (GrMethod)parent, -1, host, languageId); } else if (parent instanceof GrAnnotationNameValuePair) { final PsiReference ref = parent.getReference(); if (ref != null) { final PsiElement resolved = ref.resolve(); if (resolved instanceof PsiMethod) { - return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (PsiMethod)resolved, -1, languageId); + return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, (PsiMethod)resolved, -1, host, languageId); } } } @@ -112,7 +112,7 @@ public class GroovyLanguageInjectionSupport extends AbstractLanguageInjectionSup if (method != null) { final int index = findParameterIndex(target, ((GrMethodCall)parent.getParent())); if (index >= 0) { - return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, method, index, languageId); + return JavaLanguageInjectionSupport.doInjectInJavaMethod(project, method, index, host, languageId); } } } @@ -121,16 +121,16 @@ public class GroovyLanguageInjectionSupport extends AbstractLanguageInjectionSup if (expr instanceof GrReferenceExpression) { final PsiElement element = ((GrReferenceExpression)expr).resolve(); if (element != null) { - return doInject(languageId, element); + return doInject(languageId, element, host); } } } else { if (parent instanceof PsiVariable) { - if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, languageId)) return true; + if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)parent, host, languageId)) return true; } else if (target instanceof PsiVariable && !(target instanceof LightElement)) { - if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)target, languageId)) return true; + if (JavaLanguageInjectionSupport.doAddLanguageAnnotation(project, (PsiModifierListOwner)target, host, languageId)) return true; } } return false; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyMembersWithDocSelectioner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyMembersWithDocSelectioner.java index 2baace771327..5c64f7cab902 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyMembersWithDocSelectioner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyMembersWithDocSelectioner.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.editor.selection; -import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; @@ -30,7 +29,7 @@ import java.util.List; /** * @author Max Medvedev */ -public class GroovyMembersWithDocSelectioner implements ExtendWordSelectionHandler { +public class GroovyMembersWithDocSelectioner extends ExtendWordSelectionHandlerBase { @Override public boolean canSelect(PsiElement e) { return e instanceof GrDocComment || e instanceof GrDocCommentOwner; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyStatementSelectioner.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyStatementSelectioner.java index 8f0bab0a4842..12df73c2d5d3 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyStatementSelectioner.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyStatementSelectioner.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.editor.selection; -import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; @@ -32,7 +31,7 @@ import java.util.List; /** * @author Max Medvedev */ -public class GroovyStatementSelectioner implements ExtendWordSelectionHandler { +public class GroovyStatementSelectioner extends ExtendWordSelectionHandlerBase { @Override public boolean canSelect(PsiElement e) { return e instanceof GrExpression && PsiUtil.isExpressionStatement(e) || diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyWordSelectionHandler.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyWordSelectionHandler.java index e19137ef12ea..5f5f683169d4 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyWordSelectionHandler.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/editor/selection/GroovyWordSelectionHandler.java @@ -15,7 +15,6 @@ */ package org.jetbrains.plugins.groovy.editor.selection; -import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.codeInsight.editorActions.SelectWordUtil; import com.intellij.openapi.diagnostic.Logger; @@ -43,7 +42,7 @@ import java.util.List; /** * @author Max Medvedev */ -public class GroovyWordSelectionHandler implements ExtendWordSelectionHandler { +public class GroovyWordSelectionHandler extends ExtendWordSelectionHandlerBase { private static final Logger LOG = Logger.getInstance(GroovyWordSelectionHandler.class); @Override diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java index 44bcabc93784..16b6d0f0014a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/impl/GroovyFileImpl.java @@ -537,7 +537,7 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile { final PsiClass scriptClass = getScriptClass(); if (scriptClass != null) { final PsiElement originalElement = scriptClass.getOriginalElement(); - if (originalElement != scriptClass) { + if (originalElement != scriptClass && originalElement != null) { return originalElement.getContainingFile(); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java index b9ac58a3a577..75686574f06a 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcFramework.java @@ -324,7 +324,7 @@ public abstract class MvcFramework { protected static void ensureRunConfigurationExists(Module module, ConfigurationType configurationType, String name) { final RunManagerEx runManager = RunManagerEx.getInstanceEx(module.getProject()); - for (final RunConfiguration runConfiguration : runManager.getConfigurations(configurationType)) { + for (final RunConfiguration runConfiguration : runManager.getConfigurationsList(configurationType)) { if (runConfiguration instanceof MvcRunConfiguration && ((MvcRunConfiguration)runConfiguration).getModule() == module) { return; } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunConfigurationEditor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunConfigurationEditor.java index 1f2b126995b7..6de8565a31b2 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunConfigurationEditor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/mvc/MvcRunConfigurationEditor.java @@ -21,8 +21,8 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.util.text.StringUtil; -import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.DocumentAdapter; +import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.components.JBLabel; import org.jetbrains.annotations.NotNull; @@ -155,7 +155,4 @@ public class MvcRunConfigurationEditor<T extends MvcRunConfiguration> extends Se return myMainPanel; } - - protected void disposeEditor() { - } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java index 82f760b242db..251e7c1c8f4f 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java @@ -138,9 +138,6 @@ public class GroovyRunConfigurationEditor extends SettingsEditor<GroovyScriptRun return myMainPanel; } - public void disposeEditor() { - } - @Override public JComponent getAnchor() { return anchor; diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java index 8b0fb9e286a4..b635d1f09572 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfigurationProducer.java @@ -35,6 +35,8 @@ import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector; import org.jetbrains.plugins.groovy.lang.psi.GroovyFile; import org.jetbrains.plugins.groovy.lang.psi.impl.synthetic.GroovyScriptClass; +import java.util.List; + /** * @author ilyas */ @@ -86,7 +88,7 @@ public class GroovyScriptRunConfigurationProducer extends RuntimeConfigurationPr @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List<RunnerAndConfigurationSettings> existingConfigurations, ConfigurationContext context) { for (RunnerAndConfigurationSettings existingConfiguration : existingConfigurations) { final RunConfiguration configuration = existingConfiguration.getConfiguration(); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy index 205feed0f3a0..5c81db4fd902 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/EnterActionTest.groovy @@ -366,5 +366,15 @@ class A extends spock.lang.Specification { } ''') } + + void testCommentAtFileEnd() { + doTest('''\ +print 2 +/*<caret>''', '''\ +print 2 +/* +<caret> + */''') + } } diff --git a/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java b/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java index 03bc8450a764..3dad8e9d8302 100644 --- a/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java +++ b/plugins/junit/src/com/intellij/execution/junit/AddToTestsPatternAction.java @@ -97,7 +97,8 @@ public class AddToTestsPatternAction extends AnAction { } private static List<JUnitConfiguration> collectPatternConfigurations(Set<PsiMember> foundClasses, Project project) { - final RunConfiguration[] configurations = RunManager.getInstance(project).getConfigurations(JUnitConfigurationType.getInstance()); + final List<RunConfiguration> configurations = RunManager.getInstance(project).getConfigurationsList( + JUnitConfigurationType.getInstance()); final List<JUnitConfiguration> foundConfigurations = new ArrayList<JUnitConfiguration>(); for (RunConfiguration configuration : configurations) { final JUnitConfiguration.Data data = ((JUnitConfiguration)configuration).getPersistentData(); diff --git a/plugins/junit/src/com/intellij/execution/junit/TestObject.java b/plugins/junit/src/com/intellij/execution/junit/TestObject.java index cdd5ad02b84f..1020065d44fc 100644 --- a/plugins/junit/src/com/intellij/execution/junit/TestObject.java +++ b/plugins/junit/src/com/intellij/execution/junit/TestObject.java @@ -295,6 +295,7 @@ public abstract class TestObject implements JavaCommandLine { } } }; + Disposer.register(consoleView, packetsReceiver); final DeferredActionsQueue queue = new DeferredActionsQueueImpl(); handler.getOut().setPacketDispatcher(packetsReceiver, queue); diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java index 4be99aea9a8d..d564b54a6f2f 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java @@ -31,14 +31,13 @@ import com.intellij.execution.ui.ClassBrowser; import com.intellij.execution.ui.CommonJavaParametersPanel; import com.intellij.execution.ui.ConfigurationModuleSelector; import com.intellij.icons.AllIcons; -import com.intellij.openapi.fileTypes.PlainTextLanguage; -import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ide.util.ClassFilter; import com.intellij.ide.util.PackageChooserDialog; import com.intellij.openapi.fileChooser.FileChooser; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.fileChooser.FileChooserFactory; +import com.intellij.openapi.fileTypes.PlainTextLanguage; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.SettingsEditor; import com.intellij.openapi.project.Project; @@ -47,10 +46,7 @@ import com.intellij.openapi.ui.ex.MessagesEx; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.*; -import com.intellij.ui.EditorTextField; -import com.intellij.ui.EditorTextFieldWithBrowseButton; -import com.intellij.ui.InsertPathAction; -import com.intellij.ui.PanelWithAnchor; +import com.intellij.ui.*; import com.intellij.ui.components.JBLabel; import com.intellij.util.IconUtil; import com.intellij.util.TextFieldCompletionProvider; @@ -577,9 +573,6 @@ public class JUnitConfigurable extends SettingsEditor<JUnitConfiguration> implem return myWholePanel; } - public void disposeEditor() { - } - private void applyHelpersTo(final JUnitConfiguration currentState) { myCommonJavaParameters.applyTo(currentState); getModuleSelector().applyTo(currentState); diff --git a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java index b6c1257a4b6c..90aa44287e96 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java +++ b/plugins/junit/src/com/intellij/execution/junit2/ui/TestsPacketsReceiver.java @@ -83,7 +83,6 @@ public class TestsPacketsReceiver implements OutputPacketProcessor, Disposable { myUnboundOutput = unboundOutput; myObjectRegistry = new InputObjectRegistry(); myConsoleProperties = (JUnitConsoleProperties)consoleView.getProperties(); - Disposer.register(consoleView, this); } @Override diff --git a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenConstants.java b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenConstants.java index 4c8c8546654d..dea93b30002e 100644 --- a/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenConstants.java +++ b/plugins/maven/maven-server-api/src/org/jetbrains/idea/maven/model/MavenConstants.java @@ -50,6 +50,6 @@ public class MavenConstants { "post-integration-test", "verify", "install", "site", "deploy"); public static final List<String> BASIC_PHASES = - Arrays.asList("clean", "validate", "compile", "test", "package", "install", "deploy", "site"); + Arrays.asList("clean", "validate", "compile", "test", "package", "verify", "install", "deploy", "site"); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/DependencyId.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/DependencyId.java deleted file mode 100644 index f71270cd542b..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/dom/DependencyId.java +++ /dev/null @@ -1,63 +0,0 @@ -package org.jetbrains.idea.maven.dom; - -import com.intellij.openapi.util.text.StringUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.dom.model.MavenDomDependency; - -/** -* @author Sergey Evdokimov -*/ -public class DependencyId { - private final String groupId; - private final String artifactId; - private final String type; - private final String classifier; - - public DependencyId(@NotNull String groupId, @NotNull String artifactId, @Nullable String type, @Nullable String classifier) { - this.groupId = groupId; - this.artifactId = artifactId; - this.type = StringUtil.isEmpty(type) ? "jar" : type; - this.classifier = classifier; - } - - @Nullable - public static DependencyId create(@NotNull MavenDomDependency dep) { - String groupId = dep.getGroupId().getStringValue(); - if (StringUtil.isEmpty(groupId)) return null; - - String artifactId = dep.getArtifactId().getStringValue(); - if (StringUtil.isEmpty(artifactId)) return null; - - //noinspection ConstantConditions - return new DependencyId(groupId, artifactId, dep.getType().getStringValue(), dep.getClassifier().getStringValue()); - } - - public boolean isValid() { - return StringUtil.isNotEmpty(groupId) && StringUtil.isNotEmpty(artifactId); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof DependencyId)) return false; - - DependencyId id = (DependencyId)o; - - if (artifactId != null ? !artifactId.equals(id.artifactId) : id.artifactId != null) return false; - if (classifier != null ? !classifier.equals(id.classifier) : id.classifier != null) return false; - if (groupId != null ? !groupId.equals(id.groupId) : id.groupId != null) return false; - if (!type.equals(id.type)) return false; - - return true; - } - - @Override - public int hashCode() { - int result = groupId != null ? groupId.hashCode() : 0; - result = 31 * result + (artifactId != null ? artifactId.hashCode() : 0); - result = 31 * result + type.hashCode(); - result = 31 * result + (classifier != null ? classifier.hashCode() : 0); - return result; - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java index 96ee06d6aa66..0bf342fcdcfa 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenConfigurationProducer.java @@ -29,7 +29,6 @@ import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.project.MavenGeneralSettings; import org.jetbrains.idea.maven.project.MavenProjectsManager; import java.util.Collection; @@ -58,7 +57,7 @@ public class MavenConfigurationProducer extends RuntimeConfigurationProducer { @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List<RunnerAndConfigurationSettings> existingConfigurations, ConfigurationContext context) { final MavenRunnerParameters runnerParameters = createBuildParameters(location); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java index 5873bccf6f74..ad92707e8f01 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenExternalParameters.java @@ -144,6 +144,9 @@ public class MavenExternalParameters { params.getClassPath().add(path); } + params.setEnv(Collections.unmodifiableMap(runnerSettings.getEnvironmentProperties())); + params.setPassParentEnvs(runnerSettings.isPassParentEnv()); + params.setMainClass(MAVEN_LAUNCHER_CLASS); EncodingManager encodingManager = project == null ? EncodingProjectManager.getInstance() diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java index c92a70804daf..2982ceb4433d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunner.java @@ -19,7 +19,6 @@ import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.components.*; -import com.intellij.openapi.components.StoragePathMacros; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.progress.ProcessCanceledException; @@ -57,6 +56,7 @@ public class MavenRunner implements PersistentStateComponent<MavenRunnerSettings return mySettings; } + @NotNull public MavenRunnerSettings getState() { return mySettings; } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java index 5043a8e58dcb..61a45a4e88b1 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerPanel.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.execution; +import com.intellij.execution.configuration.EnvironmentVariablesComponent; import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.JavaSdk; import com.intellij.openapi.projectRoots.ProjectJdkTable; @@ -41,6 +42,7 @@ public class MavenRunnerPanel { private JCheckBox myRunInBackgroundCheckbox; private RawCommandLineEditor myVMParametersEditor; + private EnvironmentVariablesComponent myEnvVariablesComponent; private JComboBox myJdkCombo; private final DefaultComboBoxModel myJdkComboModel = new DefaultComboBoxModel(); private JCheckBox mySkipTestsCheckBox; @@ -104,6 +106,16 @@ public class MavenRunnerPanel { c.insets.left = 0; c.fill = GridBagConstraints.HORIZONTAL; + myEnvVariablesComponent = new EnvironmentVariablesComponent(); + myEnvVariablesComponent.setPassParentEnvs(true); + myEnvVariablesComponent.setLabelLocation(BorderLayout.WEST); + c.gridx = 0; + c.gridy++; + c.weightx = 1; + c.gridwidth = 2; + panel.add(myEnvVariablesComponent, c); + c.gridwidth = 1; + JPanel propertiesPanel = new JPanel(new BorderLayout()); propertiesPanel.setBorder(IdeBorderFactory.createTitledBorder("Properties", false)); @@ -154,6 +166,9 @@ public class MavenRunnerPanel { ComboBoxUtil.select(myJdkComboModel, data.getJreName()); myPropertiesPanel.setDataFromMap(data.getMavenProperties()); + + myEnvVariablesComponent.setEnvs(data.getEnvironmentProperties()); + myEnvVariablesComponent.setPassParentEnvs(data.isPassParentEnv()); } private Map<String, String> collectJdkNamesAndDescriptions() { @@ -189,6 +204,9 @@ public class MavenRunnerPanel { data.setJreName(ComboBoxUtil.getSelectedString(myJdkComboModel)); data.setMavenProperties(myPropertiesPanel.getDataAsMap()); + + data.setEnvironmentProperties(myEnvVariablesComponent.getEnvs()); + data.setPassParentEnv(myEnvVariablesComponent.isPassParentEnvs()); } public Project getProject() { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersPanel.form b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersPanel.form index 1b420f364eb9..158a35192d31 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersPanel.form +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerParametersPanel.form @@ -66,6 +66,7 @@ </constraints> <properties> <text value="Resolve &Workspace artifacts"/> + <toolTipText value="In case of multi-project workspace, dependencies will be looked for in the workspace first, and only after that in local repository."/> </properties> </component> <grid id="41a03" layout-manager="BorderLayout" hgap="0" vgap="0"> diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java index 8d0bae550c5f..e8a7a923c47e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettings.java @@ -19,6 +19,7 @@ package org.jetbrains.idea.maven.execution; import com.intellij.util.containers.ContainerUtil; +import com.intellij.util.containers.HashMap; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -39,6 +40,9 @@ public class MavenRunnerSettings implements Cloneable { private boolean skipTests = false; private Map<String, String> mavenProperties = new LinkedHashMap<String, String>(); + private Map<String, String> environmentProperties = new HashMap<String, String>(); + private boolean passParentEnv = true; + private List<Listener> myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); public boolean isRunMavenInBackground() { @@ -89,6 +93,26 @@ public class MavenRunnerSettings implements Cloneable { this.mavenProperties = mavenProperties; } + @NotNull + public Map<String, String> getEnvironmentProperties() { + return environmentProperties; + } + + public void setEnvironmentProperties(@NotNull Map<String, String> envs) { + if (envs == environmentProperties) return; + + environmentProperties.clear(); + environmentProperties.putAll(envs); + } + + public boolean isPassParentEnv() { + return passParentEnv; + } + + public void setPassParentEnv(boolean passParentEnv) { + this.passParentEnv = passParentEnv; + } + public void addListener(Listener l) { myListeners.add(l); } @@ -118,6 +142,8 @@ public class MavenRunnerSettings implements Cloneable { if (!jreName.equals(that.jreName)) return false; if (mavenProperties != null ? !mavenProperties.equals(that.mavenProperties) : that.mavenProperties != null) return false; if (!vmOptions.equals(that.vmOptions)) return false; + if (!environmentProperties.equals(that.environmentProperties)) return false; + if (passParentEnv != that.passParentEnv) return false; return true; } @@ -128,6 +154,7 @@ public class MavenRunnerSettings implements Cloneable { result = 31 * result + jreName.hashCode(); result = 31 * result + vmOptions.hashCode(); result = 31 * result + (skipTests ? 1 : 0); + result = 31 * result + environmentProperties.hashCode(); result = 31 * result + (mavenProperties != null ? mavenProperties.hashCode() : 0); return result; } @@ -138,6 +165,7 @@ public class MavenRunnerSettings implements Cloneable { final MavenRunnerSettings clone = (MavenRunnerSettings)super.clone(); clone.mavenProperties = cloneMap(mavenProperties); clone.myListeners = ContainerUtil.createLockFreeCopyOnWriteList(); + clone.environmentProperties = new HashMap<String, String>(environmentProperties); return clone; } catch (CloneNotSupportedException e) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsEditor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsEditor.java index 87d9dea8c1d0..b31928c813d7 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsEditor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/execution/MavenRunnerSettingsEditor.java @@ -75,9 +75,4 @@ public class MavenRunnerSettingsEditor extends SettingsEditor<MavenRunConfigurat myUseProjectSettings = pair.second; return pair.first; } - - @Override - protected void disposeEditor() { - - } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java index 003ef09ce0fe..79b83a60483e 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java @@ -335,11 +335,20 @@ public class MavenProjectImporter { } private static String formatModules(final Collection<Module> modules) { - return StringUtil.join(modules, new Function<Module, String>() { - public String fun(final Module m) { - return "'" + m.getName() + "'"; - } - }, "\n"); + StringBuilder res = new StringBuilder(); + + int i = 0; + for (Module module : modules) { + res.append('\'').append(module.getName()).append("'\n"); + + if (++i > 20) break; + } + + if (i > 20) { + res.append("\n ... and other ").append(modules.size() - 20).append(" modules"); + } + + return res.toString(); } private static void doRefreshFiles(Set<File> files) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java index 8506387d0c9c..03135609730f 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/navigator/MavenProjectsNavigator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,9 +67,9 @@ public class MavenProjectsNavigator extends MavenSimpleProjectComponent implemen private MavenProjectsNavigatorState myState = new MavenProjectsNavigatorState(); - private final MavenProjectsManager myProjectsManager; - private final MavenTasksManager myTasksManager; - private final MavenShortcutsManager myShortcutsManager; + private MavenProjectsManager myProjectsManager; + private MavenTasksManager myTasksManager; + private MavenShortcutsManager myShortcutsManager; private SimpleTree myTree; private MavenProjectsStructure myStructure; @@ -189,6 +189,8 @@ public class MavenProjectsNavigator extends MavenSimpleProjectComponent implemen @Override public void disposeComponent() { + myToolWindow = null; + myProjectsManager = null; } private void listenForProjectsChanges() { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenModelPropertiesPatcher.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenModelPropertiesPatcher.java index c16b84fba0b0..71243eb945ad 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenModelPropertiesPatcher.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenModelPropertiesPatcher.java @@ -1,70 +1,61 @@ package org.jetbrains.idea.maven.plugins.api; -import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.text.StringUtil; +import org.jdom.Element; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.model.MavenPlugin; +import org.jetbrains.plugins.groovy.util.ClassInstanceCache; -import java.util.*; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; /** * @author Sergey Evdokimov */ public class MavenModelPropertiesPatcher { - private static volatile Map<String, Map<String, String[]>> ourMap; - - private static Map<String, Map<String, String[]>> getMap() { - Map<String, Map<String, String[]>> res = ourMap; + /* + * Add properties those should be added by plugins. + */ + public static void patch(Properties modelProperties, @Nullable Collection<MavenPlugin> plugins) { + if (plugins == null) return; - if (res == null) { - res = new HashMap<String, Map<String, String[]>>(); + Map<String, Map<String, Map<String, List<MavenPluginDescriptor>>>> map = MavenPluginDescriptor.getDescriptorsMap(); - for (MavenPluginDescriptor pluginDescriptor : MavenPluginDescriptor.EP_NAME.getExtensions()) { - if (pluginDescriptor.properties != null && pluginDescriptor.properties.length > 0) { - Pair<String, String> pluginId = MavenPluginDescriptor.parsePluginId(pluginDescriptor.mavenId); + for (MavenPlugin plugin : plugins) { + Map<String, Map<String, List<MavenPluginDescriptor>>> groupMap = map.get(plugin.getArtifactId()); + if (groupMap != null) { + Map<String, List<MavenPluginDescriptor>> goalsMap = groupMap.get(plugin.getGroupId()); - String[] properties = new String[pluginDescriptor.properties.length]; - for (int i = 0; i < pluginDescriptor.properties.length; i++) { - properties[i] = pluginDescriptor.properties[i].name; - } + patch(modelProperties, goalsMap.get(null), null, plugin.getConfigurationElement(), plugin); - Map<String, String[]> groupMap = res.get(pluginId.second);// pluginId.second is artifactId - if (groupMap == null) { - groupMap = new HashMap<String, String[]>(); - res.put(pluginId.second, groupMap); + for (MavenPlugin.Execution execution : plugin.getExecutions()) { + for (String goal : execution.getGoals()) { + patch(modelProperties, goalsMap.get(goal), goal, execution.getConfigurationElement(), plugin); } - - groupMap.put(pluginId.first, properties); // pluginId.first is groupId } } - - ourMap = res; } - - return res; } - /* - * Add properties those should be added by plugins. - */ - public static void patch(Properties modelProperties, @Nullable Collection<MavenPlugin> plugins) { - if (plugins == null) return; - - Map<String, Map<String, String[]>> map = getMap(); + private static void patch(Properties modelProperties, @Nullable List<MavenPluginDescriptor> descriptors, @Nullable String goal, Element cfgElement, MavenPlugin plugin) { + if (descriptors == null) return; - for (MavenPlugin plugin : plugins) { - Map<String, String[]> groupMap = map.get(plugin.getArtifactId()); - if (groupMap != null) { - String[] properties = groupMap.get(plugin.getGroupId()); - - if (properties != null) { - for (String property : properties) { - if (!modelProperties.containsKey(property)) { - modelProperties.setProperty(property, ""); - } + for (MavenPluginDescriptor descriptor : descriptors) { + if (descriptor.properties != null) { + for (MavenPluginDescriptor.ModelProperty property : descriptor.properties) { + if (StringUtil.isNotEmpty(property.name)) { + modelProperties.setProperty(property.name, ""); } } } + + if (descriptor.propertyGenerator != null) { + MavenPropertiesGenerator generator = ClassInstanceCache.getInstance(descriptor.propertyGenerator, descriptor.getLoaderForClass()); + generator.generate(modelProperties, goal, plugin, cfgElement); + } } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginDescriptor.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginDescriptor.java index c0663282a6d3..56bc0fdf0c33 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginDescriptor.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginDescriptor.java @@ -18,11 +18,17 @@ package org.jetbrains.idea.maven.plugins.api; import com.intellij.openapi.extensions.AbstractExtensionPointBean; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.util.Pair; +import com.intellij.util.SmartList; import com.intellij.util.xml.Required; import com.intellij.util.xmlb.annotations.AbstractCollection; import com.intellij.util.xmlb.annotations.Attribute; import com.intellij.util.xmlb.annotations.Property; import com.intellij.util.xmlb.annotations.Tag; +import org.jetbrains.idea.maven.utils.MavenUtil; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * @author Sergey Evdokimov @@ -31,6 +37,12 @@ public class MavenPluginDescriptor extends AbstractExtensionPointBean { public static final ExtensionPointName<MavenPluginDescriptor> EP_NAME = new ExtensionPointName<MavenPluginDescriptor>("org.jetbrains.idea.maven.pluginDescriptor"); + // Map artifactId -> groupId -> goal -> List<MavenPluginDescriptor> + public static volatile Map<String, Map<String, Map<String, List<MavenPluginDescriptor>>>> ourDescriptorsMap; + + @Attribute("goal") + public String goal; + @Attribute("mavenId") @Required public String mavenId; @@ -43,6 +55,9 @@ public class MavenPluginDescriptor extends AbstractExtensionPointBean { @AbstractCollection(surroundWithTag = false) public ModelProperty[] properties; + @Attribute("propertyGenerator") + public String propertyGenerator; + @Tag("property") public static class ModelProperty { @Attribute("name") @@ -57,9 +72,6 @@ public class MavenPluginDescriptor extends AbstractExtensionPointBean { @Required public String name; - @Attribute("goal") - public String goal; - /** * Class name of reference provider. The reference provider must implement MavenParamReferenceProvider or PsiReferenceProvider. */ @@ -106,4 +118,30 @@ public class MavenPluginDescriptor extends AbstractExtensionPointBean { return new Pair<String, String>(mavenId.substring(0, idx), mavenId.substring(idx + 1)); } + public static Map<String, Map<String, Map<String, List<MavenPluginDescriptor>>>> getDescriptorsMap() { + Map<String, Map<String, Map<String, List<MavenPluginDescriptor>>>> res = ourDescriptorsMap; + if (res == null) { + res = new HashMap<String, Map<String, Map<String, List<MavenPluginDescriptor>>>>(); + + for (MavenPluginDescriptor pluginDescriptor : MavenPluginDescriptor.EP_NAME.getExtensions()) { + Pair<String, String> pluginId = parsePluginId(pluginDescriptor.mavenId); + + Map<String, Map<String, List<MavenPluginDescriptor>>> groupMap = MavenUtil.getOrCreate(res, pluginId.second);// pluginId.second is artifactId + + Map<String, List<MavenPluginDescriptor>> goalsMap = MavenUtil.getOrCreate(groupMap, pluginId.first);// pluginId.first is groupId + + List<MavenPluginDescriptor> descriptorList = goalsMap.get(pluginDescriptor.goal); + if (descriptorList == null) { + descriptorList = new SmartList<MavenPluginDescriptor>(); + goalsMap.put(pluginDescriptor.goal, descriptorList); + } + + descriptorList.add(pluginDescriptor); + } + + ourDescriptorsMap = res; + } + + return res; + } } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginParamInfo.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginParamInfo.java index a987c944d8b4..ba5a944b360c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginParamInfo.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPluginParamInfo.java @@ -17,6 +17,7 @@ import com.intellij.util.xml.DomManager; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.dom.model.*; +import org.jetbrains.idea.maven.utils.MavenUtil; import java.util.*; @@ -49,18 +50,21 @@ public class MavenPluginParamInfo { Map pluginsMap = res; for (int i = paramPath.length - 1; i >= 0; i--) { - pluginsMap = getOrCreate(pluginsMap, paramPath[i]); + pluginsMap = MavenUtil.getOrCreate(pluginsMap, paramPath[i]); } ParamInfo paramInfo = new ParamInfo(pluginDescriptor.getPluginDescriptor().getPluginClassLoader(), param); - Map<String, ParamInfo> goalsMap = getOrCreate(pluginsMap, pluginId); + Map<String, ParamInfo> goalsMap = MavenUtil.getOrCreate(pluginsMap, pluginId); - ParamInfo oldValue = goalsMap.put(param.goal, paramInfo); + String goal = pluginDescriptor.goal; + assert goal == null || !goal.isEmpty(); + + ParamInfo oldValue = goalsMap.put(goal, paramInfo); if (oldValue != null) { LOG.error("Duplicated maven plugin parameter descriptor: " + pluginId.first + ':' + pluginId.second + " -> " - + (param.goal != null ? "[" + param.goal + ']' : "") + param.name); + + (goal != null ? "[" + goal + ']' : "") + param.name); } } } @@ -71,17 +75,6 @@ public class MavenPluginParamInfo { return res; } - @NotNull - private static <K, V extends Map> V getOrCreate(Map map, K key) { - Map res = (Map)map.get(key); - if (res == null) { - res = new HashMap(); - map.put(key, res); - } - - return (V)res; - } - public static boolean isSimpleText(@NotNull XmlText paramValue) { PsiElement prevSibling = paramValue.getPrevSibling(); if (!(prevSibling instanceof LeafPsiElement) || ((LeafPsiElement)prevSibling).getElementType() != XmlTokenType.XML_TAG_END) { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPropertiesGenerator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPropertiesGenerator.java new file mode 100644 index 000000000000..46b149a9d882 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/api/MavenPropertiesGenerator.java @@ -0,0 +1,20 @@ +package org.jetbrains.idea.maven.plugins.api; + +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenPlugin; + +import java.util.Properties; + +/** + * @author Sergey Evdokimov + */ +public abstract class MavenPropertiesGenerator { + + public abstract void generate(@NotNull Properties modelProperties, + @Nullable String goal, + @NotNull MavenPlugin plugin, + @Nullable Element cfgElement); + +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/buildHelper/MavenBuildHelperPropertyGenerator.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/buildHelper/MavenBuildHelperPropertyGenerator.java new file mode 100644 index 000000000000..50f13d0d9951 --- /dev/null +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/plugins/buildHelper/MavenBuildHelperPropertyGenerator.java @@ -0,0 +1,34 @@ +package org.jetbrains.idea.maven.plugins.buildHelper; + +import org.jdom.Element; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.idea.maven.model.MavenPlugin; +import org.jetbrains.idea.maven.plugins.api.MavenPropertiesGenerator; + +import java.util.List; +import java.util.Properties; + +/** + * @author Sergey Evdokimov + */ +public class MavenBuildHelperPropertyGenerator extends MavenPropertiesGenerator { + @Override + public void generate(@NotNull Properties modelProperties, + @Nullable String goal, + @NotNull MavenPlugin plugin, + @Nullable Element cfgElement) { + if (cfgElement == null) return; + + Element portNames = cfgElement.getChild("portNames"); + if (portNames == null) return; + + List<Element> portName = portNames.getChildren("portName"); + for (Element element : portName) { + String propertyName = element.getTextTrim(); + if (!propertyName.isEmpty()) { + modelProperties.setProperty(propertyName, ""); + } + } + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java index 09c9c6c339c2..23ddb241eea5 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenConsoleImpl.java @@ -39,7 +39,6 @@ import org.jetbrains.idea.maven.execution.MavenRunnerParameters; import org.jetbrains.idea.maven.execution.MavenRunnerSettings; import org.jetbrains.idea.maven.utils.MavenUtil; -import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; public class MavenConsoleImpl extends MavenConsole { @@ -79,10 +78,7 @@ public class MavenConsoleImpl extends MavenConsole { public static TextConsoleBuilder createConsoleBuilder(final Project project) { TextConsoleBuilder builder = TextConsoleBuilderFactory.getInstance().createBuilder(project); - final List<Filter> filters = ExceptionFilters.getFilters(GlobalSearchScope.allScope(project)); - for (Filter filter : filters) { - builder.addFilter(filter); - } + builder.filters(ExceptionFilters.getFilters(GlobalSearchScope.allScope(project))); builder.addFilter(new RegexpFilter(project, CONSOLE_FILTER_REGEXP) { @Nullable @Override diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 5346407aa42b..5564984a835d 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -35,8 +35,8 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; import com.intellij.util.Alarm; -import com.intellij.util.Consumer; import com.intellij.util.EventDispatcher; +import com.intellij.util.NullableConsumer; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import com.intellij.util.ui.update.Update; @@ -735,7 +735,7 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent }); } - public void evaluateEffectivePom(@NotNull final MavenProject mavenProject, @NotNull final Consumer<String> consumer) { + public void evaluateEffectivePom(@NotNull final MavenProject mavenProject, @NotNull final NullableConsumer<String> consumer) { runWhenFullyOpen(new Runnable() { @Override public void run() { @@ -757,9 +757,14 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent new MavenProjectsTree.EmbedderTask() { @Override public void run(MavenEmbedderWrapper embedder) throws MavenProcessCanceledException { - String res = - embedder.evaluateEffectivePom(mavenProject.getFile(), mavenProject.getActivatedProfilesIds()); - consumer.consume(res); + try { + String res = + embedder.evaluateEffectivePom(mavenProject.getFile(), mavenProject.getActivatedProfilesIds()); + consumer.consume(res); + } + catch (UnsupportedOperationException e) { + consumer.consume(null); // null means UnsupportedOperationException + } } }); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java index 1c1a39ceca80..55e9f52fe551 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/actions/MavenShowEffectivePom.java @@ -13,7 +13,7 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; -import com.intellij.util.Consumer; +import com.intellij.util.NullableConsumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.project.MavenProject; @@ -51,13 +51,13 @@ public class MavenShowEffectivePom extends AnAction implements DumbAware { }).notify(project); } - public static void actionPerformed(@NotNull final Project project, @NotNull VirtualFile file) { + public static void actionPerformed(@NotNull final Project project, @NotNull final VirtualFile file) { final MavenProjectsManager manager = MavenProjectsManager.getInstance(project); final MavenProject mavenProject = manager.findProject(file); assert mavenProject != null; - manager.evaluateEffectivePom(mavenProject, new Consumer<String>() { + manager.evaluateEffectivePom(mavenProject, new NullableConsumer<String>() { @Override public void consume(final String s) { ApplicationManager.getApplication().invokeLater(new Runnable() { @@ -65,6 +65,11 @@ public class MavenShowEffectivePom extends AnAction implements DumbAware { public void run() { if (project.isDisposed()) return; + if (s == null) { // null means UnsupportedOperationException + showUnsupportedNotification(project, file); + return; + } + String fileName = mavenProject.getMavenId().getArtifactId() + "-effective-pom.xml"; PsiFile file = PsiFileFactory.getInstance(project).createFileFromText(fileName, XMLLanguage.INSTANCE, s); try { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java index ad2270960dbf..1aa0de6dea83 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/utils/MavenUtil.java @@ -906,4 +906,16 @@ public class MavenUtil { return ModuleRootManager.getInstance(module).getSdk(); } + + @NotNull + public static <K, V extends Map> V getOrCreate(Map map, K key) { + Map res = (Map)map.get(key); + if (res == null) { + res = new HashMap(); + map.put(key, res); + } + + return (V)res; + } + } diff --git a/plugins/maven/src/main/resources/META-INF/plugin.xml b/plugins/maven/src/main/resources/META-INF/plugin.xml index 07fb2430e032..a5aab8ba1737 100644 --- a/plugins/maven/src/main/resources/META-INF/plugin.xml +++ b/plugins/maven/src/main/resources/META-INF/plugin.xml @@ -245,6 +245,9 @@ <property name="timestamp"/> </pluginDescriptor> + <pluginDescriptor mavenId="org.codehaus.mojo:build-helper-maven-plugin" goal="reserve-network-port" + propertyGenerator="org.jetbrains.idea.maven.plugins.buildHelper.MavenBuildHelperPropertyGenerator"/> + <pluginDescriptor mavenId="org.codehaus.mojo:sql-maven-plugin"> <param name="sqlCommand" language="SQL"/> </pluginDescriptor> diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/MavenBuildHelperPluginTest.groovy b/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/MavenBuildHelperPluginTest.groovy new file mode 100644 index 000000000000..400c259f9c8e --- /dev/null +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/plugins/MavenBuildHelperPluginTest.groovy @@ -0,0 +1,102 @@ +package org.jetbrains.idea.maven.plugins + +import org.jetbrains.idea.maven.dom.MavenDomTestCase + +/** + * @author Sergey Evdokimov + */ +class MavenBuildHelperPluginTest extends MavenDomTestCase { + + public void testCompletion() { + importProject(""" +<groupId>test</groupId> +<artifactId>project</artifactId> +<version>1</version> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>yyy</id> + <goals> + <goal>reserve-network-port</goal> + </goals> + <configuration> + <portNames> + <portName>someNewProperty1</portName> + <portName>someNewProperty2</portName> + </portNames> + </configuration> + </execution> + <execution> + <id>xxx</id> + <goals> + <goal>foo</goal> + </goals> + <configuration> + <portNames> + <portName>someNewProperty3</portName> + </portNames> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <properties> + <aaa>\${someNew}</aaa> + </properties> +""") + + createProjectPom(""" +<groupId>test</groupId> +<artifactId>project</artifactId> +<version>1</version> + + <build> + <plugins> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>build-helper-maven-plugin</artifactId> + <executions> + <execution> + <id>yyy</id> + <goals> + <goal>reserve-network-port</goal> + </goals> + <configuration> + <portNames> + <portName>someNewProperty1</portName> + <portName>someNewProperty2</portName> + </portNames> + </configuration> + </execution> + <execution> + <id>xxx</id> + <goals> + <goal>foo</goal> + </goals> + <configuration> + <portNames> + <portName>someNewProperty3</portName> + </portNames> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + </build> + + <properties> + <aaa>\${someNew<caret>}</aaa> + </properties> +""") + + assertCompletionVariants(myProjectPom, "someNewProperty1", "someNewProperty2") + } + +} diff --git a/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java b/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java index 501c2dfa68d9..192f455ba615 100644 --- a/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java +++ b/plugins/properties/src/com/intellij/codeInspection/duplicatePropertyInspection/DuplicatePropertyInspection.java @@ -73,16 +73,6 @@ public class DuplicatePropertyInspection extends GlobalSimpleInspectionTool { checkFile(file, manager, (GlobalInspectionContextImpl)globalContext, globalContext.getRefManager(), problemDescriptionsProcessor); } - //public HTMLComposerImpl getComposer() { - // return new DescriptorComposer(this) { - // protected void composeDescription(final CommonProblemDescriptor description, int i, StringBuffer buf, final RefEntity refElement) { - // @NonNls String descriptionTemplate = description.getDescriptionTemplate(); - // descriptionTemplate = descriptionTemplate.replaceAll("#end", " "); - // buf.append(descriptionTemplate); - // } - // }; - //} - @SuppressWarnings({"HardCodedStringLiteral"}) private static void surroundWithHref(StringBuffer anchor, PsiElement element, final boolean isValue) { if (element != null) { @@ -143,7 +133,11 @@ public class DuplicatePropertyInspection extends GlobalSimpleInspectionTool { } } - private void checkFile(final PsiFile file, final InspectionManager manager, GlobalInspectionContextImpl context, final RefManager refManager, final ProblemDescriptionsProcessor processor) { + private void checkFile(final PsiFile file, + final InspectionManager manager, + GlobalInspectionContextImpl context, + final RefManager refManager, + final ProblemDescriptionsProcessor processor) { if (!(file instanceof PropertiesFile)) return; if (!context.isToCheckFile(file, this)) return; final PsiSearchHelper searchHelper = PsiSearchHelper.SERVICE.getInstance(file.getProject()); diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java index 9549ce5b506f..8c881ce8eef4 100644 --- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java +++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2012 JetBrains s.r.o. + * Copyright 2000-2013 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,6 +17,7 @@ package org.jetbrains.idea.svn; +import com.intellij.openapi.Disposable; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; @@ -360,6 +361,12 @@ public class SvnConfiguration implements PersistentStateComponent<Element> { if (myAuthManager == null) { // reloaded when configuration directory changes myAuthManager = new SvnAuthenticationManager(svnVcs.getProject(), new File(getConfigurationDirectory())); + Disposer.register(svnVcs.getProject(), new Disposable() { + @Override + public void dispose() { + myAuthManager = null; + } + }); getInteractiveManager(svnVcs); // to init myAuthManager.setAuthenticationProvider(new SvnAuthenticationProvider(svnVcs, myInteractiveProvider, RUNTIME_AUTH_CACHE)); diff --git a/plugins/tasks/tasks-api/src/com/intellij/tasks/config/BaseRepositoryEditor.java b/plugins/tasks/tasks-api/src/com/intellij/tasks/config/BaseRepositoryEditor.java index ab1ab1dd2630..c2908296f37c 100644 --- a/plugins/tasks/tasks-api/src/com/intellij/tasks/config/BaseRepositoryEditor.java +++ b/plugins/tasks/tasks-api/src/com/intellij/tasks/config/BaseRepositoryEditor.java @@ -25,6 +25,7 @@ import com.intellij.tasks.TaskManager; import com.intellij.tasks.TaskRepository; import com.intellij.tasks.impl.BaseRepository; import com.intellij.ui.DocumentAdapter; +import com.intellij.ui.EditorTextField; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.components.JBCheckBox; import com.intellij.ui.components.JBLabel; @@ -211,6 +212,10 @@ public class BaseRepositoryEditor<T extends BaseRepository> extends TaskReposito }); } + protected void installListener(EditorTextField editor) { + installListener(editor.getDocument()); + } + protected void doApply() { if (!myApplying) { try { diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java index 5a323982fa8a..989a5e607ac0 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/actions/SwitchTaskCombo.java @@ -112,7 +112,6 @@ public class SwitchTaskCombo extends ComboBoxAction implements DumbAware { private static String getText(LocalTask activeTask) { String text = activeTask.getPresentableName(); - return StringUtil.first(text, 80, true); + return StringUtil.first(text, 50, true); } - } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java index d0149d4d89af..8c4785ef41e6 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/impl/TaskManagerImpl.java @@ -775,6 +775,12 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe // OK } catch (Exception e) { + String reason = ""; + // Fix to IDEA-111810 + if (e.getClass() == Exception.class) { + // probably contains some message meaningful to end-user + reason = e.getMessage(); + } //noinspection InstanceofCatchParameter if (e instanceof SocketTimeoutException) { LOG.warn("Socket timeout from " + repository); @@ -784,17 +790,21 @@ public class TaskManagerImpl extends TaskManager implements ProjectComponent, Pe } myBadRepositories.add(repository); if (forceRequest) { - notifyAboutConnectionFailure(repository); + notifyAboutConnectionFailure(repository, reason); } } } return issues; } - private void notifyAboutConnectionFailure(final TaskRepository repository) { + private void notifyAboutConnectionFailure(final TaskRepository repository, String details) { Notifications.Bus.register(TASKS_NOTIFICATION_GROUP, NotificationDisplayType.BALLOON); + String content = "<p><a href=\"\">Configure server...</a></p>"; + if (!StringUtil.isEmpty(details)) { + content = "<p>" + details + "</p>" + content; + } Notifications.Bus.notify(new Notification(TASKS_NOTIFICATION_GROUP, "Cannot connect to " + repository.getUrl(), - "<p><a href=\"\">Configure server...</a></p>", NotificationType.WARNING, + content, NotificationType.WARNING, new NotificationListener() { public void hyperlinkUpdate(@NotNull Notification notification, @NotNull HyperlinkEvent event) { diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepositoryEditor.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepositoryEditor.java index 7ad7faf5fefa..02bb8a1570fe 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepositoryEditor.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/jira/JiraRepositoryEditor.java @@ -15,15 +15,11 @@ */ package com.intellij.tasks.jira; -import com.intellij.openapi.editor.Document; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiDocumentManager; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiFileFactory; import com.intellij.tasks.config.BaseRepositoryEditor; -import com.intellij.tasks.jira.jql.JqlFileType; import com.intellij.tasks.jira.jql.JqlLanguage; import com.intellij.ui.EditorTextField; +import com.intellij.ui.LanguageTextField; import com.intellij.ui.components.JBLabel; import com.intellij.util.Consumer; import com.intellij.util.ui.FormBuilder; @@ -51,12 +47,9 @@ public class JiraRepositoryEditor extends BaseRepositoryEditor<JiraRepository> { @Nullable @Override protected JComponent createCustomPanel() { + mySearchQueryField = new LanguageTextField(JqlLanguage.INSTANCE, myProject, myRepository.getSearchQuery()); + installListener(mySearchQueryField); mySearchLabel = new JBLabel("Search:", SwingConstants.RIGHT); - PsiFileFactory fileFactory = PsiFileFactory.getInstance(myProject); - PsiFile psiFile = fileFactory.createFileFromText("query.jql", JqlLanguage.INSTANCE, myRepository.getSearchQuery()); - Document document = PsiDocumentManager.getInstance(myProject).getDocument(psiFile); - mySearchQueryField = new EditorTextField(document, myProject, JqlFileType.INSTANCE); - installListener(document); return FormBuilder.createFormBuilder().addLabeledComponent(mySearchLabel, mySearchQueryField).getPanel(); } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepository.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepository.java index 05f75ffbe8d3..0430dea41320 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepository.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepository.java @@ -33,16 +33,12 @@ import com.intellij.tasks.trello.model.TrelloUser; import com.intellij.util.Function; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.xmlb.annotations.Tag; -import org.apache.commons.httpclient.HttpClient; -import org.apache.commons.httpclient.HttpMethod; -import org.apache.commons.httpclient.HttpStatus; -import org.apache.commons.httpclient.NameValuePair; +import org.apache.commons.httpclient.*; import org.apache.commons.httpclient.methods.GetMethod; import org.apache.commons.httpclient.util.EncodingUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.IOException; import java.lang.reflect.Type; import java.util.List; import java.util.Set; @@ -158,7 +154,7 @@ public final class TrelloRepository extends BaseRepositoryImpl { @Override protected void configureHttpMethod(HttpMethod method) { if (StringUtil.isEmpty(myPassword)) { - throw new IllegalStateException("Authorization token not set"); + return; } String params = EncodingUtil.formUrlEncode(new NameValuePair[]{ new NameValuePair("token", myPassword), @@ -192,28 +188,28 @@ public final class TrelloRepository extends BaseRepositoryImpl { } } - @Nullable - private TrelloBoard fetchBoardById(String id) { - String url = "/boards/" + id; + @NotNull + public TrelloBoard fetchBoardById(@NotNull String id) throws Exception { + String url = TrelloUtil.TRELLO_API_BASE_URL + "/boards/" + id; try { return makeRequestAndDeserializeJsonResponse(url, TrelloBoard.class); } catch (Exception e) { - LOG.warn("Error while fetching initial board info with id = " + id, e); + LOG.warn("Error while fetching initial board info", e); + throw e; } - return null; } - @Nullable - private TrelloList fetchListById(String id) { - String url = "/lists/" + id; + @NotNull + public TrelloList fetchListById(@NotNull String id) throws Exception { + String url = TrelloUtil.TRELLO_API_BASE_URL + "/lists/" + id; try { return makeRequestAndDeserializeJsonResponse(url, TrelloList.class); } catch (Exception e) { - LOG.warn("Error while fetching initial list info with id = " + id, e); + LOG.warn("Error while fetching initial list info" + id, e); + throw e; } - return null; } @NotNull @@ -264,10 +260,10 @@ public final class TrelloRepository extends BaseRepositoryImpl { LOG.debug("Total " + filtered.size() + " cards after filtering"); if (!fromList) { // fix for IDEA-111470 and IDEA-111475 - // Select IDs of visible cards, e.d. cards that either archived explicitly or belong to archived list + // Select IDs of visible cards, e.d. cards that either archived explicitly, belong to archived list or closed board. // This information can't be extracted from single card description, because its 'closed' field // reflects only the card state and doesn't show state of parental list and board. - // According to Trello REST API "filter=visible" parameter may be used only when fetching cards for + // NOTE: According to Trello REST API "filter=visible" parameter may be used only when fetching cards for // particular board or user. String visibleCardsUrl = baseUrl + "?filter=visible&fields=none"; List<TrelloCard> visibleCards = makeRequestAndDeserializeJsonResponse(visibleCardsUrl, TrelloUtil.LIST_OF_CARDS_TYPE); @@ -288,10 +284,14 @@ public final class TrelloRepository extends BaseRepositoryImpl { /** * Make GET request to specified URL and return HTTP entity of result as Reader object */ - private String makeRequest(String url) throws IOException { - HttpClient client = getHttpClient(); + private String makeRequest(String url) throws Exception { HttpMethod method = new GetMethod(url); configureHttpMethod(method); + return executeMethod(method); + } + + private String executeMethod(HttpMethod method) throws Exception { + HttpClient client = getHttpClient(); String entityContent; try { client.executeMethod(method); @@ -303,12 +303,19 @@ public final class TrelloRepository extends BaseRepositoryImpl { method.releaseConnection(); } LOG.debug(entityContent); + if (method.getStatusCode() != HttpStatus.SC_OK) { + Header header = method.getResponseHeader("Content-Type"); + if (header != null && header.getValue().startsWith("text/plain")) { + throw new Exception("Request failed. Reason: " + StringUtil.capitalize(entityContent)); + } + throw new Exception("Request failed with HTTP error: " + method.getStatusText()); + } //return new InputStreamReader(method.getResponseBodyAsStream(), "utf-8"); return entityContent; } @NotNull - private <T> T makeRequestAndDeserializeJsonResponse(String url, Type type) throws IOException { + private <T> T makeRequestAndDeserializeJsonResponse(String url, Type type) throws Exception { String entityStream = makeRequest(url); // javac 1.6.0_23 bug workaround // TrelloRepository.java:286: type parameters of <T>T cannot be determined; no unique maximal instance exists for type variable T with upper bounds T,java.lang.Object @@ -317,7 +324,7 @@ public final class TrelloRepository extends BaseRepositoryImpl { } @NotNull - private <T> T makeRequestAndDeserializeJsonResponse(String url, Class<T> cls) throws IOException { + private <T> T makeRequestAndDeserializeJsonResponse(String url, Class<T> cls) throws Exception { String entityStream = makeRequest(url); return TrelloUtil.GSON.fromJson(entityStream, cls); } @@ -337,18 +344,12 @@ public final class TrelloRepository extends BaseRepositoryImpl { @Nullable @Override public CancellableConnection createCancellableConnection() { - // try to fetch user info to check connection availability - GetMethod method = new GetMethod(TrelloUtil.TRELLO_API_BASE_URL + "/members/me"); + GetMethod method = new GetMethod(TrelloUtil.TRELLO_API_BASE_URL + "/members/me/cards?limit=1"); configureHttpMethod(method); return new HttpTestConnection<GetMethod>(method) { @Override protected void doTest(GetMethod method) throws Exception { - int statusCode = getHttpClient().executeMethod(method); - if (statusCode == HttpStatus.SC_UNAUTHORIZED) { - throw new Exception("Invalid token value"); - } else if (statusCode != HttpStatus.SC_OK) { - throw new Exception("Error while connecting to server: " + HttpStatus.getStatusText(statusCode)); - } + executeMethod(method); } }; } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepositoryEditor.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepositoryEditor.java index cd8d86d960e3..9389e8f44523 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepositoryEditor.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/TrelloRepositoryEditor.java @@ -16,13 +16,14 @@ package com.intellij.tasks.trello; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ComboBox; import com.intellij.tasks.config.BaseRepositoryEditor; import com.intellij.tasks.trello.model.TrelloBoard; import com.intellij.tasks.trello.model.TrelloList; -import com.intellij.tasks.trello.model.TrelloModel; import com.intellij.ui.DocumentAdapter; import com.intellij.ui.ListCellRendererWrapper; import com.intellij.ui.components.JBLabel; @@ -44,29 +45,19 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor private static final Logger LOG = Logger.getInstance("#com.intellij.tasks.trello.TrelloRepositoryEditor"); private static final TrelloBoard UNSPECIFIED_BOARD = new TrelloBoard() { + @NotNull @Override public String getName() { return "-- from all boards --"; } - - @NotNull - @Override - public String getId() { - return ""; - } }; private final static TrelloList UNSPECIFIED_LIST = new TrelloList() { + @NotNull @Override public String getName() { return "-- from all lists --"; } - - @NotNull - @Override - public String getId() { - return ""; - } }; private ComboBox myBoardComboBox; @@ -89,23 +80,17 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor @Override protected void textChanged(DocumentEvent e) { String password = String.valueOf(myPasswordText.getPassword()); - if (password.isEmpty() && password.equals(myRepository.getPassword())) { + if (password.equals(myRepository.getPassword())) { return; } myRepository.setPassword(password); - new BoardsDownloader() { + new BoardsDownloader(UNSPECIFIED_BOARD) { @Override - protected List<TrelloBoard> doInBackground() throws Exception { + protected List<TrelloBoard> download() throws Exception { myRepository.setCurrentUser(myRepository.fetchUserByToken()); - return super.doInBackground(); + return super.download(); } - - @Override - protected void done() { - super.done(); - myBoardComboBox.setSelectedItem(UNSPECIFIED_BOARD); - } - }.execute(); + }.runOnPooledThread(); doApply(); } }); @@ -119,13 +104,7 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor } if (board != UNSPECIFIED_BOARD) { myRepository.setCurrentBoard(board); - new ListsDownloader() { - @Override - protected void done() { - super.done(); - myListComboBox.setSelectedItem(UNSPECIFIED_LIST); - } - }.execute(); + new ListsDownloader(UNSPECIFIED_LIST).runOnPooledThread(); } else { myRepository.setCurrentBoard(null); @@ -136,8 +115,8 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor doApply(); } }); - myBoardComboBox.setRenderer(new TrelloModelRenderer("Set token first")); - myListComboBox.setRenderer(new TrelloModelRenderer("Select board first")); + myBoardComboBox.setRenderer(new TrelloBoardRenderer("Set token first")); + myListComboBox.setRenderer(new TrelloListRenderer("Select board first")); myListComboBox.addItemListener(new ItemListener() { @Override @@ -151,26 +130,44 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor } }); + // Initial setup: if (myRepository.getCurrentUser() != null) { - new BoardsDownloader() { + new BoardsDownloader(myRepository.getCurrentBoard()) { @Override - protected void done() { - // save already selected board, because ItemListener will reset it - TrelloBoard selectedBoard = myRepository.getCurrentBoard(); - super.done(); - myBoardComboBox.setSelectedItem(selectedBoard != null ? selectedBoard : UNSPECIFIED_BOARD); + protected List<TrelloBoard> download() throws Exception { + List<TrelloBoard> boards = super.download(); + if (myBoard == null) { + return boards; + } + int i = boards.indexOf(myBoard); + // update information about selected board + // if it's open and thus downloaded with other boards of user, take info from there, + // otherwise issue a separate request + myBoard = i >= 0 ? boards.get(i) : myRepository.fetchBoardById(myBoard.getId()); + myRepository.setCurrentBoard(myBoard); + return boards; } - }.execute(); + }.runOnPooledThread(); } + if (myRepository.getCurrentBoard() != null) { - new ListsDownloader() { + new ListsDownloader(myRepository.getCurrentList()) { @Override - protected void done() { - TrelloList selectedList = myRepository.getCurrentList(); - super.done(); - myListComboBox.setSelectedItem(selectedList != null ? selectedList : UNSPECIFIED_LIST); + protected List<TrelloList> download() throws Exception { + List<TrelloList> lists = super.download(); + if (myList == null) { + return lists; + } + int i = lists.indexOf(myList); + myList = i >= 0 ? lists.get(i) : myRepository.fetchListById(myList.getId()); + TrelloBoard currentBoard = myRepository.getCurrentBoard(); + if (currentBoard != null && !myList.getIdBoard().equals(currentBoard.getId())) { + myList.setMoved(true); + } + myRepository.setCurrentList(myList); + return lists; } - }.execute(); + }.runOnPooledThread(); } } @@ -190,16 +187,6 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor .getPanel(); } - private void fillBoardsComboBox(List<TrelloBoard> boards) { - myBoardComboBox.setModel(new DefaultComboBoxModel(boards.toArray())); - myBoardComboBox.insertItemAt(UNSPECIFIED_BOARD, 0); - } - - private void fillListsComboBox(List<TrelloList> lists) { - myListComboBox.setModel(new DefaultComboBoxModel(lists.toArray())); - myListComboBox.insertItemAt(UNSPECIFIED_LIST, 0); - } - @Override public void setAnchor(@Nullable JComponent anchor) { super.setAnchor(anchor); @@ -207,53 +194,151 @@ public class TrelloRepositoryEditor extends BaseRepositoryEditor<TrelloRepositor myBoardLabel.setAnchor(anchor); } - private class BoardsDownloader extends SwingWorker<List<TrelloBoard>, Void> { - @Override - protected List<TrelloBoard> doInBackground() throws Exception { - return myRepository.fetchUserBoards(); + + private abstract class Downloader<T> implements Runnable { + + private final ModalityState myModalityState = ModalityState.current(); + + protected abstract T download() throws Exception; + + protected void updateUI(T result) { + // empty + } + + protected void handleException(Exception e) { + // empty } @Override - protected void done() { + public void run() { try { - fillBoardsComboBox(get()); + final T result; + synchronized (myRepository) { + result = download(); + } + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + updateUI(result); + } + }, myModalityState); } - catch (Exception e) { - LOG.warn("Error while fetching boards", e); - myBoardComboBox.removeAllItems(); - myListComboBox.removeAllItems(); + catch (final Exception e) { + LOG.warn(e); + ApplicationManager.getApplication().invokeLater(new Runnable() { + @Override + public void run() { + handleException(e); + } + }, myModalityState); } } + + public void runOnPooledThread() { + ApplicationManager.getApplication().executeOnPooledThread(this); + } } - private class ListsDownloader extends SwingWorker<List<TrelloList>, Void> { + private class BoardsDownloader extends Downloader<List<TrelloBoard>> { + protected TrelloBoard myBoard; + + private BoardsDownloader(TrelloBoard selectedBoard) { + myBoard = selectedBoard; + } + + @Override + protected List<TrelloBoard> download() throws Exception { + return myRepository.fetchUserBoards(); + } + + @Override + protected void updateUI(List<TrelloBoard> boards) { + myBoardComboBox.setModel(new DefaultComboBoxModel(boards.toArray())); + myBoardComboBox.insertItemAt(UNSPECIFIED_BOARD, 0); + // explicitly add missing closed board + if (!(myBoard == null || myBoard == UNSPECIFIED_BOARD) && !boards.contains(myBoard)) { + myBoardComboBox.addItem(myBoard); + } + myBoardComboBox.setSelectedItem(myBoard == null ? UNSPECIFIED_BOARD : myBoard); + } + + @Override + protected void handleException(Exception e) { + myBoardComboBox.removeAllItems(); + myListComboBox.removeAllItems(); + } + } + + private class ListsDownloader extends Downloader<List<TrelloList>> { + protected TrelloList myList; + + private ListsDownloader(TrelloList selectedList) { + this.myList = selectedList; + } + @Override - protected List<TrelloList> doInBackground() throws Exception { + protected List<TrelloList> download() throws Exception { return myRepository.fetchBoardLists(); } @Override - protected void done() { - try { - fillListsComboBox(get()); + protected void updateUI(List<TrelloList> lists) { + myListComboBox.setModel(new DefaultComboBoxModel(lists.toArray())); + myListComboBox.insertItemAt(UNSPECIFIED_LIST, 0); + // explicitly add moved or archived list to combobox: see IDEA-111819 for details + if (!(myList == null || myList == UNSPECIFIED_LIST) && !lists.contains(myList)) { + myListComboBox.addItem(myList); } - catch (Exception e) { - LOG.warn("Error while fetching lists", e); - myListComboBox.removeAllItems(); + myListComboBox.setSelectedItem(myList == null ? UNSPECIFIED_LIST : myList); + } + + @Override + protected void handleException(Exception e) { + myListComboBox.removeAllItems(); + } + } + + private static class TrelloBoardRenderer extends ListCellRendererWrapper<TrelloBoard> { + private String myNullDescription; + + private TrelloBoardRenderer(String nullDescription) { + this.myNullDescription = nullDescription; + } + + @Override + public void customize(JList list, TrelloBoard board, int index, boolean selected, boolean hasFocus) { + if (board == null) { + setText(myNullDescription); + return; } + setText(board.isClosed() ? board.getName() + " (closed)" : board.getName()); } } - private static class TrelloModelRenderer extends ListCellRendererWrapper<TrelloModel> { - private String initialMessage; + private static class TrelloListRenderer extends ListCellRendererWrapper<TrelloList> { + private String myNullDescription; - private TrelloModelRenderer(String nullDescription) { - this.initialMessage = nullDescription; + private TrelloListRenderer(String nullDescription) { + this.myNullDescription = nullDescription; } @Override - public void customize(JList list, TrelloModel value, int index, boolean selected, boolean hasFocus) { - setText(value == null ? initialMessage : value.getName()); + public void customize(JList list, TrelloList trelloList, int index, boolean selected, boolean hasFocus) { + if (trelloList == null) { + setText(myNullDescription); + return; + } + String text = trelloList.getName(); + if (trelloList.isClosed() && trelloList.isMoved()) { + text += " (archived,moved)"; + } + else if (trelloList.isMoved()) { + text += " (moved)"; + } + else if (trelloList.isClosed()) { + text += " (archived)"; + } + setText(text); } } } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloBoard.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloBoard.java index d5f984d87286..332929dd582b 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloBoard.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloBoard.java @@ -42,7 +42,7 @@ public class TrelloBoard extends TrelloModel { @Override public String toString() { - return String.format("TrelloBoard(id='%s', name='%s')", getId(), name); + return String.format("TrelloBoard(id='%s', name='%s')", getId(), getName()); } public boolean isClosed() { @@ -66,7 +66,7 @@ public class TrelloBoard extends TrelloModel { } @Override - public void setName(String name) { + public void setName(@NotNull String name) { this.name = name; } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloList.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloList.java index 99840c3c56f6..4df2a65d5270 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloList.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloList.java @@ -29,6 +29,13 @@ public class TrelloList extends TrelloModel { private String idBoard; private String name; private double pos; + /** + * This field is not part of REST responses. It will be set explicitly to show in UI, that + * selected list doesn't belong to specified board anymore. + * + * @see com.intellij.tasks.trello.TrelloRepositoryEditor + */ + private boolean moved; /** * Serialization constructor @@ -39,7 +46,7 @@ public class TrelloList extends TrelloModel { @Override public String toString() { - return String.format("TrelloList(id='%s' name='%s')", getId(), name); + return String.format("TrelloList(id='%s' name='%s')", getId(), getName()); } public boolean isClosed() { @@ -59,11 +66,19 @@ public class TrelloList extends TrelloModel { } @Override - public void setName(String name) { + public void setName(@NotNull String name) { this.name = name; } public double getPos() { return pos; } + + public boolean isMoved() { + return moved; + } + + public void setMoved(boolean moved) { + this.moved = moved; + } } diff --git a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloModel.java b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloModel.java index 3dd0687a0a21..20f28b600314 100644 --- a/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloModel.java +++ b/plugins/tasks/tasks-core/src/com/intellij/tasks/trello/model/TrelloModel.java @@ -23,9 +23,17 @@ import org.jetbrains.annotations.NotNull; * @author Mikhail Golubev */ public abstract class TrelloModel { - private String id; + public static final String ILLEGAL_ID = "ILLEGAL_ID"; + private String id = ILLEGAL_ID; + + /** + * Trello always provides objects IDs as part of its REST responses. But it may still be null + * if e.g. object was incorrectly created manually, or it is some kind of stub implementation + * as for UNSPECIFIED_BOARD and UNSPECIFIED_LIST in TrelloRepositoryEditor. ILLEGAL_ID + * value serves as fallback in such cases. + */ @Attribute("id") @NotNull public String getId() { @@ -59,11 +67,11 @@ public abstract class TrelloModel { if (obj == this) return true; if (!(obj instanceof TrelloModel)) return false; TrelloModel model = (TrelloModel) obj; - return id != null && id.equals(model.id); + return !id.equals(ILLEGAL_ID) && id.equals(model.id); } @Override public final int hashCode() { - return id != null ? id.hashCode() : 0; + return id.hashCode(); } } diff --git a/plugins/terminal/lib/jediterm-pty-0.08.jar b/plugins/terminal/lib/jediterm-pty-0.08.jar Binary files differindex ac2ead227485..5fe6a5fd700b 100644 --- a/plugins/terminal/lib/jediterm-pty-0.08.jar +++ b/plugins/terminal/lib/jediterm-pty-0.08.jar diff --git a/plugins/terminal/lib/jediterm.in b/plugins/terminal/lib/jediterm.in new file mode 100644 index 000000000000..9a256a968583 --- /dev/null +++ b/plugins/terminal/lib/jediterm.in @@ -0,0 +1,38 @@ +#!/bin/bash + +# When bash is invoked as an interactive login shell, or as a non-interac- +# tive shell with the --login option, it first reads and executes commands +# from the file /etc/profile, if that file exists. After reading that +# file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in +# that order, and reads and executes commands from the first one that +# exists and is readable. + +if [ -f /etc/profile ]; +then + source /etc/profile +fi + +if [ -f ~/.bash_profile ]; +then + source ~/.bash_profile +else + if [ -f ~/.bash_login ] + then + source ~/.bash_login + else + if [ -f ~/.profile ] + then + source ~/.profile + fi + fi +fi + +function generate_command_executed_sequence() { + printf '\e\7' +} + +export -f generate_command_executed_sequence + + +#generate escape sequence after command is executed to notify jediterm emulator +trap "generate_command_executed_sequence" DEBUG diff --git a/plugins/terminal/lib/macosx/x86_64/libpty.dylib b/plugins/terminal/lib/macosx/x86_64/libpty.dylib Binary files differnew file mode 100755 index 000000000000..7755a8142d6e --- /dev/null +++ b/plugins/terminal/lib/macosx/x86_64/libpty.dylib diff --git a/plugins/terminal/lib/pty4j-0.2.jar b/plugins/terminal/lib/pty4j-0.2.jar Binary files differdeleted file mode 100644 index 44b238387d60..000000000000 --- a/plugins/terminal/lib/pty4j-0.2.jar +++ /dev/null diff --git a/plugins/terminal/lib/pty4j-0.3.jar b/plugins/terminal/lib/pty4j-0.3.jar Binary files differnew file mode 100644 index 000000000000..38b047086c37 --- /dev/null +++ b/plugins/terminal/lib/pty4j-0.3.jar diff --git a/plugins/terminal/lib/win/x86/libwinpty.dll b/plugins/terminal/lib/win/x86/libwinpty.dll Binary files differnew file mode 100644 index 000000000000..2b581b260d2f --- /dev/null +++ b/plugins/terminal/lib/win/x86/libwinpty.dll diff --git a/plugins/terminal/lib/win/x86/winpty-agent.exe b/plugins/terminal/lib/win/x86/winpty-agent.exe Binary files differnew file mode 100644 index 000000000000..87431b52c287 --- /dev/null +++ b/plugins/terminal/lib/win/x86/winpty-agent.exe diff --git a/plugins/terminal/lib/win/x86_64/libwinpty.dll b/plugins/terminal/lib/win/x86_64/libwinpty.dll Binary files differnew file mode 100644 index 000000000000..dea8dcf55232 --- /dev/null +++ b/plugins/terminal/lib/win/x86_64/libwinpty.dll diff --git a/plugins/terminal/lib/win/x86_64/winpty-agent.exe b/plugins/terminal/lib/win/x86_64/winpty-agent.exe Binary files differnew file mode 100644 index 000000000000..9083e0365584 --- /dev/null +++ b/plugins/terminal/lib/win/x86_64/winpty-agent.exe diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalStarter.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalStarter.java new file mode 100644 index 000000000000..f94459e7661a --- /dev/null +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalStarter.java @@ -0,0 +1,47 @@ +package org.jetbrains.plugins.terminal; + +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.vfs.LocalFileSystem; +import com.jediterm.terminal.*; +import com.jediterm.terminal.emulator.JediEmulator; + +import javax.swing.*; + +/** + * @author traff + */ +public class JBTerminalStarter extends TerminalStarter { + public JBTerminalStarter(Terminal terminal, TtyConnector ttyConnector) { + super(terminal, ttyConnector); + } + + @Override + protected JediEmulator createEmulator(TtyChannel channel, TerminalOutputStream stream, Terminal terminal) { + return new JediEmulator(channel, stream, terminal) { + @Override + protected void unsupported(char... sequenceChars) { + if (sequenceChars[0] == 7) { //ESC BEL + handleCommandExecutedSequence(); + } + else { + super.unsupported(); + } + } + }; + } + + private static void handleCommandExecutedSequence() { + //we need to refresh local file system after a command has been executed in the terminal + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + ApplicationManager.getApplication().runWriteAction(new Runnable() { + @Override + public void run() { + LocalFileSystem.getInstance().refresh(false); + } + }); + } + }); + } +} diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java index 79c46c5d1f90..1701a18926a7 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/JBTerminalWidget.java @@ -8,7 +8,10 @@ import com.intellij.openapi.util.InvalidDataException; import com.intellij.openapi.util.WriteExternalException; import com.intellij.ui.components.JBScrollBar; import com.intellij.util.containers.HashMap; +import com.jediterm.terminal.TerminalStarter; +import com.jediterm.terminal.TtyConnector; import com.jediterm.terminal.display.BackBuffer; +import com.jediterm.terminal.display.JediTerminal; import com.jediterm.terminal.display.StyleState; import com.jediterm.terminal.ui.JediTermWidget; import com.jediterm.terminal.ui.SystemSettingsProvider; @@ -34,6 +37,11 @@ public class JBTerminalWidget extends JediTermWidget { return new JBTerminalPanel(settingsProvider, backBuffer, styleState, getColorScheme()); } + @Override + protected TerminalStarter createTerminalStarter(JediTerminal terminal, TtyConnector connector) { + return new JBTerminalStarter(terminal, connector); + } + public EditorColorsScheme getColorScheme() { return createBoundColorSchemeDelegate(null); } diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java index 8d49b030a0eb..bd540bfaf387 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/LocalTerminalDirectRunner.java @@ -5,17 +5,25 @@ import com.intellij.execution.process.*; import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.SystemInfo; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import com.intellij.util.containers.HashMap; import com.jediterm.pty.PtyProcessTtyConnector; import com.jediterm.terminal.TtyConnector; import com.pty4j.PtyProcess; +import com.pty4j.util.PtyUtil; +import com.pty4j.windows.WinPty; import org.jetbrains.annotations.Nullable; +import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.Charset; +import java.security.CodeSource; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -28,10 +36,34 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess private final Charset myDefaultCharset; private final String[] myCommand; - public LocalTerminalDirectRunner(Project project, String[] command) { + public LocalTerminalDirectRunner(Project project) { super(project); myDefaultCharset = Charset.forName("UTF-8"); - myCommand = command; + + if (SystemInfo.isUnix) { + File rcFile = findRCFile(); + + if (rcFile != null) { + myCommand = new String[]{"/bin/bash", "--rcfile", rcFile.getAbsolutePath(), "-i"}; + } + else { + myCommand = new String[]{"/bin/bash", "--login"}; + } + } + else { + myCommand = new String[]{"cmd.exe"}; + } + } + + private static File findRCFile() { + String folder = PtyUtil.getJarFolder(); + if (folder != null) { + File rcFile = new File(folder, "jediterm.in"); + if (rcFile.exists()) { + return rcFile; + } + } + return null; } @Override @@ -39,13 +71,20 @@ public class LocalTerminalDirectRunner extends AbstractTerminalRunner<PtyProcess Map<String, String> envs = new HashMap<String, String>(System.getenv()); envs.put("TERM", "xterm"); try { - return PtyProcess.exec(myCommand, envs, null); + return PtyProcess.exec(myCommand, envs, currentProjectFolder()); } catch (IOException e) { throw new ExecutionException(e); } } + private String currentProjectFolder() { + for (VirtualFile vf : ProjectRootManager.getInstance(myProject).getContentRoots()) { + return vf.getCanonicalPath(); + } + return null; + } + @Override protected ProcessHandler createProcessHandler(final PtyProcess process) { return new PtyProcessHandler(process); diff --git a/plugins/terminal/src/org/jetbrains/plugins/terminal/OpenLocalTerminalAction.java b/plugins/terminal/src/org/jetbrains/plugins/terminal/OpenLocalTerminalAction.java index 8738eb06a99f..203de242cb6e 100644 --- a/plugins/terminal/src/org/jetbrains/plugins/terminal/OpenLocalTerminalAction.java +++ b/plugins/terminal/src/org/jetbrains/plugins/terminal/OpenLocalTerminalAction.java @@ -50,12 +50,14 @@ public class OpenLocalTerminalAction extends AnAction implements DumbAware { @Nullable public static LocalTerminalDirectRunner createTerminalRunner(Project project) { + String[] terminalCommand; if (SystemInfo.isWindows) { - return null; + terminalCommand = new String[]{"cmd.exe"}; + } + else { + terminalCommand = new String[]{"/bin/bash", "--login"}; } - //String[] terminalCommand = SystemInfo.isMac ? new String[]{"/bin/bash", "--login"} : new String[]{"/bin/bash"}; - String[] terminalCommand = new String[]{"/bin/bash", "--login"}; - return new LocalTerminalDirectRunner(project, terminalCommand); + return new LocalTerminalDirectRunner(project); } } diff --git a/plugins/terminal/terminal.iml b/plugins/terminal/terminal.iml index a334163c613a..86f90598c51f 100644 --- a/plugins/terminal/terminal.iml +++ b/plugins/terminal/terminal.iml @@ -22,7 +22,7 @@ <orderEntry type="module-library"> <library name="pty4j"> <CLASSES> - <root url="jar://$MODULE_DIR$/lib/pty4j-0.2.jar!/" /> + <root url="jar://$MODULE_DIR$/lib/pty4j-0.3.jar!/" /> </CLASSES> <JAVADOC /> <SOURCES /> diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java index 6c21e171acba..524d31169df4 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationEditor.java @@ -505,10 +505,6 @@ public class TestNGConfigurationEditor extends SettingsEditor<TestNGConfiguratio }).disableUpDownActions().createPanel(), BorderLayout.CENTER); } - @Override - protected void disposeEditor() { - } - public void onTypeChanged(TestType type) { //LOGGER.info("onTypeChanged with " + type); if (type != TestType.PACKAGE && type != TestType.SUITE) { diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java index 79875c2145b3..2baeab69c1b0 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGConfigurationProducer.java @@ -32,6 +32,8 @@ import com.intellij.psi.PsiElement; import com.theoryinpractice.testng.model.TestData; import org.jetbrains.annotations.NotNull; +import java.util.List; + public abstract class TestNGConfigurationProducer extends JavaRuntimeConfigurationProducerBase implements Cloneable { public TestNGConfigurationProducer() { @@ -40,7 +42,7 @@ public abstract class TestNGConfigurationProducer extends JavaRuntimeConfigurati @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List<RunnerAndConfigurationSettings> existingConfigurations, ConfigurationContext context) { final TestNGConfiguration testNGConfiguration = (TestNGConfiguration)context.getOriginalConfiguration(TestNGConfigurationType.getInstance()); diff --git a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java index 4a8ebbbe8877..086615719d52 100644 --- a/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java +++ b/plugins/testng/src/com/theoryinpractice/testng/configuration/TestNGPatternConfigurationProducer.java @@ -40,6 +40,7 @@ import com.theoryinpractice.testng.util.TestNGUtil; import org.jetbrains.annotations.NotNull; import java.util.LinkedHashSet; +import java.util.List; import java.util.Set; public class TestNGPatternConfigurationProducer extends TestNGConfigurationProducer{ @@ -135,7 +136,7 @@ public class TestNGPatternConfigurationProducer extends TestNGConfigurationProdu @Override protected RunnerAndConfigurationSettings findExistingByElement(@NotNull Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List<RunnerAndConfigurationSettings> existingConfigurations, ConfigurationContext context) { final LinkedHashSet<String> classes = new LinkedHashSet<String>(); collectPatternElements(context, classes); diff --git a/plugins/ui-designer-core/src/com/intellij/designer/LightToolWindow.java b/plugins/ui-designer-core/src/com/intellij/designer/LightToolWindow.java index 89019e0de2b5..a2a62f7e2d9a 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/LightToolWindow.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/LightToolWindow.java @@ -20,6 +20,7 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.actionSystem.impl.ActionManagerImpl; import com.intellij.openapi.actionSystem.impl.MenuItemPresentationFactory; +import com.intellij.openapi.keymap.KeymapUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.ThreeComponentsSplitter; import com.intellij.openapi.util.SystemInfo; @@ -479,7 +480,7 @@ public class LightToolWindow extends JPanel { myAction = action; Presentation presentation = action.getTemplatePresentation(); - InplaceButton button = new InplaceButton(AnAction.createTooltipText(presentation.getText(), action), EmptyIcon.ICON_16, this) { + InplaceButton button = new InplaceButton(KeymapUtil.createTooltipText(presentation.getText(), action), EmptyIcon.ICON_16, this) { @Override public boolean isActive() { return LightToolWindow.this.isActive(); diff --git a/plugins/ui-designer-core/src/com/intellij/designer/componentTree/ComponentTree.java b/plugins/ui-designer-core/src/com/intellij/designer/componentTree/ComponentTree.java index 79f935c5181d..f7735c52eb0e 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/componentTree/ComponentTree.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/componentTree/ComponentTree.java @@ -17,7 +17,6 @@ package com.intellij.designer.componentTree; import com.intellij.codeHighlighting.HighlightDisplayLevel; import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; import com.intellij.designer.actions.DesignerActionPanel; import com.intellij.designer.actions.StartInplaceEditing; import com.intellij.designer.designSurface.DesignerEditorPanel; @@ -159,7 +158,7 @@ public final class ComponentTree extends Tree implements DataProvider { @Nullable private static HighlightDisplayLevel getHighlightDisplayLevel(Project project, RadComponent component) { HighlightDisplayLevel displayLevel = null; - SeverityRegistrar severityRegistrar = SeverityUtil.getSeverityRegistrar(project); + SeverityRegistrar severityRegistrar = SeverityRegistrar.getSeverityRegistrar(project); for (ErrorInfo errorInfo : RadComponent.getError(component)) { if (displayLevel == null || severityRegistrar.compare(errorInfo.getLevel().getSeverity(), displayLevel.getSeverity()) > 0) { displayLevel = errorInfo.getLevel(); @@ -174,7 +173,7 @@ public final class ComponentTree extends Tree implements DataProvider { if (level != null) { TextAttributesKey attributesKey = - SeverityUtil.getSeverityRegistrar(myDesigner.getProject()).getHighlightInfoTypeBySeverity(level.getSeverity()).getAttributesKey(); + SeverityRegistrar.getSeverityRegistrar(myDesigner.getProject()).getHighlightInfoTypeBySeverity(level.getSeverity()).getAttributesKey(); final TextAttributes textAttributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attributesKey); wrapper = new AttributeWrapper() { diff --git a/plugins/ui-designer-core/src/com/intellij/designer/componentTree/TreeEditableArea.java b/plugins/ui-designer-core/src/com/intellij/designer/componentTree/TreeEditableArea.java index 31357b05430f..bce7b2f01c0a 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/componentTree/TreeEditableArea.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/componentTree/TreeEditableArea.java @@ -31,6 +31,7 @@ import javax.swing.*; import javax.swing.event.EventListenerList; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreePath; import java.awt.*; import java.util.ArrayList; @@ -274,7 +275,8 @@ public final class TreeEditableArea implements EditableArea, FeedbackTreeLayer, private TreePath getPath(RadComponent component) { // TODO: I don't know better way gets tree path for element - return new TreePath(myTreeBuilder.getNodeForElement(component).getPath()); + DefaultMutableTreeNode node = myTreeBuilder.getNodeForElement(component); + return node == null ? null : new TreePath(node.getPath()); } @Override diff --git a/plugins/ui-designer-core/src/com/intellij/designer/designSurface/tools/CreationTool.java b/plugins/ui-designer-core/src/com/intellij/designer/designSurface/tools/CreationTool.java index 5f301ac7a15e..83ed5047b023 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/designSurface/tools/CreationTool.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/designSurface/tools/CreationTool.java @@ -16,10 +16,8 @@ package com.intellij.designer.designSurface.tools; import com.intellij.designer.designSurface.OperationContext; -import com.intellij.designer.model.RadComponent; import java.util.Collections; -import java.util.List; /** * @author Alexander Lobas @@ -51,11 +49,6 @@ public class CreationTool extends AbstractCreationTool { @Override protected void updateTarget() { - if (myTargetOperation != null && myContext != null) { - List<RadComponent> components = myContext.getComponents(); - if (components != null && !components.isEmpty()) { - myTargetOperation.setComponent(components.get(0)); - } - } + myTargetOperation.setComponent(myContext.getComponents().get(0)); } }
\ No newline at end of file diff --git a/plugins/ui-designer-core/src/com/intellij/designer/propertyTable/RadPropertyTable.java b/plugins/ui-designer-core/src/com/intellij/designer/propertyTable/RadPropertyTable.java index f9975f929662..0fe7d64f0411 100644 --- a/plugins/ui-designer-core/src/com/intellij/designer/propertyTable/RadPropertyTable.java +++ b/plugins/ui-designer-core/src/com/intellij/designer/propertyTable/RadPropertyTable.java @@ -15,7 +15,7 @@ */ package com.intellij.designer.propertyTable; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; +import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; import com.intellij.designer.DesignerBundle; import com.intellij.designer.designSurface.ComponentSelectionListener; import com.intellij.designer.designSurface.DesignerEditorPanel; @@ -104,7 +104,7 @@ public class RadPropertyTable extends PropertyTable implements DataProvider, Com @NotNull protected TextAttributesKey getErrorAttributes(@NotNull HighlightSeverity severity) { - return SeverityUtil.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(severity).getAttributesKey(); + return SeverityRegistrar.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(severity).getAttributesKey(); } ////////////////////////////////////////////////////////////////////////////////////////// diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/ErrorAnalyzer.java b/plugins/ui-designer/src/com/intellij/uiDesigner/ErrorAnalyzer.java index c6c96814723d..8d38863b939f 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/ErrorAnalyzer.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/ErrorAnalyzer.java @@ -16,7 +16,7 @@ package com.intellij.uiDesigner; import com.intellij.codeHighlighting.HighlightDisplayLevel; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; +import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; @@ -392,7 +392,7 @@ public final class ErrorAnalyzer { public static HighlightDisplayLevel getHighlightDisplayLevel(final Project project, @NotNull final RadComponent component) { HighlightDisplayLevel displayLevel = null; for(ErrorInfo errInfo: getAllErrorsForComponent(component)) { - if (displayLevel == null || SeverityUtil.getSeverityRegistrar(project).compare(errInfo.getHighlightDisplayLevel().getSeverity(), displayLevel.getSeverity()) > 0) { + if (displayLevel == null || SeverityRegistrar.getSeverityRegistrar(project).compare(errInfo.getHighlightDisplayLevel().getSeverity(), displayLevel.getSeverity()) > 0) { displayLevel = errInfo.getHighlightDisplayLevel(); } } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/componentTree/ComponentTree.java b/plugins/ui-designer/src/com/intellij/uiDesigner/componentTree/ComponentTree.java index 0889ca174181..a2f50bb6b13c 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/componentTree/ComponentTree.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/componentTree/ComponentTree.java @@ -16,7 +16,7 @@ package com.intellij.uiDesigner.componentTree; import com.intellij.codeHighlighting.HighlightDisplayLevel; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; +import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; import com.intellij.icons.AllIcons; import com.intellij.ide.DeleteProvider; import com.intellij.ide.highlighter.JavaHighlightingColors; @@ -328,7 +328,7 @@ public final class ComponentTree extends Tree implements DataProvider { SimpleTextAttributes result = highlightMap.get(attrs); if (result == null) { - final TextAttributesKey attrKey = SeverityUtil.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(level.getSeverity()).getAttributesKey(); + final TextAttributesKey attrKey = SeverityRegistrar.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(level.getSeverity()).getAttributesKey(); TextAttributes textAttrs = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attrKey); textAttrs = TextAttributes.merge(attrs.toTextAttributes(), textAttrs); result = SimpleTextAttributes.fromTextAttributes(textAttrs); diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button.png Binary files differindex 7e94090bae18..211c90e79138 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button@2x.png Binary files differnew file mode 100644 index 000000000000..ae8638c781bc --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/button@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup.png Binary files differindex fc1026c61f3e..3128143897d7 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup@2x.png Binary files differnew file mode 100644 index 000000000000..dcc9f3ade53e --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/buttonGroup@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox.png Binary files differindex 917a11d6ca92..85448c02b6dd 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox@2x.png Binary files differnew file mode 100644 index 000000000000..8eb071aeb545 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/checkBox@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale.png Binary files differindex 4ec56035f298..3835c686ce27 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale@2x.png Binary files differnew file mode 100644 index 000000000000..2580a4cbc337 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/chooseLocale@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode.png Binary files differindex 6b4f883215cf..409bde26096e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x.png Binary files differnew file mode 100644 index 000000000000..87d59bfd9f86 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x_dark.png Binary files differnew file mode 100644 index 000000000000..a303c01a3af4 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode_dark.png Binary files differnew file mode 100644 index 000000000000..76db8ca3fa18 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/collapseNode_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox.png Binary files differindex 9d68cb3e08a4..14ff0f6b2d83 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox@2x.png Binary files differnew file mode 100644 index 000000000000..aa99643c7e28 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/comboBox@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard.png Binary files differindex d59fa997d617..6260b778177d 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard@2x.png Binary files differnew file mode 100644 index 000000000000..a424469e9716 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/dataBindingWizard@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell.png Binary files differindex fd867049dcd6..3886a96f71c1 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x.png Binary files differnew file mode 100644 index 000000000000..ae4a4864b101 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x_dark.png Binary files differnew file mode 100644 index 000000000000..369b51d32850 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell_dark.png Binary files differnew file mode 100644 index 000000000000..d6ba0552ce90 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/deleteCell_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag.png Binary files differindex 89ba13f8294d..855b281bc066 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x.png Binary files differnew file mode 100644 index 000000000000..081d4c244686 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x_dark.png Binary files differnew file mode 100644 index 000000000000..164f94ebf4d0 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag_dark.png Binary files differnew file mode 100644 index 000000000000..41e558235e48 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/drag_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane.png Binary files differindex b4b93e2c5331..858939f1aafe 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane@2x.png Binary files differnew file mode 100644 index 000000000000..94fab4a84300 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/editorPane@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode.png Binary files differindex 7987865fcedc..f5841b8c0120 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x.png Binary files differnew file mode 100644 index 000000000000..c8fd9d05dade --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x_dark.png Binary files differnew file mode 100644 index 000000000000..2f6f09d464df --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode_dark.png Binary files differnew file mode 100644 index 000000000000..0ee3911d6cd6 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/expandNode_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField.png Binary files differindex 7e4f36aa3d3d..2812d788246d 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField@2x.png Binary files differnew file mode 100644 index 000000000000..f770e176b9b2 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/formattedTextField@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer.png Binary files differindex 9d1918ae481f..efe7705a4ff7 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x.png Binary files differnew file mode 100644 index 000000000000..73437f7f3ebf --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x_dark.png Binary files differnew file mode 100644 index 000000000000..27cab04c7473 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer_dark.png Binary files differnew file mode 100644 index 000000000000..8113c52f15b2 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/hspacer_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft.png Binary files differindex b2ef505d7407..6486608f153a 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x.png Binary files differnew file mode 100644 index 000000000000..ce6be755cd86 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x_dark.png Binary files differnew file mode 100644 index 000000000000..19ba81766669 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft_dark.png Binary files differnew file mode 100644 index 000000000000..6f75a83756e5 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnLeft_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight.png Binary files differindex c53241fb8614..368ab216a03f 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x.png Binary files differnew file mode 100644 index 000000000000..f603f4c7a150 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x_dark.png Binary files differnew file mode 100644 index 000000000000..8bf6bc561c79 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight_dark.png Binary files differnew file mode 100644 index 000000000000..8945c5ae5304 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertColumnRight_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove.png Binary files differindex 5540a2812367..a4f4f361cbe8 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x.png Binary files differnew file mode 100644 index 000000000000..6e47c352a9df --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x_dark.png Binary files differnew file mode 100644 index 000000000000..3b238aa3d334 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove_dark.png Binary files differnew file mode 100644 index 000000000000..3e96d0a08335 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowAbove_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow.png Binary files differindex 19b9cee788f6..060343026236 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x.png Binary files differnew file mode 100644 index 000000000000..722d8b6ad617 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x_dark.png Binary files differnew file mode 100644 index 000000000000..b79842689e7a --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow_dark.png Binary files differnew file mode 100644 index 000000000000..46f64972d770 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/insertRowBelow_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression.png Binary files differindex e9deac3fe29c..fdeee2402126 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x.png Binary files differnew file mode 100644 index 000000000000..dcaec401b0b7 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x_dark.png Binary files differnew file mode 100644 index 000000000000..308b3ae439de --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression_dark.png Binary files differnew file mode 100644 index 000000000000..0578e41a793a --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/inspectionSuppression_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label.png Binary files differindex 45bbab0830af..1dd5ff6b023e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x.png Binary files differnew file mode 100644 index 000000000000..4550b5398ea7 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x_dark.png Binary files differnew file mode 100644 index 000000000000..3fdd054b42c3 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label_dark.png Binary files differnew file mode 100644 index 000000000000..507e3fc7fc6c --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/label_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list.png Binary files differindex 91d79de1edd5..fb56fd9e479d 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list@2x.png Binary files differnew file mode 100644 index 000000000000..6dbf1d8b49ec --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/list@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener.png Binary files differindex 4aed6ddaa523..2bae257605d3 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x.png Binary files differnew file mode 100644 index 000000000000..390ff4478b6f --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x_dark.png Binary files differnew file mode 100644 index 000000000000..04e5e573f514 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener_dark.png Binary files differnew file mode 100644 index 000000000000..ebe58c12aea9 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/listener_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel.png Binary files differindex 671e08fcfafa..a1a76588e4c4 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x.png Binary files differnew file mode 100644 index 000000000000..794583e830bb --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x_dark.png Binary files differnew file mode 100644 index 000000000000..c956cc5d33b1 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel_dark.png Binary files differnew file mode 100644 index 000000000000..4a018896a1f5 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/panel_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField.png Binary files differindex 54c31be8c002..924dc8f0ed74 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField@2x.png Binary files differnew file mode 100644 index 000000000000..68a6fd49e330 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/passwordField@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar.png Binary files differindex aa7c52214d3b..10325651a247 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x.png Binary files differnew file mode 100644 index 000000000000..3e3b04ce7d59 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x_dark.png Binary files differnew file mode 100644 index 000000000000..bcf5c4053aba --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar_dark.png Binary files differnew file mode 100644 index 000000000000..7cbf601218f9 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/progressbar_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton.png Binary files differindex 710f4e10a3d6..b765b5427d5e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton@2x.png Binary files differnew file mode 100644 index 000000000000..8a5fb46136f6 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/radioButton@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane.png Binary files differindex cf82df16adf7..98c1e167138e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane@2x.png Binary files differnew file mode 100644 index 000000000000..a0424f27bf3c --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollPane@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar.png Binary files differindex 61f9d838d26d..712eb58a6621 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar@2x.png Binary files differnew file mode 100644 index 000000000000..6b9178f691a9 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/scrollbar@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator.png Binary files differindex 7a7a57ff0ac1..6e31b3bc6070 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x.png Binary files differnew file mode 100644 index 000000000000..4e13c000bb93 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x_dark.png Binary files differnew file mode 100644 index 000000000000..ad38d12563cf --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator_dark.png Binary files differnew file mode 100644 index 000000000000..c1287b7d468d --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/separator_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider.png Binary files differindex 6f09484fc2ab..5254f7048d89 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x.png Binary files differnew file mode 100644 index 000000000000..aaf449f565a5 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x_dark.png Binary files differnew file mode 100644 index 000000000000..f03503fc5276 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider_dark.png Binary files differnew file mode 100644 index 000000000000..c4678119162e --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/slider_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner.png Binary files differindex 453e59c12079..8aedf7d0ba2a 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner@2x.png Binary files differnew file mode 100644 index 000000000000..5174b3ab4583 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/spinner@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn.png Binary files differindex 99dee675c5d1..f8923017a8c4 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x.png Binary files differnew file mode 100644 index 000000000000..34ac420413a6 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x_dark.png Binary files differnew file mode 100644 index 000000000000..e02b0ebfd63c --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn_dark.png Binary files differnew file mode 100644 index 000000000000..40b1ec4c6340 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitColumn_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane.png Binary files differindex b8aa9e7759f7..b6c8bed77f81 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane@2x.png Binary files differnew file mode 100644 index 000000000000..3517fa928132 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitPane@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow.png Binary files differindex 066335b1c110..fd8152ffab37 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x.png Binary files differnew file mode 100644 index 000000000000..9274f731aa7e --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x_dark.png Binary files differnew file mode 100644 index 000000000000..ac45196ea706 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow_dark.png Binary files differnew file mode 100644 index 000000000000..6f562e2fa529 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/splitRow_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane.png Binary files differindex d5d250f22fc0..0f4f3783efb0 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane@2x.png Binary files differnew file mode 100644 index 000000000000..1dba51672d17 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tabbedPane@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table.png Binary files differindex 08c0ef2d7e66..8100081b405d 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table@2x.png Binary files differnew file mode 100644 index 000000000000..c6a2bfdcbfc9 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/table@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea.png Binary files differindex ee324ef13cd9..b1150e295de9 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea@2x.png Binary files differnew file mode 100644 index 000000000000..4953ee2e0212 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textArea@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField.png Binary files differindex e4a35a86c2a7..8e0f3d67fad2 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x.png Binary files differnew file mode 100644 index 000000000000..d4d370d9c042 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x_dark.png Binary files differnew file mode 100644 index 000000000000..50c73d1d7564 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField_dark.png Binary files differnew file mode 100644 index 000000000000..17b3b305f3cf --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textField_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane.png Binary files differindex 66cd2ea20528..2f9e9bf5367e 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane@2x.png Binary files differnew file mode 100644 index 000000000000..415db0dc203c --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/textPane@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner.png Binary files differindex f20a7f19617f..2913c640bc34 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x.png Binary files differnew file mode 100644 index 000000000000..57692fbfb367 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x_dark.png Binary files differnew file mode 100644 index 000000000000..9114e9efc85b --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner_dark.png Binary files differnew file mode 100644 index 000000000000..07cf1e179829 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolWindowUIDesigner_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar.png Binary files differindex 8281450f68e4..93be76122c35 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar@2x.png Binary files differnew file mode 100644 index 000000000000..3bc3a9f345e7 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbar@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator.png Binary files differindex 16b34281e728..237dcaeb52c4 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x.png Binary files differnew file mode 100644 index 000000000000..f054d26a68aa --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x_dark.png Binary files differnew file mode 100644 index 000000000000..61a39baedeec --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator_dark.png Binary files differnew file mode 100644 index 000000000000..65d760aad60f --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/toolbarSeparator_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree.png Binary files differindex 4d3813bad039..e1b5bcece78b 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x.png Binary files differnew file mode 100644 index 000000000000..4a26f7af9adc --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x_dark.png Binary files differnew file mode 100644 index 000000000000..8c3ad52d1cb5 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree_dark.png Binary files differnew file mode 100644 index 000000000000..90a124110da9 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/tree_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small.png Binary files differindex 8948a92fd765..000da55025d1 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small@2x.png Binary files differnew file mode 100644 index 000000000000..65d884da1049 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown-small@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown.png Binary files differindex 81fe79306e3c..000da55025d1 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown@2x.png Binary files differnew file mode 100644 index 000000000000..65d884da1049 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/unknown@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer.png Binary files differindex ea3e315d9120..63e24d643977 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer.png +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x.png Binary files differnew file mode 100644 index 000000000000..fe7e2143700f --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x_dark.png Binary files differnew file mode 100644 index 000000000000..c434cde71e87 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer@2x_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer_dark.png b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer_dark.png Binary files differnew file mode 100644 index 000000000000..6d5407f84949 --- /dev/null +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/icons/vspacer_dark.png diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/propertyInspector/PropertyInspectorTable.java b/plugins/ui-designer/src/com/intellij/uiDesigner/propertyInspector/PropertyInspectorTable.java index 22d95ba4d781..a711578b3f28 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/propertyInspector/PropertyInspectorTable.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/propertyInspector/PropertyInspectorTable.java @@ -15,7 +15,7 @@ */ package com.intellij.uiDesigner.propertyInspector; -import com.intellij.codeInsight.daemon.impl.SeverityUtil; +import com.intellij.codeInsight.daemon.impl.SeverityRegistrar; import com.intellij.icons.AllIcons; import com.intellij.ide.ui.LafManager; import com.intellij.ide.ui.LafManagerListener; @@ -1131,7 +1131,7 @@ public final class PropertyInspectorTable extends Table implements DataProvider{ Map<HighlightSeverity, SimpleTextAttributes> cache = modified ? myModifiedHighlightAttributes : myHighlightAttributes; result = cache.get(severity); if (result == null) { - final TextAttributesKey attrKey = SeverityUtil.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(severity).getAttributesKey(); + final TextAttributesKey attrKey = SeverityRegistrar.getSeverityRegistrar(myProject).getHighlightInfoTypeBySeverity(severity).getAttributesKey(); TextAttributes textAttrs = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attrKey); if (modified) { textAttrs = textAttrs.clone(); diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/radComponents/RadContainer.java b/plugins/ui-designer/src/com/intellij/uiDesigner/radComponents/RadContainer.java index 663dfc3a724b..78e386ce49b1 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/radComponents/RadContainer.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/radComponents/RadContainer.java @@ -680,7 +680,7 @@ public class RadContainer extends RadComponent implements IContainer { public RadAbstractGridLayoutManager getGridLayoutManager() { if (!(myLayoutManager instanceof RadAbstractGridLayoutManager)) { - throw new RuntimeException("Not a grid container"); + throw new RuntimeException("Not a grid container: " + myLayoutManager); } return (RadAbstractGridLayoutManager)myLayoutManager; } diff --git a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java index aec774c713fc..e498ca80211f 100644 --- a/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java +++ b/plugins/ui-designer/src/com/intellij/uiDesigner/snapShooter/CreateSnapShotAction.java @@ -115,7 +115,7 @@ public class CreateSnapShotAction extends AnAction { boolean connected = false; ApplicationConfigurationType cfgType = ApplicationConfigurationType.getInstance(); - RunnerAndConfigurationSettings[] racsi = RunManager.getInstance(project).getConfigurationSettings(cfgType); + List<RunnerAndConfigurationSettings> racsi = RunManager.getInstance(project).getConfigurationSettingsList(cfgType); for(RunnerAndConfigurationSettings config: racsi) { if (config.getConfiguration() instanceof ApplicationConfiguration) { diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathStringLiteralSelectioner.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathStringLiteralSelectioner.java index bb7218660f9e..a90237b5784c 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathStringLiteralSelectioner.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/XPathStringLiteralSelectioner.java @@ -15,7 +15,7 @@ */ package org.intellij.lang.xpath; -import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandler; +import com.intellij.codeInsight.editorActions.ExtendWordSelectionHandlerBase; import com.intellij.lang.ASTNode; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.TextRange; @@ -30,7 +30,7 @@ import java.util.List; * Date: 08.10.2009 * Time: 21:06:04 */ -public class XPathStringLiteralSelectioner implements ExtendWordSelectionHandler { +public class XPathStringLiteralSelectioner extends ExtendWordSelectionHandlerBase { public boolean canSelect(PsiElement e) { ASTNode astNode = e.getNode(); return astNode != null && diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/quickfix/DownloadManager.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/quickfix/DownloadManager.java index 10211674885b..fd064347c71f 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/quickfix/DownloadManager.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/quickfix/DownloadManager.java @@ -18,6 +18,8 @@ package org.intellij.lang.xpath.xslt.quickfix; import com.intellij.javaee.ExternalResourceManager; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.PathManager; +import com.intellij.openapi.application.Result; +import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; @@ -26,7 +28,6 @@ import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; -import com.intellij.ui.GuiUtils; import com.intellij.util.net.HttpConfigurable; import com.intellij.util.net.NetUtils; @@ -35,130 +36,149 @@ import java.lang.reflect.InvocationTargetException; import java.net.URLConnection; import java.util.Set; -@SuppressWarnings({ "StringEquality" }) +@SuppressWarnings({"StringEquality"}) public abstract class DownloadManager { - private static final ExternalResourceManager resourceManager = ExternalResourceManager.getInstance(); + private static final ExternalResourceManager resourceManager = ExternalResourceManager.getInstance(); - private final Project myProject; - private final ProgressIndicator myProgress; - private final String myResourcePath; + private final Project myProject; + private final ProgressIndicator myProgress; + private final String myResourcePath; - public DownloadManager(Project project, ProgressIndicator progress) { - myProject = project; - myProgress = progress; + public DownloadManager(Project project, ProgressIndicator progress) { + myProject = project; + myProgress = progress; - myResourcePath = PathManager.getSystemPath() + File.separatorChar + "extResources"; - final File dir = new File(myResourcePath); - dir.mkdirs(); - } + myResourcePath = PathManager.getSystemPath() + File.separatorChar + "extResources"; + final File dir = new File(myResourcePath); + dir.mkdirs(); + } - public void fetch(String location) throws DownloadException { - if (resourceManager.getResourceLocation(location) == location) { - myProgress.setText("Downloading " + location); - downloadAndRegister(location); - } + public void fetch(String location) throws DownloadException { + if (resourceManager.getResourceLocation(location) == location) { + myProgress.setText("Downloading " + location); + downloadAndRegister(location); } + } - private void downloadAndRegister(final String location) throws DownloadException { - final ExternalResourceManager resourceManager = ExternalResourceManager.getInstance(); - - File file = null; - try { - final URLConnection urlConnection = HttpConfigurable.getInstance().openConnection(location); - urlConnection.connect(); - final InputStream in = urlConnection.getInputStream(); + private void downloadAndRegister(final String location) throws DownloadException { + final ExternalResourceManager resourceManager = ExternalResourceManager.getInstance(); - final OutputStream out; - try { - final int total = urlConnection.getContentLength(); + File file = null; + try { + final URLConnection urlConnection = HttpConfigurable.getInstance().openConnection(location); + urlConnection.connect(); + final InputStream in = urlConnection.getInputStream(); - final String name = Integer.toHexString(System.identityHashCode(this)) + "_" + Integer.toHexString(location.hashCode()) + "_" + location.substring(location.lastIndexOf('/') + 1); - file = new File(myResourcePath, name.lastIndexOf('.') == -1 ? name + ".xml" : name); - out = new FileOutputStream(file); + final OutputStream out; + try { + final int total = urlConnection.getContentLength(); - try { - NetUtils.copyStreamContent(myProgress, in, out, total); - } - finally { - out.close(); - } - } - finally { - in.close(); - } + final String name = Integer.toHexString(System.identityHashCode(this)) + + "_" + + Integer.toHexString(location.hashCode()) + + "_" + + location.substring(location.lastIndexOf('/') + 1); + file = new File(myResourcePath, name.lastIndexOf('.') == -1 ? name + ".xml" : name); + out = new FileOutputStream(file); - try { - final File _file = file; - - //noinspection unchecked - final Set<String>[] resourceDependencies = new Set[1]; - Runnable runnable = new Runnable() { - public void run() { - Runnable runnable = new Runnable() { + try { + NetUtils.copyStreamContent(myProgress, in, out, total); + } + finally { + out.close(); + } + } + finally { + in.close(); + } + + try { + final File _file = file; + + //noinspection unchecked + final Set<String>[] resourceDependencies = new Set[1]; + new WriteAction() { + @Override + protected void run(Result result) throws Throwable { + final VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(_file); + if (vf != null) { + final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(vf); + if (psiFile != null && isAccepted(psiFile)) { + resourceDependencies[0] = getResourceDependencies(psiFile); + resourceManager.addResource(location, _file.getAbsolutePath()); + } + else { + ApplicationManager.getApplication().invokeLater( + new Runnable() { + @Override public void run() { - final VirtualFile vf = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(_file); - if (vf != null) { - final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(vf); - if (psiFile != null && isAccepted(psiFile)) { - resourceDependencies[0] = getResourceDependencies(psiFile); - resourceManager.addResource(location, _file.getAbsolutePath()); - } - else { - Messages.showErrorDialog(myProject, "Not a valid file: " + vf.getPresentableUrl(), "Download Problem"); - } - } + Messages.showErrorDialog(myProject, "Not a valid file: " + vf.getPresentableUrl(), "Download Problem"); } - }; - ApplicationManager.getApplication().runWriteAction(runnable); - } - }; - GuiUtils.invokeAndWait(runnable); - - if (resourceDependencies[0] != null) { - for (String s : resourceDependencies[0]) { - myProgress.checkCanceled(); - myProgress.setFraction(0); - fetch(s); - } + }, myProject.getDisposed()); } - } catch (InterruptedException e) { - // OK - } catch (InvocationTargetException e) { - final Throwable targetException = e.getTargetException(); - if (targetException instanceof RuntimeException) { - throw (RuntimeException)targetException; - } else if (targetException instanceof IOException) { - throw (IOException)targetException; - } else if (targetException instanceof InterruptedException) { - // OK - } else { - Logger.getInstance(getClass().getName()).error(e); - } - } - } catch (IOException e) { - throw new DownloadException(location, e); - } finally { - if (file != null && resourceManager.getResourceLocation(location) == location) { - // something went wrong. get rid of the file - file.delete(); } + } + }.execute(); + + if (resourceDependencies[0] != null) { + for (String s : resourceDependencies[0]) { + myProgress.checkCanceled(); + myProgress.setFraction(0); + fetch(s); + } + } + } + catch (Error err) { + Throwable e = err.getCause(); + if (e instanceof InterruptedException) { + // OK + } + else if (e instanceof InvocationTargetException) { + final Throwable targetException = ((InvocationTargetException)e).getTargetException(); + if (targetException instanceof RuntimeException) { + throw (RuntimeException)targetException; + } + else if (targetException instanceof IOException) { + throw (IOException)targetException; + } + else if (targetException instanceof InterruptedException) { + // OK + } + else { + Logger.getInstance(getClass().getName()).error(e); + } } + else { + throw err; + } + } + } + catch (IOException e) { + throw new DownloadException(location, e); } + finally { + if (file != null && resourceManager.getResourceLocation(location) == location) { + // something went wrong. get rid of the file + file.delete(); + } + } + } - protected abstract boolean isAccepted(PsiFile psiFile); - protected abstract Set<String> getResourceDependencies(PsiFile psiFile); + protected abstract boolean isAccepted(PsiFile psiFile); - public static class DownloadException extends IOException { - private final String myLocation; + protected abstract Set<String> getResourceDependencies(PsiFile psiFile); - public DownloadException(String location, IOException cause) { - super(); - myLocation = location; - initCause(cause); - } + public static class DownloadException extends IOException { + private final String myLocation; - public String getLocation() { - return myLocation; - } + public DownloadException(String location, IOException cause) { + super(); + myLocation = location; + initCause(cause); + } + + public String getLocation() { + return myLocation; } + } }
\ No newline at end of file diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java index ea392f083101..5d45ea057471 100644 --- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java +++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/xslt/run/XsltConfigurationProducer.java @@ -34,6 +34,7 @@ import org.intellij.lang.xpath.xslt.XsltSupport; import org.jetbrains.annotations.NotNull; import java.io.File; +import java.util.List; public class XsltConfigurationProducer extends RuntimeConfigurationProducer{ private XmlFile myFile; @@ -68,7 +69,7 @@ public class XsltConfigurationProducer extends RuntimeConfigurationProducer{ @Override protected RunnerAndConfigurationSettings findExistingByElement(Location location, - @NotNull RunnerAndConfigurationSettings[] existingConfigurations, + @NotNull List<RunnerAndConfigurationSettings> existingConfigurations, ConfigurationContext context) { final XmlFile file = PsiTreeUtil.getParentOfType(location.getPsiElement(), XmlFile.class, false); if (file != null && file.isPhysical() && XsltSupport.isXsltFile(file)) { |