More precise descriptor kind filtering (preparing to optimize smart completion)
This commit is contained in:
@@ -117,7 +117,7 @@ public class BuiltInsSerializer(val out: PrintStream?) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
val classNames = ArrayList<Name>()
|
val classNames = ArrayList<Name>()
|
||||||
val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors({ it == JetScope.DescriptorKind.CLASSIFIER }))
|
val classifierDescriptors = DescriptorSerializer.sort(packageView.getMemberScope().getDescriptors({ it == JetScope.DescriptorKind.TYPE }))
|
||||||
|
|
||||||
ClassSerializationUtil.serializeClasses(classifierDescriptors, serializer, object : ClassSerializationUtil.Sink {
|
ClassSerializationUtil.serializeClasses(classifierDescriptors, serializer, object : ClassSerializationUtil.Sink {
|
||||||
override fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class) {
|
override fun writeClass(classDescriptor: ClassDescriptor, classProto: ProtoBuf.Class) {
|
||||||
|
|||||||
+2
-2
@@ -294,7 +294,7 @@ public abstract class LazyJavaMemberScope(
|
|||||||
nameFilter: (Name) -> Boolean): List<DeclarationDescriptor> {
|
nameFilter: (Name) -> Boolean): List<DeclarationDescriptor> {
|
||||||
val result = LinkedHashSet<DeclarationDescriptor>()
|
val result = LinkedHashSet<DeclarationDescriptor>()
|
||||||
|
|
||||||
if (kindFilter(JetScope.DescriptorKind.CLASSIFIER)) {
|
if (kindFilter(JetScope.DescriptorKind.TYPE)) {
|
||||||
for (name in getClassNames(nameFilter)) {
|
for (name in getClassNames(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)
|
||||||
@@ -303,7 +303,7 @@ public abstract class LazyJavaMemberScope(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_FUNCTION)) {
|
if (kindFilter(JetScope.DescriptorKind.ORDINARY_FUNCTION) || kindFilter(JetScope.DescriptorKind.SAM_CONSTRUCTOR)) {
|
||||||
for (name in getFunctionNames(nameFilter)) {
|
for (name in getFunctionNames(nameFilter)) {
|
||||||
if (nameFilter(name)) {
|
if (nameFilter(name)) {
|
||||||
result.addAll(getFunctions(name))
|
result.addAll(getFunctions(name))
|
||||||
|
|||||||
+3
-2
@@ -21,6 +21,7 @@ import org.jetbrains.jet.lang.descriptors.ReceiverParameterDescriptor
|
|||||||
import org.jetbrains.jet.lang.resolve.name.Name
|
import org.jetbrains.jet.lang.resolve.name.Name
|
||||||
|
|
||||||
public class InnerClassesScopeWrapper(override val workerScope: JetScope) : AbstractScopeAdapter() {
|
public class InnerClassesScopeWrapper(override val workerScope: JetScope) : AbstractScopeAdapter() {
|
||||||
|
private val descriptorKinds = setOf(JetScope.DescriptorKind.TYPE, JetScope.DescriptorKind.OBJECT, JetScope.DescriptorKind.ENUM_ENTRY)
|
||||||
|
|
||||||
override fun getClassifier(name: Name) = workerScope.getClassifier(name) as? ClassDescriptor
|
override fun getClassifier(name: Name) = workerScope.getClassifier(name) as? ClassDescriptor
|
||||||
|
|
||||||
@@ -28,8 +29,8 @@ public class InnerClassesScopeWrapper(override val workerScope: JetScope) : Abst
|
|||||||
|
|
||||||
override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean,
|
override fun getDescriptors(kindFilter: (JetScope.DescriptorKind) -> Boolean,
|
||||||
nameFilter: (Name) -> Boolean): List<ClassDescriptor> {
|
nameFilter: (Name) -> Boolean): List<ClassDescriptor> {
|
||||||
if (!kindFilter(JetScope.DescriptorKind.CLASSIFIER)) return listOf()
|
if (!descriptorKinds.any { kindFilter(it) }) return listOf()
|
||||||
return workerScope.getDescriptors({ it == JetScope.DescriptorKind.CLASSIFIER }, nameFilter).filterIsInstance(javaClass<ClassDescriptor>())
|
return workerScope.getDescriptors(JetScope.DescriptorKind.CLASSIFIERS, nameFilter).filterIsInstance(javaClass<ClassDescriptor>())
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
override fun getImplicitReceiversHierarchy(): List<ReceiverParameterDescriptor> = listOf()
|
||||||
|
|||||||
@@ -78,10 +78,13 @@ public trait JetScope {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public enum class DescriptorKind {
|
public enum class DescriptorKind {
|
||||||
CLASSIFIER
|
TYPE // class, trait ot type parameter
|
||||||
|
ENUM_ENTRY
|
||||||
|
OBJECT
|
||||||
PACKAGE
|
PACKAGE
|
||||||
NON_EXTENSION_FUNCTION
|
ORDINARY_FUNCTION // not extension and not SAM-constructor
|
||||||
EXTENSION_FUNCTION
|
EXTENSION_FUNCTION
|
||||||
|
SAM_CONSTRUCTOR
|
||||||
NON_EXTENSION_PROPERTY
|
NON_EXTENSION_PROPERTY
|
||||||
EXTENSION_PROPERTY
|
EXTENSION_PROPERTY
|
||||||
LOCAL_VARIABLE
|
LOCAL_VARIABLE
|
||||||
@@ -89,11 +92,19 @@ public trait JetScope {
|
|||||||
class object {
|
class object {
|
||||||
public val ALL: (DescriptorKind) -> Boolean = { true }
|
public val ALL: (DescriptorKind) -> Boolean = { true }
|
||||||
public val EXTENSIONS: (DescriptorKind) -> Boolean = { it == EXTENSION_FUNCTION || it == EXTENSION_PROPERTY }
|
public val EXTENSIONS: (DescriptorKind) -> Boolean = { it == EXTENSION_FUNCTION || it == EXTENSION_PROPERTY }
|
||||||
public val FUNCTIONS: (DescriptorKind) -> Boolean = { it == NON_EXTENSION_FUNCTION || it == EXTENSION_FUNCTION }
|
public val FUNCTIONS: (DescriptorKind) -> Boolean = { it == ORDINARY_FUNCTION || it == EXTENSION_FUNCTION || it == SAM_CONSTRUCTOR }
|
||||||
public val CALLABLES: (DescriptorKind) -> Boolean = { it != CLASSIFIER && it != PACKAGE }
|
public val CALLABLES: (DescriptorKind) -> Boolean = { it == ORDINARY_FUNCTION
|
||||||
public val NON_EXTENSION_CALLABLES: (DescriptorKind) -> Boolean = { it == NON_EXTENSION_FUNCTION || it == NON_EXTENSION_PROPERTY || it == LOCAL_VARIABLE }
|
|| it == EXTENSION_FUNCTION
|
||||||
|
|| it == SAM_CONSTRUCTOR
|
||||||
|
|| it == NON_EXTENSION_PROPERTY
|
||||||
|
|| it == EXTENSION_PROPERTY
|
||||||
|
|| it == LOCAL_VARIABLE }
|
||||||
|
public val NON_EXTENSION_CALLABLES: (DescriptorKind) -> Boolean = { it == ORDINARY_FUNCTION
|
||||||
|
|| it == SAM_CONSTRUCTOR
|
||||||
|
|| it == NON_EXTENSION_PROPERTY
|
||||||
|
|| it == LOCAL_VARIABLE }
|
||||||
public val NON_EXTENSIONS: (DescriptorKind) -> Boolean = { it != EXTENSION_FUNCTION && it != EXTENSION_PROPERTY }
|
public val NON_EXTENSIONS: (DescriptorKind) -> Boolean = { it != EXTENSION_FUNCTION && it != EXTENSION_PROPERTY }
|
||||||
public val CLASSIFIERS: (DescriptorKind) -> Boolean = { it == CLASSIFIER }
|
public val CLASSIFIERS: (DescriptorKind) -> Boolean = { it == TYPE || it == ENUM_ENTRY || it == OBJECT }
|
||||||
public val PACKAGES: (DescriptorKind) -> Boolean = { it == PACKAGE }
|
public val PACKAGES: (DescriptorKind) -> Boolean = { it == PACKAGE }
|
||||||
public val VARIABLES_AND_PROPERTIES: (DescriptorKind) -> Boolean = { it == LOCAL_VARIABLE || it == NON_EXTENSION_PROPERTY || it == EXTENSION_PROPERTY }
|
public val VARIABLES_AND_PROPERTIES: (DescriptorKind) -> Boolean = { it == LOCAL_VARIABLE || it == NON_EXTENSION_PROPERTY || it == EXTENSION_PROPERTY }
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ public class DeserializedClassDescriptor(outerContext: DeserializationContext, p
|
|||||||
if (classId.isTopLevelClass()) {
|
if (classId.isTopLevelClass()) {
|
||||||
val fragments = context.packageFragmentProvider.getPackageFragments(classId.getPackageFqName())
|
val fragments = context.packageFragmentProvider.getPackageFragments(classId.getPackageFqName())
|
||||||
assert(fragments.size() == 1) { "there should be exactly one package: $fragments, class id is $classId" }
|
assert(fragments.size() == 1) { "there should be exactly one package: $fragments, class id is $classId" }
|
||||||
return fragments.iterator().next()
|
return fragments.single()
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return context.deserializeClass(classId.getOuterClassId()) ?: ErrorUtils.getErrorModule()
|
return context.deserializeClass(classId.getOuterClassId()) ?: ErrorUtils.getErrorModule()
|
||||||
|
|||||||
+2
-2
@@ -107,7 +107,7 @@ public abstract class DeserializedMemberScope protected(
|
|||||||
|
|
||||||
for (name in membersProtos().keySet()) {
|
for (name in membersProtos().keySet()) {
|
||||||
if (nameFilter(name)) {
|
if (nameFilter(name)) {
|
||||||
if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_FUNCTION) || kindFilter(JetScope.DescriptorKind.EXTENSION_FUNCTION)) {
|
if (kindFilter(JetScope.DescriptorKind.ORDINARY_FUNCTION) || kindFilter(JetScope.DescriptorKind.EXTENSION_FUNCTION)) {
|
||||||
result.addAll(getFunctions(name))
|
result.addAll(getFunctions(name))
|
||||||
}
|
}
|
||||||
if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_PROPERTY) || kindFilter(JetScope.DescriptorKind.EXTENSION_PROPERTY)) {
|
if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_PROPERTY) || kindFilter(JetScope.DescriptorKind.EXTENSION_PROPERTY)) {
|
||||||
@@ -118,7 +118,7 @@ public abstract class DeserializedMemberScope protected(
|
|||||||
|
|
||||||
addNonDeclaredDescriptors(result)
|
addNonDeclaredDescriptors(result)
|
||||||
|
|
||||||
if (kindFilter(JetScope.DescriptorKind.CLASSIFIER)) {
|
if (kindFilter(JetScope.DescriptorKind.TYPE) || kindFilter(JetScope.DescriptorKind.OBJECT) || kindFilter(JetScope.DescriptorKind.ENUM_ENTRY)) {
|
||||||
addClassDescriptors(result, nameFilter)
|
addClassDescriptors(result, nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -42,11 +42,11 @@ public class StubBasedPackageMemberDeclarationProvider(
|
|||||||
override fun getDeclarations(kindFilter: (JetScope.DescriptorKind) -> Boolean, nameFilter: (Name) -> Boolean): List<JetDeclaration> {
|
override fun getDeclarations(kindFilter: (JetScope.DescriptorKind) -> Boolean, nameFilter: (Name) -> Boolean): List<JetDeclaration> {
|
||||||
val result = ArrayList<JetDeclaration>()
|
val result = ArrayList<JetDeclaration>()
|
||||||
|
|
||||||
if (kindFilter(JetScope.DescriptorKind.CLASSIFIER)) {
|
if (kindFilter(JetScope.DescriptorKind.TYPE) || kindFilter(JetScope.DescriptorKind.OBJECT)) {
|
||||||
result.addDeclarations(JetFullClassNameIndex.getInstance(), nameFilter)
|
result.addDeclarations(JetFullClassNameIndex.getInstance(), nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (kindFilter(JetScope.DescriptorKind.NON_EXTENSION_FUNCTION) || kindFilter(JetScope.DescriptorKind.EXTENSION_FUNCTION)) {
|
if (kindFilter(JetScope.DescriptorKind.ORDINARY_FUNCTION) || kindFilter(JetScope.DescriptorKind.EXTENSION_FUNCTION)) {
|
||||||
result.addDeclarations(JetTopLevelFunctionsFqnNameIndex.getInstance(), nameFilter)
|
result.addDeclarations(JetTopLevelFunctionsFqnNameIndex.getInstance(), nameFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user