KT-34740 Refactor implicitReceiversUtils.kt

This commit is contained in:
Roman Golyshev
2019-11-21 12:58:00 +03:00
committed by Roman Golyshev
parent 34b8b96cde
commit be2fe256ba
@@ -82,7 +82,7 @@ fun LexicalScope.getImplicitReceiversWithInstanceToExpression(
for ((index, receiver) in receivers.withIndex()) { for ((index, receiver) in receivers.withIndex()) {
val owner = receiver.containingDeclaration val owner = receiver.containingDeclaration
if (owner is ScriptDescriptor) { if (owner is ScriptDescriptor) {
result.put(receiver, null) result[receiver] = null
continue continue
} }
val (expressionText, isImmediateThis) = if (owner in outerDeclarationsWithInstance) { val (expressionText, isImmediateThis) = if (owner in outerDeclarationsWithInstance) {
@@ -91,11 +91,9 @@ fun LexicalScope.getImplicitReceiversWithInstanceToExpression(
(thisWithLabel ?: "this") to true (thisWithLabel ?: "this") to true
else else
thisWithLabel to false thisWithLabel to false
} } else if (owner is ClassDescriptor && owner.kind.isSingleton) {
else if (owner is ClassDescriptor && owner.kind.isSingleton) {
IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(owner) to false IdeDescriptorRenderers.SOURCE_CODE.renderClassifierName(owner) to false
} } else {
else {
continue continue
} }
val factory = if (expressionText != null) val factory = if (expressionText != null)
@@ -108,7 +106,7 @@ fun LexicalScope.getImplicitReceiversWithInstanceToExpression(
} }
else else
null null
result.put(receiver, factory) result[receiver] = factory
} }
return result return result
} }
@@ -123,15 +121,15 @@ private fun thisQualifierName(receiver: ReceiverParameterDescriptor): Name? {
} }
private fun List<ReceiverParameterDescriptor>.shadowedByDslMarkers(): Set<ReceiverParameterDescriptor> { private fun List<ReceiverParameterDescriptor>.shadowedByDslMarkers(): Set<ReceiverParameterDescriptor> {
val typesByDslScopes = LinkedHashMap<FqName, MutableList<ReceiverParameterDescriptor>>() val typesByDslScopes = mutableMapOf<FqName, MutableList<ReceiverParameterDescriptor>>()
this.mapNotNull { receiver -> for (receiver in this) {
val dslMarkers = DslMarkerUtils.extractDslMarkerFqNames(receiver.value).all() val dslMarkers = DslMarkerUtils.extractDslMarkerFqNames(receiver.value).all()
(receiver to dslMarkers).takeIf { dslMarkers.isNotEmpty() } for (marker in dslMarkers) {
}.forEach { (v, dslMarkers) -> dslMarkers.forEach { typesByDslScopes.getOrPut(it, { mutableListOf() }) += v } } typesByDslScopes.getOrPut(marker) { mutableListOf() } += receiver
}
}
val shadowedDslReceivers = mutableSetOf<ReceiverParameterDescriptor>() // for each DSL marker, all receivers except the closest one are shadowed by it; that is why we drop it
typesByDslScopes.flatMapTo(shadowedDslReceivers) { (_, v) -> v.asSequence().drop(1).asIterable() } return typesByDslScopes.values.flatMapTo(mutableSetOf()) { it.drop(1) }
return shadowedDslReceivers
} }