[PSI, FE] Review fixes
This commit is contained in:
committed by
TeamCityServer
parent
f427265739
commit
af78ec7371
@@ -48,7 +48,6 @@ import org.jetbrains.kotlin.util.slicedMap.*;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static org.jetbrains.kotlin.util.slicedMap.RewritePolicy.DO_NOTHING;
|
import static org.jetbrains.kotlin.util.slicedMap.RewritePolicy.DO_NOTHING;
|
||||||
@@ -264,7 +263,7 @@ public interface BindingContext {
|
|||||||
.setFurtherLookupSlices(DECLARATIONS_TO_DESCRIPTORS)
|
.setFurtherLookupSlices(DECLARATIONS_TO_DESCRIPTORS)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
WritableSlice<DeclarationDescriptor, LinkedHashMap<ReceiverParameterDescriptor, String>> DESCRIPTOR_TO_NAMED_RECEIVERS = Slices.createSimpleSlice();
|
WritableSlice<DeclarationDescriptor, Map<ReceiverParameterDescriptor, String>> DESCRIPTOR_TO_NAMED_RECEIVERS = Slices.createSimpleSlice();
|
||||||
WritableSlice<KtReferenceExpression, PsiElement> LABEL_TARGET = Slices.createSimpleSlice();
|
WritableSlice<KtReferenceExpression, PsiElement> LABEL_TARGET = Slices.createSimpleSlice();
|
||||||
WritableSlice<KtReferenceExpression, Collection<? extends PsiElement>> AMBIGUOUS_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, PropertyDescriptor> VALUE_PARAMETER_AS_PROPERTY = Slices.createSimpleSlice();
|
||||||
|
|||||||
+27
-11
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
|||||||
import org.jetbrains.kotlin.resolve.calls.util.isSafeCall
|
import org.jetbrains.kotlin.resolve.calls.util.isSafeCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue.Kind.OTHER
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue.Kind.OTHER
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue.Kind.STABLE_VALUE
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValue.Kind.STABLE_VALUE
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver
|
||||||
@@ -180,7 +181,12 @@ internal fun getIdForStableIdentifier(
|
|||||||
|
|
||||||
is KtThisExpression -> {
|
is KtThisExpression -> {
|
||||||
val declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.instanceReference)
|
val declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.instanceReference)
|
||||||
getIdForThisReceiver(declarationDescriptor, bindingContext, expression.getLabelName())
|
val labelName = expression.getLabelName()
|
||||||
|
if (labelName == null) {
|
||||||
|
getIdForThisReceiver(declarationDescriptor)
|
||||||
|
} else {
|
||||||
|
getIdForThisReceiver(declarationDescriptor, bindingContext, labelName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
is KtPostfixExpression -> {
|
is KtPostfixExpression -> {
|
||||||
@@ -229,7 +235,7 @@ private fun getIdForSimpleNameExpression(
|
|||||||
if (implicitReceiver == null) {
|
if (implicitReceiver == null) {
|
||||||
selectorInfo
|
selectorInfo
|
||||||
} else {
|
} else {
|
||||||
val receiverInfo = getIdForImplicitReceiver(implicitReceiver, simpleNameExpression, bindingContext)
|
val receiverInfo = getIdForImplicitReceiver(implicitReceiver, simpleNameExpression)
|
||||||
|
|
||||||
if (receiverInfo == null) {
|
if (receiverInfo == null) {
|
||||||
selectorInfo
|
selectorInfo
|
||||||
@@ -255,9 +261,11 @@ private fun getIdForSimpleNameExpression(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIdForImplicitReceiver(receiverValue: ReceiverValue?, expression: KtExpression?, bindingContext: BindingContext) =
|
private fun getIdForImplicitReceiver(receiverValue: ReceiverValue?, expression: KtExpression?) =
|
||||||
when (receiverValue) {
|
when (receiverValue) {
|
||||||
is ImplicitReceiver -> getIdForThisReceiver(receiverValue.declarationDescriptor, bindingContext)
|
is ContextReceiver -> IdentifierInfo.Receiver(receiverValue)
|
||||||
|
|
||||||
|
is ImplicitReceiver -> getIdForThisReceiver(receiverValue.declarationDescriptor)
|
||||||
|
|
||||||
is TransientReceiver ->
|
is TransientReceiver ->
|
||||||
throw AssertionError("Transient receiver is implicit for an explicit expression: $expression. Receiver: $receiverValue")
|
throw AssertionError("Transient receiver is implicit for an explicit expression: $expression. Receiver: $receiverValue")
|
||||||
@@ -265,16 +273,24 @@ private fun getIdForImplicitReceiver(receiverValue: ReceiverValue?, expression:
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getIdForThisReceiver(
|
private fun getIdForThisReceiver(descriptorOfThisReceiver: DeclarationDescriptor?) = when (descriptorOfThisReceiver) {
|
||||||
descriptorOfThisReceiver: DeclarationDescriptor?,
|
is CallableDescriptor -> {
|
||||||
bindingContext: BindingContext,
|
val receiverParameter = descriptorOfThisReceiver.extensionReceiverParameter
|
||||||
labelName: String? = null
|
?: error("'This' refers to the callable member without a receiver parameter: $descriptorOfThisReceiver")
|
||||||
) =
|
IdentifierInfo.Receiver(receiverParameter.value)
|
||||||
|
}
|
||||||
|
|
||||||
|
is ClassDescriptor -> IdentifierInfo.Receiver(descriptorOfThisReceiver.thisAsReceiverParameter.value)
|
||||||
|
|
||||||
|
else -> IdentifierInfo.NO
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun getIdForThisReceiver(descriptorOfThisReceiver: DeclarationDescriptor?, bindingContext: BindingContext, labelName: String) =
|
||||||
when (descriptorOfThisReceiver) {
|
when (descriptorOfThisReceiver) {
|
||||||
is CallableDescriptor -> {
|
is CallableDescriptor -> {
|
||||||
val receiverParameter = findReceiverByLabelOrGetDefault(
|
val receiverParameter = findReceiverByLabelOrGetDefault(
|
||||||
descriptorOfThisReceiver,
|
descriptorOfThisReceiver,
|
||||||
descriptorOfThisReceiver.extensionReceiverParameter ?: descriptorOfThisReceiver.contextReceiverParameters.firstOrNull(),
|
descriptorOfThisReceiver.extensionReceiverParameter,
|
||||||
bindingContext,
|
bindingContext,
|
||||||
labelName
|
labelName
|
||||||
)
|
)
|
||||||
@@ -298,7 +314,7 @@ private fun findReceiverByLabelOrGetDefault(
|
|||||||
descriptorOfThisReceiver: DeclarationDescriptor,
|
descriptorOfThisReceiver: DeclarationDescriptor,
|
||||||
default: ReceiverParameterDescriptor?,
|
default: ReceiverParameterDescriptor?,
|
||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
labelName: String? = null
|
labelName: String
|
||||||
): ReceiverParameterDescriptor {
|
): ReceiverParameterDescriptor {
|
||||||
val receiverToLabelMap = bindingContext.get(
|
val receiverToLabelMap = bindingContext.get(
|
||||||
BindingContext.DESCRIPTOR_TO_NAMED_RECEIVERS,
|
BindingContext.DESCRIPTOR_TO_NAMED_RECEIVERS,
|
||||||
|
|||||||
+2
-2
@@ -40,7 +40,7 @@ import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProv
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum;
|
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionClassReceiver;
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ContextClassReceiver;
|
||||||
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
|
||||||
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
|
import org.jetbrains.kotlin.storage.MemoizedFunctionToNotNull;
|
||||||
import org.jetbrains.kotlin.storage.NotNullLazyValue;
|
import org.jetbrains.kotlin.storage.NotNullLazyValue;
|
||||||
@@ -313,7 +313,7 @@ public class LazyClassDescriptor extends ClassDescriptorBase implements ClassDes
|
|||||||
c.getTypeResolver().resolveType(getScopeForClassHeaderResolution(), typeReference, c.getTrace(), true);
|
c.getTypeResolver().resolveType(getScopeForClassHeaderResolution(), typeReference, c.getTrace(), true);
|
||||||
return new ReceiverParameterDescriptorImpl(
|
return new ReceiverParameterDescriptorImpl(
|
||||||
this,
|
this,
|
||||||
new ExtensionClassReceiver(this, kotlinType, null),
|
new ContextClassReceiver(this, kotlinType, null),
|
||||||
Annotations.Companion.getEMPTY()
|
Annotations.Companion.getEMPTY()
|
||||||
);
|
);
|
||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
|
|||||||
+2
-2
@@ -93,7 +93,7 @@ fun StatementGenerator.generateReceiver(defaultStartOffset: Int, defaultEndOffse
|
|||||||
context.symbolTable.referenceValueParameter(receiverClassDescriptor.thisAsReceiverParameter)
|
context.symbolTable.referenceValueParameter(receiverClassDescriptor.thisAsReceiverParameter)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
is ExtensionClassReceiver -> {
|
is ContextClassReceiver -> {
|
||||||
val receiverClassDescriptor = receiver.classDescriptor
|
val receiverClassDescriptor = receiver.classDescriptor
|
||||||
val thisAsReceiverParameter = receiverClassDescriptor.thisAsReceiverParameter
|
val thisAsReceiverParameter = receiverClassDescriptor.thisAsReceiverParameter
|
||||||
val thisReceiver = IrGetValueImpl(
|
val thisReceiver = IrGetValueImpl(
|
||||||
@@ -226,7 +226,7 @@ fun StatementGenerator.generateCallReceiver(
|
|||||||
dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
|
dispatchReceiverValue = generateReceiverOrNull(ktDefaultElement, dispatchReceiver)
|
||||||
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
|
extensionReceiverValue = generateReceiverOrNull(ktDefaultElement, extensionReceiver)
|
||||||
contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull {
|
contextReceiverValues = if (ktDefaultElement is KtConstructorDelegationCall) contextReceivers.mapNotNull {
|
||||||
generateReceiverOrNull(ktDefaultElement, it as ExtensionClassReceiver)
|
generateReceiverOrNull(ktDefaultElement, it as ContextClassReceiver)
|
||||||
}
|
}
|
||||||
else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
|
else contextReceivers.mapNotNull { generateReceiverOrNull(ktDefaultElement, it) }
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -426,7 +426,7 @@ class StatementGenerator(
|
|||||||
val receivers = listOfNotNull(referenceTarget.extensionReceiverParameter) + referenceTarget.contextReceiverParameters
|
val receivers = listOfNotNull(referenceTarget.extensionReceiverParameter) + referenceTarget.contextReceiverParameters
|
||||||
val receiver = receivers.find {
|
val receiver = receivers.find {
|
||||||
it == resolvedCall?.candidateDescriptor
|
it == resolvedCall?.candidateDescriptor
|
||||||
} ?: referenceTarget.extensionReceiverParameter ?: TODO("No receiver: $referenceTarget")
|
} ?: referenceTarget.extensionReceiverParameter ?: error("No receiver: $referenceTarget")
|
||||||
val receiverType = receiver.type.toIrType()
|
val receiverType = receiver.type.toIrType()
|
||||||
IrGetValueImpl(
|
IrGetValueImpl(
|
||||||
startOffset, endOffset,
|
startOffset, endOffset,
|
||||||
|
|||||||
@@ -618,7 +618,7 @@ public class KotlinParsing extends AbstractKotlinParsing {
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* contextReceiverList
|
* contextReceiverList
|
||||||
* : "context" "(" (label? typeReference{","})+ ")"
|
* : "context" "(" (contextReceiver{","})+ ")"
|
||||||
*/
|
*/
|
||||||
public void parseContextReceiverList() {
|
public void parseContextReceiverList() {
|
||||||
assert _at(CONTEXT_KEYWORD);
|
assert _at(CONTEXT_KEYWORD);
|
||||||
|
|||||||
@@ -183,37 +183,6 @@ public class KtNamedFunction extends KtTypeParameterListOwnerStub<KotlinFunction
|
|||||||
return getReceiverTypeRefByTree();
|
return getReceiverTypeRefByTree();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
@Override
|
|
||||||
public List<KtContextReceiver> getContextReceivers() {
|
|
||||||
KotlinFunctionStub stub = getStub();
|
|
||||||
if (stub != null) {
|
|
||||||
List<KtContextReceiverList> childContextReceivers = getStubOrPsiChildrenAsList(KtStubElementTypes.CONTEXT_RECEIVER_LIST);
|
|
||||||
if (!childContextReceivers.isEmpty()) {
|
|
||||||
return childContextReceivers.get(0).contextReceivers();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return getContextReceiverTypeRefsByTree();
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
private List<KtContextReceiver> getContextReceiverTypeRefsByTree() {
|
|
||||||
PsiElement child = getFirstChild();
|
|
||||||
while (child != null) {
|
|
||||||
IElementType tt = child.getNode().getElementType();
|
|
||||||
if (tt == KtTokens.LPAR || tt == KtTokens.COLON) break;
|
|
||||||
if (child instanceof KtContextReceiverList) {
|
|
||||||
return ((KtContextReceiverList) child).contextReceivers();
|
|
||||||
}
|
|
||||||
child = child.getNextSibling();
|
|
||||||
}
|
|
||||||
|
|
||||||
return Collections.emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private KtTypeReference getReceiverTypeRefByTree() {
|
private KtTypeReference getReceiverTypeRefByTree() {
|
||||||
PsiElement child = getFirstChild();
|
PsiElement child = getFirstChild();
|
||||||
@@ -229,6 +198,18 @@ public class KtNamedFunction extends KtTypeParameterListOwnerStub<KotlinFunction
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public List<KtContextReceiver> getContextReceivers() {
|
||||||
|
KtContextReceiverList list = getContextReceiverList();
|
||||||
|
return list != null ? list.contextReceivers() : Collections.emptyList();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private KtContextReceiverList getContextReceiverList() {
|
||||||
|
return getStubOrPsiChild(KtStubElementTypes.CONTEXT_RECEIVER_LIST);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public KtTypeReference getTypeReference() {
|
public KtTypeReference getTypeReference() {
|
||||||
|
|||||||
+18
-17
@@ -804,6 +804,24 @@ internal object ErrorDescriptorResolutionPart : ResolutionPart() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
internal object CheckContextReceiversResolutionPart : ResolutionPart() {
|
internal object CheckContextReceiversResolutionPart : ResolutionPart() {
|
||||||
|
override fun ResolutionCandidate.process(workIndex: Int) {
|
||||||
|
val parentLexicalScopes = scopeTower.lexicalScope.parentsWithSelf.filterIsInstance<LexicalScope>()
|
||||||
|
val implicitReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
||||||
|
for (scope in parentLexicalScopes) {
|
||||||
|
scopeTower.getImplicitReceiver(scope)?.let { implicitReceiversGroups.add(listOf(it)) }
|
||||||
|
val contextReceiversGroup = scopeTower.getContextReceivers(scope)
|
||||||
|
if (contextReceiversGroup.isNotEmpty()) {
|
||||||
|
implicitReceiversGroups.add(contextReceiversGroup)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val contextReceiversArguments = mutableListOf<SimpleKotlinCallArgument>()
|
||||||
|
for (candidateContextReceiverParameter in candidateDescriptor.contextReceiverParameters) {
|
||||||
|
val contextReceiverArgument = findContextReceiver(implicitReceiversGroups, candidateContextReceiverParameter) ?: return
|
||||||
|
contextReceiversArguments.add(contextReceiverArgument)
|
||||||
|
}
|
||||||
|
resolvedCall.contextReceiversArguments = contextReceiversArguments
|
||||||
|
}
|
||||||
|
|
||||||
private data class ApplicableArgumentWithConstraint(
|
private data class ApplicableArgumentWithConstraint(
|
||||||
val argument: SimpleKotlinCallArgument,
|
val argument: SimpleKotlinCallArgument,
|
||||||
val argumentType: UnwrappedType,
|
val argumentType: UnwrappedType,
|
||||||
@@ -844,21 +862,4 @@ internal object CheckContextReceiversResolutionPart : ResolutionPart() {
|
|||||||
diagnosticsFromResolutionParts.add(NoContextReceiver(candidateContextReceiverParameter))
|
diagnosticsFromResolutionParts.add(NoContextReceiver(candidateContextReceiverParameter))
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun ResolutionCandidate.process(workIndex: Int) {
|
|
||||||
val parentLexicalScopes = scopeTower.lexicalScope.parentsWithSelf.filterIsInstance<LexicalScope>()
|
|
||||||
val implicitReceiversGroups = mutableListOf<List<ReceiverValueWithSmartCastInfo>>()
|
|
||||||
for (scope in parentLexicalScopes) {
|
|
||||||
scopeTower.getImplicitReceiver(scope)?.let { implicitReceiversGroups.add(listOf(it)) }
|
|
||||||
val contextReceiversGroup = scopeTower.getContextReceivers(scope)
|
|
||||||
if (contextReceiversGroup.isNotEmpty()) {
|
|
||||||
implicitReceiversGroups.add(contextReceiversGroup)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val contextReceiversArguments = mutableListOf<SimpleKotlinCallArgument>()
|
|
||||||
for (candidateContextReceiverParameter in candidateDescriptor.contextReceiverParameters) {
|
|
||||||
contextReceiversArguments.add(findContextReceiver(implicitReceiversGroups, candidateContextReceiverParameter) ?: return)
|
|
||||||
}
|
|
||||||
resolvedCall.contextReceiversArguments = contextReceiversArguments
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
+3
-3
@@ -9,7 +9,7 @@ import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class ExtensionClassReceiver(
|
class ContextClassReceiver(
|
||||||
val classDescriptor: ClassDescriptor,
|
val classDescriptor: ClassDescriptor,
|
||||||
receiverType: KotlinType,
|
receiverType: KotlinType,
|
||||||
original: ReceiverValue?
|
original: ReceiverValue?
|
||||||
@@ -17,7 +17,7 @@ class ExtensionClassReceiver(
|
|||||||
override val declarationDescriptor: DeclarationDescriptor
|
override val declarationDescriptor: DeclarationDescriptor
|
||||||
get() = classDescriptor
|
get() = classDescriptor
|
||||||
|
|
||||||
override fun replaceType(newType: KotlinType): ReceiverValue = ExtensionClassReceiver(classDescriptor, newType, original)
|
override fun replaceType(newType: KotlinType): ReceiverValue = ContextClassReceiver(classDescriptor, newType, original)
|
||||||
|
|
||||||
override fun toString(): String = "$type: Ext { $classDescriptor }"
|
override fun toString(): String = "$type: Ctx { $classDescriptor }"
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user