diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapLongWithMathToIntExactFix.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapLongWithMathToIntExactFix.java index ebb0dbb93bff..57f4e7305204 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapLongWithMathToIntExactFix.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/WrapLongWithMathToIntExactFix.java @@ -16,15 +16,12 @@ package com.intellij.codeInsight.daemon.impl.quickfix; import com.intellij.codeInsight.daemon.QuickFixBundle; -import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil; import com.intellij.codeInsight.intention.HighPriorityAction; import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.project.Project; import com.intellij.psi.*; -import com.intellij.psi.codeStyle.JavaCodeStyleManager; -import com.intellij.psi.util.InheritanceUtil; import com.intellij.psi.util.PsiUtil; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.Nls; @@ -105,8 +102,7 @@ public class WrapLongWithMathToIntExactFix extends LocalQuickFixAndIntentionActi @Nullable @Override protected PsiExpression getModifiedArgument(final PsiExpression expression, final PsiType toType) throws IncorrectOperationException { - LOG.assertTrue(PsiType.INT.equals(toType)); - return (PsiExpression)getModifiedExpression(expression); + return PsiType.INT.equals(toType) ? (PsiExpression)getModifiedExpression(expression) : null; } @Override diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java index ea2209f232ee..04a925b970d9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/AnonymousCanBeMethodReferenceInspection.java @@ -19,7 +19,6 @@ import com.intellij.codeInsight.FileModificationService; import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.codeStyle.JavaCodeStyleManager; @@ -69,7 +68,7 @@ public class AnonymousCanBeMethodReferenceInspection extends BaseJavaBatchLocalI final PsiMethod method = aClass.getMethods()[0]; final PsiCodeBlock body = method.getBody(); final PsiCallExpression callExpression = - LambdaCanBeMethodReferenceInspection.canBeMethodReferenceProblem(body, method.getParameterList().getParameters(), aClass.getBaseClassType()); + LambdaCanBeMethodReferenceInspection.canBeMethodReferenceProblem(body, method.getParameterList().getParameters(), aClass.getBaseClassType(), aClass.getParent()); if (callExpression != null) { final PsiMethod resolveMethod = callExpression.resolveMethod(); if (resolveMethod != method && @@ -118,7 +117,7 @@ public class AnonymousCanBeMethodReferenceInspection extends BaseJavaBatchLocalI final PsiParameter[] parameters = methods[0].getParameterList().getParameters(); final PsiCallExpression callExpression = LambdaCanBeMethodReferenceInspection - .canBeMethodReferenceProblem(methods[0].getBody(), parameters, anonymousClass.getBaseClassType()); + .canBeMethodReferenceProblem(methods[0].getBody(), parameters, anonymousClass.getBaseClassType(), anonymousClass.getParent()); if (callExpression == null) return; final String methodRefText = LambdaCanBeMethodReferenceInspection.createMethodReferenceText(callExpression, anonymousClass.getBaseClassType(), parameters); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java index 140f672f1a30..2abba13e3c34 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/LambdaCanBeMethodReferenceInspection.java @@ -89,8 +89,16 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp @Nullable public static PsiCallExpression canBeMethodReferenceProblem(@Nullable final PsiElement body, - final PsiParameter[] parameters, - PsiType functionalInterfaceType) { + final PsiParameter[] parameters, + final PsiType functionalInterfaceType) { + return canBeMethodReferenceProblem(body, parameters, functionalInterfaceType, null); + } + + @Nullable + public static PsiCallExpression canBeMethodReferenceProblem(@Nullable final PsiElement body, + final PsiParameter[] parameters, + PsiType functionalInterfaceType, + @Nullable PsiElement context) { final PsiCallExpression callExpression = extractMethodCallFromBlock(body); if (callExpression instanceof PsiNewExpression) { final PsiNewExpression newExpression = (PsiNewExpression)callExpression; @@ -104,7 +112,7 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp LOG.assertTrue(callExpression != null); final PsiElementFactory elementFactory = JavaPsiFacade.getElementFactory(callExpression.getProject()); final PsiMethodReferenceExpression methodReferenceExpression = - (PsiMethodReferenceExpression)elementFactory.createExpressionFromText(methodReferenceText, callExpression); + (PsiMethodReferenceExpression)elementFactory.createExpressionFromText(methodReferenceText, context != null ? context : callExpression); final Map map = LambdaUtil.getFunctionalTypeMap(); try { map.put(methodReferenceExpression, functionalInterfaceType); @@ -367,7 +375,10 @@ public class LambdaCanBeMethodReferenceInspection extends BaseJavaBatchLocalInsp return getClassReferenceName(containingClass); } else { - final PsiClass parentContainingClass = PsiTreeUtil.getParentOfType(methodCall, PsiClass.class); + PsiClass parentContainingClass = PsiTreeUtil.getParentOfType(methodCall, PsiClass.class); + if (parentContainingClass instanceof PsiAnonymousClass) { + parentContainingClass = PsiTreeUtil.getParentOfType(parentContainingClass, PsiClass.class, true); + } PsiClass treeContainingClass = parentContainingClass; while (treeContainingClass != null && !InheritanceUtil.isInheritorOrSelf(treeContainingClass, containingClass, true)) { treeContainingClass = PsiTreeUtil.getParentOfType(treeContainingClass, PsiClass.class, true); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterUnqualifiedThis.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterUnqualifiedThis.java new file mode 100644 index 000000000000..e777691e49f5 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterUnqualifiedThis.java @@ -0,0 +1,12 @@ +// "Replace with method reference" "true" +class Test { + + private void doTest (){} + + void foo(Runnable r){} + + { + foo (this::doTest); + } + +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeUnqualifiedThis.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeUnqualifiedThis.java new file mode 100644 index 000000000000..35b98c03eb2e --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeUnqualifiedThis.java @@ -0,0 +1,17 @@ +// "Replace with method reference" "true" +class Test { + + private void doTest (){} + + void foo(Runnable r){} + + { + foo (new Runnable() { + @Override + public void run() { + doTest(); + } + }); + } + +} diff --git a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java index 67a5642e41f7..b6b12247df07 100644 --- a/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java +++ b/platform/lang-impl/src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java @@ -882,8 +882,7 @@ public class ScopeTreeViewPanel extends JPanel implements Disposable { } else if (node instanceof FileNode) { final PsiFile psiFile = (PsiFile)node.getPsiElement(); - LOG.assertTrue(psiFile != null); - return psiFile.getContainingDirectory(); + return psiFile != null ? psiFile.getContainingDirectory() : null; } } return null;