From 1bc132bc1abca039fb3ddab660f7f3357617aaef Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 1 Oct 2015 23:11:52 +0300 Subject: [PATCH] No members&extensions after non-qualified "::" because it will be soon unsupported by the compiler --- .../codeInsight/ReferenceVariantsHelper.kt | 51 +++++++------------ .../jetbrains/kotlin/idea/util/CallType.kt | 14 ++--- .../callableReference/EmptyQualifier.kt | 16 +++--- .../EmptyQualifierInExtensionFun.kt | 8 +-- .../common/callableReference/SmartCastThis.kt | 31 ----------- .../callableReference/SyntheticExtensions2.kt | 10 ---- ...CallableReferenceNotImported.dependency.kt | 8 ++- .../CallableReferenceNotImported.kt | 3 +- .../basic/callableReference/Property.kt | 4 +- .../basic/callableReference/Property.kt.after | 4 +- ...CallableReferenceNotImported.dependency.kt | 6 +-- .../CallableReferenceNotImported.kt | 4 +- .../test/JSBasicCompletionTestGenerated.java | 12 ----- .../test/JvmBasicCompletionTestGenerated.java | 12 ----- 14 files changed, 44 insertions(+), 139 deletions(-) delete mode 100644 idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt delete mode 100644 idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index b3f9d073574..b03108d161a 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -23,11 +23,13 @@ import org.jetbrains.kotlin.idea.resolve.frontendService import org.jetbrains.kotlin.idea.util.* import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.JetCodeFragment +import org.jetbrains.kotlin.psi.JetExpression +import org.jetbrains.kotlin.psi.JetSimpleNameExpression +import org.jetbrains.kotlin.psi.JetTypeReference import org.jetbrains.kotlin.psi.psiUtil.getParentOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo -import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager import org.jetbrains.kotlin.resolve.descriptorUtil.isAnnotatedAsHidden import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension @@ -105,7 +107,10 @@ public class ReferenceVariantsHelper( return getVariantsForUserType(callTypeAndReceiver.receiver, expression, kindFilter, nameFilter) } - is CallTypeAndReceiver.CALLABLE_REFERENCE -> receiverExpression = null // handled below + is CallTypeAndReceiver.CALLABLE_REFERENCE -> { + val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression.parent as JetExpression] ?: return emptyList() + return getVariantsForCallableReference(callTypeAndReceiver.receiver, resolutionScope, kindFilter, nameFilter) + } is CallTypeAndReceiver.DEFAULT -> receiverExpression = null is CallTypeAndReceiver.DOT -> receiverExpression = callTypeAndReceiver.receiver @@ -116,8 +121,8 @@ public class ReferenceVariantsHelper( else -> throw RuntimeException() //TODO: see KT-9394 } - val resolutionScope = resolutionScope(expression, context) ?: return emptyList() - val dataFlowInfo = dataFlowInfo(expression, context) + val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return emptyList() + val dataFlowInfo = context.getDataFlowInfo(expression) val containingDeclaration = resolutionScope.getContainingDeclaration() val smartCastManager = resolutionFacade.frontendService() @@ -125,10 +130,6 @@ public class ReferenceVariantsHelper( smartCastManager.getSmartCastVariantsWithLessSpecificExcluded(it.value, context, containingDeclaration, dataFlowInfo) }.toSet() - if (callTypeAndReceiver is CallTypeAndReceiver.CALLABLE_REFERENCE) { - return getVariantsForCallableReference(callTypeAndReceiver.receiver, resolutionScope, implicitReceiverTypes, kindFilter, nameFilter) - } - val descriptors = LinkedHashSet() if (receiverExpression != null) { @@ -180,7 +181,6 @@ public class ReferenceVariantsHelper( private fun getVariantsForCallableReference( qualifierTypeRef: JetTypeReference?, resolutionScope: JetScope, - implicitReceiverTypes: Collection, kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean ): Collection { @@ -188,17 +188,13 @@ public class ReferenceVariantsHelper( if (qualifierTypeRef != null) { val type = context[BindingContext.TYPE, qualifierTypeRef] ?: return emptyList() - descriptors.addNonExtensionMembers(listOf(type), kindFilter, nameFilter, constructorsForInnerClassesOnly = false) + descriptors.addNonExtensionMembers(listOf(type), kindFilter, nameFilter, constructorFilter = { true }) descriptors.addScopeAndSyntheticExtensions(resolutionScope, listOf(type), CallType.CALLABLE_REFERENCE, kindFilter, nameFilter) } else { // process non-instance members and class constructors - descriptors.addNonExtensionCallablesAndConstructors(resolutionScope, kindFilter, nameFilter, constructorsForInnerClassesOnly = false) - - descriptors.addNonExtensionMembers(implicitReceiverTypes, kindFilter, nameFilter, constructorsForInnerClassesOnly = true) - - descriptors.addScopeAndSyntheticExtensions(resolutionScope, implicitReceiverTypes, CallType.CALLABLE_REFERENCE, kindFilter, nameFilter) + descriptors.addNonExtensionCallablesAndConstructors(resolutionScope, kindFilter, nameFilter, constructorFilter = { !it.isInner }) } return descriptors } @@ -226,7 +222,7 @@ public class ReferenceVariantsHelper( kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean ) { - addNonExtensionMembers(receiverTypes, kindFilter, nameFilter, constructorsForInnerClassesOnly = true) + addNonExtensionMembers(receiverTypes, kindFilter, nameFilter, constructorFilter = { it.isInner }) addMemberExtensions(implicitReceiverTypes, receiverTypes, callType, kindFilter, nameFilter) addScopeAndSyntheticExtensions(resolutionScope, receiverTypes, callType, kindFilter, nameFilter) } @@ -250,10 +246,10 @@ public class ReferenceVariantsHelper( receiverTypes: Collection, kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean, - constructorsForInnerClassesOnly: Boolean + constructorFilter: (ClassDescriptor) -> Boolean ) { for (receiverType in receiverTypes) { - addNonExtensionCallablesAndConstructors(receiverType.memberScope, kindFilter, nameFilter, constructorsForInnerClassesOnly) + addNonExtensionCallablesAndConstructors(receiverType.memberScope, kindFilter, nameFilter, constructorFilter) } } @@ -261,7 +257,7 @@ public class ReferenceVariantsHelper( scope: JetScope, kindFilter: DescriptorKindFilter, nameFilter: (Name) -> Boolean, - constructorsForInnerClassesOnly: Boolean + constructorFilter: (ClassDescriptor) -> Boolean ) { var filterToUse = DescriptorKindFilter(kindFilter.kindMask and DescriptorKindFilter.CALLABLES.kindMask).exclude(DescriptorKindExclude.Extensions) @@ -272,8 +268,8 @@ public class ReferenceVariantsHelper( for (descriptor in scope.getDescriptorsFiltered(filterToUse, nameFilter)) { if (descriptor is ClassDescriptor) { - if (constructorsForInnerClassesOnly && !descriptor.isInner) continue if (descriptor.modality == Modality.ABSTRACT || descriptor.modality == Modality.SEALED) continue + if (!constructorFilter(descriptor)) continue descriptor.constructors.filterTo(this) { kindFilter.accepts(it) } } else if (kindFilter.accepts(descriptor)) { @@ -333,17 +329,4 @@ public class ReferenceVariantsHelper( val resolutionScope = context[BindingContext.RESOLUTION_SCOPE, expression] ?: return listOf() return resolutionScope.getDescriptorsFiltered(DescriptorKindFilter.PACKAGES, nameFilter).filter(visibilityFilter) } - - companion object { - //TODO: drop these methods - public fun resolutionScope(expression: JetExpression, bindingContext: BindingContext): JetScope? { - val parent = expression.parent - return bindingContext[BindingContext.RESOLUTION_SCOPE, if (parent is JetCallableReferenceExpression) parent else expression] - } - - public fun dataFlowInfo(expression: JetExpression, bindingContext: BindingContext): DataFlowInfo { - val parent = expression.parent - return bindingContext.getDataFlowInfo(if (parent is JetCallableReferenceExpression) parent else expression) - } - } } diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt index 766ea5b0c67..29e0389c279 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/CallType.kt @@ -20,13 +20,13 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor -import org.jetbrains.kotlin.idea.codeInsight.ReferenceVariantsHelper import org.jetbrains.kotlin.lexer.JetTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getReceiverExpression import org.jetbrains.kotlin.psi.psiUtil.isImportDirectiveExpression import org.jetbrains.kotlin.psi.psiUtil.isPackageDirectiveExpression import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.bindingContextUtil.getDataFlowInfo import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager import org.jetbrains.kotlin.resolve.scopes.DescriptorKindExclude @@ -158,13 +158,7 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes( val receiverExpression: JetExpression? when (this) { is CallTypeAndReceiver.CALLABLE_REFERENCE -> { - if (receiver != null) { - val type = bindingContext[BindingContext.TYPE, receiver] - return type.singletonOrEmptyList() - } - else { - receiverExpression = null - } + return receiver?.let { bindingContext[BindingContext.TYPE, it] }.singletonOrEmptyList() } is CallTypeAndReceiver.DEFAULT -> receiverExpression = null @@ -187,11 +181,11 @@ public fun CallTypeAndReceiver<*, *>.receiverTypes( expressionType?.let { listOf(ExpressionReceiver(receiverExpression, expressionType)) } ?: return emptyList() } else { - val resolutionScope = ReferenceVariantsHelper.resolutionScope(position, bindingContext) ?: return emptyList() + val resolutionScope = bindingContext[BindingContext.RESOLUTION_SCOPE, position] ?: return emptyList() resolutionScope.getImplicitReceiversWithInstance().map { it.value } } - val dataFlowInfo = ReferenceVariantsHelper.dataFlowInfo(position, bindingContext) + val dataFlowInfo = bindingContext.getDataFlowInfo(position) return receiverValues.flatMap { receiverValue -> val dataFlowValue = DataFlowValueFactory.createDataFlowValue(receiverValue, bindingContext, moduleDescriptor) diff --git a/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifier.kt b/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifier.kt index 89ecb10fc86..ae0f7e11d04 100644 --- a/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifier.kt +++ b/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifier.kt @@ -7,13 +7,13 @@ val String.extensionVal: Int val globalVal = 1 var globalVar = 1 +fun funWithFunctionParameter(p: () -> Unit) {} + class C { fun memberFun(){} val memberVal = 1 - fun funWithFunctionParameter(p: () -> Unit) {} - class NestedClass inner class InnerClass @@ -38,16 +38,16 @@ abstract class AbstractClass // EXIST: { itemText: "globalVar", attributes: "" } // ABSENT: extensionFun // ABSENT: extensionVal -// EXIST: { itemText: "memberFun", attributes: "bold" } -// EXIST: { itemText: "memberVal", attributes: "bold" } +// ABSENT: memberFun +// ABSENT: memberVal // EXIST: { itemText: "localFun", attributes: "" } -// ABSENT: { itemText: "local", attributes: "" } -// EXIST: { itemText: "companionObjectFun", attributes: "bold" } +// ABSENT: local +// ABSENT: companionObjectFun // EXIST: { itemText: "C", attributes: "" } // EXIST: { itemText: "NestedClass", attributes: "" } -// EXIST: { itemText: "InnerClass", attributes: "bold" } +// ABSENT: InnerClass // ABSENT: WithPrivateConstructor // ABSENT: AbstractClass // ABSENT: class // ABSENT: class.java -// EXIST: { itemText: "funWithFunctionParameter", tailText: "(p: () -> Unit)", attributes: "bold" } +// EXIST: { itemText: "funWithFunctionParameter", tailText: "(p: () -> Unit) ()", attributes: "" } diff --git a/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifierInExtensionFun.kt b/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifierInExtensionFun.kt index 3755a9f0c5d..a095912e9c2 100644 --- a/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifierInExtensionFun.kt +++ b/idea/idea-completion/testData/basic/common/callableReference/EmptyQualifierInExtensionFun.kt @@ -15,9 +15,9 @@ fun C.foo() { val v = :: } -// EXIST: { itemText: "memberFun", attributes: "bold" } -// EXIST: { itemText: "memberVal", attributes: "bold" } -// EXIST: { itemText: "hashCode", attributes: "" } +// ABSENT: memberFun +// ABSENT: memberVal +// ABSENT: hashCode // ABSENT: companionObjectFun // ABSENT: NestedClass -// EXIST: { itemText: "InnerClass", attributes: "bold" } +// ABSENT: InnerClass diff --git a/idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt b/idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt deleted file mode 100644 index f7960281b67..00000000000 --- a/idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt +++ /dev/null @@ -1,31 +0,0 @@ -interface I1 { - fun i1Member() -} - -interface I2 { - fun i2Member() -} - -fun I1.i1Extension(){} -fun I2.i2Extension(){} -fun Any.anyExtension(){} -fun String.stringExtension(){} - -open class C { - fun cMember(){} - - fun foo() { - if (this is I1 && this is I2) { - val v = :: - } - } -} - -// EXIST: { itemText: "i1Extension", attributes: "bold" } -// EXIST: { itemText: "i2Extension", attributes: "bold" } -// EXIST: { itemText: "i1Member", attributes: "bold" } -// EXIST: { itemText: "i2Member", attributes: "bold" } -// EXIST: { itemText: "anyExtension", attributes: "" } -// EXIST: { itemText: "hashCode", attributes: "" } -// ABSENT: stringExtension -// EXIST: { itemText: "cMember", attributes: "bold" } diff --git a/idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt b/idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt deleted file mode 100644 index ec391f7ffd2..00000000000 --- a/idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt +++ /dev/null @@ -1,10 +0,0 @@ -import java.io.File - -class MyFile : File("") { - val v = :: -} - -// EXIST_JAVA_ONLY: { itemText: "getFreeSpace", tailText: "()", attributes: "" } -// ABSENT: freeSpace -// EXIST_JAVA_ONLY: { itemText: "isFile", tailText: "()", attributes: "" } -// ABSENT: { itemText: "isFile", tailText: " (from isFile())" } diff --git a/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt b/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt index 5b5d42561ab..4892804af8d 100644 --- a/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt +++ b/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt @@ -1,9 +1,7 @@ package dependency -fun CharSequence.extFun(){} - -fun Int.wrongExtFun(){} - fun topLevelFun(){} -val topLevelVal: Int = 1 \ No newline at end of file +val topLevelVal: Int = 1 + +fun CharSequence.extFun(){} diff --git a/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.kt b/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.kt index 07036ccbc1a..2d58e6f45ae 100644 --- a/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.kt +++ b/idea/idea-completion/testData/basic/multifile/CallableReferenceNotImported/CallableReferenceNotImported.kt @@ -3,7 +3,6 @@ fun String.foo() { } // INVOCATION_COUNT: 2 -// EXIST: extFun // EXIST: topLevelFun // EXIST: topLevelVal -// ABSENT: wrongExtFun +// ABSENT: extFun diff --git a/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt b/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt index 1b4e7560177..0a98338902b 100644 --- a/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt +++ b/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt @@ -1,6 +1,6 @@ -class C { - val prop: Int = 0 +val prop: Int = 0 +class C { fun foo() { val v = :: } diff --git a/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt.after b/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt.after index e3f4c71d3ff..293d8fd217b 100644 --- a/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt.after +++ b/idea/idea-completion/testData/handlers/basic/callableReference/Property.kt.after @@ -1,6 +1,6 @@ -class C { - val prop: Int = 0 +val prop: Int = 0 +class C { fun foo() { val v = ::prop } diff --git a/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt b/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt index c3485310a67..6bc316e082f 100644 --- a/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt +++ b/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.dependency.kt @@ -1,7 +1,5 @@ package dependency -fun String.extFun(){} -fun String.wrongExtFun(p: Int){} - fun topLevelFun(){} -fun wrongTopLevelFun(p: Int){} + +fun String.extFun(){} diff --git a/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.kt b/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.kt index d82f957740b..41f084f0710 100644 --- a/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.kt +++ b/idea/idea-completion/testData/smartMultiFile/CallableReferenceNotImported/CallableReferenceNotImported.kt @@ -7,7 +7,5 @@ fun bar(p: String.() -> Unit) { } // INVOCATION_COUNT: 2 -// EXIST: extFun // EXIST: topLevelFun -// ABSENT: wrongExtFun -// ABSENT: wrongTopLevelFun +// ABSENT: extFun diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 60c5b5b8768..f31f9142932 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -1098,23 +1098,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } - @TestMetadata("SmartCastThis.kt") - public void testSmartCastThis() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt"); - doTest(fileName); - } - @TestMetadata("SyntheticExtensions.kt") public void testSyntheticExtensions() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions.kt"); doTest(fileName); } - - @TestMetadata("SyntheticExtensions2.kt") - public void testSyntheticExtensions2() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt"); - doTest(fileName); - } } @TestMetadata("idea/idea-completion/testData/basic/common/extensions") diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index d202ee6213e..ac7319cc813 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -1098,23 +1098,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } - @TestMetadata("SmartCastThis.kt") - public void testSmartCastThis() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SmartCastThis.kt"); - doTest(fileName); - } - @TestMetadata("SyntheticExtensions.kt") public void testSyntheticExtensions() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions.kt"); doTest(fileName); } - - @TestMetadata("SyntheticExtensions2.kt") - public void testSyntheticExtensions2() throws Exception { - String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/callableReference/SyntheticExtensions2.kt"); - doTest(fileName); - } } @TestMetadata("idea/idea-completion/testData/basic/common/extensions")