From 413dce7548b32fb432250fc160603bea4edda197 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 28 Oct 2015 17:11:41 +0100 Subject: [PATCH 1/3] NPE (IDEA-147001) --- .../src/com/intellij/ide/scopeView/ScopeTreeViewPanel.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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; From 543e5f3cdf666aa332d47d7cd7f25a38e8f65a06 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 28 Oct 2015 18:14:50 +0100 Subject: [PATCH 2/3] remove this qualifier on anonym -> method ref fix --- ...onymousCanBeMethodReferenceInspection.java | 5 ++--- .../LambdaCanBeMethodReferenceInspection.java | 19 +++++++++++++++---- .../afterUnqualifiedThis.java | 12 ++++++++++++ .../beforeUnqualifiedThis.java | 17 +++++++++++++++++ 4 files changed, 46 insertions(+), 7 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/afterUnqualifiedThis.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeUnqualifiedThis.java 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(); + } + }); + } + +} From f7bed52e981759cd231d620e80414c8bb74bc4bd Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 28 Oct 2015 19:41:26 +0100 Subject: [PATCH 3/3] reject wrap fix if types are incompatible: fix AdvHighlightingTests --- .../daemon/impl/quickfix/WrapLongWithMathToIntExactFix.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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