Completion optimizations: do not search classes in java package when no SAM-constructors needed or when only singleton classifiers needed
This commit is contained in:
-1
@@ -30,7 +30,6 @@ import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
|
|||||||
import org.jetbrains.jet.lang.types.TypeUtils
|
import org.jetbrains.jet.lang.types.TypeUtils
|
||||||
import java.util.ArrayList
|
import java.util.ArrayList
|
||||||
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
import org.jetbrains.jet.lang.types.checker.JetTypeChecker
|
||||||
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor
|
|
||||||
|
|
||||||
public object SamConversionResolverImpl : SamConversionResolver {
|
public object SamConversionResolverImpl : SamConversionResolver {
|
||||||
override fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor? {
|
override fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor? {
|
||||||
|
|||||||
+6
-2
@@ -35,6 +35,7 @@ import org.jetbrains.jet.lang.resolve.java.JavaVisibilities
|
|||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaConstructorDescriptor
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaConstructorDescriptor
|
||||||
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
|
import org.jetbrains.jet.lang.resolve.java.resolver.DescriptorResolverUtils
|
||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||||
|
|
||||||
public class LazyJavaClassMemberScope(
|
public class LazyJavaClassMemberScope(
|
||||||
c: LazyJavaResolverContextWithTypes,
|
c: LazyJavaResolverContextWithTypes,
|
||||||
@@ -45,7 +46,8 @@ public class LazyJavaClassMemberScope(
|
|||||||
override fun computeMemberIndex(): MemberIndex {
|
override fun computeMemberIndex(): MemberIndex {
|
||||||
return object : ClassMemberIndex(jClass, { !it.isStatic() }) {
|
return object : ClassMemberIndex(jClass, { !it.isStatic() }) {
|
||||||
// For SAM-constructors
|
// For SAM-constructors
|
||||||
override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection<Name> = super.getMethodNames(nameFilter) + getClassNames(nameFilter)
|
override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection<Name>
|
||||||
|
= super.getMethodNames(nameFilter) + getClassNames(JetScope.KindFilter.CLASSIFIERS, nameFilter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +232,9 @@ public class LazyJavaClassMemberScope(
|
|||||||
DescriptorUtils.getDispatchReceiverParameterIfNeeded(getContainingDeclaration())
|
DescriptorUtils.getDispatchReceiverParameterIfNeeded(getContainingDeclaration())
|
||||||
|
|
||||||
override fun getClassifier(name: Name): ClassifierDescriptor? = nestedClasses(name)
|
override fun getClassifier(name: Name): ClassifierDescriptor? = nestedClasses(name)
|
||||||
override fun getClassNames(nameFilter: (Name) -> Boolean): Collection<Name> = nestedClassIndex().keySet() + enumEntryIndex().keySet()
|
|
||||||
|
override fun getClassNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
|
||||||
|
= nestedClassIndex().keySet() + enumEntryIndex().keySet()
|
||||||
|
|
||||||
// TODO
|
// TODO
|
||||||
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
||||||
|
|||||||
+6
-6
@@ -210,7 +210,9 @@ public abstract class LazyJavaMemberScope(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun getFunctions(name: Name) = functions(name)
|
override fun getFunctions(name: Name) = functions(name)
|
||||||
protected open fun getFunctionNames(nameFilter: (Name) -> Boolean): Collection<Name> = memberIndex().getMethodNames(nameFilter)
|
|
||||||
|
protected open fun getFunctionNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
|
||||||
|
= memberIndex().getMethodNames(nameFilter)
|
||||||
|
|
||||||
protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection<PropertyDescriptor>)
|
protected abstract fun computeNonDeclaredProperties(name: Name, result: MutableCollection<PropertyDescriptor>)
|
||||||
|
|
||||||
@@ -298,9 +300,8 @@ public abstract class LazyJavaMemberScope(
|
|||||||
nameFilter: (Name) -> Boolean): List<DeclarationDescriptor> {
|
nameFilter: (Name) -> Boolean): List<DeclarationDescriptor> {
|
||||||
val result = LinkedHashSet<DeclarationDescriptor>()
|
val result = LinkedHashSet<DeclarationDescriptor>()
|
||||||
|
|
||||||
//TODO: only non-singleton classifiers in package!
|
|
||||||
if (kindFilter.acceptsKind(JetScope.CLASSIFIERS_MASK)) {
|
if (kindFilter.acceptsKind(JetScope.CLASSIFIERS_MASK)) {
|
||||||
for (name in getClassNames(nameFilter)) {
|
for (name in getClassNames(kindFilter, nameFilter)) {
|
||||||
if (nameFilter(name)) {
|
if (nameFilter(name)) {
|
||||||
// Null signifies that a class found in Java is not present in Kotlin (e.g. package class)
|
// Null signifies that a class found in Java is not present in Kotlin (e.g. package class)
|
||||||
result.addIfNotNull(getClassifier(name))
|
result.addIfNotNull(getClassifier(name))
|
||||||
@@ -308,9 +309,8 @@ public abstract class LazyJavaMemberScope(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: SAM-constructors only in package!
|
|
||||||
if (kindFilter.acceptsKind(JetScope.FUNCTION) && !kindFilter.excludes.contains(JetScope.DescriptorKindExclude.NonExtensions)) {
|
if (kindFilter.acceptsKind(JetScope.FUNCTION) && !kindFilter.excludes.contains(JetScope.DescriptorKindExclude.NonExtensions)) {
|
||||||
for (name in getFunctionNames(nameFilter)) {
|
for (name in getFunctionNames(kindFilter, nameFilter)) {
|
||||||
if (nameFilter(name)) {
|
if (nameFilter(name)) {
|
||||||
result.addAll(getFunctions(name))
|
result.addAll(getFunctions(name))
|
||||||
}
|
}
|
||||||
@@ -336,7 +336,7 @@ public abstract class LazyJavaMemberScope(
|
|||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
|
|
||||||
protected abstract fun getClassNames(nameFilter: (Name) -> Boolean): Collection<Name>
|
protected abstract fun getClassNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name>
|
||||||
|
|
||||||
override fun toString() = "Lazy scope for ${getContainingDeclaration()}"
|
override fun toString() = "Lazy scope for ${getContainingDeclaration()}"
|
||||||
|
|
||||||
|
|||||||
+5
-4
@@ -23,6 +23,7 @@ import org.jetbrains.jet.lang.resolve.java.lazy.LazyJavaResolverContext
|
|||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaClass
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorFactory.*
|
import org.jetbrains.jet.lang.resolve.DescriptorFactory.*
|
||||||
import org.jetbrains.jet.utils.addIfNotNull
|
import org.jetbrains.jet.utils.addIfNotNull
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||||
|
|
||||||
public class LazyJavaStaticClassScope(
|
public class LazyJavaStaticClassScope(
|
||||||
c: LazyJavaResolverContext,
|
c: LazyJavaResolverContext,
|
||||||
@@ -42,14 +43,14 @@ public class LazyJavaStaticClassScope(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFunctionNames(nameFilter: (Name) -> Boolean): Collection<Name> {
|
override fun getFunctionNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name> {
|
||||||
if (jClass.isEnum()) {
|
if (jClass.isEnum()) {
|
||||||
return super.getFunctionNames(nameFilter) + listOf(DescriptorUtils.ENUM_VALUE_OF, DescriptorUtils.ENUM_VALUES)
|
return super.getFunctionNames(kindFilter, nameFilter) + listOf(DescriptorUtils.ENUM_VALUE_OF, DescriptorUtils.ENUM_VALUES)
|
||||||
}
|
}
|
||||||
return super.getFunctionNames(nameFilter)
|
return super.getFunctionNames(kindFilter, nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassNames(nameFilter: (Name) -> Boolean): Collection<Name> = listOf()
|
override fun getClassNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name> = listOf()
|
||||||
override fun getClassifier(name: Name): ClassifierDescriptor? = null
|
override fun getClassifier(name: Name): ClassifierDescriptor? = null
|
||||||
|
|
||||||
override fun getSubPackages(): Collection<FqName> = listOf()
|
override fun getSubPackages(): Collection<FqName> = listOf()
|
||||||
|
|||||||
+13
-2
@@ -26,6 +26,7 @@ import org.jetbrains.jet.lang.resolve.java.PackageClassUtils
|
|||||||
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
import org.jetbrains.jet.lang.resolve.scopes.JetScope
|
||||||
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass
|
import org.jetbrains.jet.lang.resolve.kotlin.KotlinJvmBinaryClass
|
||||||
import org.jetbrains.jet.utils.addIfNotNull
|
import org.jetbrains.jet.utils.addIfNotNull
|
||||||
|
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptorKindExclude
|
||||||
|
|
||||||
public class LazyPackageFragmentScopeForJavaPackage(
|
public class LazyPackageFragmentScopeForJavaPackage(
|
||||||
c: LazyJavaResolverContext,
|
c: LazyJavaResolverContext,
|
||||||
@@ -75,15 +76,25 @@ public class LazyPackageFragmentScopeForJavaPackage(
|
|||||||
|
|
||||||
override fun computeMemberIndex(): MemberIndex = object : MemberIndex by EMPTY_MEMBER_INDEX {
|
override fun computeMemberIndex(): MemberIndex = object : MemberIndex by EMPTY_MEMBER_INDEX {
|
||||||
// For SAM-constructors
|
// For SAM-constructors
|
||||||
override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection<Name> = getClassNames(nameFilter)
|
override fun getMethodNames(nameFilter: (Name) -> Boolean): Collection<Name> = getClassNames(JetScope.KindFilter.CLASSIFIERS, nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getClassNames(nameFilter: (Name) -> Boolean): Collection<Name> {
|
override fun getClassNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name> {
|
||||||
|
// neither objects nor enum members can be in java package
|
||||||
|
if (!kindFilter.acceptsKind(JetScope.NON_SINGLETON_CLASSIFIER)) return listOf()
|
||||||
|
|
||||||
return jPackage.getClasses(nameFilter).stream()
|
return jPackage.getClasses(nameFilter).stream()
|
||||||
.filter { c -> c.getOriginKind() != JavaClass.OriginKind.KOTLIN_LIGHT_CLASS }
|
.filter { c -> c.getOriginKind() != JavaClass.OriginKind.KOTLIN_LIGHT_CLASS }
|
||||||
.map { c -> c.getName() }.toList()
|
.map { c -> c.getName() }.toList()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getFunctionNames(kindFilter: JetScope.KindFilter, nameFilter: (Name) -> Boolean): Collection<Name> {
|
||||||
|
// optimization: only SAM-constructors may exist in java package
|
||||||
|
if (kindFilter.excludes.contains(SamConstructorDescriptorKindExclude)) return listOf()
|
||||||
|
|
||||||
|
return super.getFunctionNames(kindFilter, nameFilter)
|
||||||
|
}
|
||||||
|
|
||||||
private val subPackages = c.storageManager.createRecursionTolerantLazyValue(
|
private val subPackages = c.storageManager.createRecursionTolerantLazyValue(
|
||||||
{
|
{
|
||||||
jPackage.getSubPackages().map { sp -> sp.getFqName() }
|
jPackage.getSubPackages().map { sp -> sp.getFqName() }
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
|
|||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
import org.jetbrains.jet.lang.resolve.java.structure.JavaMethod
|
||||||
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor
|
import org.jetbrains.jet.lang.resolve.java.descriptor.JavaClassDescriptor
|
||||||
import org.jetbrains.jet.lang.descriptors.SamConstructorDescriptor
|
import org.jetbrains.jet.lang.resolve.java.descriptor.SamConstructorDescriptor
|
||||||
|
|
||||||
public trait SamConversionResolver {
|
public trait SamConversionResolver {
|
||||||
public fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor?
|
public fun resolveSamConstructor(name: Name, scope: JetScope): SamConstructorDescriptor?
|
||||||
|
|||||||
Reference in New Issue
Block a user