provide accessibility and static modifier fixes for method references (IDEA-166707)

This commit is contained in:
Anna Kozlova
2017-01-18 16:51:50 +03:00
parent e05b364a63
commit 560b5b0265
11 changed files with 158 additions and 9 deletions

View File

@@ -21,6 +21,7 @@ import com.intellij.codeInsight.daemon.impl.*;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightUtil.Feature;
import com.intellij.codeInsight.daemon.impl.quickfix.QuickFixAction;
import com.intellij.codeInsight.intention.QuickFixFactory;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
import com.intellij.lang.injection.InjectedLanguageManager;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Document;
@@ -1315,6 +1316,7 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (method != null && !result.isAccessible()) {
final String accessProblem = HighlightUtil.buildProblemWithAccessDescription(expression, result);
HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(accessProblem).create();
HighlightUtil.registerAccessQuickFixAction((PsiMember)method, expression, info, result.getCurrentFileResolveScope());
myHolder.add(info);
}
else {
@@ -1362,7 +1364,16 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (!myHolder.hasErrorResults() && functionalInterfaceType != null) {
final String errorMessage = PsiMethodReferenceUtil.checkMethodReferenceContext(expression);
if (errorMessage != null) {
myHolder.add(HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(errorMessage).create());
final HighlightInfo info =
HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(errorMessage).create();
if (method instanceof PsiMethod && !((PsiMethod)method).isConstructor() &&
!((PsiMethod)method).hasModifierProperty(PsiModifier.ABSTRACT)) {
final boolean shouldHave = !((PsiMethod)method).hasModifierProperty(PsiModifier.STATIC);
final LocalQuickFixAndIntentionActionOnPsiElement fixStaticModifier =
QuickFixFactory.getInstance().createModifierListFix((PsiModifierListOwner)method, PsiModifier.STATIC, shouldHave, false);
QuickFixAction.registerQuickFixAction(info, fixStaticModifier);
}
myHolder.add(info);
}
}

View File

@@ -310,15 +310,15 @@ public class PsiMethodReferenceUtil {
}
}
if (!receiverReferenced && isStaticSelector && !isMethodStatic && !isConstructor) {
return "Non-static method cannot be referenced from a static context";
if (!receiverReferenced) {
if (isStaticSelector && !isMethodStatic && !isConstructor) {
return "Non-static method cannot be referenced from a static context";
}
if (!isStaticSelector && isMethodStatic) {
return "Static method referenced through non-static qualifier";
}
}
if (!receiverReferenced && !isStaticSelector && isMethodStatic) {
return "Static method referenced through non-static qualifier";
}
if (receiverReferenced && isStaticSelector && isMethodStatic && !isConstructor) {
else if (isStaticSelector && isMethodStatic) {
return "Static method referenced through receiver";
}

View File

@@ -0,0 +1,14 @@
// "Make 'PrivateMethodRef.filter' package-private" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
static boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
Predicate<String> filter2 = PrivateMethodRef::filter;
}
}

View File

@@ -0,0 +1,14 @@
// "Make 'PrivateMethodRef.filter' package-private" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
private static boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
Predicate<String> filter2 = PrivateMethodRef::fi<caret>lter;
}
}

View File

@@ -0,0 +1,16 @@
// "Make 'filter' not static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
PrivateMethodRef ref = new PrivateMethodRef();
Predicate<String> filter2 = ref::filter;
}
}

View File

@@ -0,0 +1,16 @@
// "Make 'filter' not static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
boolean filter() {
return false;
}
}
class Some {
public static void main(String[] args) {
PrivateMethodRef f = null;
Predicate<PrivateMethodRef> filter2 = PrivateMethodRef::filter;
}
}

View File

@@ -0,0 +1,15 @@
// "Make 'filter' static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
static boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
Predicate<String> filter2 = PrivateMethodRef::filter;
}
}

View File

@@ -0,0 +1,16 @@
// "Make 'filter' not static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
static boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
PrivateMethodRef ref = new PrivateMethodRef();
Predicate<String> filter2 = ref::fi<caret>lter;
}
}

View File

@@ -0,0 +1,16 @@
// "Make 'filter' not static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
static boolean filter() {
return false;
}
}
class Some {
public static void main(String[] args) {
PrivateMethodRef f = null;
Predicate<PrivateMethodRef> filter2 = PrivateMethodRef::fil<caret>ter;
}
}

View File

@@ -0,0 +1,15 @@
// "Make 'filter' static" "true"
import java.util.function.Predicate;
class PrivateMethodRef {
boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
Predicate<String> filter2 = PrivateMethodRef::fi<caret>lter;
}
}

View File

@@ -0,0 +1,16 @@
// "Make 'filter' static" "false"
import java.util.function.Predicate;
class PrivateMethodRef {
boolean filter(final String s) {
return false;
}
}
class Some {
public static void main(String[] args) {
PrivateMethodRef ref = new PrivateMethodRef();
Predicate<String> filter2 = ref::fi<caret>lter;
}
}