From 310c68f633336a211ad627ac081d038c5aebf30e Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Wed, 24 Feb 2016 21:40:30 +0300 Subject: [PATCH] Removed lock level WRITING from LexicalWritableScope. --- .../kotlin/resolve/DescriptorResolver.java | 2 +- .../resolve/FunctionDescriptorResolver.kt | 4 +- .../kotlin/resolve/scopes/LexicalScopeImpl.kt | 8 ---- .../resolve/scopes/LexicalScopeStorage.kt | 25 +++++----- .../resolve/scopes/LexicalWritableScope.kt | 46 ++++--------------- .../expressions/ExpressionTypingServices.java | 3 +- .../expressions/ExpressionTypingUtils.java | 6 +-- 7 files changed, 26 insertions(+), 68 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java index 30a1f251d51..64349e6e6d0 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/DescriptorResolver.java @@ -724,7 +724,7 @@ public class DescriptorResolver { LexicalScopeKind.PROPERTY_HEADER); typeParameterDescriptors = resolveTypeParametersForCallableDescriptor( propertyDescriptor, writableScope, scope, typeParameters, trace); - writableScope.changeLockLevel(LexicalWritableScope.LockLevel.READING); + writableScope.freeze(); resolveGenericBounds(property, propertyDescriptor, writableScope, typeParameterDescriptors, trace); scopeWithTypeParameters = writableScope; } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt index 6ebe9c9834a..30da658c3b4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/FunctionDescriptorResolver.kt @@ -143,7 +143,6 @@ class FunctionDescriptorResolver( val typeParameterDescriptors = descriptorResolver. resolveTypeParametersForCallableDescriptor(functionDescriptor, innerScope, scope, function.typeParameters, trace) - innerScope.changeLockLevel(LexicalWritableScope.LockLevel.BOTH) descriptorResolver.resolveGenericBounds(function, functionDescriptor, innerScope, typeParameterDescriptors, trace) val receiverTypeRef = function.receiverTypeReference @@ -156,7 +155,7 @@ class FunctionDescriptorResolver( val valueParameterDescriptors = createValueParameterDescriptors(function, functionDescriptor, innerScope, trace, expectedFunctionType) - innerScope.changeLockLevel(LexicalWritableScope.LockLevel.READING) + innerScope.freeze() val returnType = function.typeReference?.let { typeResolver.resolveType(innerScope, it, trace, true) } @@ -283,7 +282,6 @@ class FunctionDescriptorResolver( TraceBasedLocalRedeclarationChecker(trace), LexicalScopeKind.CONSTRUCTOR_HEADER ) - parameterScope.changeLockLevel(LexicalWritableScope.LockLevel.BOTH) val constructor = constructorDescriptor.initialize( resolveValueParameters(constructorDescriptor, parameterScope, valueParameters, trace, null), resolveVisibilityFromModifiers( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeImpl.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeImpl.kt index 2f19abfecc2..32441e82118 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeImpl.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeImpl.kt @@ -17,8 +17,6 @@ package org.jetbrains.kotlin.resolve.scopes import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.incremental.components.LookupLocation -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.Printer class LexicalScopeImpl @JvmOverloads constructor( @@ -35,12 +33,6 @@ class LexicalScopeImpl @JvmOverloads constructor( InitializeHandler().initialize() } - override fun getContributedClassifier(name: Name, location: LookupLocation) = getClassifier(name) - override fun getContributedVariables(name: Name, location: LookupLocation) = getVariables(name) - - override fun getContributedFunctions(name: Name, location: LookupLocation) = getFunctions(name) - override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) = addedDescriptors - override fun toString(): String = kind.toString() override fun printStructure(p: Printer) { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt index 4decfb4e329..baf207c6af7 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalScopeStorage.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.ClassifierDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor +import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.scopes.utils.takeSnapshot import java.util.* @@ -36,6 +37,14 @@ abstract class LexicalScopeStorage( private var functionsByName: MutableMap? = null private var variablesAndClassifiersByName: MutableMap? = null + override fun getContributedClassifier(name: Name, location: LookupLocation) = variableOrClassDescriptorByName(name) as? ClassifierDescriptor + override fun getContributedVariables(name: Name, location: LookupLocation) = listOfNotNull(variableOrClassDescriptorByName(name) as? VariableDescriptor) + + override fun getContributedFunctions(name: Name, location: LookupLocation) = functionsByName(name) + + override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) + = addedDescriptors + protected fun addVariableOrClassDescriptor(descriptor: DeclarationDescriptor) { val name = descriptor.name val descriptorIndex = addDescriptor(descriptor) @@ -72,8 +81,8 @@ abstract class LexicalScopeStorage( return null } - protected fun functionsByName(name: Name, descriptorLimit: Int = addedDescriptors.size): List? { - if (descriptorLimit == 0) return null + protected fun functionsByName(name: Name, descriptorLimit: Int = addedDescriptors.size): List { + if (descriptorLimit == 0) return emptyList() var list = functionsByName?.get(name) while (list != null) { @@ -82,7 +91,7 @@ abstract class LexicalScopeStorage( } list = list.prev } - return null + return emptyList() } private fun addDescriptor(descriptor: DeclarationDescriptor): Int { @@ -106,14 +115,4 @@ abstract class LexicalScopeStorage( } while (rest != null) return result } - - protected fun getClassifier(name: Name, descriptorLimit: Int = addedDescriptors.size) - = variableOrClassDescriptorByName(name, descriptorLimit) as? ClassifierDescriptor - - protected fun getVariables(name: Name, descriptorLimit: Int = addedDescriptors.size): Collection - = listOfNotNull(variableOrClassDescriptorByName(name, descriptorLimit) as? VariableDescriptor) - - protected fun getFunctions(name: Name, descriptorLimit: Int = addedDescriptors.size): Collection - = functionsByName(name, descriptorLimit) ?: emptyList() - } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt index 0f1787070e3..3587e9ce259 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/scopes/LexicalWritableScope.kt @@ -29,24 +29,15 @@ class LexicalWritableScope( redeclarationChecker: LocalRedeclarationChecker, override val kind: LexicalScopeKind ) : LexicalScopeStorage(parent, redeclarationChecker) { - enum class LockLevel { - WRITING, - BOTH, - READING - } - private var lockLevel: LockLevel = LockLevel.WRITING + private var canWrite: Boolean = true private var lastSnapshot: Snapshot? = null - fun changeLockLevel(lockLevel: LockLevel) { - if (lockLevel.ordinal < this.lockLevel.ordinal) { - throw IllegalStateException("cannot lower lock level from " + this.lockLevel + " to " + lockLevel + " at " + toString()) - } - this.lockLevel = lockLevel + fun freeze() { + canWrite = false } fun takeSnapshot(): LexicalScope { - checkMayRead() if (lastSnapshot == null || lastSnapshot!!.descriptorLimit != addedDescriptors.size) { lastSnapshot = Snapshot(addedDescriptors.size) } @@ -68,40 +59,21 @@ class LexicalWritableScope( addVariableOrClassDescriptor(classifierDescriptor) } - override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) - = checkMayRead().addedDescriptors - - override fun getContributedClassifier(name: Name, location: LookupLocation) = checkMayRead().getClassifier(name) - - override fun getContributedVariables(name: Name, location: LookupLocation) = checkMayRead().getVariables(name) - - override fun getContributedFunctions(name: Name, location: LookupLocation) = checkMayRead().getFunctions(name) - - private fun checkMayRead(): LexicalWritableScope { - if (lockLevel != LockLevel.READING && lockLevel != LockLevel.BOTH) { - throw IllegalStateException("cannot read with lock level " + lockLevel + " at " + toString()) - } - return this - } - private fun checkMayWrite() { - if (lockLevel != LockLevel.WRITING && lockLevel != LockLevel.BOTH) { - throw IllegalStateException("cannot write with lock level " + lockLevel + " at " + toString()) + if (!canWrite) { + throw IllegalStateException("Cannot write into freezed scope:" + toString()) } } private inner class Snapshot(val descriptorLimit: Int) : LexicalScope by this { override fun getContributedDescriptors(kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean) - = this@LexicalWritableScope.addedDescriptors.subList(0, descriptorLimit) + = addedDescriptors.subList(0, descriptorLimit) - override fun getContributedClassifier(name: Name, location: LookupLocation) - = this@LexicalWritableScope.getClassifier(name, descriptorLimit) + override fun getContributedClassifier(name: Name, location: LookupLocation) = variableOrClassDescriptorByName(name, descriptorLimit) as? ClassifierDescriptor + override fun getContributedVariables(name: Name, location: LookupLocation) = listOfNotNull(variableOrClassDescriptorByName(name, descriptorLimit) as? VariableDescriptor) - override fun getContributedVariables(name: Name, location: LookupLocation) - = this@LexicalWritableScope.getVariables(name, descriptorLimit) + override fun getContributedFunctions(name: Name, location: LookupLocation) = functionsByName(name, descriptorLimit) - override fun getContributedFunctions(name: Name, location: LookupLocation) - = this@LexicalWritableScope.getFunctions(name, descriptorLimit) override fun toString(): String = "Snapshot($descriptorLimit) for $kind" diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java index fbe0f5007bc..36e0aadd052 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingServices.java @@ -165,7 +165,6 @@ public class ExpressionTypingServices { DeclarationDescriptor containingDescriptor = context.scope.getOwnerDescriptor(); LexicalWritableScope scope = new LexicalWritableScope(context.scope, containingDescriptor, false, null, new TraceBasedLocalRedeclarationChecker(context.trace), LexicalScopeKind.CODE_BLOCK); - scope.changeLockLevel(LexicalWritableScope.LockLevel.BOTH); KotlinTypeInfo r; if (block.isEmpty()) { @@ -176,7 +175,7 @@ public class ExpressionTypingServices { r = getBlockReturnedTypeWithWritableScope(scope, block, coercionStrategyForLastExpression, context.replaceStatementFilter(statementFilter)); } - scope.changeLockLevel(LexicalWritableScope.LockLevel.READING); + scope.freeze(); if (containingDescriptor instanceof ScriptDescriptor) { context.trace.record(BindingContext.SCRIPT_SCOPE, (ScriptDescriptor) containingDescriptor, scope); diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java index 07eb8ea403a..4e8366d0038 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/ExpressionTypingUtils.java @@ -81,10 +81,8 @@ public class ExpressionTypingUtils { @NotNull public static LexicalWritableScope newWritableScopeImpl(ExpressionTypingContext context, @NotNull LexicalScopeKind scopeKind) { - LexicalWritableScope scope = new LexicalWritableScope(context.scope, context.scope.getOwnerDescriptor(), false, null, - new TraceBasedLocalRedeclarationChecker(context.trace), scopeKind); - scope.changeLockLevel(LexicalWritableScope.LockLevel.BOTH); - return scope; + return new LexicalWritableScope(context.scope, context.scope.getOwnerDescriptor(), false, null, + new TraceBasedLocalRedeclarationChecker(context.trace), scopeKind); } public static KtExpression createFakeExpressionOfType(