Introduce "add default constructor for expect class" fix
Related to KT-24597
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||
* that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.quickfix
|
||||
|
||||
import com.intellij.openapi.editor.Editor
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||
|
||||
class AddDefaultConstructorFix(expectClass: KtClass) : KotlinQuickFixAction<KtClass>(expectClass) {
|
||||
|
||||
override fun getText() = "Add default constructor to expect class"
|
||||
|
||||
override fun getFamilyName() = text
|
||||
|
||||
override fun invoke(project: Project, editor: Editor?, file: KtFile) {
|
||||
element?.createPrimaryConstructorIfAbsent()
|
||||
}
|
||||
|
||||
companion object : KotlinSingleIntentionActionFactory() {
|
||||
override fun createAction(diagnostic: Diagnostic): KotlinQuickFixAction<KtClass>? {
|
||||
val argumentList = diagnostic.psiElement as? KtValueArgumentList ?: return null
|
||||
if (argumentList.arguments.isNotEmpty()) return null
|
||||
val derivedClass = argumentList.getStrictParentOfType<KtClassOrObject>() ?: return null
|
||||
val context = derivedClass.analyze()
|
||||
val baseTypeCallEntry = derivedClass.superTypeListEntries.filterIsInstance<KtSuperTypeCallEntry>().firstOrNull() ?: return null
|
||||
val baseType = context[BindingContext.TYPE, baseTypeCallEntry.typeReference] ?: return null
|
||||
val baseClassDescriptor = baseType.constructor.declarationDescriptor as? ClassDescriptor ?: return null
|
||||
if (!baseClassDescriptor.isExpect) return null
|
||||
if (baseClassDescriptor.kind != ClassKind.CLASS) return null
|
||||
val baseClass = DescriptorToSourceUtils.descriptorToDeclaration(baseClassDescriptor) as? KtClass ?: return null
|
||||
return AddDefaultConstructorFix(baseClass)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -541,6 +541,7 @@ class QuickFixRegistrar : QuickFixContributor {
|
||||
WRONG_ANNOTATION_TARGET_WITH_USE_SITE_TARGET.registerFactory(MoveReceiverAnnotationFix, AddAnnotationTargetFix)
|
||||
|
||||
NO_CONSTRUCTOR.registerFactory(RemoveNoConstructorFix)
|
||||
NO_CONSTRUCTOR.registerFactory(AddDefaultConstructorFix)
|
||||
|
||||
ANNOTATION_USED_AS_ANNOTATION_ARGUMENT.registerFactory(RemoveAtFromAnnotationArgument)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user