mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-05 01:50:56 +07:00
provide accessibility and static modifier fixes for method references (IDEA-166707)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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";
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user