[FE] Add context receivers to scope
This commit is contained in:
committed by
TeamCityServer
parent
c5687e080d
commit
d923c95671
+1
-1
@@ -37,7 +37,7 @@ import org.jetbrains.kotlin.types.TypeApproximator
|
||||
interface ImplicitScopeTower {
|
||||
val lexicalScope: LexicalScope
|
||||
|
||||
fun getImplicitReceiver(scope: LexicalScope): ReceiverValueWithSmartCastInfo?
|
||||
fun getImplicitReceivers(scope: LexicalScope): List<ReceiverValueWithSmartCastInfo>
|
||||
|
||||
fun getNameForGivenImportAlias(name: Name): Name?
|
||||
|
||||
|
||||
@@ -144,7 +144,7 @@ class TowerResolver {
|
||||
)
|
||||
}
|
||||
|
||||
getImplicitReceiver(scope)?.let {
|
||||
getImplicitReceivers(scope).forEach {
|
||||
addLevel(
|
||||
MemberScopeTowerLevel(this@createNonLocalLevels, it),
|
||||
it.mayFitForName(name)
|
||||
@@ -197,9 +197,9 @@ class TowerResolver {
|
||||
.process(scope.mayFitForName(name))?.let { return it }
|
||||
}
|
||||
|
||||
implicitScopeTower.getImplicitReceiver(scope)
|
||||
?.let { processImplicitReceiver(it, resolveExtensionsForImplicitReceiver) }
|
||||
?.let { return it }
|
||||
implicitScopeTower.getImplicitReceivers(scope).forEach { rv ->
|
||||
processImplicitReceiver(rv, resolveExtensionsForImplicitReceiver)?.let { return it }
|
||||
}
|
||||
} else {
|
||||
TowerData.TowerLevel(ImportingScopeBasedTowerLevel(implicitScopeTower, scope as ImportingScope))
|
||||
.process(scope.mayFitForName(name))?.let { return it }
|
||||
|
||||
@@ -32,7 +32,7 @@ class LexicalChainedScope private constructor(
|
||||
parent: LexicalScope,
|
||||
override val ownerDescriptor: DeclarationDescriptor,
|
||||
override val isOwnerDescriptorAccessibleByLabel: Boolean,
|
||||
override val implicitReceiver: ReceiverParameterDescriptor?,
|
||||
override val implicitReceivers: List<ReceiverParameterDescriptor>,
|
||||
override val kind: LexicalScopeKind,
|
||||
// NB. Here can be very special subtypes of MemberScope (e.g., DeprecatedMemberScope).
|
||||
// Please, do not leak them outside of LexicalChainedScope, because other parts of compiler are not ready to work with them
|
||||
@@ -74,8 +74,14 @@ class LexicalChainedScope private constructor(
|
||||
|
||||
override fun printStructure(p: Printer) {
|
||||
p.println(
|
||||
this::class.java.simpleName, ": ", kind, "; for descriptor: ", ownerDescriptor.name,
|
||||
" with implicitReceiver: ", implicitReceiver?.value ?: "NONE", " {"
|
||||
this::class.java.simpleName,
|
||||
": ",
|
||||
kind,
|
||||
"; for descriptor: ",
|
||||
ownerDescriptor.name,
|
||||
" with implicitReceiver: ",
|
||||
if (implicitReceivers.isEmpty()) "NONE" else implicitReceivers.joinToString { it.value.toString() },
|
||||
" {"
|
||||
)
|
||||
p.pushIndent()
|
||||
|
||||
@@ -105,13 +111,13 @@ class LexicalChainedScope private constructor(
|
||||
parent: LexicalScope,
|
||||
ownerDescriptor: DeclarationDescriptor,
|
||||
isOwnerDescriptorAccessibleByLabel: Boolean,
|
||||
implicitReceiver: ReceiverParameterDescriptor?,
|
||||
implicitReceivers: List<ReceiverParameterDescriptor>,
|
||||
kind: LexicalScopeKind,
|
||||
vararg memberScopes: MemberScope?,
|
||||
isStaticScope: Boolean = false
|
||||
): LexicalScope =
|
||||
LexicalChainedScope(
|
||||
parent, ownerDescriptor, isOwnerDescriptorAccessibleByLabel, implicitReceiver, kind,
|
||||
parent, ownerDescriptor, isOwnerDescriptorAccessibleByLabel, implicitReceivers, kind,
|
||||
listOfNonEmptyScopes(*memberScopes).toTypedArray(),
|
||||
isStaticScope
|
||||
)
|
||||
|
||||
@@ -23,7 +23,7 @@ class LexicalScopeImpl @JvmOverloads constructor(
|
||||
parent: HierarchicalScope,
|
||||
override val ownerDescriptor: DeclarationDescriptor,
|
||||
override val isOwnerDescriptorAccessibleByLabel: Boolean,
|
||||
override val implicitReceiver: ReceiverParameterDescriptor?,
|
||||
override val implicitReceivers: List<ReceiverParameterDescriptor>,
|
||||
override val kind: LexicalScopeKind,
|
||||
redeclarationChecker: LocalRedeclarationChecker = LocalRedeclarationChecker.DO_NOTHING,
|
||||
initialize: LexicalScopeImpl.InitializeHandler.() -> Unit = {}
|
||||
@@ -37,8 +37,14 @@ class LexicalScopeImpl @JvmOverloads constructor(
|
||||
|
||||
override fun printStructure(p: Printer) {
|
||||
p.println(
|
||||
this::class.java.simpleName, ": ", kind, "; for descriptor: ", ownerDescriptor.name,
|
||||
" with implicitReceiver: ", implicitReceiver?.value ?: "NONE", " {"
|
||||
this::class.java.simpleName,
|
||||
": ",
|
||||
kind,
|
||||
"; for descriptor: ",
|
||||
ownerDescriptor.name,
|
||||
" with implicitReceiver: ",
|
||||
if (implicitReceivers.isEmpty()) "NONE" else implicitReceivers.joinToString { it.value.toString() },
|
||||
" {"
|
||||
)
|
||||
p.pushIndent()
|
||||
|
||||
|
||||
+10
-4
@@ -30,8 +30,8 @@ class LexicalWritableScope(
|
||||
override val kind: LexicalScopeKind
|
||||
) : LexicalScopeStorage(parent, redeclarationChecker) {
|
||||
|
||||
override val implicitReceiver: ReceiverParameterDescriptor?
|
||||
get() = null
|
||||
override val implicitReceivers: List<ReceiverParameterDescriptor>
|
||||
get() = emptyList()
|
||||
|
||||
private var canWrite: Boolean = true
|
||||
private var lastSnapshot: Snapshot? = null
|
||||
@@ -105,8 +105,14 @@ class LexicalWritableScope(
|
||||
|
||||
override fun printStructure(p: Printer) {
|
||||
p.println(
|
||||
this::class.java.simpleName, ": ", kind, "; for descriptor: ", ownerDescriptor.name,
|
||||
" with implicitReceiver: ", implicitReceiver?.value ?: "NONE", " {"
|
||||
this::class.java.simpleName,
|
||||
": ",
|
||||
kind,
|
||||
"; for descriptor: ",
|
||||
ownerDescriptor.name,
|
||||
" with implicitReceivers: ",
|
||||
if (implicitReceivers.isEmpty()) "NONE" else implicitReceivers.joinToString { it.value.toString() },
|
||||
" {"
|
||||
)
|
||||
p.pushIndent()
|
||||
|
||||
|
||||
@@ -20,10 +20,15 @@ import kotlin.Unit;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor;
|
||||
import org.jetbrains.kotlin.descriptors.VariableDescriptorWithAccessors;
|
||||
import org.jetbrains.kotlin.utils.Printer;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
public final class ScopeUtils {
|
||||
private ScopeUtils() {}
|
||||
|
||||
@@ -31,7 +36,7 @@ public final class ScopeUtils {
|
||||
@NotNull LexicalScope parent,
|
||||
@NotNull PropertyDescriptor propertyDescriptor
|
||||
) {
|
||||
return new LexicalScopeImpl(parent, propertyDescriptor, false, null, LexicalScopeKind.PROPERTY_HEADER,
|
||||
return new LexicalScopeImpl(parent, propertyDescriptor, false, Collections.emptyList(), LexicalScopeKind.PROPERTY_HEADER,
|
||||
// redeclaration on type parameters should be reported early, see: DescriptorResolver.resolvePropertyDescriptor()
|
||||
LocalRedeclarationChecker.DO_NOTHING.INSTANCE,
|
||||
handler -> {
|
||||
@@ -47,7 +52,7 @@ public final class ScopeUtils {
|
||||
@NotNull LexicalScope propertyHeader,
|
||||
@NotNull PropertyDescriptor propertyDescriptor
|
||||
) {
|
||||
return new LexicalScopeImpl(propertyHeader, propertyDescriptor, false, null, LexicalScopeKind.PROPERTY_INITIALIZER_OR_DELEGATE);
|
||||
return new LexicalScopeImpl(propertyHeader, propertyDescriptor, false, Collections.emptyList(), LexicalScopeKind.PROPERTY_INITIALIZER_OR_DELEGATE);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@@ -55,8 +60,13 @@ public final class ScopeUtils {
|
||||
@NotNull LexicalScope parent,
|
||||
@NotNull VariableDescriptorWithAccessors variableDescriptor
|
||||
) {
|
||||
List<ReceiverParameterDescriptor> implicitReceivers = new ArrayList<>();
|
||||
ReceiverParameterDescriptor extensionReceiverParameter = variableDescriptor.getExtensionReceiverParameter();
|
||||
if (extensionReceiverParameter != null) {
|
||||
implicitReceivers.add(extensionReceiverParameter);
|
||||
}
|
||||
// todo: very strange scope!
|
||||
return new LexicalScopeImpl(parent, variableDescriptor, true, variableDescriptor.getExtensionReceiverParameter(),
|
||||
return new LexicalScopeImpl(parent, variableDescriptor, true, implicitReceivers,
|
||||
LexicalScopeKind.PROPERTY_DELEGATE_METHOD
|
||||
);
|
||||
}
|
||||
|
||||
@@ -36,7 +36,7 @@ interface LexicalScope : HierarchicalScope {
|
||||
val ownerDescriptor: DeclarationDescriptor
|
||||
val isOwnerDescriptorAccessibleByLabel: Boolean
|
||||
|
||||
val implicitReceiver: ReceiverParameterDescriptor?
|
||||
val implicitReceivers: List<ReceiverParameterDescriptor>
|
||||
|
||||
val kind: LexicalScopeKind
|
||||
|
||||
@@ -50,8 +50,8 @@ interface LexicalScope : HierarchicalScope {
|
||||
override val isOwnerDescriptorAccessibleByLabel: Boolean
|
||||
get() = false
|
||||
|
||||
override val implicitReceiver: ReceiverParameterDescriptor?
|
||||
get() = null
|
||||
override val implicitReceivers: List<ReceiverParameterDescriptor>
|
||||
get() = emptyList()
|
||||
|
||||
override val kind: LexicalScopeKind
|
||||
get() = LexicalScopeKind.EMPTY
|
||||
|
||||
@@ -36,8 +36,8 @@ val HierarchicalScope.parents: Sequence<HierarchicalScope>
|
||||
* Adds receivers to the list in order of locality, so that the closest (the most local) receiver goes first
|
||||
*/
|
||||
fun LexicalScope.getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = collectFromMeAndParent {
|
||||
(it as? LexicalScope)?.implicitReceiver
|
||||
}
|
||||
(it as? LexicalScope)?.implicitReceivers
|
||||
}.flatten()
|
||||
|
||||
fun LexicalScope.getDeclarationsByLabel(labelName: Name): Collection<DeclarationDescriptor> = collectAllFromMeAndParent {
|
||||
if (it is LexicalScope && it.isOwnerDescriptorAccessibleByLabel && it.ownerDescriptor.name == labelName) {
|
||||
@@ -261,7 +261,7 @@ fun LexicalScope.replaceImportingScopes(importingScopeChain: ImportingScope?): L
|
||||
fun LexicalScope.createScopeForDestructuring(newReceiver: ReceiverParameterDescriptor?): LexicalScope {
|
||||
return LexicalScopeImpl(
|
||||
parent, ownerDescriptor, isOwnerDescriptorAccessibleByLabel,
|
||||
newReceiver,
|
||||
listOfNotNull(newReceiver),
|
||||
LexicalScopeKind.FUNCTION_HEADER_FOR_DESTRUCTURING
|
||||
)
|
||||
}
|
||||
@@ -324,7 +324,7 @@ class ErrorLexicalScope : LexicalScope {
|
||||
|
||||
override val ownerDescriptor: DeclarationDescriptor = ErrorUtils.createErrorClass("<ERROR CLASS FOR ERROR SCOPE>")
|
||||
override val isOwnerDescriptorAccessibleByLabel: Boolean = false
|
||||
override val implicitReceiver: ReceiverParameterDescriptor? = null
|
||||
override val implicitReceivers: List<ReceiverParameterDescriptor> = emptyList()
|
||||
override val kind: LexicalScopeKind = LexicalScopeKind.THROWING
|
||||
|
||||
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? = null
|
||||
|
||||
Reference in New Issue
Block a user