Add a dialog to select members for export in expect class
#KT-31476 Fixed #KT-31446 Fixed #KT-31033 Fixed
This commit is contained in:
@@ -125,15 +125,18 @@ private fun KtClassOrObject.isExpected(): Boolean {
|
|||||||
|
|
||||||
fun KtDeclaration.hasMatchingExpected() = (toDescriptor() as? MemberDescriptor)?.expectedDescriptor() != null
|
fun KtDeclaration.hasMatchingExpected() = (toDescriptor() as? MemberDescriptor)?.expectedDescriptor() != null
|
||||||
|
|
||||||
fun KtDeclaration.isEffectivelyActual(): Boolean {
|
fun KtDeclaration.isEffectivelyActual(checkConstructor: Boolean = true): Boolean {
|
||||||
if (hasActualModifier()) return true
|
if (hasActualModifier()) return true
|
||||||
|
|
||||||
val descriptor = toDescriptor() as? MemberDescriptor ?: return false
|
val descriptor = toDescriptor() as? MemberDescriptor ?: return false
|
||||||
return descriptor.isEffectivelyActual()
|
return descriptor.isEffectivelyActual(checkConstructor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun MemberDescriptor.isEffectivelyActual(): Boolean =
|
private fun MemberDescriptor.isEffectivelyActual(checkConstructor: Boolean = true): Boolean =
|
||||||
isActual || isEnumEntryInActual() || (this is ClassConstructorDescriptor && containingDeclaration.isEffectivelyActual())
|
isActual || isEnumEntryInActual() || isConstructorInActual(checkConstructor)
|
||||||
|
|
||||||
|
private fun MemberDescriptor.isConstructorInActual(checkConstructor: Boolean) =
|
||||||
|
checkConstructor && this is ClassConstructorDescriptor && containingDeclaration.isEffectivelyActual(checkConstructor)
|
||||||
|
|
||||||
private fun MemberDescriptor.isEnumEntryInActual() =
|
private fun MemberDescriptor.isEnumEntryInActual() =
|
||||||
(DescriptorUtils.isEnumEntry(this) && (containingDeclaration as? MemberDescriptor)?.isActual == true)
|
(DescriptorUtils.isEnumEntry(this) && (containingDeclaration as? MemberDescriptor)?.isActual == true)
|
||||||
|
|||||||
+5
-1
@@ -387,7 +387,11 @@ fun generateUnsupportedOrSuperCall(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtNamedDeclaration.makeNotActual() {
|
fun KtModifierListOwner.makeNotActual() {
|
||||||
removeModifier(KtTokens.ACTUAL_KEYWORD)
|
removeModifier(KtTokens.ACTUAL_KEYWORD)
|
||||||
removeModifier(KtTokens.IMPL_KEYWORD)
|
removeModifier(KtTokens.IMPL_KEYWORD)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun KtModifierListOwner.makeActual() {
|
||||||
|
addModifier(KtTokens.ACTUAL_KEYWORD)
|
||||||
|
}
|
||||||
+4
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint
|
import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||||
|
|
||||||
abstract class AbstractCreateDeclarationFix<D : KtNamedDeclaration>(
|
abstract class AbstractCreateDeclarationFix<D : KtNamedDeclaration>(
|
||||||
declaration: D,
|
declaration: D,
|
||||||
@@ -81,7 +82,9 @@ abstract class AbstractCreateDeclarationFix<D : KtNamedDeclaration>(
|
|||||||
}
|
}
|
||||||
val reformatted = CodeStyleManager.getInstance(project).reformat(generatedDeclaration)
|
val reformatted = CodeStyleManager.getInstance(project).reformat(generatedDeclaration)
|
||||||
val shortened = ShortenReferences.DEFAULT.process(reformatted as KtElement)
|
val shortened = ShortenReferences.DEFAULT.process(reformatted as KtElement)
|
||||||
EditorHelper.openInEditor(shortened)?.caretModel?.moveToOffset(shortened.textRange.startOffset)
|
EditorHelper.openInEditor(shortened)?.caretModel?.moveToOffset(
|
||||||
|
(shortened as? KtNamedDeclaration)?.nameIdentifier?.startOffset ?: shortened.startOffset
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,20 +6,32 @@
|
|||||||
package org.jetbrains.kotlin.idea.quickfix.expectactual
|
package org.jetbrains.kotlin.idea.quickfix.expectactual
|
||||||
|
|
||||||
import com.intellij.codeInsight.intention.IntentionAction
|
import com.intellij.codeInsight.intention.IntentionAction
|
||||||
|
import com.intellij.ide.util.MemberChooser
|
||||||
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.module.Module
|
import com.intellij.openapi.module.Module
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.idea.caches.project.implementedModules
|
import org.jetbrains.kotlin.idea.caches.project.implementedModules
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
||||||
|
import org.jetbrains.kotlin.idea.core.overrideImplement.makeActual
|
||||||
|
import org.jetbrains.kotlin.idea.core.overrideImplement.makeNotActual
|
||||||
import org.jetbrains.kotlin.idea.core.toDescriptor
|
import org.jetbrains.kotlin.idea.core.toDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject
|
||||||
import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory
|
import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory
|
||||||
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
|
import org.jetbrains.kotlin.idea.util.hasInlineModifier
|
||||||
|
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
|
||||||
import org.jetbrains.kotlin.idea.util.liftToExpected
|
import org.jetbrains.kotlin.idea.util.liftToExpected
|
||||||
import org.jetbrains.kotlin.idea.util.module
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClass
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
||||||
@@ -87,10 +99,104 @@ class CreateExpectedClassFix(
|
|||||||
klass: KtClassOrObject,
|
klass: KtClassOrObject,
|
||||||
outerExpectedClass: KtClassOrObject?,
|
outerExpectedClass: KtClassOrObject?,
|
||||||
commonModule: Module
|
commonModule: Module
|
||||||
) : CreateExpectedFix<KtClassOrObject>(klass, outerExpectedClass, commonModule, { project, element ->
|
) : CreateExpectedFix<KtClassOrObject>(klass, outerExpectedClass, commonModule, block@{ project, element ->
|
||||||
|
val originalCollection = element.collectDeclarations(false).filter(KtDeclaration::canAddActualModifier).toList()
|
||||||
|
val collection = originalCollection.filterNot(KtDeclaration::isAlwaysActual)
|
||||||
|
val selectedElements = when {
|
||||||
|
ApplicationManager.getApplication().isUnitTestMode -> collection.filter { it.isEffectivelyActual(false) }
|
||||||
|
collection.any(KtDeclaration::hasActualModifier) && collection.any { !it.hasActualModifier() } -> {
|
||||||
|
val prefix = klass.fqName?.asString()?.plus(".") ?: ""
|
||||||
|
chooseMembers(project, collection, prefix) ?: return@block null
|
||||||
|
}
|
||||||
|
else -> null
|
||||||
|
}
|
||||||
|
|
||||||
|
project.executeWriteCommand("Repair actual members") {
|
||||||
|
repairActualModifiers(originalCollection, selectedElements)
|
||||||
|
}
|
||||||
|
|
||||||
generateClassOrObject(project, true, element, listOfNotNull(outerExpectedClass))
|
generateClassOrObject(project, true, element, listOfNotNull(outerExpectedClass))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
private fun KtDeclaration.canAddActualModifier() = when (this) {
|
||||||
|
is KtEnumEntry -> false
|
||||||
|
is KtParameter -> this.hasValOrVar()
|
||||||
|
else -> true
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* @return null if close without OK
|
||||||
|
*/
|
||||||
|
private fun chooseMembers(project: Project, collection: Collection<KtDeclaration>, prefixToRemove: String): List<KtDeclaration>? {
|
||||||
|
val classMembers = collection.map { Member(prefixToRemove, it, it.resolveToDescriptorIfAny()!!) }
|
||||||
|
return MemberChooser(
|
||||||
|
classMembers.toTypedArray(),
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
project
|
||||||
|
).run {
|
||||||
|
title = "Choose actual members"
|
||||||
|
setCopyJavadocVisible(false)
|
||||||
|
selectElements(classMembers.filter { (it.element as KtDeclaration).hasActualModifier() }.toTypedArray())
|
||||||
|
show()
|
||||||
|
if (!isOK) null else selectedElements?.map { it.element as KtDeclaration }.orEmpty()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Member(val prefix: String, element: KtElement, descriptor: DeclarationDescriptor) :
|
||||||
|
DescriptorMemberChooserObject(element, descriptor) {
|
||||||
|
override fun getText(): String {
|
||||||
|
val text = super.getText()
|
||||||
|
return if (descriptor is ClassDescriptor) text.removePrefix(prefix)
|
||||||
|
else text
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtClassOrObject.collectDeclarations(withSelf: Boolean = true): Sequence<KtDeclaration> {
|
||||||
|
val thisSequence = if (withSelf) sequenceOf(this) else emptySequence()
|
||||||
|
val primaryConstructorSequence = primaryConstructorParameters.asSequence() + primaryConstructor.let {
|
||||||
|
if (it != null) sequenceOf(it) else emptySequence()
|
||||||
|
}
|
||||||
|
return thisSequence + primaryConstructorSequence + declarations.asSequence().flatMap {
|
||||||
|
if (it is KtClassOrObject) it.collectDeclarations() else sequenceOf(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun repairActualModifiers(
|
||||||
|
originalElements: Collection<KtDeclaration>,
|
||||||
|
// If null, all class declarations are actual
|
||||||
|
selectedElements: Collection<KtDeclaration>?
|
||||||
|
) {
|
||||||
|
if (selectedElements == null)
|
||||||
|
for (original in originalElements) {
|
||||||
|
original.recursivelyMakeActual()
|
||||||
|
}
|
||||||
|
else
|
||||||
|
for (original in originalElements) {
|
||||||
|
if (original.isAlwaysActual() || original in selectedElements)
|
||||||
|
original.recursivelyMakeActual()
|
||||||
|
else
|
||||||
|
original.makeNotActual()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private tailrec fun KtDeclaration.recursivelyMakeActual() {
|
||||||
|
makeActual()
|
||||||
|
containingClassOrObject?.takeUnless(KtDeclaration::hasActualModifier)?.recursivelyMakeActual()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtDeclaration.isAlwaysActual(): Boolean {
|
||||||
|
val primaryConstructor = when (this) {
|
||||||
|
is KtPrimaryConstructor -> this
|
||||||
|
is KtParameter -> (parent as? KtParameterList)?.parent as? KtPrimaryConstructor
|
||||||
|
else -> null
|
||||||
|
} ?: return false
|
||||||
|
|
||||||
|
return primaryConstructor.containingClass()?.let {
|
||||||
|
it.isAnnotation() || it.hasInlineModifier()
|
||||||
|
} ?: false
|
||||||
|
}
|
||||||
|
|
||||||
class CreateExpectedPropertyFix(
|
class CreateExpectedPropertyFix(
|
||||||
property: KtNamedDeclaration,
|
property: KtNamedDeclaration,
|
||||||
targetExpectedClass: KtClassOrObject?,
|
targetExpectedClass: KtClassOrObject?,
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.idea.project.platform
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.idea.util.hasDeclarationOf
|
import org.jetbrains.kotlin.idea.util.hasDeclarationOf
|
||||||
|
import org.jetbrains.kotlin.idea.util.hasInlineModifier
|
||||||
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
|
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
|
||||||
import org.jetbrains.kotlin.idea.util.module
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||||
@@ -172,7 +173,7 @@ internal fun KtPsiFactory.generateClassOrObject(
|
|||||||
}
|
}
|
||||||
declLoop@ for (originalDeclaration in originalClass.declarations.filter { !it.exists() }) {
|
declLoop@ for (originalDeclaration in originalClass.declarations.filter { !it.exists() }) {
|
||||||
val descriptor = originalDeclaration.toDescriptor() ?: continue
|
val descriptor = originalDeclaration.toDescriptor() ?: continue
|
||||||
if (generateExpectClass && !originalDeclaration.isEffectivelyActual()) continue
|
if (generateExpectClass && !originalDeclaration.isEffectivelyActual(false)) continue
|
||||||
val generatedDeclaration: KtDeclaration = when (originalDeclaration) {
|
val generatedDeclaration: KtDeclaration = when (originalDeclaration) {
|
||||||
is KtClassOrObject -> {
|
is KtClassOrObject -> {
|
||||||
generateClassOrObject(project, generateExpectClass, originalDeclaration, outerClasses + generatedClass)
|
generateClassOrObject(project, generateExpectClass, originalDeclaration, outerClasses + generatedClass)
|
||||||
@@ -192,7 +193,7 @@ internal fun KtPsiFactory.generateClassOrObject(
|
|||||||
}
|
}
|
||||||
generatedClass.addDeclaration(generatedDeclaration)
|
generatedClass.addDeclaration(generatedDeclaration)
|
||||||
}
|
}
|
||||||
if (!originalClass.isAnnotation()) {
|
if (!originalClass.isAnnotation() && !originalClass.hasInlineModifier()) {
|
||||||
for (originalProperty in originalClass.primaryConstructorParameters) {
|
for (originalProperty in originalClass.primaryConstructorParameters) {
|
||||||
if (!originalProperty.hasValOrVar() || !originalProperty.hasActualModifier()) continue
|
if (!originalProperty.hasValOrVar() || !originalProperty.hasActualModifier()) continue
|
||||||
val descriptor = originalProperty.toDescriptor() as? PropertyDescriptor ?: continue
|
val descriptor = originalProperty.toDescriptor() as? PropertyDescriptor ?: continue
|
||||||
@@ -203,7 +204,12 @@ internal fun KtPsiFactory.generateClassOrObject(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
val originalPrimaryConstructor = originalClass.primaryConstructor
|
val originalPrimaryConstructor = originalClass.primaryConstructor
|
||||||
if (generatedClass is KtClass && originalPrimaryConstructor != null && !originalPrimaryConstructor.exists()) {
|
if (
|
||||||
|
generatedClass is KtClass
|
||||||
|
&& originalPrimaryConstructor != null
|
||||||
|
&& (!generateExpectClass || originalClass.hasInlineModifier() || originalPrimaryConstructor.hasActualModifier())
|
||||||
|
&& !originalPrimaryConstructor.exists()
|
||||||
|
) {
|
||||||
val descriptor = originalPrimaryConstructor.toDescriptor()
|
val descriptor = originalPrimaryConstructor.toDescriptor()
|
||||||
if (descriptor is FunctionDescriptor) {
|
if (descriptor is FunctionDescriptor) {
|
||||||
val expectedPrimaryConstructor = generateFunction(
|
val expectedPrimaryConstructor = generateFunction(
|
||||||
|
|||||||
@@ -5,7 +5,9 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.util
|
package org.jetbrains.kotlin.idea.util
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||||
import org.jetbrains.kotlin.psi.KtTypeArgumentList
|
import org.jetbrains.kotlin.psi.KtTypeArgumentList
|
||||||
|
|
||||||
|
|
||||||
@@ -15,4 +17,6 @@ fun KtCallExpression.replaceOrCreateTypeArgumentList(newTypeArgumentList: KtType
|
|||||||
newTypeArgumentList,
|
newTypeArgumentList,
|
||||||
calleeExpression
|
calleeExpression
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun KtModifierListOwner.hasInlineModifier() = hasModifier(KtTokens.INLINE_KEYWORD)
|
||||||
@@ -1,3 +1,3 @@
|
|||||||
// My: to be implemented
|
// My: to be implemented
|
||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
expect annotation class My(val x: Int, val y: Double)
|
expect annotation class <caret>My(val x: Int, val y: Double)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// "Create expected annotation class in common module testModule_Common" "true"
|
// "Create expected annotation class in common module testModule_Common" "true"
|
||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual annotation class <caret>My(actual val x: Int, actual val y: Double)
|
actual annotation class <caret>My actual constructor(actual val x: Int, actual val y: Double)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// "Create expected annotation class in common module testModule_Common" "true"
|
// "Create expected annotation class in common module testModule_Common" "true"
|
||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual annotation class My(actual val x: Int, actual val y: Double)
|
actual annotation class My actual constructor(actual val x: Int, actual val y: Double)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
// My: to be implemented
|
||||||
|
// DISABLE-ERRORS
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// My: to be implemented
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
expect annotation class <caret>My(val x: Int, val y: Double)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected annotation class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual annotation class <caret>My(actual val x: Int, actual val y: Double)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected annotation class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual annotation class My actual constructor(actual val x: Int, actual val y: Double)
|
||||||
idea/testData/multiModuleQuickFix/expectClassWithConstructorWithParametersWithoutValVar/common/My.kt
Vendored
+1
@@ -0,0 +1 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
|
expect class <caret>My(a: Int, b: String) {
|
||||||
|
fun foo(param: String): Int
|
||||||
|
val a: Int
|
||||||
|
}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My<caret> actual constructor(actual val a: Int, b: String) {
|
||||||
|
actual fun foo(param: String) = param.length
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My actual constructor(actual val a: Int, b: String) {
|
||||||
|
actual fun foo(param: String) = param.length
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
|
expect class <caret>My {
|
||||||
|
constructor()
|
||||||
|
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My<caret>(val a: Int) {
|
||||||
|
fun foo(param: String) = param.length
|
||||||
|
|
||||||
|
actual constructor(): this(42)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My(val a: Int) {
|
||||||
|
fun foo(param: String) = param.length
|
||||||
|
|
||||||
|
actual constructor(): this(42)
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// DISABLE-ERRORS
|
||||||
|
expect class <caret>My(a: Int) {
|
||||||
|
val text: String
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My<caret> actual constructor(val a: Int) {
|
||||||
|
fun foo(param: String) = param.length
|
||||||
|
actual val text: String = "test"
|
||||||
|
constructor(): this(42)
|
||||||
|
}
|
||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My actual constructor(val a: Int) {
|
||||||
|
fun foo(param: String) = param.length
|
||||||
|
actual val text: String = "test"
|
||||||
|
constructor(): this(42)
|
||||||
|
}
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
<caret>expect inline class InlineMe(val x: Int)
|
expect inline class <caret>InlineMe(val x: Int)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// "Create expected class in common module testModule_Common" "true"
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual inline class Inline<caret>Me actual constructor(val x: Int)
|
actual inline class Inline<caret>Me(val x: Int)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
// "Create expected class in common module testModule_Common" "true"
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual inline class InlineMe actual constructor(val x: Int)
|
actual inline class InlineMe actual constructor(actual val x: Int)
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
expect inline class <caret>InlineMe(val x: Int)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual inline class InlineMe<caret>(actual val x: Int)
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual inline class InlineMe actual constructor(actual val x: Int)
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
expect class <caret>My {
|
||||||
|
class Middle {
|
||||||
|
class Inner() {
|
||||||
|
enum class MyEnum {
|
||||||
|
FOO, TEST;
|
||||||
|
|
||||||
|
fun check(): String
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My<caret> {
|
||||||
|
class Middle() {
|
||||||
|
class Inner actual constructor() {
|
||||||
|
enum class MyEnum {
|
||||||
|
FOO, TEST;
|
||||||
|
|
||||||
|
actual fun check() = "42"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// "Create expected class in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual class My<caret> {
|
||||||
|
actual class Middle() {
|
||||||
|
actual class Inner actual constructor() {
|
||||||
|
actual enum class MyEnum {
|
||||||
|
FOO, TEST;
|
||||||
|
|
||||||
|
actual fun check() = "42"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,12 +2,12 @@
|
|||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual class My {
|
actual class My {
|
||||||
actual inner class <caret>Nested(actual val s: String) {
|
actual inner class <caret>Nested actual constructor(actual val s: String) {
|
||||||
actual fun hello() = s
|
actual fun hello() = s
|
||||||
|
|
||||||
actual var ss = s
|
actual var ss = s
|
||||||
|
|
||||||
actual class OtherNested(actual var d: Double) {
|
actual class OtherNested actual constructor(actual var d: Double) {
|
||||||
actual val dd = d
|
actual val dd = d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,12 +2,12 @@
|
|||||||
// DISABLE-ERRORS
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
actual class My {
|
actual class My {
|
||||||
actual inner class <caret>Nested(actual val s: String) {
|
actual inner class <caret>Nested actual constructor(actual val s: String) {
|
||||||
actual fun hello() = s
|
actual fun hello() = s
|
||||||
|
|
||||||
actual var ss = s
|
actual var ss = s
|
||||||
|
|
||||||
actual class OtherNested(actual var d: Double) {
|
actual class OtherNested actual constructor(actual var d: Double) {
|
||||||
actual val dd = d
|
actual val dd = d
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+30
@@ -274,6 +274,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/expectAnnotation/");
|
runTest("idea/testData/multiModuleQuickFix/expectAnnotation/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectAnnotation2")
|
||||||
|
public void testExpectAnnotation2() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectAnnotation2/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expectClass")
|
@TestMetadata("expectClass")
|
||||||
public void testExpectClass() throws Exception {
|
public void testExpectClass() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/expectClass/");
|
runTest("idea/testData/multiModuleQuickFix/expectClass/");
|
||||||
@@ -309,6 +314,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/expectClassWithAliases/");
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithAliases/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectClassWithConstructorWithParametersWithoutValVar")
|
||||||
|
public void testExpectClassWithConstructorWithParametersWithoutValVar() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithConstructorWithParametersWithoutValVar/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expectClassWithInitializer")
|
@TestMetadata("expectClassWithInitializer")
|
||||||
public void testExpectClassWithInitializer() throws Exception {
|
public void testExpectClassWithInitializer() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/expectClassWithInitializer/");
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithInitializer/");
|
||||||
@@ -319,6 +329,16 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/expectClassWithPlatformNested/");
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithPlatformNested/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectClassWithSecondaryConstructor")
|
||||||
|
public void testExpectClassWithSecondaryConstructor() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithSecondaryConstructor/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectClassWithSecondaryConstructor2")
|
||||||
|
public void testExpectClassWithSecondaryConstructor2() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithSecondaryConstructor2/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expectClassWithSupertype")
|
@TestMetadata("expectClassWithSupertype")
|
||||||
public void testExpectClassWithSupertype() throws Exception {
|
public void testExpectClassWithSupertype() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/expectClassWithSupertype/");
|
runTest("idea/testData/multiModuleQuickFix/expectClassWithSupertype/");
|
||||||
@@ -399,6 +419,16 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/expectInlineClass/");
|
runTest("idea/testData/multiModuleQuickFix/expectInlineClass/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectInlineClass2")
|
||||||
|
public void testExpectInlineClass2() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectInlineClass2/");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectInnerEnum")
|
||||||
|
public void testExpectInnerEnum() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectInnerEnum/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expectNestedClass")
|
@TestMetadata("expectNestedClass")
|
||||||
public void testExpectNestedClass() throws Exception {
|
public void testExpectNestedClass() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/expectNestedClass/");
|
runTest("idea/testData/multiModuleQuickFix/expectNestedClass/");
|
||||||
|
|||||||
Reference in New Issue
Block a user