diff --git a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
index 8572d14733be..59c3cf484641 100644
--- a/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
+++ b/java/java-impl/src/com/intellij/psi/controlFlow/ControlFlowAnalyzer.java
@@ -1009,10 +1009,23 @@ class ControlFlowAnalyzer extends JavaJspElementVisitor {
final PsiType type = catchBlockParameters[i].getType();
// todo cast param
- if (type instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)type) ||
- type instanceof PsiDisjunctionType && ExceptionUtil.isUncheckedExceptionOrSuperclass(((PsiDisjunctionType)type).getLeastUpperBound())) {
+ if (type instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)type)) {
myUnhandledExceptionCatchBlocks.push(catchBlocks[i]);
}
+ else if (type instanceof PsiDisjunctionType) {
+ final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound();
+ if (lub instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)lub)) {
+ myUnhandledExceptionCatchBlocks.push(catchBlocks[i]);
+ }
+ else if (lub instanceof PsiIntersectionType) {
+ for (PsiType conjunct : ((PsiIntersectionType)lub).getConjuncts()) {
+ if (conjunct instanceof PsiClassType && ExceptionUtil.isUncheckedExceptionOrSuperclass((PsiClassType)conjunct)) {
+ myUnhandledExceptionCatchBlocks.push(catchBlocks[i]);
+ break;
+ }
+ }
+ }
+ }
}
PsiCodeBlock finallyBlock = statement.getFinallyBlock();
diff --git a/java/java-impl/src/com/intellij/psi/impl/source/parsing/ExpressionParsing.java b/java/java-impl/src/com/intellij/psi/impl/source/parsing/ExpressionParsing.java
index fb96293d27e0..f2a90cbae073 100644
--- a/java/java-impl/src/com/intellij/psi/impl/source/parsing/ExpressionParsing.java
+++ b/java/java-impl/src/com/intellij/psi/impl/source/parsing/ExpressionParsing.java
@@ -17,6 +17,7 @@ package com.intellij.psi.impl.source.parsing;
import com.intellij.codeInsight.daemon.JavaErrorMessages;
import com.intellij.lang.ASTFactory;
+import com.intellij.lang.ASTNode;
import com.intellij.lexer.FilterLexer;
import com.intellij.lexer.JavaLexer;
import com.intellij.lexer.Lexer;
@@ -406,7 +407,7 @@ public class ExpressionParsing extends Parsing {
final CompositeElement expr = parseUnaryExpression(lexer);
if (expr == null) {
- final TreeElement lastNode = TreeUtil.findLastLeaf(type);
+ final ASTNode lastNode = TreeUtil.findLastLeaf(type);
if (lastNode.getElementType() != JavaTokenType.GT) { //cannot parse correct parenthesized expression if we already parsed correct parameterized type
lexer.restore(pos);
return parsePostfixExpression(lexer);
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java
index b2d50a07080e..69cf037ebaae 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/MultiCatch.java
@@ -1,18 +1,23 @@
abstract class C {
private static class NE { }
- private static class E extends Exception { }
+ private static class E extends Exception { public String s; }
private static class E1 extends E { }
private static class E2 extends E { }
private static class E3 extends E { }
private static class RE extends RuntimeException { }
+ private interface I { }
+ private static class IE1 extends E implements I { }
+ private static class IE2 extends E implements I { }
abstract void f() throws E1, E2;
+ abstract void g() throws IE1, IE2;
void m() {
try { f(); } catch (E1 | E2 e) { }
- try { f(); } catch (E2 | E e) { e.printStackTrace(); }
+ try { f(); } catch (E2 | E e) { e.printStackTrace(); System.out.println(e.s); }
try { f(); } catch (E2 | E1 e) { } catch (E e) { } catch (RE e) { }
try { f(); } catch (E1 | E e) { E ee = e; }
+ try { g(); } catch (IE1 | IE2 e) { E ee = e; I ii = e; }
try { f(); } catch (E1 | E2 | E3 e) { }
try { f(); } catch (E3 | E e) { }
diff --git a/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java b/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java
index 673413e10e91..e764b3bde987 100644
--- a/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java
+++ b/java/openapi/src/com/intellij/psi/PsiDisjunctionType.java
@@ -30,7 +30,7 @@ import java.util.List;
public class PsiDisjunctionType extends PsiType {
private final PsiTypeElement myTypeElement;
private final List myTypes;
- private final CachedValue myLubCache;
+ private final CachedValue myLubCache;
public PsiDisjunctionType(final PsiTypeElement typeElement) {
super(PsiAnnotation.EMPTY_ARRAY);
@@ -46,19 +46,18 @@ public class PsiDisjunctionType extends PsiType {
}));
final CachedValuesManager cacheManager = CachedValuesManager.getManager(myTypeElement.getProject());
- myLubCache = cacheManager.createCachedValue(new CachedValueProvider() {
- public Result compute() {
+ myLubCache = cacheManager.createCachedValue(new CachedValueProvider() {
+ public Result compute() {
PsiType lub = myTypes.get(0);
for (int i = 1; i < myTypes.size(); i++) {
lub = GenericsUtil.getLeastUpperBound(lub, myTypes.get(i), myTypeElement.getManager());
}
- assert lub instanceof PsiClassType : getCanonicalText() + ", " + lub;
- return Result.create((PsiClassType)lub, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
+ return Result.create(lub, PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT);
}
}, false);
}
- public PsiClassType getLeastUpperBound() {
+ public PsiType getLeastUpperBound() {
return myLubCache.getValue();
}
@@ -102,7 +101,11 @@ public class PsiDisjunctionType extends PsiType {
@Override
public A accept(final PsiTypeVisitor visitor) {
- return visitor.visitClassType(getLeastUpperBound());
+ final PsiType lub = getLeastUpperBound();
+ if (lub instanceof PsiClassType) {
+ return visitor.visitClassType((PsiClassType)lub);
+ }
+ return visitor.visitType(lub);
}
@Override
diff --git a/java/openapi/src/com/intellij/psi/util/PsiUtil.java b/java/openapi/src/com/intellij/psi/util/PsiUtil.java
index 68b646d1acce..f34dfee9b11d 100644
--- a/java/openapi/src/com/intellij/psi/util/PsiUtil.java
+++ b/java/openapi/src/com/intellij/psi/util/PsiUtil.java
@@ -98,6 +98,12 @@ public final class PsiUtil extends PsiUtilBase {
if (type instanceof PsiClassType) {
return ((PsiClassType)type).resolveGenerics();
}
+ if (type instanceof PsiDisjunctionType) {
+ final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound();
+ if (lub instanceof PsiClassType) {
+ return ((PsiClassType)lub).resolveGenerics();
+ }
+ }
if (type == null && expression instanceof PsiReferenceExpression) {
JavaResolveResult resolveResult = ((PsiReferenceExpression)expression).advancedResolve(false);
if (resolveResult.getElement() instanceof PsiClass) {
@@ -372,7 +378,10 @@ public final class PsiUtil extends PsiUtilBase {
return resolveClassInType(((PsiArrayType) type).getComponentType());
}
if (type instanceof PsiDisjunctionType) {
- return ((PsiDisjunctionType)type).getLeastUpperBound().resolve();
+ final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound();
+ if (lub instanceof PsiClassType) {
+ return ((PsiClassType)lub).resolve();
+ }
}
return null;
}
@@ -385,6 +394,12 @@ public final class PsiUtil extends PsiUtilBase {
if (type instanceof PsiArrayType) {
return resolveGenericsClassInType(((PsiArrayType) type).getComponentType());
}
+ if (type instanceof PsiDisjunctionType) {
+ final PsiType lub = ((PsiDisjunctionType)type).getLeastUpperBound();
+ if (lub instanceof PsiClassType) {
+ return ((PsiClassType)lub).resolveGenerics();
+ }
+ }
return PsiClassType.ClassResolveResult.EMPTY;
}
diff --git a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
index 21bed94c1850..ef936fc4706b 100644
--- a/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
+++ b/platform/lang-impl/src/com/intellij/execution/runners/AbstractConsoleRunnerWithHistory.java
@@ -108,14 +108,7 @@ public abstract class AbstractConsoleRunnerWithHistory {
myProcessHandler.addProcessListener(new ProcessAdapter() {
@Override
public void processTerminated(ProcessEvent event) {
- myRunAction.getTemplatePresentation().setEnabled(false);
- myConsoleView.getConsole().setPrompt("");
- myConsoleView.getConsole().getConsoleEditor().setRendererMode(true);
- ApplicationManager.getApplication().invokeLater(new Runnable() {
- public void run() {
- myConsoleView.getConsole().getConsoleEditor().getComponent().updateUI();
- }
- });
+ finishConsole();
}
});
@@ -155,6 +148,17 @@ public abstract class AbstractConsoleRunnerWithHistory {
myProcessHandler.startNotify();
}
+ protected void finishConsole() {
+ myRunAction.getTemplatePresentation().setEnabled(false);
+ myConsoleView.getConsole().setPrompt("");
+ myConsoleView.getConsole().getConsoleEditor().setRendererMode(true);
+ ApplicationManager.getApplication().invokeLater(new Runnable() {
+ public void run() {
+ myConsoleView.getConsole().getConsoleEditor().getComponent().updateUI();
+ }
+ });
+ }
+
protected abstract LanguageConsoleViewImpl createConsoleView();
@Nullable
diff --git a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java
index 1d0d9bd67dd9..3acd3bb38257 100644
--- a/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java
+++ b/platform/lang-impl/src/com/intellij/find/EditorSearchComponent.java
@@ -166,7 +166,7 @@ public class EditorSearchComponent extends JPanel implements DataProvider, LiveP
myProject = project;
myEditor = editor;
- myLivePreview = new LivePreview(myEditor.getProject());
+ myLivePreview = new LivePreview(myEditor.getProject(), 0);
myLivePreview.addCursorListener(this);
myLivePreview.setDelegate(myLivePreviewController);
@@ -378,7 +378,7 @@ public class EditorSearchComponent extends JPanel implements DataProvider, LiveP
replacement.add(myPreserveCase);
for (Component comp : replacement.getComponents()) {
if (comp instanceof JComponent) {
- setSmallerFont((JComponent)comp);
+ setSmallerFontAndOpaque((JComponent)comp);
}
}
}
diff --git a/platform/lang-impl/src/com/intellij/find/impl/LivePreview.java b/platform/lang-impl/src/com/intellij/find/impl/LivePreview.java
index 810b058cd234..6c1f8a346b1d 100644
--- a/platform/lang-impl/src/com/intellij/find/impl/LivePreview.java
+++ b/platform/lang-impl/src/com/intellij/find/impl/LivePreview.java
@@ -156,6 +156,8 @@ public class LivePreview extends DocumentAdapter implements ReplacementView.Dele
private Runnable myContinuation;
+ private int myUserActivityDelay = USER_ACTIVITY_TRIGGERING_DELAY;
+
public Runnable getContinuation() {
return myContinuation;
}
@@ -174,7 +176,11 @@ public class LivePreview extends DocumentAdapter implements ReplacementView.Dele
public LivePreview(Project project) {
myProject = project;
-// updateEditorReference();
+ }
+
+ public LivePreview(Project project, int delay) {
+ this(project);
+ myUserActivityDelay = delay;
}
public Delegate getDelegate() {
@@ -223,7 +229,7 @@ public class LivePreview extends DocumentAdapter implements ReplacementView.Dele
public void run() {
updateInBackground();
}
- }, USER_ACTIVITY_TRIGGERING_DELAY);
+ }, myUserActivityDelay);
}
}
diff --git a/platform/lang-impl/src/com/intellij/psi/formatter/FormatterUtil.java b/platform/lang-impl/src/com/intellij/psi/formatter/FormatterUtil.java
index 4c0da4006d16..15dce65f488b 100644
--- a/platform/lang-impl/src/com/intellij/psi/formatter/FormatterUtil.java
+++ b/platform/lang-impl/src/com/intellij/psi/formatter/FormatterUtil.java
@@ -237,7 +237,7 @@ public class FormatterUtil {
}
public static void replaceLastWhiteSpace(final ASTNode astNode, final String whiteSpace, final TextRange textRange) {
- LeafElement lastWS = TreeUtil.findLastLeaf(astNode);
+ ASTNode lastWS = TreeUtil.findLastLeaf(astNode);
if (lastWS.getElementType() != TokenType.WHITE_SPACE) {
lastWS = null;
}
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
index 0f3143b812e8..b4fd690afdd1 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/codeStyle/CodeEditUtil.java
@@ -227,7 +227,7 @@ public class CodeEditUtil {
@Nullable
private static ASTNode findLastLeaf(ASTNode first, ASTNode last) {
do{
- final LeafElement leaf = TreeUtil.findLastLeaf(last);
+ final ASTNode leaf = TreeUtil.findLastLeaf(last);
if(leaf != null) return leaf;
last = last.getTreePrev();
if (last == null) return null;
diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java
index 3e4eda145434..4243155fb903 100644
--- a/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java
+++ b/platform/lang-impl/src/com/intellij/psi/impl/source/tree/TreeUtil.java
@@ -142,12 +142,12 @@ public class TreeUtil {
}
@Nullable
- public static LeafElement findLastLeaf(ASTNode element) {
+ public static ASTNode findLastLeaf(ASTNode element) {
if (element instanceof LeafElement) {
- return (LeafElement)element;
+ return element;
}
for (ASTNode child = element.getLastChildNode(); child != null; child = child.getTreePrev()) {
- LeafElement leaf = findLastLeaf(child);
+ ASTNode leaf = findLastLeaf(child);
if (leaf != null) return leaf;
}
return null;
@@ -304,7 +304,7 @@ public class TreeUtil {
}
@Nullable
- public static LeafElement prevLeaf(TreeElement start, @Nullable CommonParentState commonParent) {
+ public static ASTNode prevLeaf(TreeElement start, @Nullable CommonParentState commonParent) {
while (true) {
if (start == null) return null;
if (commonParent != null) {
@@ -314,7 +314,7 @@ public class TreeUtil {
commonParent.nextLeafBranchStart = start;
}
ASTNode prevTree = start;
- LeafElement prev = null;
+ ASTNode prev = null;
while (prev == null && (prevTree = prevTree.getTreePrev()) != null) {
prev = findLastLeaf(prevTree);
}
diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/BackgroundTaskQueue.java b/platform/platform-impl/src/com/intellij/openapi/progress/BackgroundTaskQueue.java
index 2275a074d1ef..ae18d1e2f15f 100644
--- a/platform/platform-impl/src/com/intellij/openapi/progress/BackgroundTaskQueue.java
+++ b/platform/platform-impl/src/com/intellij/openapi/progress/BackgroundTaskQueue.java
@@ -93,8 +93,13 @@ public class BackgroundTaskQueue {
ProgressManager.getInstance().runProcess(new Runnable() {
@Override
public void run() {
- // calls task's run and onCancel() or onSuccess()
- RunBackgroundable.runIfBackgroundThread(backgroundable, pi, runnable);
+ ApplicationManager.getApplication().executeOnPooledThread(new Runnable() {
+ @Override
+ public void run() {
+ // calls task's run and onCancel() or onSuccess()
+ RunBackgroundable.runIfBackgroundThread(backgroundable, pi, runnable);
+ }
+ });
}
}, pi);
}
diff --git a/plugins/java-i18n/src/com/intellij/spellchecker/PsiTypeTokenizer.java b/plugins/java-i18n/src/com/intellij/spellchecker/PsiTypeTokenizer.java
index c7a7eeaea5a4..848c09762ffc 100644
--- a/plugins/java-i18n/src/com/intellij/spellchecker/PsiTypeTokenizer.java
+++ b/plugins/java-i18n/src/com/intellij/spellchecker/PsiTypeTokenizer.java
@@ -20,7 +20,10 @@ import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiDisjunctionType;
+import com.intellij.psi.PsiType;
import com.intellij.psi.PsiTypeElement;
+import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.spellchecker.inspections.SplitterFactory;
import com.intellij.spellchecker.tokenizer.Token;
@@ -28,6 +31,10 @@ import com.intellij.spellchecker.tokenizer.Tokenizer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
/**
* Created by IntelliJ IDEA.
*
@@ -38,7 +45,10 @@ public class PsiTypeTokenizer extends Tokenizer {
@Nullable
@Override
public Token[] tokenize(@NotNull PsiTypeElement element) {
- final PsiClass psiClass = PsiUtil.resolveClassInType(element.getType());
+ final PsiType type = element.getType();
+ if (type instanceof PsiDisjunctionType) return tokenizeComplexType(element);
+
+ final PsiClass psiClass = PsiUtil.resolveClassInType(type);
if (psiClass == null || psiClass.getContainingFile() == null || psiClass.getContainingFile().getVirtualFile() == null) {
return null;
@@ -57,6 +67,19 @@ public class PsiTypeTokenizer extends Tokenizer {
SplitterFactory.getInstance().getIdentifierSplitter())};
}
+ @Nullable
+ private Token[] tokenizeComplexType(PsiTypeElement element) {
+ final List subTypes = PsiTreeUtil.getChildrenOfTypeAsList(element, PsiTypeElement.class);
+ final List result = new ArrayList(subTypes.size());
+ for (PsiTypeElement subType : subTypes) {
+ final Token[] tokens = tokenize(subType);
+ if (tokens != null) {
+ result.addAll(Arrays.asList(tokens));
+ }
+ }
+ return result.size() != 0 ? result.toArray(new Token[result.size()]) : null;
+ }
+
@NotNull
private TextRange getRangeToCheck(@NotNull String text, @NotNull String name) {
final int i = text.indexOf(name);
diff --git a/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic b/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic
index 024641691104..3d84c3e01c53 100644
--- a/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic
+++ b/plugins/spellchecker/src/com/intellij/spellchecker/jetbrains.dic
@@ -298,6 +298,7 @@ utils
validator
validators
vararg
+varargs
varbinary
varchar
varcharacter
diff --git a/plugins/svn4idea/lib/README.txt b/plugins/svn4idea/lib/README.txt
index 0e072966c7ca..fdbc9a5c7431 100644
--- a/plugins/svn4idea/lib/README.txt
+++ b/plugins/svn4idea/lib/README.txt
@@ -42,4 +42,4 @@ SVNKit Continuous Build Server: https://teamcity.svnkit.com/
5. CONTACTS
-On all questions related to SVNKit please contact us at support@svnkit.com
+On all questions related to SVNKit please contact us at support@svnkit.com
\ No newline at end of file
diff --git a/plugins/svn4idea/lib/svnkit.jar b/plugins/svn4idea/lib/svnkit.jar
index 6bf67f63791c..fa05aebfb3b1 100644
Binary files a/plugins/svn4idea/lib/svnkit.jar and b/plugins/svn4idea/lib/svnkit.jar differ
diff --git a/plugins/svn4idea/lib/svnkitsrc.zip b/plugins/svn4idea/lib/svnkitsrc.zip
index 821bdba56372..2b558ead1ae8 100644
Binary files a/plugins/svn4idea/lib/svnkitsrc.zip and b/plugins/svn4idea/lib/svnkitsrc.zip differ
diff --git a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnAuthenticationManager.java b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnAuthenticationManager.java
index a683ee9a8aa1..6c10446fdc44 100644
--- a/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnAuthenticationManager.java
+++ b/plugins/svn4idea/src/org/jetbrains/idea/svn/SvnAuthenticationManager.java
@@ -155,13 +155,18 @@ public class SvnAuthenticationManager extends DefaultSVNAuthenticationManager im
private PersistentAuthenticationProviderProxy(File authDir, String userName) {
ISVNAuthenticationStorageOptions delegatingOptions = new ISVNAuthenticationStorageOptions() {
- public boolean isNonInteractive() throws SVNException {
- return getAuthenticationStorageOptions().isNonInteractive();
- }
+ public boolean isNonInteractive() throws SVNException {
+ return getAuthenticationStorageOptions().isNonInteractive();
+ }
- public ISVNAuthStoreHandler getAuthStoreHandler() throws SVNException {
- return getAuthenticationStorageOptions().getAuthStoreHandler();
- }
+ public ISVNAuthStoreHandler getAuthStoreHandler() throws SVNException {
+ return getAuthenticationStorageOptions().getAuthStoreHandler();
+ }
+
+ @Override
+ public ISVNGnomeKeyringPasswordProvider getGnomeKeyringPasswordProvider() {
+ return getAuthenticationStorageOptions().getGnomeKeyringPasswordProvider();
+ }
@Override
public boolean isSSLPassphrasePromptSupported() {