Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| /* | |
| * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license | |
| * that can be found in the license/LICENSE.txt file. | |
| */ | |
| package org.jetbrains.kotlin.resolve; | |
| import com.google.common.collect.ImmutableMap; | |
| import com.intellij.psi.PsiElement; | |
| import kotlin.annotations.jvm.ReadOnly; | |
| import org.jetbrains.annotations.NotNull; | |
| import org.jetbrains.annotations.Nullable; | |
| import org.jetbrains.annotations.TestOnly; | |
| import org.jetbrains.kotlin.cfg.LeakingThisDescriptor; | |
| import org.jetbrains.kotlin.cfg.TailRecursionKind; | |
| import org.jetbrains.kotlin.contracts.description.InvocationKind; | |
| import org.jetbrains.kotlin.contracts.model.Computation; | |
| import org.jetbrains.kotlin.contracts.model.Functor; | |
| import org.jetbrains.kotlin.descriptors.*; | |
| import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; | |
| import org.jetbrains.kotlin.name.FqName; | |
| import org.jetbrains.kotlin.name.FqNameUnsafe; | |
| import org.jetbrains.kotlin.psi.*; | |
| import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext; | |
| import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemCompleter; | |
| import org.jetbrains.kotlin.resolve.calls.model.PartialCallResolutionResult; | |
| import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall; | |
| import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; | |
| import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue; | |
| import org.jetbrains.kotlin.resolve.calls.smartcasts.ExplicitSmartCasts; | |
| import org.jetbrains.kotlin.resolve.calls.smartcasts.ImplicitSmartCasts; | |
| import org.jetbrains.kotlin.resolve.calls.tower.KotlinResolutionCallbacksImpl; | |
| import org.jetbrains.kotlin.resolve.checkers.PrimitiveNumericComparisonInfo; | |
| import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant; | |
| import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics; | |
| import org.jetbrains.kotlin.resolve.scopes.LexicalScope; | |
| import org.jetbrains.kotlin.resolve.scopes.receivers.Qualifier; | |
| import org.jetbrains.kotlin.types.DeferredType; | |
| import org.jetbrains.kotlin.types.KotlinType; | |
| import org.jetbrains.kotlin.types.expressions.CaptureKind; | |
| import org.jetbrains.kotlin.types.expressions.DoubleColonLHS; | |
| import org.jetbrains.kotlin.types.expressions.KotlinTypeInfo; | |
| import org.jetbrains.kotlin.types.expressions.PreliminaryDeclarationVisitor; | |
| import org.jetbrains.kotlin.util.Box; | |
| import org.jetbrains.kotlin.util.slicedMap.*; | |
| import java.util.Collection; | |
| import java.util.Collections; | |
| import static org.jetbrains.kotlin.util.slicedMap.RewritePolicy.DO_NOTHING; | |
| import static org.jetbrains.kotlin.util.slicedMap.Slices.COMPILE_TIME_VALUE_REWRITE_POLICY; | |
| public interface BindingContext { | |
| BindingContext EMPTY = new BindingContext() { | |
| @NotNull | |
| @Override | |
| public Diagnostics getDiagnostics() { | |
| return Diagnostics.Companion.getEMPTY(); | |
| } | |
| @Override | |
| public <K, V> V get(ReadOnlySlice<K, V> slice, K key) { | |
| return null; | |
| } | |
| @NotNull | |
| @Override | |
| public <K, V> Collection<K> getKeys(WritableSlice<K, V> slice) { | |
| return Collections.emptyList(); | |
| } | |
| @NotNull | |
| @TestOnly | |
| @Override | |
| public <K, V> ImmutableMap<K, V> getSliceContents(@NotNull ReadOnlySlice<K, V> slice) { | |
| return ImmutableMap.of(); | |
| } | |
| @Nullable | |
| @Override | |
| public KotlinType getType(@NotNull KtExpression expression) { | |
| return null; | |
| } | |
| @Override | |
| public void addOwnDataTo(@NotNull BindingTrace trace, boolean commitDiagnostics) { | |
| // Do nothing | |
| } | |
| }; | |
| WritableSlice<KtAnnotationEntry, AnnotationDescriptor> ANNOTATION = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, CompileTimeConstant<?>> COMPILE_TIME_VALUE = new BasicWritableSlice<>(COMPILE_TIME_VALUE_REWRITE_POLICY); | |
| WritableSlice<KtTypeReference, KotlinType> TYPE = Slices.createSimpleSlice(); | |
| WritableSlice<KtTypeReference, KotlinType> ABBREVIATED_TYPE = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, KotlinTypeInfo> EXPRESSION_TYPE_INFO = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, DataFlowInfo> DATA_FLOW_INFO_BEFORE = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, KotlinType> EXPECTED_EXPRESSION_TYPE = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtElement, Computation> EXPRESSION_EFFECTS = Slices.createSimpleSlice(); | |
| WritableSlice<FunctionDescriptor, Functor> FUNCTOR = Slices.createSimpleSlice(); | |
| WritableSlice<KtFunction, KotlinType> EXPECTED_RETURN_TYPE = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, DataFlowInfo> DATAFLOW_INFO_AFTER_CONDITION = Slices.createSimpleSlice(); | |
| WritableSlice<VariableDescriptor, DataFlowValue> BOUND_INITIALIZER_VALUE = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, LeakingThisDescriptor> LEAKING_THIS = Slices.createSimpleSlice(); | |
| /** | |
| * A qualifier corresponds to a receiver expression (if any). For 'A.B' qualifier is recorded for 'A'. | |
| */ | |
| WritableSlice<KtExpression, Qualifier> QUALIFIER = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, DoubleColonLHS> DOUBLE_COLON_LHS = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtSuperExpression, KotlinType> THIS_TYPE_FOR_SUPER_EXPRESSION = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtReferenceExpression, DeclarationDescriptor> REFERENCE_TARGET = new BasicWritableSlice<>(DO_NOTHING); | |
| // if 'A' really means 'A.Companion' then this slice stores class descriptor for A, REFERENCE_TARGET stores descriptor Companion in this case | |
| WritableSlice<KtReferenceExpression, ClassifierDescriptorWithTypeParameters> SHORT_REFERENCE_TO_COMPANION_OBJECT = | |
| new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<Call, ResolvedCall<?>> RESOLVED_CALL = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<Call, PartialCallResolutionResult> ONLY_RESOLVED_CALL = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<Call, BasicCallResolutionContext> PARTIAL_CALL_RESOLUTION_CONTEXT = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, Call> DELEGATE_EXPRESSION_TO_PROVIDE_DELEGATE_CALL = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<Call, TailRecursionKind> TAIL_RECURSION_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtElement, ConstraintSystemCompleter> CONSTRAINT_SYSTEM_COMPLETER = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtElement, Call> CALL = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, Collection<? extends DeclarationDescriptor>> AMBIGUOUS_REFERENCE_TARGET = | |
| new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, ResolvedCall<FunctionDescriptor>> LOOP_RANGE_ITERATOR_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ResolvedCall<FunctionDescriptor>> LOOP_RANGE_HAS_NEXT_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ResolvedCall<FunctionDescriptor>> LOOP_RANGE_NEXT_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<Call, FunctionDescriptor> ENCLOSING_SUSPEND_FUNCTION_FOR_SUSPEND_FUNCTION_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<VariableAccessorDescriptor, ResolvedCall<FunctionDescriptor>> DELEGATED_PROPERTY_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<VariableAccessorDescriptor, Call> DELEGATED_PROPERTY_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<VariableDescriptorWithAccessors, ResolvedCall<FunctionDescriptor>> PROVIDE_DELEGATE_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<VariableDescriptorWithAccessors, Call> PROVIDE_DELEGATE_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtDestructuringDeclarationEntry, ResolvedCall<FunctionDescriptor>> COMPONENT_RESOLVED_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ResolvedCall<FunctionDescriptor>> INDEXED_LVALUE_GET = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ResolvedCall<FunctionDescriptor>> INDEXED_LVALUE_SET = Slices.createSimpleSlice(); | |
| WritableSlice<KtCollectionLiteralExpression, ResolvedCall<FunctionDescriptor>> COLLECTION_LITERAL_CALL = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ExplicitSmartCasts> SMARTCAST = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, Boolean> SMARTCAST_NULL = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, ImplicitSmartCasts> IMPLICIT_RECEIVER_SMARTCAST = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtWhenExpression, Boolean> EXHAUSTIVE_WHEN = Slices.createSimpleSlice(); | |
| WritableSlice<KtWhenExpression, Boolean> IMPLICIT_EXHAUSTIVE_WHEN = Slices.createSimpleSlice(); | |
| WritableSlice<KtElement, LexicalScope> LEXICAL_SCOPE = Slices.createSimpleSlice(); | |
| WritableSlice<ScriptDescriptor, LexicalScope> SCRIPT_SCOPE = Slices.createSimpleSlice(); | |
| WritableSlice<KtExpression, Boolean> VARIABLE_REASSIGNMENT = Slices.createSimpleSetSlice(); | |
| WritableSlice<ValueParameterDescriptor, Boolean> AUTO_CREATED_IT = Slices.createSimpleSetSlice(); | |
| /** | |
| * Has type of current expression has been already resolved | |
| */ | |
| WritableSlice<KtExpression, Boolean> PROCESSED = Slices.createSimpleSlice(); | |
| WritableSlice<KtElement, Boolean> USED_AS_EXPRESSION = Slices.createSimpleSetSlice(); | |
| WritableSlice<KtElement, Boolean> USED_AS_RESULT_OF_LAMBDA = Slices.createSimpleSetSlice(); | |
| WritableSlice<KtElement, Boolean> UNREACHABLE_CODE = Slices.createSimpleSetSlice(); | |
| WritableSlice<VariableDescriptor, CaptureKind> CAPTURED_IN_CLOSURE = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtDeclaration, PreliminaryDeclarationVisitor> PRELIMINARY_VISITOR = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<Box<DeferredType>, Boolean> DEFERRED_TYPE = Slices.createCollectiveSetSlice(); | |
| WritableSlice<PropertyDescriptor, Boolean> BACKING_FIELD_REQUIRED = new SetSlice<PropertyDescriptor>(DO_NOTHING) { | |
| @Override | |
| public Boolean computeValue( | |
| SlicedMap map, | |
| PropertyDescriptor propertyDescriptor, | |
| Boolean backingFieldRequired, | |
| boolean valueNotFound | |
| ) { | |
| if (propertyDescriptor.getKind() != CallableMemberDescriptor.Kind.DECLARATION) { | |
| return false; | |
| } | |
| backingFieldRequired = valueNotFound ? false : backingFieldRequired; | |
| PsiElement declarationPsiElement = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor); | |
| if (declarationPsiElement instanceof KtParameter) { | |
| KtParameter jetParameter = (KtParameter) declarationPsiElement; | |
| return jetParameter.hasValOrVar() || | |
| backingFieldRequired; // this part is unused because we do not allow access to constructor parameters in member bodies | |
| } | |
| if (propertyDescriptor.getModality() == Modality.ABSTRACT) return false; | |
| if (declarationPsiElement instanceof KtProperty && | |
| ((KtProperty) declarationPsiElement).hasDelegate()) return false; | |
| PropertyGetterDescriptor getter = propertyDescriptor.getGetter(); | |
| PropertySetterDescriptor setter = propertyDescriptor.getSetter(); | |
| if (getter == null) return true; | |
| if (propertyDescriptor.isVar() && setter == null) return true; | |
| if (setter != null && !DescriptorPsiUtilsKt.hasBody(setter) && setter.getModality() != Modality.ABSTRACT) return true; | |
| if (!DescriptorPsiUtilsKt.hasBody(getter) && getter.getModality() != Modality.ABSTRACT) return true; | |
| return backingFieldRequired; | |
| } | |
| }; | |
| WritableSlice<PropertyDescriptor, Boolean> IS_UNINITIALIZED = Slices.createSimpleSetSlice(); | |
| WritableSlice<PropertyDescriptor, Boolean> MUST_BE_LATEINIT = Slices.createSimpleSetSlice(); | |
| WritableSlice<KtLambdaExpression, InvocationKind> LAMBDA_INVOCATIONS = Slices.createSimpleSlice(); | |
| WritableSlice<KtLambdaExpression, Boolean> BLOCK = new SetSlice<KtLambdaExpression>(DO_NOTHING) { | |
| @Override | |
| public Boolean computeValue(SlicedMap map, KtLambdaExpression expression, Boolean isBlock, boolean valueNotFound) { | |
| isBlock = valueNotFound ? false : isBlock; | |
| return isBlock && !expression.getFunctionLiteral().hasParameterSpecification(); | |
| } | |
| }; | |
| WritableSlice<PsiElement, ClassDescriptor> CLASS = Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, ScriptDescriptor> SCRIPT = Slices.createSimpleSlice(); | |
| WritableSlice<KtTypeParameter, TypeParameterDescriptor> TYPE_PARAMETER = Slices.createSimpleSlice(); | |
| /** | |
| * @see BindingContextUtils#recordFunctionDeclarationToDescriptor(BindingTrace, PsiElement, SimpleFunctionDescriptor)} | |
| */ | |
| WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.createSimpleSlice(); | |
| WritableSlice<ConstructorDescriptor, ResolvedCall<ConstructorDescriptor>> CONSTRUCTOR_RESOLVED_DELEGATION_CALL = | |
| Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.createSimpleSlice(); | |
| WritableSlice<KtParameter, VariableDescriptor> VALUE_PARAMETER = Slices.createSimpleSlice(); | |
| WritableSlice<KtPropertyAccessor, PropertyAccessorDescriptor> PROPERTY_ACCESSOR = Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, PropertyDescriptor> PRIMARY_CONSTRUCTOR_PARAMETER = Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, TypeAliasDescriptor> TYPE_ALIAS = Slices.createSimpleSlice(); | |
| WritableSlice<PsiElement, Boolean> DEPRECATED_SHORT_NAME_ACCESS = Slices.createSimpleSlice(); | |
| WritableSlice[] DECLARATIONS_TO_DESCRIPTORS = new WritableSlice[] { | |
| CLASS, TYPE_PARAMETER, FUNCTION, CONSTRUCTOR, VARIABLE, VALUE_PARAMETER, PROPERTY_ACCESSOR, | |
| PRIMARY_CONSTRUCTOR_PARAMETER, SCRIPT, TYPE_ALIAS | |
| }; | |
| @SuppressWarnings("unchecked") | |
| ReadOnlySlice<PsiElement, DeclarationDescriptor> DECLARATION_TO_DESCRIPTOR = | |
| Slices.<PsiElement, DeclarationDescriptor>sliceBuilder() | |
| .setFurtherLookupSlices(DECLARATIONS_TO_DESCRIPTORS) | |
| .build(); | |
| WritableSlice<KtReferenceExpression, PsiElement> LABEL_TARGET = Slices.createSimpleSlice(); | |
| WritableSlice<KtReferenceExpression, Collection<? extends PsiElement>> AMBIGUOUS_LABEL_TARGET = Slices.createSimpleSlice(); | |
| WritableSlice<ValueParameterDescriptor, PropertyDescriptor> VALUE_PARAMETER_AS_PROPERTY = Slices.createSimpleSlice(); | |
| WritableSlice<ValueParameterDescriptor, FunctionDescriptor> DATA_CLASS_COMPONENT_FUNCTION = Slices.createSimpleSlice(); | |
| WritableSlice<ClassDescriptor, FunctionDescriptor> DATA_CLASS_COPY_FUNCTION = Slices.createSimpleSlice(); | |
| WritableSlice<FqNameUnsafe, ClassDescriptor> FQNAME_TO_CLASS_DESCRIPTOR = new BasicWritableSlice<>(DO_NOTHING, true); | |
| WritableSlice<FqName, Collection<KtFile>> PACKAGE_TO_FILES = Slices.createSimpleSlice(); | |
| WritableSlice<KtBinaryExpressionWithTypeRHS, Boolean> CAST_TYPE_USED_AS_EXPECTED_TYPE = Slices.createSimpleSlice(); | |
| WritableSlice<KtFunction, KotlinResolutionCallbacksImpl.LambdaInfo> NEW_INFERENCE_LAMBDA_INFO = new BasicWritableSlice<>(DO_NOTHING); | |
| WritableSlice<KtExpression, PrimitiveNumericComparisonInfo> PRIMITIVE_NUMERIC_COMPARISON_INFO = Slices.createSimpleSlice(); | |
| @SuppressWarnings("UnusedDeclaration") | |
| @Deprecated // This field is needed only for the side effects of its initializer | |
| Void _static_initializer = BasicWritableSlice.initSliceDebugNames(BindingContext.class); | |
| @NotNull | |
| Diagnostics getDiagnostics(); | |
| @Nullable | |
| <K, V> V get(ReadOnlySlice<K, V> slice, K key); | |
| // slice.isCollective() must be true | |
| @NotNull | |
| @ReadOnly | |
| <K, V> Collection<K> getKeys(WritableSlice<K, V> slice); | |
| /** This method should be used only for debug and testing */ | |
| @TestOnly | |
| @NotNull | |
| <K, V> ImmutableMap<K, V> getSliceContents(@NotNull ReadOnlySlice<K, V> slice); | |
| @Nullable | |
| KotlinType getType(@NotNull KtExpression expression); | |
| void addOwnDataTo(@NotNull BindingTrace trace, boolean commitDiagnostics); | |
| } |