From 6a3200764f13c6ec7409070205bb55d8338cc0ea Mon Sep 17 00:00:00 2001 From: Zalim Bashorov Date: Fri, 21 Aug 2015 18:29:01 +0300 Subject: [PATCH] Don't try to record lookups which already tracked --- .../lazy/descriptors/LazyClassMemberScope.kt | 48 ++++++++++--------- .../descriptors/LazyScriptClassMemberScope.kt | 17 ++++--- .../incremental/components/LookupLocation.kt | 3 +- .../DeserializedClassDescriptor.kt | 13 +++-- 4 files changed, 41 insertions(+), 40 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt index 5bb078e896d..3555591770f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyClassMemberScope.kt @@ -23,6 +23,8 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl import org.jetbrains.kotlin.diagnostics.Errors +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetProperty @@ -34,14 +36,12 @@ import org.jetbrains.kotlin.resolve.lazy.LazyClassContext import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.JetScope -import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.resolve.varianceChecker.VarianceChecker import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.types.DeferredType import org.jetbrains.kotlin.types.JetType -import java.util.ArrayList -import java.util.LinkedHashSet +import java.util.* public open class LazyClassMemberScope( c: LazyClassContext, @@ -54,7 +54,7 @@ public open class LazyClassMemberScope( computeDescriptorsFromDeclaredElements(DescriptorKindFilter.ALL, JetScope.ALL_NAME_FILTER) } private val extraDescriptors: NotNullLazyValue> = storageManager.createLazyValue { - computeExtraDescriptors() + computeExtraDescriptors(NoLookupLocation.FOR_ALREADY_TRACKED) } override fun getDescriptors(kindFilter: DescriptorKindFilter, @@ -64,21 +64,21 @@ public open class LazyClassMemberScope( return result } - protected open fun computeExtraDescriptors(): Collection { + protected open fun computeExtraDescriptors(location: LookupLocation): Collection { val result = ArrayList() - for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { - for (descriptor in supertype.getMemberScope().getDescriptors()) { + for (supertype in thisDescriptor.typeConstructor.supertypes) { + for (descriptor in supertype.memberScope.getDescriptors()) { if (descriptor is FunctionDescriptor) { - result.addAll(getFunctions(descriptor.getName())) + result.addAll(getFunctions(descriptor.name, location)) } else if (descriptor is PropertyDescriptor) { - result.addAll(getProperties(descriptor.getName())) + result.addAll(getProperties(descriptor.name, location)) } // Nothing else is inherited } } - addDataClassMethods(result) + addDataClassMethods(result, location) result.trimToSize() return result @@ -123,16 +123,18 @@ public open class LazyClassMemberScope( } protected override fun getNonDeclaredFunctions(name: Name, result: MutableSet) { + val location = NoLookupLocation.FOR_ALREADY_TRACKED + val fromSupertypes = Lists.newArrayList() - for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { - fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)) + for (supertype in thisDescriptor.typeConstructor.supertypes) { + fromSupertypes.addAll(supertype.memberScope.getFunctions(name, location)) } result.addAll(generateDelegatingDescriptors(name, EXTRACT_FUNCTIONS, result)) - generateDataClassMethods(result, name) + generateDataClassMethods(result, name, location) generateFakeOverrides(name, fromSupertypes, result, javaClass()) } - private fun generateDataClassMethods(result: MutableCollection, name: Name) { + private fun generateDataClassMethods(result: MutableCollection, name: Name, location: LookupLocation) { if (!KotlinBuiltIns.isData(thisDescriptor)) return val constructor = getPrimaryConstructor() ?: return @@ -147,7 +149,7 @@ public open class LazyClassMemberScope( if (parameter.getType().isError()) continue if (!primaryConstructorParameters.get(parameter.getIndex()).hasValOrVar()) continue - val properties = getProperties(parameter.getName()) + val properties = getProperties(parameter.name, location) if (properties.isEmpty()) continue val property = properties.iterator().next() as PropertyDescriptor @@ -165,7 +167,7 @@ public open class LazyClassMemberScope( if (name == DescriptorResolver.COPY_METHOD_NAME) { for (parameter in constructor.getValueParameters()) { // force properties resolution to fill BindingContext.VALUE_PARAMETER_AS_PROPERTY slice - getProperties(parameter.getName()) + getProperties(parameter.name, location) } val copyFunctionDescriptor = DescriptorResolver.createCopyFunctionDescriptor(constructor.getValueParameters(), thisDescriptor, trace) @@ -195,8 +197,8 @@ public open class LazyClassMemberScope( // Members from supertypes val fromSupertypes = ArrayList() - for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { - fromSupertypes.addAll(supertype.getMemberScope().getProperties(name) as Collection) + for (supertype in thisDescriptor.typeConstructor.supertypes) { + fromSupertypes.addAll(supertype.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection) } result.addAll(generateDelegatingDescriptors(name, EXTRACT_PROPERTIES, result)) generateFakeOverrides(name, fromSupertypes, result as MutableCollection, javaClass()) @@ -239,7 +241,7 @@ public open class LazyClassMemberScope( return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor, lazyTypeResolver) } - private fun addDataClassMethods(result: MutableCollection) { + private fun addDataClassMethods(result: MutableCollection, location: LookupLocation) { if (!KotlinBuiltIns.isData(thisDescriptor)) return if (getPrimaryConstructor() == null) return @@ -248,14 +250,14 @@ public open class LazyClassMemberScope( var n = 1 while (true) { val componentName = createComponentName(n) - val functions = getFunctions(componentName) + val functions = getFunctions(componentName, location) if (functions.isEmpty()) break result.addAll(functions) n++ } - result.addAll(getFunctions(Name.identifier("copy"))) + result.addAll(getFunctions(Name.identifier("copy"), location)) } override fun getPackage(name: Name): PackageViewDescriptor? = null @@ -314,14 +316,14 @@ public open class LazyClassMemberScope( companion object { private val EXTRACT_FUNCTIONS: MemberExtractor = object : MemberExtractor { override fun extract(extractFrom: JetType, name: Name): Collection { - return extractFrom.getMemberScope().getFunctions(name) + return extractFrom.memberScope.getFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED) } } private val EXTRACT_PROPERTIES: MemberExtractor = object : MemberExtractor { override fun extract(extractFrom: JetType, name: Name): Collection { @suppress("UNCHECKED_CAST") - return extractFrom.getMemberScope().getProperties(name) as Collection + return extractFrom.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index f079d732198..38b5018a15f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -17,18 +17,17 @@ package org.jetbrains.kotlin.resolve.lazy.descriptors import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl +import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl +import org.jetbrains.kotlin.incremental.components.LookupLocation +import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.BindingTrace import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.data.JetScriptInfo import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider -import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.utils.toReadOnlyList -import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl -import org.jetbrains.kotlin.descriptors.annotations.Annotations -import org.jetbrains.kotlin.types.JetType -import java.util.Collections -import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl // SCRIPT: Members of a script class public class LazyScriptClassMemberScope protected constructor( @@ -43,9 +42,9 @@ public class LazyScriptClassMemberScope protected constructor( createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.script)) } - override fun computeExtraDescriptors(): Collection { - return (super.computeExtraDescriptors() - + getProperties(Name.identifier(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) + override fun computeExtraDescriptors(location: LookupLocation): Collection { + return (super.computeExtraDescriptors(location) + + getProperties(Name.identifier(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME), location) + getPropertiesForScriptParameters()).toReadOnlyList() } diff --git a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt index 497d44883a9..745176c3954 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/incremental/components/LookupLocation.kt @@ -30,5 +30,6 @@ public enum class NoLookupLocation : LookupLocation { FOR_SCRIPT, FROM_REFLECTION, WHEN_RESOLVE_DECLARATION, - WHEN_GET_DECLARATION_SCOPE + WHEN_GET_DECLARATION_SCOPE, + FOR_ALREADY_TRACKED } diff --git a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt index 8ca3a42dec1..3cabf746be7 100644 --- a/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt +++ b/core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/descriptors/DeserializedClassDescriptor.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor +import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.OverridingUtil @@ -35,9 +36,7 @@ import org.jetbrains.kotlin.types.AbstractClassTypeConstructor import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.singletonOrEmptyList -import java.util.ArrayList -import java.util.HashSet -import java.util.LinkedHashSet +import java.util.* public class DeserializedClassDescriptor( outerContext: DeserializationContext, @@ -186,17 +185,17 @@ public class DeserializedClassDescriptor( override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection) { val fromSupertypes = ArrayList() - for (supertype in classDescriptor.getTypeConstructor().getSupertypes()) { - fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)) + for (supertype in classDescriptor.getTypeConstructor().supertypes) { + fromSupertypes.addAll(supertype.memberScope.getFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED)) } generateFakeOverrides(name, fromSupertypes, functions) } override fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection) { val fromSupertypes = ArrayList() - for (supertype in classDescriptor.getTypeConstructor().getSupertypes()) { + for (supertype in classDescriptor.getTypeConstructor().supertypes) { @suppress("UNCHECKED_CAST") - fromSupertypes.addAll(supertype.getMemberScope().getProperties(name) as Collection) + fromSupertypes.addAll(supertype.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection) } generateFakeOverrides(name, fromSupertypes, descriptors) }