Completion of object's in type position - they can be used there

This commit is contained in:
Valentin Kipyatkov
2014-12-05 08:05:23 +03:00
parent ca2b1efac9
commit cb5c12cda3
9 changed files with 37 additions and 28 deletions
@@ -35,5 +35,4 @@ public class SamConstructorDescriptor(
public object SamConstructorDescriptorKindExclude : DescriptorKindExclude {
override fun matches(descriptor: DeclarationDescriptor) = descriptor is SamConstructorDescriptor
override fun toString() = this.javaClass.getSimpleName()
}
@@ -185,17 +185,20 @@ public class DescriptorKindFilter(
public trait DescriptorKindExclude {
public fun matches(descriptor: DeclarationDescriptor): Boolean
override fun toString() = this.javaClass.getSimpleName()
public object Extensions : DescriptorKindExclude {
override fun matches(descriptor: DeclarationDescriptor)
= descriptor is CallableDescriptor && descriptor.getExtensionReceiverParameter() != null
override fun toString() = this.javaClass.getSimpleName()
}
public object NonExtensions : DescriptorKindExclude {
override fun matches(descriptor: DeclarationDescriptor)
= descriptor !is CallableDescriptor || descriptor.getExtensionReceiverParameter() == null
}
override fun toString() = this.javaClass.getSimpleName()
public object EnumEntry : DescriptorKindExclude {
override fun matches(descriptor: DeclarationDescriptor)
= descriptor is ClassDescriptor && descriptor.getKind() == ClassKind.ENUM_ENTRY
}
}
@@ -23,7 +23,6 @@ import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.plugin.caches.resolve.*
import org.jetbrains.jet.plugin.codeInsight.ReferenceVariantsHelper
import org.jetbrains.jet.plugin.completion.smart.SmartCompletion
@@ -43,6 +42,7 @@ import org.jetbrains.jet.lang.psi.psiUtil.getStrictParentOfType
import org.jetbrains.jet.plugin.util.makeNotNullable
import org.jetbrains.jet.plugin.util.CallType
import org.jetbrains.jet.plugin.completion.isVisible
import org.jetbrains.jet.lang.resolve.scopes.DescriptorKindExclude
class CompletionSessionConfiguration(
val completeNonImportedDeclarations: Boolean,
@@ -187,18 +187,13 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
val completeReference = jetReference != null && !isOnlyKeywordCompletion()
val onlyTypes = completeReference && shouldRunOnlyTypeCompletion()
val kindMask = if (onlyTypes)
DescriptorKindFilter.NON_SINGLETON_CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK
val kindFilter = if (onlyTypes)
DescriptorKindFilter(DescriptorKindFilter.CLASSIFIERS_MASK or DescriptorKindFilter.PACKAGES_MASK) exclude DescriptorKindExclude.EnumEntry
else
DescriptorKindFilter.ALL_KINDS_MASK
val kindFilter = DescriptorKindFilter(kindMask)
DescriptorKindFilter(DescriptorKindFilter.ALL_KINDS_MASK)
if (completeReference) {
addReferenceVariants(kindFilter, shouldCastToRuntimeType = false)
if (onlyTypes) {
collector.addDescriptorElements(listOf(KotlinBuiltIns.getInstance().getUnit()), false)
}
}
KeywordCompletion.complete(parameters, prefixMatcher.getPrefix(), collector)
@@ -223,7 +218,7 @@ class BasicCompletionSession(configuration: CompletionSessionConfiguration,
private fun addNonImported(onlyTypes: Boolean) {
if (shouldRunTopLevelCompletion()) {
addAllClasses { if (onlyTypes) !it.isSingleton() else it != ClassKind.ENUM_ENTRY }
addAllClasses { it != ClassKind.ENUM_ENTRY }
if (!onlyTypes) {
collector.addDescriptorElements(getKotlinTopLevelCallables(), suppressAutoInsertion = true)
@@ -4,5 +4,4 @@ fun test() {
val a : Named<caret>
}
// INVOCATION_COUNT: 2
// ABSENT: NamedObject
// EXIST: NamedObject
@@ -0,0 +1,3 @@
package ppp
object SomeObject
@@ -0,0 +1,4 @@
fun foo(): S<caret>
// INVOCATION_COUNT: 2
// EXIST: SomeObject
@@ -700,12 +700,6 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest(fileName);
}
@TestMetadata("NoObjectInTypePosition.kt")
public void testNoObjectInTypePosition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
doTest(fileName);
}
@TestMetadata("NoPackageFacadeClasses.kt")
public void testNoPackageFacadeClasses() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoPackageFacadeClasses.kt");
@@ -724,6 +718,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest(fileName);
}
@TestMetadata("ObjectInTypePosition.kt")
public void testObjectInTypePosition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/ObjectInTypePosition.kt");
doTest(fileName);
}
@TestMetadata("ObjectRedeclaration1.kt")
public void testObjectRedeclaration1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/ObjectRedeclaration1.kt");
@@ -700,12 +700,6 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest(fileName);
}
@TestMetadata("NoObjectInTypePosition.kt")
public void testNoObjectInTypePosition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoObjectInTypePosition.kt");
doTest(fileName);
}
@TestMetadata("NoPackageFacadeClasses.kt")
public void testNoPackageFacadeClasses() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/NoPackageFacadeClasses.kt");
@@ -724,6 +718,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest(fileName);
}
@TestMetadata("ObjectInTypePosition.kt")
public void testObjectInTypePosition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/ObjectInTypePosition.kt");
doTest(fileName);
}
@TestMetadata("ObjectRedeclaration1.kt")
public void testObjectRedeclaration1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/ObjectRedeclaration1.kt");
@@ -174,6 +174,12 @@ public class MultiFileJvmBasicCompletionTestGenerated extends AbstractMultiFileJ
doTest(fileName);
}
@TestMetadata("ObjectInTypePosition")
public void testObjectInTypePosition() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/multifile/ObjectInTypePosition/");
doTest(fileName);
}
@TestMetadata("TopLevelFunction")
public void testTopLevelFunction() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/multifile/TopLevelFunction/");