Cleanup: NotNull/Nullable
[idea/community.git] / java / java-psi-api / src / com / intellij / psi / PsiFunctionalExpression.java
1 /*
2  * Copyright 2000-2016 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.psi;
17
18 import com.intellij.openapi.util.Iconable;
19 import org.jetbrains.annotations.Nullable;
20
21 public interface PsiFunctionalExpression extends PsiExpression, Iconable, NavigatablePsiElement {
22   PsiFunctionalExpression[] EMPTY_ARRAY = new PsiFunctionalExpression[0];
23   /**
24    * @return SAM type the lambda expression corresponds to
25    *         or null when no SAM type could be found
26    */
27   @Nullable
28   PsiType getFunctionalInterfaceType();
29
30   /**
31    * @return true if assignment SAM s = expr is correctly shaped
32    */
33   boolean isAcceptable(PsiType left);
34
35   /**
36    * Potentially compatible check takes into account the presence and "shape" of functional interface target types.
37    *
38    * JLS placement:
39    * 15.12.2.1 Identify Potentially Applicable Methods
40    * A member method is potentially applicable to a method invocation if and only if all of the following are true:
41    *  The name of the member is identical to the name of the method in the method invocation.
42    *  The member is accessible (p6.6) to the class or interface in which the method invocation appears.
43    *  If the member is a fixed arity method with arity n, the arity of the method invocation is equal to n,
44    *   and for all i (1 <= i <= n), the i'th argument of the method invocation is potentially compatible, as defined below,
45    *   with the type of the i'th parameter of the method.
46    *  If the member is a variable arity method with arity n, etc
47    */
48   boolean isPotentiallyCompatible(PsiType left);
49
50   /**
51    * JLS 9.9. Function Types:
52    * 
53    * When a generic functional interface is parameterized by wildcards, there are many different instantiations that could satisfy the wildcard
54    * and produce different function types. Sometimes, it is possible to known from the context, such as the parameter types of a lambda expression, 
55    * which function type is intended (15.27.3). Other times, it is necessary to pick one; in these circumstances, the bounds are used. 
56    */
57   @Nullable
58   PsiType getGroundTargetType(PsiType functionalInterfaceType);
59 }