Don't try to record lookups which already tracked

This commit is contained in:
Zalim Bashorov
2015-08-21 18:29:01 +03:00
parent cca57af401
commit 6a3200764f
4 changed files with 41 additions and 40 deletions
@@ -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.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ConstructorDescriptorImpl
import org.jetbrains.kotlin.diagnostics.Errors 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.name.Name
import org.jetbrains.kotlin.psi.JetDeclaration import org.jetbrains.kotlin.psi.JetDeclaration
import org.jetbrains.kotlin.psi.JetProperty 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.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.JetScope 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.resolve.varianceChecker.VarianceChecker
import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NotNullLazyValue
import org.jetbrains.kotlin.storage.NullableLazyValue import org.jetbrains.kotlin.storage.NullableLazyValue
import org.jetbrains.kotlin.types.DeferredType import org.jetbrains.kotlin.types.DeferredType
import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.JetType
import java.util.ArrayList import java.util.*
import java.util.LinkedHashSet
public open class LazyClassMemberScope( public open class LazyClassMemberScope(
c: LazyClassContext, c: LazyClassContext,
@@ -54,7 +54,7 @@ public open class LazyClassMemberScope(
computeDescriptorsFromDeclaredElements(DescriptorKindFilter.ALL, JetScope.ALL_NAME_FILTER) computeDescriptorsFromDeclaredElements(DescriptorKindFilter.ALL, JetScope.ALL_NAME_FILTER)
} }
private val extraDescriptors: NotNullLazyValue<Collection<DeclarationDescriptor>> = storageManager.createLazyValue { private val extraDescriptors: NotNullLazyValue<Collection<DeclarationDescriptor>> = storageManager.createLazyValue {
computeExtraDescriptors() computeExtraDescriptors(NoLookupLocation.FOR_ALREADY_TRACKED)
} }
override fun getDescriptors(kindFilter: DescriptorKindFilter, override fun getDescriptors(kindFilter: DescriptorKindFilter,
@@ -64,21 +64,21 @@ public open class LazyClassMemberScope(
return result return result
} }
protected open fun computeExtraDescriptors(): Collection<DeclarationDescriptor> { protected open fun computeExtraDescriptors(location: LookupLocation): Collection<DeclarationDescriptor> {
val result = ArrayList<DeclarationDescriptor>() val result = ArrayList<DeclarationDescriptor>()
for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { for (supertype in thisDescriptor.typeConstructor.supertypes) {
for (descriptor in supertype.getMemberScope().getDescriptors()) { for (descriptor in supertype.memberScope.getDescriptors()) {
if (descriptor is FunctionDescriptor) { if (descriptor is FunctionDescriptor) {
result.addAll(getFunctions(descriptor.getName())) result.addAll(getFunctions(descriptor.name, location))
} }
else if (descriptor is PropertyDescriptor) { else if (descriptor is PropertyDescriptor) {
result.addAll(getProperties(descriptor.getName())) result.addAll(getProperties(descriptor.name, location))
} }
// Nothing else is inherited // Nothing else is inherited
} }
} }
addDataClassMethods(result) addDataClassMethods(result, location)
result.trimToSize() result.trimToSize()
return result return result
@@ -123,16 +123,18 @@ public open class LazyClassMemberScope(
} }
protected override fun getNonDeclaredFunctions(name: Name, result: MutableSet<FunctionDescriptor>) { protected override fun getNonDeclaredFunctions(name: Name, result: MutableSet<FunctionDescriptor>) {
val location = NoLookupLocation.FOR_ALREADY_TRACKED
val fromSupertypes = Lists.newArrayList<FunctionDescriptor>() val fromSupertypes = Lists.newArrayList<FunctionDescriptor>()
for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { for (supertype in thisDescriptor.typeConstructor.supertypes) {
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)) fromSupertypes.addAll(supertype.memberScope.getFunctions(name, location))
} }
result.addAll(generateDelegatingDescriptors(name, EXTRACT_FUNCTIONS, result)) result.addAll(generateDelegatingDescriptors(name, EXTRACT_FUNCTIONS, result))
generateDataClassMethods(result, name) generateDataClassMethods(result, name, location)
generateFakeOverrides(name, fromSupertypes, result, javaClass<FunctionDescriptor>()) generateFakeOverrides(name, fromSupertypes, result, javaClass<FunctionDescriptor>())
} }
private fun generateDataClassMethods(result: MutableCollection<FunctionDescriptor>, name: Name) { private fun generateDataClassMethods(result: MutableCollection<FunctionDescriptor>, name: Name, location: LookupLocation) {
if (!KotlinBuiltIns.isData(thisDescriptor)) return if (!KotlinBuiltIns.isData(thisDescriptor)) return
val constructor = getPrimaryConstructor() ?: return val constructor = getPrimaryConstructor() ?: return
@@ -147,7 +149,7 @@ public open class LazyClassMemberScope(
if (parameter.getType().isError()) continue if (parameter.getType().isError()) continue
if (!primaryConstructorParameters.get(parameter.getIndex()).hasValOrVar()) continue if (!primaryConstructorParameters.get(parameter.getIndex()).hasValOrVar()) continue
val properties = getProperties(parameter.getName()) val properties = getProperties(parameter.name, location)
if (properties.isEmpty()) continue if (properties.isEmpty()) continue
val property = properties.iterator().next() as PropertyDescriptor val property = properties.iterator().next() as PropertyDescriptor
@@ -165,7 +167,7 @@ public open class LazyClassMemberScope(
if (name == DescriptorResolver.COPY_METHOD_NAME) { if (name == DescriptorResolver.COPY_METHOD_NAME) {
for (parameter in constructor.getValueParameters()) { for (parameter in constructor.getValueParameters()) {
// force properties resolution to fill BindingContext.VALUE_PARAMETER_AS_PROPERTY slice // 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) val copyFunctionDescriptor = DescriptorResolver.createCopyFunctionDescriptor(constructor.getValueParameters(), thisDescriptor, trace)
@@ -195,8 +197,8 @@ public open class LazyClassMemberScope(
// Members from supertypes // Members from supertypes
val fromSupertypes = ArrayList<PropertyDescriptor>() val fromSupertypes = ArrayList<PropertyDescriptor>()
for (supertype in thisDescriptor.getTypeConstructor().getSupertypes()) { for (supertype in thisDescriptor.typeConstructor.supertypes) {
fromSupertypes.addAll(supertype.getMemberScope().getProperties(name) as Collection<PropertyDescriptor>) fromSupertypes.addAll(supertype.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection<PropertyDescriptor>)
} }
result.addAll(generateDelegatingDescriptors(name, EXTRACT_PROPERTIES, result)) result.addAll(generateDelegatingDescriptors(name, EXTRACT_PROPERTIES, result))
generateFakeOverrides(name, fromSupertypes, result as MutableCollection<PropertyDescriptor>, javaClass<PropertyDescriptor>()) generateFakeOverrides(name, fromSupertypes, result as MutableCollection<PropertyDescriptor>, javaClass<PropertyDescriptor>())
@@ -239,7 +241,7 @@ public open class LazyClassMemberScope(
return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor, lazyTypeResolver) return generateDelegatedMembers(classOrObject, thisDescriptor, existingDescriptors, trace, lazyMemberExtractor, lazyTypeResolver)
} }
private fun addDataClassMethods(result: MutableCollection<DeclarationDescriptor>) { private fun addDataClassMethods(result: MutableCollection<DeclarationDescriptor>, location: LookupLocation) {
if (!KotlinBuiltIns.isData(thisDescriptor)) return if (!KotlinBuiltIns.isData(thisDescriptor)) return
if (getPrimaryConstructor() == null) return if (getPrimaryConstructor() == null) return
@@ -248,14 +250,14 @@ public open class LazyClassMemberScope(
var n = 1 var n = 1
while (true) { while (true) {
val componentName = createComponentName(n) val componentName = createComponentName(n)
val functions = getFunctions(componentName) val functions = getFunctions(componentName, location)
if (functions.isEmpty()) break if (functions.isEmpty()) break
result.addAll(functions) result.addAll(functions)
n++ n++
} }
result.addAll(getFunctions(Name.identifier("copy"))) result.addAll(getFunctions(Name.identifier("copy"), location))
} }
override fun getPackage(name: Name): PackageViewDescriptor? = null override fun getPackage(name: Name): PackageViewDescriptor? = null
@@ -314,14 +316,14 @@ public open class LazyClassMemberScope(
companion object { companion object {
private val EXTRACT_FUNCTIONS: MemberExtractor<FunctionDescriptor> = object : MemberExtractor<FunctionDescriptor> { private val EXTRACT_FUNCTIONS: MemberExtractor<FunctionDescriptor> = object : MemberExtractor<FunctionDescriptor> {
override fun extract(extractFrom: JetType, name: Name): Collection<FunctionDescriptor> { override fun extract(extractFrom: JetType, name: Name): Collection<FunctionDescriptor> {
return extractFrom.getMemberScope().getFunctions(name) return extractFrom.memberScope.getFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED)
} }
} }
private val EXTRACT_PROPERTIES: MemberExtractor<PropertyDescriptor> = object : MemberExtractor<PropertyDescriptor> { private val EXTRACT_PROPERTIES: MemberExtractor<PropertyDescriptor> = object : MemberExtractor<PropertyDescriptor> {
override fun extract(extractFrom: JetType, name: Name): Collection<PropertyDescriptor> { override fun extract(extractFrom: JetType, name: Name): Collection<PropertyDescriptor> {
@suppress("UNCHECKED_CAST") @suppress("UNCHECKED_CAST")
return extractFrom.getMemberScope().getProperties(name) as Collection<PropertyDescriptor> return extractFrom.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection<PropertyDescriptor>
} }
} }
} }
@@ -17,18 +17,17 @@
package org.jetbrains.kotlin.resolve.lazy.descriptors package org.jetbrains.kotlin.resolve.lazy.descriptors
import org.jetbrains.kotlin.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.BindingTrace
import org.jetbrains.kotlin.resolve.lazy.ResolveSession import org.jetbrains.kotlin.resolve.lazy.ResolveSession
import org.jetbrains.kotlin.resolve.lazy.data.JetScriptInfo import org.jetbrains.kotlin.resolve.lazy.data.JetScriptInfo
import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider import org.jetbrains.kotlin.resolve.lazy.declarations.ClassMemberDeclarationProvider
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.storage.NotNullLazyValue import org.jetbrains.kotlin.storage.NotNullLazyValue
import org.jetbrains.kotlin.utils.toReadOnlyList 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 // SCRIPT: Members of a script class
public class LazyScriptClassMemberScope protected constructor( public class LazyScriptClassMemberScope protected constructor(
@@ -43,9 +42,9 @@ public class LazyScriptClassMemberScope protected constructor(
createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.script)) createScriptResultProperty(resolveSession.getScriptDescriptor(scriptInfo.script))
} }
override fun computeExtraDescriptors(): Collection<DeclarationDescriptor> { override fun computeExtraDescriptors(location: LookupLocation): Collection<DeclarationDescriptor> {
return (super.computeExtraDescriptors() return (super.computeExtraDescriptors(location)
+ getProperties(Name.identifier(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME)) + getProperties(Name.identifier(ScriptDescriptor.LAST_EXPRESSION_VALUE_FIELD_NAME), location)
+ getPropertiesForScriptParameters()).toReadOnlyList() + getPropertiesForScriptParameters()).toReadOnlyList()
} }
@@ -30,5 +30,6 @@ public enum class NoLookupLocation : LookupLocation {
FOR_SCRIPT, FOR_SCRIPT,
FROM_REFLECTION, FROM_REFLECTION,
WHEN_RESOLVE_DECLARATION, WHEN_RESOLVE_DECLARATION,
WHEN_GET_DECLARATION_SCOPE WHEN_GET_DECLARATION_SCOPE,
FOR_ALREADY_TRACKED
} }
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor import org.jetbrains.kotlin.descriptors.impl.AbstractClassDescriptor
import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor import org.jetbrains.kotlin.descriptors.impl.EnumEntrySyntheticClassDescriptor
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.DescriptorFactory import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.OverridingUtil 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.types.JetType
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.singletonOrEmptyList import org.jetbrains.kotlin.utils.singletonOrEmptyList
import java.util.ArrayList import java.util.*
import java.util.HashSet
import java.util.LinkedHashSet
public class DeserializedClassDescriptor( public class DeserializedClassDescriptor(
outerContext: DeserializationContext, outerContext: DeserializationContext,
@@ -186,17 +185,17 @@ public class DeserializedClassDescriptor(
override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection<FunctionDescriptor>) { override fun computeNonDeclaredFunctions(name: Name, functions: MutableCollection<FunctionDescriptor>) {
val fromSupertypes = ArrayList<FunctionDescriptor>() val fromSupertypes = ArrayList<FunctionDescriptor>()
for (supertype in classDescriptor.getTypeConstructor().getSupertypes()) { for (supertype in classDescriptor.getTypeConstructor().supertypes) {
fromSupertypes.addAll(supertype.getMemberScope().getFunctions(name)) fromSupertypes.addAll(supertype.memberScope.getFunctions(name, NoLookupLocation.FOR_ALREADY_TRACKED))
} }
generateFakeOverrides(name, fromSupertypes, functions) generateFakeOverrides(name, fromSupertypes, functions)
} }
override fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection<PropertyDescriptor>) { override fun computeNonDeclaredProperties(name: Name, descriptors: MutableCollection<PropertyDescriptor>) {
val fromSupertypes = ArrayList<PropertyDescriptor>() val fromSupertypes = ArrayList<PropertyDescriptor>()
for (supertype in classDescriptor.getTypeConstructor().getSupertypes()) { for (supertype in classDescriptor.getTypeConstructor().supertypes) {
@suppress("UNCHECKED_CAST") @suppress("UNCHECKED_CAST")
fromSupertypes.addAll(supertype.getMemberScope().getProperties(name) as Collection<PropertyDescriptor>) fromSupertypes.addAll(supertype.memberScope.getProperties(name, NoLookupLocation.FOR_ALREADY_TRACKED) as Collection<PropertyDescriptor>)
} }
generateFakeOverrides(name, fromSupertypes, descriptors) generateFakeOverrides(name, fromSupertypes, descriptors)
} }