CreateExpectFix: fix selection for primary constructor

This commit is contained in:
Dmitry Gridin
2019-08-09 19:29:38 +03:00
parent 4a049b9b01
commit 3f7c983f04
@@ -138,7 +138,7 @@ class CreateExpectedClassFix(
val prefix = klass.fqName?.asString()?.plus(".") ?: "" val prefix = klass.fqName?.asString()?.plus(".") ?: ""
chooseMembers(project, membersForSelection, prefix) ?: return@block null chooseMembers(project, membersForSelection, prefix) ?: return@block null
} }
}.plus(members.filter(KtNamedDeclaration::isAlwaysActual)) }.asSequence().plus(members.filter(KtNamedDeclaration::isAlwaysActual)).flatMap(KtNamedDeclaration::selected).toSet()
val selectedClasses = findClasses(selectedElements + klass, commonModule) val selectedClasses = findClasses(selectedElements + klass, commonModule)
val resultDeclarations = if (selectedClasses != existingClasses) { val resultDeclarations = if (selectedClasses != existingClasses) {
@@ -164,7 +164,7 @@ class CreateExpectedClassFix(
generateClassOrObject(project, true, element, commonModule, listOfNotNull(outerExpectedClass), selectedClasses) generateClassOrObject(project, true, element, commonModule, listOfNotNull(outerExpectedClass), selectedClasses)
}) })
private tailrec fun findClasses(elements: List<KtNamedDeclaration>, module: Module): HashSet<String> { private tailrec fun findClasses(elements: Collection<KtNamedDeclaration>, module: Module): HashSet<String> {
val classes = elements.filterIsInstance<KtClassOrObject>() val classes = elements.filterIsInstance<KtClassOrObject>()
val existingNames = classes.mapNotNull { it.fqName?.asString() }.toHashSet() val existingNames = classes.mapNotNull { it.fqName?.asString() }.toHashSet()
val newExistingClasses = classes.filter { it.checkTypeAccessibilityInModule(module, existingNames) } val newExistingClasses = classes.filter { it.checkTypeAccessibilityInModule(module, existingNames) }
@@ -273,10 +273,16 @@ private fun repairActualModifiers(
private tailrec fun KtDeclaration.makeActualWithParents() { private tailrec fun KtDeclaration.makeActualWithParents() {
makeActual() makeActual()
safeAs<KtParameter>()?.parent?.parent?.safeAs<KtPrimaryConstructor>()?.takeUnless(KtDeclaration::hasActualModifier)?.makeActual()
containingClassOrObject?.takeUnless(KtDeclaration::hasActualModifier)?.makeActualWithParents() containingClassOrObject?.takeUnless(KtDeclaration::hasActualModifier)?.makeActualWithParents()
} }
private fun KtNamedDeclaration.selected(): Sequence<KtNamedDeclaration> {
val additionalSequence = safeAs<KtParameter>()?.parent?.parent?.safeAs<KtPrimaryConstructor>()?.let {
sequenceOf(it)
} ?: emptySequence()
return sequenceOf(this) + additionalSequence + containingClassOrObject?.selected().orEmpty()
}
class CreateExpectedPropertyFix( class CreateExpectedPropertyFix(
property: KtNamedDeclaration, property: KtNamedDeclaration,
targetExpectedClass: KtClassOrObject?, targetExpectedClass: KtClassOrObject?,