blob: 62af5576f0ae60954aeb534f6206ee9e4d581976 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Stephan Herrmann - Contributions for
* Bug 452788 - [1.8][compiler] Type not correctly inferred in lambda expression
*******************************************************************************/
package org.eclipse.jdt.internal.compiler.ast;
import org.eclipse.jdt.internal.compiler.lookup.BlockScope;
import org.eclipse.jdt.internal.compiler.lookup.InferenceContext18;
import org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
import org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
import org.eclipse.jdt.internal.compiler.lookup.PolyTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.Scope;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
/**
Contract to be implemented by all poly expressions and potential poly expressions for uniform integration into overload resolution and type inference.
Additional contracts may be imposed by {@link Invocation} and {@link InvocationSite}. For most contracts "default" implementations are furnished by
{@link Expression} or {@link Statement} or by {@link ASTNode} and the poly expression should suitably override where required.
@see PolyTypeBinding
@see ExpressionContext
*/
public interface IPolyExpression {
// Expression context manipulation
public void setExpressionContext(ExpressionContext context);
public ExpressionContext getExpressionContext();
// Target type injection.
public void setExpectedType(TypeBinding targetType);
public TypeBinding invocationTargetType();
// Compatibility checks.
public boolean isPotentiallyCompatibleWith(TypeBinding targetType, Scope scope);
public boolean isCompatibleWith(TypeBinding targetType, final Scope scope);
public boolean isBoxingCompatibleWith(TypeBinding targetType, Scope scope);
public boolean sIsMoreSpecific(TypeBinding s, TypeBinding t, Scope skope);
// Pertinence checks.
public boolean isPertinentToApplicability(TypeBinding targetType, MethodBinding method);
// Polyness checks
public boolean isPolyExpression(MethodBinding candidate);
public boolean isPolyExpression();
public boolean isFunctionalType();
public Expression[] getPolyExpressions();
/* Resolution: A poly expression must be prepared to be resolved multiple times and should manage matters in a side effect free fashion.
Typically, in invocation contexts, there is an initial resolution, multiple tentative resolutions and then a final resolution against
the ultimate target type.
*/
public TypeBinding resolveType(BlockScope blockScope);
// Resolve expression tentatively - should have no lingering side-effects that may impact final resolution !
public Expression resolveExpressionExpecting(TypeBinding targetType, Scope scope, InferenceContext18 inferenceContext);
}