Take snapshot for LexicalWritableScope when subscopes created

This commit is contained in:
Stanislav Erokhin
2015-08-27 23:47:15 +03:00
parent 4c7bafce45
commit 2cb3842c39
5 changed files with 16 additions and 9 deletions
@@ -31,6 +31,7 @@ import org.jetbrains.kotlin.resolve.calls.context.ResolutionContext
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope
import org.jetbrains.kotlin.resolve.scopes.utils.asJetScope
import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
public fun JetReturnExpression.getTargetFunctionDescriptor(context: BindingContext): FunctionDescriptor? {
@@ -57,7 +58,7 @@ public fun JetExpression.isUsedAsStatement(context: BindingContext): Boolean = !
public fun <C : ResolutionContext<C>> ResolutionContext<C>.recordScopeAndDataFlowInfo(expression: JetExpression?) {
if (expression == null) return
val scopeToRecord = if (scope is LexicalWritableScope) scope.takeSnapshot() else scope
val scopeToRecord = scope.takeSnapshot()
trace.record(BindingContext.RESOLUTION_SCOPE, expression, scopeToRecord.asJetScope())
trace.record(BindingContext.LEXICAL_SCOPE, expression, scopeToRecord)
@@ -20,18 +20,20 @@ import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot
import org.jetbrains.kotlin.util.collectionUtils.getFirstMatch
import org.jetbrains.kotlin.util.collectionUtils.getFromAllScopes
import org.jetbrains.kotlin.utils.Printer
public class LexicalChainedScope(
override val parent: LexicalScope,
parent: LexicalScope,
override val ownerDescriptor: DeclarationDescriptor,
override val isOwnerDescriptorAccessibleByLabel: Boolean,
override val implicitReceiver: ReceiverParameterDescriptor?,
private val debugName: String,
vararg memberScopes: JetScope // todo JetScope -> MemberScope
): LexicalScope {
override val parent = parent.takeSnapshot()
private val scopeChain = memberScopes.clone()
override fun getDeclaredDescriptors() = getFromAllScopes(scopeChain) { it.getAllDescriptors() }
@@ -20,10 +20,11 @@ import com.intellij.util.SmartList
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot
import org.jetbrains.kotlin.utils.Printer
public class LexicalScopeImpl jvmOverloads constructor(
override val parent: LexicalScope,
parent: LexicalScope,
override val ownerDescriptor: DeclarationDescriptor,
override val isOwnerDescriptorAccessibleByLabel: Boolean,
override val implicitReceiver: ReceiverParameterDescriptor?,
@@ -31,6 +32,7 @@ public class LexicalScopeImpl jvmOverloads constructor(
redeclarationHandler: RedeclarationHandler = RedeclarationHandler.DO_NOTHING,
initialize: LexicalScopeImpl.InitializeHandler.() -> Unit = {}
): LexicalScope, WritableScopeStorage {
override val parent = parent.takeSnapshot()
override val addedDescriptors: MutableList<DeclarationDescriptor> = SmartList()
override val redeclarationHandler: RedeclarationHandler
get() = RedeclarationHandler.DO_NOTHING
@@ -20,16 +20,18 @@ import com.intellij.util.SmartList
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot
import org.jetbrains.kotlin.utils.Printer
class LexicalWritableScope(
override val parent: LexicalScope,
parent: LexicalScope,
override val ownerDescriptor: DeclarationDescriptor,
override val isOwnerDescriptorAccessibleByLabel: Boolean,
override val implicitReceiver: ReceiverParameterDescriptor?,
override val redeclarationHandler: RedeclarationHandler,
private val debugName: String
) : LexicalScope, WritableScopeStorage {
override val parent = parent.takeSnapshot()
override val addedDescriptors: MutableList<DeclarationDescriptor> = SmartList()
override var functionsByName: MutableMap<Name, WritableScopeStorage.IntList>? = null
@@ -21,10 +21,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.FileScope
import org.jetbrains.kotlin.resolve.scopes.JetScope
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.*
import org.jetbrains.kotlin.types.JetType
import org.jetbrains.kotlin.util.collectionUtils.concat
import org.jetbrains.kotlin.utils.Printer
@@ -109,6 +106,8 @@ public fun LexicalScope.getClassifier(name: Name, location: LookupLocation): Cla
return null
}
public fun LexicalScope.takeSnapshot(): LexicalScope = if (this is LexicalWritableScope) takeSnapshot() else this
public fun LexicalScope.asJetScope(): JetScope {
if (this is JetScope) return this
if (this is MemberScopeToFileScopeAdapter) return this.memberScope
@@ -126,7 +125,8 @@ public fun JetScope.asLexicalScope(): LexicalScope
memberScopeAsFileScope()
}
private class LexicalToJetScopeAdapter(val lexicalScope: LexicalScope): JetScope {
private class LexicalToJetScopeAdapter(lexicalScope: LexicalScope): JetScope {
val lexicalScope = lexicalScope.takeSnapshot()
override fun getClassifier(name: Name, location: LookupLocation) = lexicalScope.getClassifier(name, location)