diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java index f13a1b2e7171..70db6cf0ce8b 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java @@ -566,15 +566,18 @@ public class HighlightUtil { String name = variable.getName(); if (variable instanceof PsiLocalVariable || variable instanceof PsiParameter && ((PsiParameter)variable).getDeclarationScope() instanceof PsiCatchSection || - variable instanceof PsiParameter && ((PsiParameter)variable).getDeclarationScope() instanceof PsiForeachStatement || - variable instanceof PsiResource && ((PsiResource)variable).getResourceElement() instanceof PsiLocalVariable) { - PsiElement scope = PsiTreeUtil.getParentOfType(variable, PsiFile.class, PsiMethod.class, PsiClassInitializer.class); + variable instanceof PsiParameter && ((PsiParameter)variable).getDeclarationScope() instanceof PsiForeachStatement) { + PsiElement scope = PsiTreeUtil.getParentOfType(variable, PsiFile.class, PsiMethod.class, PsiClassInitializer.class, PsiResourceList.class); VariablesNotProcessor proc = new VariablesNotProcessor(variable, false) { protected boolean check(final PsiVariable var, final ResolveState state) { return (var instanceof PsiLocalVariable || var instanceof PsiParameter) && super.check(var, state); } }; PsiScopesUtil.treeWalkUp(proc, identifier, scope); + if (scope instanceof PsiResourceList && proc.size() == 0) { + scope = PsiTreeUtil.getParentOfType(variable, PsiFile.class, PsiMethod.class, PsiClassInitializer.class); + PsiScopesUtil.treeWalkUp(proc, identifier, scope); + } if (proc.size() > 0) { isIncorrect = true; } diff --git a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java index 0a863ea0d9a3..44bbf950c6d1 100644 --- a/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -194,17 +194,16 @@ public class PsiImplUtil { return true; } - public static boolean processDeclarationsInTryStatement(@NotNull final PsiTryStatement statement, + public static boolean processDeclarationsInResourceList(@NotNull final PsiResourceList resourceList, @NotNull final PsiScopeProcessor processor, @NotNull final ResolveState state, final PsiElement lastParent) { - final PsiResourceList resourceList = statement.getResourceList(); - if (resourceList != null && lastParent instanceof PsiCodeBlock && lastParent == statement.getTryBlock()) { - final List resources = resourceList.getResources(); - for (PsiResource resource : resources) { - final PsiElement resourceElement = resource.getResourceElement(); - if (resourceElement instanceof PsiLocalVariable && !processor.execute(resourceElement, state)) return false; - } + final List resources = resourceList.getResources(); + for (PsiResource resource : resources) { + final PsiElement resourceElement = resource.getResourceElement(); + if (resourceElement instanceof PsiLocalVariable && + !resourceElement.equals(lastParent) && + !processor.execute(resourceElement, state)) return false; } return true; diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceListImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceListImpl.java index f69d21569307..0ecec5626043 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceListImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiResourceListImpl.java @@ -15,12 +15,11 @@ */ package com.intellij.psi.impl.source.tree.java; -import com.intellij.psi.JavaElementVisitor; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.PsiResource; -import com.intellij.psi.PsiResourceList; +import com.intellij.psi.*; +import com.intellij.psi.impl.PsiImplUtil; import com.intellij.psi.impl.source.tree.CompositePsiElement; import com.intellij.psi.impl.source.tree.JavaElementType; +import com.intellij.psi.scope.PsiScopeProcessor; import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; @@ -47,6 +46,14 @@ public class PsiResourceListImpl extends CompositePsiElement implements PsiResou } } + @Override + public boolean processDeclarations(@NotNull final PsiScopeProcessor processor, + @NotNull final ResolveState state, + final PsiElement lastParent, + @NotNull final PsiElement place) { + return PsiImplUtil.processDeclarationsInResourceList(this, processor, state, lastParent); + } + @Override public String toString() { return "PsiResourceList:" + getText(); diff --git a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiTryStatementImpl.java b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiTryStatementImpl.java index b8bd9a9e373d..3abdb2b2bb23 100644 --- a/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiTryStatementImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/source/tree/java/PsiTryStatementImpl.java @@ -164,7 +164,12 @@ public class PsiTryStatementImpl extends CompositePsiElement implements PsiTrySt @NotNull final ResolveState state, final PsiElement lastParent, @NotNull final PsiElement place) { - return PsiImplUtil.processDeclarationsInTryStatement(this, processor, state, lastParent); + final PsiResourceList resourceList = getResourceList(); + if (resourceList != null && lastParent instanceof PsiCodeBlock && lastParent == getTryBlock()) { + return PsiImplUtil.processDeclarationsInResourceList(resourceList, processor, state, lastParent); + } + + return true; } public String toString() { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/TryWithResources.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/TryWithResources.java index 4c086108583f..2a3875509b2f 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/TryWithResources.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/TryWithResources.java @@ -34,7 +34,7 @@ class C { try ("resource") { } } - void m3() throws Exception { + void m3(int p) throws Exception { try (MyResource r = new MyResource()) { r.doSomething(); /* todo: < error descr="Cannot assign a value to final variable 'r'">r = null;*/ @@ -47,10 +47,18 @@ class C { } r = null; + try (MyResource r = new MyResource(); MyResource r = new MyResource()) { } + MyResource r = null; - try (MyResource r = new MyResource()) { } - try (r = new MyResource()) { } + + try (MyResource p = new MyResource()) { } + new Runnable() { + public void run() { + try (MyResource p = new MyResource()) { } + catch (E e) { } + } + }.run(); } } \ No newline at end of file