method refs: super::abstract method

This commit is contained in:
anna
2013-02-26 19:51:03 +01:00
parent 2d1f7206ce
commit 2ceabcf7ba
3 changed files with 37 additions and 1 deletions
@@ -1040,7 +1040,8 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (myRefCountHolder != null) {
myRefCountHolder.registerReference(expression, result);
}
if (result.getElement() != null && !result.isAccessible()) {
final PsiElement method = result.getElement();
if (method != null && !result.isAccessible()) {
final String accessProblem = HighlightUtil.buildProblemWithAccessDescription(expression, result);
HighlightInfo info = HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expression).descriptionAndTooltip(accessProblem).create();
myHolder.add(info);
@@ -1075,6 +1076,17 @@ public class HighlightVisitorImpl extends JavaElementVisitor implements Highligh
if (!myHolder.hasErrorResults()) {
myHolder.add(HighlightUtil.checkUnhandledExceptions(expression, expression.getTextRange()));
}
if (!myHolder.hasErrorResults()) {
if (method instanceof PsiMethod && ((PsiMethod)method).hasModifierProperty(PsiModifier.ABSTRACT)) {
final PsiElement qualifier = expression.getQualifier();
if (qualifier instanceof PsiSuperExpression) {
myHolder.add(HighlightInfo
.newHighlightInfo(HighlightInfoType.ERROR)
.range(expression.getReferenceNameElement())
.descriptionAndTooltip("Abstract method '" + ((PsiMethod)method).getName() + "' cannot be accessed directly").create());
}
}
}
}
@Override
@@ -0,0 +1,20 @@
class Test {
interface I {
int _();
}
static abstract class Parent {
abstract int foo() ;
}
static abstract class Child extends Parent {
abstract int foo() ;
void test() {
I s = super::<error descr="Abstract method 'foo' cannot be accessed directly">foo</error>;
I s1 = this::foo;
Parent sup = null;
I s2 = sup::foo;
}
}
}
@@ -200,6 +200,10 @@ public class MethodRefHighlightingTest extends LightDaemonAnalyzerTestCase {
doTest();
}
public void testAbstractMethod() throws Exception {
doTest();
}
private void doTest() throws Exception {
doTest(false);
}