mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-18 09:34:34 +07:00
First take on method references
This commit is contained in:
+26
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright 2000-2012 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
class C {
|
||||
interface Simplest {
|
||||
void m();
|
||||
}
|
||||
void simplest() { }
|
||||
|
||||
void test() {
|
||||
<error descr="Incompatible types. Found: 'null', required: 'C.Simplest'">Simplest simplest = this::simplest;</error>
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
PsiJavaFile:MethodRef0.java
|
||||
PsiMethodReferenceExpression:a.b.C::m
|
||||
PsiReferenceExpression:a.b.C
|
||||
PsiReferenceExpression:a.b
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:b('b')
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:C('C')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:m('m')
|
||||
@@ -0,0 +1,27 @@
|
||||
PsiJavaFile:MethodRef1.java
|
||||
PsiMethodReferenceExpression:a.b.C<T>::new
|
||||
PsiTypeElement:a.b.C<T>
|
||||
PsiJavaCodeReferenceElement:a.b.C<T>
|
||||
PsiJavaCodeReferenceElement:a.b
|
||||
PsiJavaCodeReferenceElement:a
|
||||
PsiIdentifier:a('a')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiIdentifier:b('b')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiIdentifier:C('C')
|
||||
PsiReferenceParameterList
|
||||
PsiJavaToken:LT('<')
|
||||
PsiTypeElement:T
|
||||
PsiJavaCodeReferenceElement:T
|
||||
PsiIdentifier:T('T')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiJavaToken:GT('>')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiKeyword:new('new')
|
||||
@@ -0,0 +1,16 @@
|
||||
PsiJavaFile:MethodRef2.java
|
||||
PsiMethodReferenceExpression:C::<T>m
|
||||
PsiReferenceExpression:C
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:C('C')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
PsiJavaToken:LT('<')
|
||||
PsiTypeElement:T
|
||||
PsiJavaCodeReferenceElement:T
|
||||
PsiIdentifier:T('T')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiJavaToken:GT('>')
|
||||
PsiIdentifier:m('m')
|
||||
@@ -0,0 +1,17 @@
|
||||
PsiJavaFile:MethodRef3.java
|
||||
PsiMethodReferenceExpression:a[i]::m
|
||||
PsiArrayAccessExpression:a[i]
|
||||
PsiReferenceExpression:a
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:a('a')
|
||||
PsiJavaToken:LBRACKET('[')
|
||||
PsiReferenceExpression:i
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:i('i')
|
||||
PsiJavaToken:RBRACKET(']')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:m('m')
|
||||
@@ -0,0 +1,11 @@
|
||||
PsiJavaFile:MethodRef4.java
|
||||
PsiMethodReferenceExpression:int[]::clone
|
||||
PsiTypeElement:int[]
|
||||
PsiTypeElement:int
|
||||
PsiKeyword:int('int')
|
||||
PsiJavaToken:LBRACKET('[')
|
||||
PsiJavaToken:RBRACKET(']')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:clone('clone')
|
||||
@@ -0,0 +1,55 @@
|
||||
PsiJavaFile:MethodRef5.java
|
||||
PsiMethodReferenceExpression:(f ? list.map(String::length) : Collections.emptyList())::iterator
|
||||
PsiParenthesizedExpression:(f ? list.map(String::length) : Collections.emptyList())
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiConditionalExpression:f ? list.map(String::length) : Collections.emptyList()
|
||||
PsiReferenceExpression:f
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:f('f')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:QUEST('?')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiMethodCallExpression:list.map(String::length)
|
||||
PsiReferenceExpression:list.map
|
||||
PsiReferenceExpression:list
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:list('list')
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:map('map')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiMethodReferenceExpression:String::length
|
||||
PsiReferenceExpression:String
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:String('String')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:length('length')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiJavaToken:COLON(':')
|
||||
PsiWhiteSpace(' ')
|
||||
PsiMethodCallExpression:Collections.emptyList()
|
||||
PsiReferenceExpression:Collections.emptyList
|
||||
PsiReferenceExpression:Collections
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:Collections('Collections')
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:emptyList('emptyList')
|
||||
PsiExpressionList
|
||||
PsiJavaToken:LPARENTH('(')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:RPARENTH(')')
|
||||
PsiJavaToken:DOUBLE_COLON('::')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:iterator('iterator')
|
||||
@@ -0,0 +1,11 @@
|
||||
PsiJavaFile:PrimitiveFieldAccess.java
|
||||
PsiReferenceExpression:int.x
|
||||
PsiClassObjectAccessExpression:int
|
||||
PsiTypeElement:int
|
||||
PsiKeyword:int('int')
|
||||
PsiErrorElement:.class expected
|
||||
<empty list>
|
||||
PsiJavaToken:DOT('.')
|
||||
PsiReferenceParameterList
|
||||
<empty list>
|
||||
PsiIdentifier:x('x')
|
||||
+1
@@ -184,4 +184,5 @@ public class LightAdvHighlightingJdk7Test extends LightDaemonAnalyzerTestCase {
|
||||
public void testIDEA84533() throws Exception { doTest(false, false); }
|
||||
public void testClassLiteral() throws Exception { doTest(false, false); }
|
||||
public void testExtensionMethods() throws Exception { doTest(false, false); }
|
||||
public void testMethodReferences() throws Exception { doTest(false, false); }
|
||||
}
|
||||
|
||||
+8
@@ -111,9 +111,17 @@ public class ExpressionParserTest extends JavaParsingTestCase {
|
||||
public void testQualifiedSuperMethodCall1() { doParserTest("d.super(0)"); }
|
||||
public void testSuperMethodCallTypeParameterList() { doParserTest("super()"); }
|
||||
public void testPrimitiveClassObjectAccess() { doParserTest("int.class"); }
|
||||
public void testPrimitiveFieldAccess() { doParserTest("int.x"); }
|
||||
public void testChainedClassObjectAccess() { doParserTest("A.class.B.class"); }
|
||||
public void testChainedThisObjectAccess() { doParserTest("A.this.B.this"); }
|
||||
|
||||
public void testMethodRef0() { doParserTest("a.b.C::m"); }
|
||||
public void testMethodRef1() { doParserTest("a.b.C<T>::new"); }
|
||||
public void testMethodRef2() { doParserTest("C::<T>m"); }
|
||||
public void testMethodRef3() { doParserTest("a[i]::m"); }
|
||||
public void testMethodRef4() { doParserTest("int[]::clone"); }
|
||||
public void testMethodRef5() { doParserTest("(f ? list.map(String::length) : Collections.emptyList())::iterator"); }
|
||||
|
||||
private void doParserTest(@NonNls final String text) {
|
||||
doParserTest(text, new MyTestParser());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user