diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java index 8f15a49870a2..ce8ef9ae143a 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiImplUtil.java @@ -544,7 +544,8 @@ public class PsiImplUtil { PsiClass aClass = member.getContainingClass(); if (aClass instanceof PsiAnonymousClass) { //member from anonymous class can be called from outside the class - PsiElement methodCallExpr = PsiTreeUtil.getParentOfType(aClass, PsiMethodCallExpression.class); + PsiElement methodCallExpr = PsiUtil.isLanguageLevel8OrHigher(aClass) ? PsiTreeUtil.getParentOfType(aClass, PsiMember.class) + : PsiTreeUtil.getParentOfType(aClass, PsiMethodCallExpression.class); return new LocalSearchScope(methodCallExpr != null ? methodCallExpr : aClass); } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java new file mode 100644 index 000000000000..db563c05a5be --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java @@ -0,0 +1,21 @@ +import java.util.Collection; +import java.util.Map; + +class Test{ + + public static void main(String[] args) { + Map> myMap = null; + + myMap.entrySet().stream() + .flatMap(entry -> entry.getValue().stream() + .map(val -> new Object() { + String key = entry.getKey(); + Integer value = val; + })) + .forEachOrdered(o -> { + final String key = o.key; + final Integer value = o.value; + System.out.println("key: " + key + " value: " + value); + }); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java index 3c9a0e1064df..a6a75b7c061c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java @@ -16,12 +16,13 @@ package com.intellij.codeInsight.daemon.lambda; import com.intellij.JavaTestUtil; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiFunctionalExpression; +import com.intellij.psi.*; import com.intellij.psi.search.searches.FunctionalExpressionSearch; +import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.testFramework.LightProjectDescriptor; import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase; +import org.jetbrains.annotations.NotNull; import java.util.Collection; @@ -39,8 +40,27 @@ public class FindFunctionalInterfaceTest extends LightCodeInsightFixtureTestCase assertEquals("() -> {}", next.getText()); } + public void testFieldFromAnonymousClassScope() throws Exception { + myFixture.configureByFile(getTestName(false) + ".java"); + final PsiElement elementAtCaret = myFixture.getElementAtCaret(); + assertNotNull(elementAtCaret); + final PsiField field = PsiTreeUtil.getParentOfType(elementAtCaret, PsiField.class, false); + assertNotNull(field); + final PsiClass aClass = field.getContainingClass(); + assertTrue(aClass instanceof PsiAnonymousClass); + final Collection references = ReferencesSearch.search(field).findAll(); + assertFalse(references.isEmpty()); + assertEquals(1, references.size()); + } + @Override protected String getBasePath() { return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/lambda/findUsages/"; } + + @NotNull + @Override + protected LightProjectDescriptor getProjectDescriptor() { + return JAVA_8; + } }