KT-6442 Completion of inner class name contains outer name
#KT-6442 Fixed
This commit is contained in:
+18
-17
@@ -101,7 +101,9 @@ public class ReferenceVariantsHelper(
|
||||
val receiverValue = ExpressionReceiver(receiverExpression, expressionType)
|
||||
val dataFlowInfo = context.getDataFlowInfo(expression)
|
||||
|
||||
descriptors.addMembers(receiverValue, callType, dataFlowInfo, kindFilter, nameFilter)
|
||||
for (variant in SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(receiverValue, context, dataFlowInfo)) {
|
||||
descriptors.addMembersFromReceiver(variant, callType, kindFilter, nameFilter)
|
||||
}
|
||||
|
||||
descriptors.addCallableExtensions(resolutionScope, receiverValue, dataFlowInfo, callType, kindFilter, nameFilter)
|
||||
}
|
||||
@@ -113,8 +115,9 @@ public class ReferenceVariantsHelper(
|
||||
|
||||
// process instance members that can be called via implicit receiver's instances
|
||||
val receivers = resolutionScope.getImplicitReceiversWithInstance()
|
||||
val fromReceiversFilter = kindFilter.withoutKinds(DescriptorKindFilter.CLASSIFIERS_MASK) exclude DescriptorKindExclude.Extensions
|
||||
receivers.flatMapTo(descriptorsSet) { it.getType().getMemberScope().getDescriptorsFiltered(fromReceiversFilter, nameFilter) }
|
||||
for (receiver in receivers) {
|
||||
descriptorsSet.addMembersFromReceiver(receiver.getType(), CallType.NORMAL, kindFilter, nameFilter)
|
||||
}
|
||||
|
||||
val dataFlowInfo = context.getDataFlowInfo(expression)
|
||||
val receiverValues = receivers.map { it.getValue() }
|
||||
@@ -135,25 +138,23 @@ public class ReferenceVariantsHelper(
|
||||
}
|
||||
}
|
||||
|
||||
private fun MutableCollection<DeclarationDescriptor>.addMembers(
|
||||
receiverValue: ExpressionReceiver,
|
||||
private fun MutableCollection<DeclarationDescriptor>.addMembersFromReceiver(
|
||||
receiverType: JetType,
|
||||
callType: CallType,
|
||||
dataFlowInfo: DataFlowInfo,
|
||||
kindFilter: DescriptorKindFilter,
|
||||
nameFilter: (Name) -> Boolean) {
|
||||
nameFilter: (Name) -> Boolean
|
||||
) {
|
||||
var memberFilter = kindFilter exclude DescriptorKindExclude.Extensions
|
||||
for (variant in SmartCastUtils.getSmartCastVariantsWithLessSpecificExcluded(receiverValue, context, dataFlowInfo)) {
|
||||
val members = variant.getMemberScope().getDescriptorsFiltered(DescriptorKindFilter.ALL, nameFilter) // filter by kind later because of constructors
|
||||
for (member in members) {
|
||||
if (member is ClassDescriptor) {
|
||||
if (member.isInner()) {
|
||||
member.getConstructors().filterTo(this) { callType.canCall(it) && memberFilter.accepts(it) }
|
||||
}
|
||||
}
|
||||
else if (callType.canCall(member) && memberFilter.accepts(member)) {
|
||||
this.add(member)
|
||||
val members = receiverType.getMemberScope().getDescriptorsFiltered(DescriptorKindFilter.ALL, nameFilter) // filter by kind later because of constructors
|
||||
for (member in members) {
|
||||
if (member is ClassDescriptor) {
|
||||
if (member.isInner()) {
|
||||
member.getConstructors().filterTo(this) { callType.canCall(it) && memberFilter.accepts(it) }
|
||||
}
|
||||
}
|
||||
else if (callType.canCall(member) && memberFilter.accepts(member)) {
|
||||
this.add(member)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -141,6 +141,9 @@ class TypeInstantiationItems(
|
||||
return lookupElement.addTail(tail)
|
||||
}
|
||||
|
||||
// not all inner classes can be instantiated and we handle them via constructors returned by ReferenceVariantsHelper
|
||||
if (classifier.isInner()) return null
|
||||
|
||||
val isAbstract = classifier.getModality() == Modality.ABSTRACT
|
||||
val allConstructors = classifier.getConstructors()
|
||||
val visibleConstructors = allConstructors.filter {
|
||||
|
||||
@@ -8,4 +8,4 @@ fun Outer.foo() {
|
||||
}
|
||||
|
||||
// ABSENT: Nested
|
||||
// ABSENT: Inner
|
||||
// EXIST: { itemText: "Inner", tailText: "()", typeText: "Outer.Inner" }
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
class A {
|
||||
inner class XYZ
|
||||
|
||||
fun foo() {
|
||||
val v: XYZ = <caret>
|
||||
}
|
||||
}
|
||||
|
||||
// ELEMENT: XYZ
|
||||
@@ -0,0 +1,9 @@
|
||||
class A {
|
||||
inner class XYZ
|
||||
|
||||
fun foo() {
|
||||
val v: XYZ = XYZ()<caret>
|
||||
}
|
||||
}
|
||||
|
||||
// ELEMENT: XYZ
|
||||
@@ -0,0 +1,9 @@
|
||||
class A {
|
||||
inner class XYZ
|
||||
}
|
||||
|
||||
fun A.foo(): A.XYZ {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// ELEMENT: XYZ
|
||||
@@ -0,0 +1,9 @@
|
||||
class A {
|
||||
inner class XYZ
|
||||
}
|
||||
|
||||
fun A.foo(): A.XYZ {
|
||||
return XYZ()<caret>
|
||||
}
|
||||
|
||||
// ELEMENT: XYZ
|
||||
@@ -0,0 +1,11 @@
|
||||
class C {
|
||||
inner class Inner
|
||||
}
|
||||
|
||||
fun foo() : C.Inner {
|
||||
return <caret>
|
||||
}
|
||||
|
||||
// ABSENT: Inner
|
||||
// EXIST: foo
|
||||
// NUMBER: 1
|
||||
@@ -636,6 +636,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NoInnerClassInstantiation.kt")
|
||||
public void testNoInnerClassInstantiation() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/NoInnerClassInstantiation.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("NoNothing.kt")
|
||||
public void testNoNothing() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/smart/NoNothing.kt");
|
||||
|
||||
+12
@@ -366,6 +366,18 @@ public class SmartCompletionHandlerTestGenerated extends AbstractSmartCompletion
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("InnerClassInstantiation1.kt")
|
||||
public void testInnerClassInstantiation1() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/InnerClassInstantiation1.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("InnerClassInstantiation2.kt")
|
||||
public void testInnerClassInstantiation2() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/InnerClassInstantiation2.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("JavaEnumMemberInsertsImport.kt")
|
||||
public void testJavaEnumMemberInsertsImport() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/handlers/smart/JavaEnumMemberInsertsImport.kt");
|
||||
|
||||
Reference in New Issue
Block a user