KT-9839: intention introduced: convert secondary constructor to primary one #KT-9839 Fixed
(cherry picked from commit f3fa779)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
28b70faa99
commit
725df49c8c
@@ -397,6 +397,10 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return createClass("class A()").getPrimaryConstructor()!!
|
return createClass("class A()").getPrimaryConstructor()!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createPrimaryConstructor(modifiers: String?): KtPrimaryConstructor {
|
||||||
|
return modifiers?.let { createClass("class A $modifiers constructor()").getPrimaryConstructor() } ?: createPrimaryConstructor()
|
||||||
|
}
|
||||||
|
|
||||||
fun createConstructorKeyword(): PsiElement =
|
fun createConstructorKeyword(): PsiElement =
|
||||||
createClass("class A constructor()").getPrimaryConstructor()!!.getConstructorKeyword()!!
|
createClass("class A constructor()").getPrimaryConstructor()!!.getConstructorKeyword()!!
|
||||||
|
|
||||||
|
|||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class Foo(val x: Int = 4, y: Int) {
|
||||||
|
val z = y
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
class Foo {
|
||||||
|
val z = y
|
||||||
|
|
||||||
|
val x: Int
|
||||||
|
|
||||||
|
constructor(x: Int = 4, y: Int) {
|
||||||
|
this.x = x
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention converts secondary constructor to primary one.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1377,6 +1377,11 @@
|
|||||||
<category>Kotlin</category>
|
<category>Kotlin</category>
|
||||||
</intentionAction>
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.kotlin.idea.intentions.ConvertSecondaryConstructorToPrimaryIntention</className>
|
||||||
|
<category>Kotlin</category>
|
||||||
|
</intentionAction>
|
||||||
|
|
||||||
<localInspection implementationClass="org.jetbrains.kotlin.idea.intentions.ObjectLiteralToLambdaInspection"
|
<localInspection implementationClass="org.jetbrains.kotlin.idea.intentions.ObjectLiteralToLambdaInspection"
|
||||||
displayName="Object literal can be converted to lambda"
|
displayName="Object literal can be converted to lambda"
|
||||||
groupName="Kotlin"
|
groupName="Kotlin"
|
||||||
|
|||||||
+149
@@ -0,0 +1,149 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.intentions
|
||||||
|
|
||||||
|
import com.intellij.openapi.editor.Editor
|
||||||
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
|
import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
|
|
||||||
|
class ConvertSecondaryConstructorToPrimaryIntention : SelfTargetingIntention<KtSecondaryConstructor>(
|
||||||
|
KtSecondaryConstructor::class.java,
|
||||||
|
"Convert to primary constructor"
|
||||||
|
) {
|
||||||
|
private tailrec fun ConstructorDescriptor.isReachableByDelegationFrom(
|
||||||
|
constructor: ConstructorDescriptor, context: BindingContext, visited: Set<ConstructorDescriptor> = emptySet()
|
||||||
|
): Boolean {
|
||||||
|
if (constructor == this) return true
|
||||||
|
if (constructor in visited) return false
|
||||||
|
val resolvedDelegationCall = context[BindingContext.CONSTRUCTOR_RESOLVED_DELEGATION_CALL, constructor] ?: return false
|
||||||
|
val delegationDescriptor = resolvedDelegationCall.candidateDescriptor
|
||||||
|
return isReachableByDelegationFrom(delegationDescriptor, context, visited + constructor)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun isApplicableTo(element: KtSecondaryConstructor, caretOffset: Int): Boolean {
|
||||||
|
val delegationCall = element.getDelegationCall()
|
||||||
|
if (delegationCall.isCallToThis) return false
|
||||||
|
val klass = element.containingClassOrObject ?: return false
|
||||||
|
if (klass.hasPrimaryConstructor()) return false
|
||||||
|
|
||||||
|
val context = klass.analyze()
|
||||||
|
val classDescriptor = context[BindingContext.CLASS, klass] ?: return false
|
||||||
|
val elementDescriptor = context[BindingContext.CONSTRUCTOR, element] ?: return false
|
||||||
|
|
||||||
|
for (constructorDescriptor in classDescriptor.constructors) {
|
||||||
|
if (constructorDescriptor == elementDescriptor) continue
|
||||||
|
if (!elementDescriptor.isReachableByDelegationFrom(constructorDescriptor, context)) return false
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtExpression.tryConvertToPropertyByParameterInitialization(
|
||||||
|
constructorDescriptor: ConstructorDescriptor, context: BindingContext
|
||||||
|
): Pair<ValueParameterDescriptor, PropertyDescriptor>? {
|
||||||
|
if (this !is KtBinaryExpression || operationToken != KtTokens.EQ) return null
|
||||||
|
val rightReference = right as? KtReferenceExpression ?: return null
|
||||||
|
val rightDescriptor = context[BindingContext.REFERENCE_TARGET, rightReference] as? ValueParameterDescriptor ?: return null
|
||||||
|
if (rightDescriptor.containingDeclaration != constructorDescriptor) return null
|
||||||
|
val left = left
|
||||||
|
val leftReference = when (left) {
|
||||||
|
is KtReferenceExpression ->
|
||||||
|
left
|
||||||
|
is KtDotQualifiedExpression ->
|
||||||
|
if (left.receiverExpression is KtThisExpression) left.selectorExpression as? KtReferenceExpression else null
|
||||||
|
else ->
|
||||||
|
null
|
||||||
|
}
|
||||||
|
val leftDescriptor = context[BindingContext.REFERENCE_TARGET, leftReference] as? PropertyDescriptor ?: return null
|
||||||
|
return rightDescriptor to leftDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun applyTo(element: KtSecondaryConstructor, editor: Editor?) {
|
||||||
|
val klass = element.containingClassOrObject as? KtClass ?: return
|
||||||
|
val context = klass.analyzeFully()
|
||||||
|
val constructorDescriptor = context[BindingContext.CONSTRUCTOR, element] ?: return
|
||||||
|
val factory = KtPsiFactory(klass)
|
||||||
|
val constructorInClass = klass.createPrimaryConstructorIfAbsent()
|
||||||
|
val constructor = factory.createPrimaryConstructor(element.modifierList?.text?.replace("\n", " "))
|
||||||
|
val parameterList = constructor.valueParameterList!!
|
||||||
|
val parameterToPropertyMap = mutableMapOf<ValueParameterDescriptor, PropertyDescriptor>()
|
||||||
|
val initializer = factory.createAnonymousInitializer() as? KtClassInitializer
|
||||||
|
for (statement in element.bodyExpression?.statements ?: emptyList()) {
|
||||||
|
val (rightDescriptor, leftDescriptor) = statement.tryConvertToPropertyByParameterInitialization(constructorDescriptor, context)
|
||||||
|
?: with (initializer) {
|
||||||
|
(initializer?.body as? KtBlockExpression)?.let {
|
||||||
|
it.addBefore(statement.copy(), it.rBrace)
|
||||||
|
it.addBefore(factory.createNewLine(), it.rBrace)
|
||||||
|
}
|
||||||
|
null to null
|
||||||
|
}
|
||||||
|
if (rightDescriptor == null || leftDescriptor == null) continue
|
||||||
|
parameterToPropertyMap[rightDescriptor] = leftDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
|
for (parameter in element.valueParameters) {
|
||||||
|
val newParameter = factory.createParameter(parameter.text)
|
||||||
|
val parameterDescriptor = context[BindingContext.VALUE_PARAMETER, parameter]
|
||||||
|
val propertyDescriptor = parameterToPropertyMap[parameterDescriptor]
|
||||||
|
if (parameterDescriptor != null && propertyDescriptor != null) {
|
||||||
|
val property = DescriptorToSourceUtils.descriptorToDeclaration(propertyDescriptor) as? KtProperty
|
||||||
|
if (property != null) {
|
||||||
|
if (propertyDescriptor.name == parameterDescriptor.name && propertyDescriptor.type == parameterDescriptor.type) {
|
||||||
|
val valOrVar = if (property.isVar) factory.createVarKeyword() else factory.createValKeyword()
|
||||||
|
newParameter.addBefore(valOrVar, newParameter.nameIdentifier)
|
||||||
|
val propertyModifiers = property.modifierList?.text
|
||||||
|
if (propertyModifiers != null) {
|
||||||
|
val newModifiers = factory.createModifierList(propertyModifiers)
|
||||||
|
newParameter.addBefore(newModifiers, newParameter.valOrVarKeyword)
|
||||||
|
}
|
||||||
|
property.delete()
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
property.initializer = factory.createSimpleName(parameterDescriptor.name.asString())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
parameterList.addParameter(newParameter)
|
||||||
|
}
|
||||||
|
|
||||||
|
val delegationCall = element.getDelegationCall()
|
||||||
|
val argumentList = delegationCall.valueArgumentList
|
||||||
|
if (!delegationCall.isImplicit && argumentList != null) {
|
||||||
|
for (superTypeListEntry in klass.getSuperTypeListEntries()) {
|
||||||
|
val typeReference = superTypeListEntry.typeReference ?: continue
|
||||||
|
val type = context[BindingContext.TYPE, typeReference]
|
||||||
|
if ((type?.constructor?.declarationDescriptor as? ClassDescriptor)?.kind == ClassKind.CLASS) {
|
||||||
|
val superTypeCallEntry = factory.createSuperTypeCallEntry("${typeReference.text}${argumentList.text}")
|
||||||
|
superTypeListEntry.replace(superTypeCallEntry)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
constructorInClass.replace(constructor)
|
||||||
|
element.delete()
|
||||||
|
if ((initializer?.body as? KtBlockExpression)?.statements?.isNotEmpty() ?: false) {
|
||||||
|
initializer?.let { klass.addDeclaration(it) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org.jetbrains.kotlin.idea.intentions.ConvertSecondaryConstructorToPrimaryIntention
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
class DefaultValueChain {
|
||||||
|
val x1: Int
|
||||||
|
val x3: Int
|
||||||
|
val x5: Int
|
||||||
|
|
||||||
|
<caret>constructor(x1: Int, x2: Int = x1, x3: Int = x2, x4: Int = x3, x5: Int = x4) {
|
||||||
|
this.x1 = x1
|
||||||
|
this.x3 = x3
|
||||||
|
this.x5 = x5
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class DefaultValueChain(val x1: Int, x2: Int = x1, val x3: Int = x2, x4: Int = x3, val x5: Int = x4) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class ConvertToInit {
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
|
|
||||||
|
constructor(<caret>) {
|
||||||
|
foo()
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
class ConvertToInit() {
|
||||||
|
fun foo() {}
|
||||||
|
|
||||||
|
fun bar() {}
|
||||||
|
|
||||||
|
init {
|
||||||
|
foo()
|
||||||
|
bar()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
class InitAndParams {
|
||||||
|
constructor<caret>(x: Int, z: Int) {
|
||||||
|
this.y = x
|
||||||
|
w = foo(y)
|
||||||
|
this.v = w + z
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Int
|
||||||
|
|
||||||
|
val w: Int
|
||||||
|
|
||||||
|
fun foo(arg: Int) = arg
|
||||||
|
|
||||||
|
val v: Int
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
class InitAndParams(x: Int, z: Int) {
|
||||||
|
|
||||||
|
val y: Int = x
|
||||||
|
|
||||||
|
val w: Int
|
||||||
|
|
||||||
|
fun foo(arg: Int) = arg
|
||||||
|
|
||||||
|
val v: Int
|
||||||
|
|
||||||
|
init {
|
||||||
|
w = foo(y)
|
||||||
|
this.v = w + z
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
|
||||||
|
class NonReachableConstructor {
|
||||||
|
constructor<caret>(x: String)
|
||||||
|
|
||||||
|
constructor(x: Int)
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
// ERROR: There's a cycle in the delegation calls chain
|
||||||
|
// ERROR: There's a cycle in the delegation calls chain
|
||||||
|
|
||||||
|
class NonReachableLoop {
|
||||||
|
constructor<caret>(x: String)
|
||||||
|
|
||||||
|
constructor(x: Int, y: Int): this(x + y)
|
||||||
|
|
||||||
|
constructor(x: Int): this(x, x)
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
class Protected {
|
||||||
|
internal var s: String
|
||||||
|
|
||||||
|
protected <caret>constructor(s: String) {
|
||||||
|
this.s = s
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class Protected protected constructor(internal var s: String) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class Simple {
|
||||||
|
constructor<caret>()
|
||||||
|
}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
class Simple() {
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class UseParam {
|
||||||
|
constructor<caret>(x: Int) {
|
||||||
|
this.y = x
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Int
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
class UseParam(x: Int) {
|
||||||
|
|
||||||
|
val y: Int = x
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class WithVarArg {
|
||||||
|
|
||||||
|
val x: List<String>
|
||||||
|
|
||||||
|
constructor(<caret>vararg zz: String) {
|
||||||
|
x = listOf(*zz)
|
||||||
|
}
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class WithVarArg(vararg zz: String) {
|
||||||
|
|
||||||
|
val x: List<String>
|
||||||
|
|
||||||
|
init {
|
||||||
|
x = listOf(*zz)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarargVal {
|
||||||
|
val param: Array<out String>
|
||||||
|
|
||||||
|
constructor<caret>(vararg param: String) {
|
||||||
|
this.param = param
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarargVal(vararg val param: String) {
|
||||||
|
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
abstract class Base(val x: String)
|
||||||
|
|
||||||
|
class Derived : Base {
|
||||||
|
constructor(x: String<caret>): super(x)
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
abstract class Base(val x: String)
|
||||||
|
|
||||||
|
class Derived(x: String) : Base(x) {
|
||||||
|
}
|
||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
interface Interface
|
||||||
|
|
||||||
|
interface Another
|
||||||
|
|
||||||
|
abstract class Base
|
||||||
|
|
||||||
|
class Derived : Interface, Base, Another {
|
||||||
|
|
||||||
|
val x: String
|
||||||
|
|
||||||
|
constructor(x: String<caret>): super() {
|
||||||
|
this.x = x
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
interface Interface
|
||||||
|
|
||||||
|
interface Another
|
||||||
|
|
||||||
|
abstract class Base
|
||||||
|
|
||||||
|
class Derived(val x: String) : Interface, Base(), Another {
|
||||||
|
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
annotation class AnnParam
|
||||||
|
|
||||||
|
annotation class AnnProperty
|
||||||
|
|
||||||
|
abstract class WithComposedModifiers {
|
||||||
|
@AnnProperty
|
||||||
|
open val x: Array<out String>
|
||||||
|
|
||||||
|
constructor<caret>(@AnnParam vararg x: String) {
|
||||||
|
this.x = x
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+8
@@ -0,0 +1,8 @@
|
|||||||
|
annotation class AnnParam
|
||||||
|
|
||||||
|
annotation class AnnProperty
|
||||||
|
|
||||||
|
abstract class WithComposedModifiers(@AnnParam vararg @AnnProperty
|
||||||
|
open val x: String) {
|
||||||
|
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
|
||||||
|
class WithDelegation {
|
||||||
|
constructor()
|
||||||
|
|
||||||
|
constructor<caret>(x: Int): this()
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
class WithDifferentTypeProperty {
|
||||||
|
val x: Number
|
||||||
|
|
||||||
|
val y: String
|
||||||
|
|
||||||
|
constructor(x: Int, <caret>z: String) {
|
||||||
|
this.x = x
|
||||||
|
this.y = z
|
||||||
|
}
|
||||||
|
}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
class WithDifferentTypeProperty(x: Int, z: String) {
|
||||||
|
val x: Number = x
|
||||||
|
|
||||||
|
val y: String = z
|
||||||
|
|
||||||
|
}
|
||||||
+6
@@ -0,0 +1,6 @@
|
|||||||
|
annotation class Ann
|
||||||
|
|
||||||
|
internal class WithModifiers {
|
||||||
|
@Ann
|
||||||
|
private constructor<caret>()
|
||||||
|
}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
annotation class Ann
|
||||||
|
|
||||||
|
internal class WithModifiers @Ann private constructor() {
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class WithParameters {
|
||||||
|
constructor(<caret>x: Int = 42, y: String = "Hello")
|
||||||
|
}
|
||||||
+2
@@ -0,0 +1,2 @@
|
|||||||
|
class WithParameters(x: Int = 42, y: String = "Hello") {
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
// ERROR: Primary constructor call expected
|
||||||
|
|
||||||
|
class WithPrimary() {
|
||||||
|
constructor<caret>(x: Int)
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
class WithProperties {
|
||||||
|
val x: Int
|
||||||
|
val y: Int
|
||||||
|
private val z: Int
|
||||||
|
|
||||||
|
constructor(x: Int, y: Int = 7, z: Int = 13<caret>) {
|
||||||
|
this.x = x
|
||||||
|
this.y = y
|
||||||
|
this.z = z
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class WithProperties(val x: Int, val y: Int = 7, private val z: Int = 13) {
|
||||||
|
|
||||||
|
}
|
||||||
+1
@@ -1,5 +1,6 @@
|
|||||||
// "Create secondary constructor" "false"
|
// "Create secondary constructor" "false"
|
||||||
// ERROR: Too many arguments for public constructor Any() defined in kotlin.Any
|
// ERROR: Too many arguments for public constructor Any() defined in kotlin.Any
|
||||||
|
// ACTION: Convert to primary constructor
|
||||||
// WITH_RUNTIME
|
// WITH_RUNTIME
|
||||||
|
|
||||||
interface T {
|
interface T {
|
||||||
|
|||||||
+1
@@ -1,5 +1,6 @@
|
|||||||
// "class org.jetbrains.kotlin.idea.quickfix.InsertDelegationCallQuickfix" "false"
|
// "class org.jetbrains.kotlin.idea.quickfix.InsertDelegationCallQuickfix" "false"
|
||||||
// ACTION: Insert 'super()' call
|
// ACTION: Insert 'super()' call
|
||||||
|
// ACTION: Convert to primary constructor
|
||||||
// ERROR: Explicit 'this' or 'super' call is required. There is no constructor in superclass that can be called without arguments
|
// ERROR: Explicit 'this' or 'super' call is required. There is no constructor in superclass that can be called without arguments
|
||||||
|
|
||||||
open class B(val x: Int)
|
open class B(val x: Int)
|
||||||
|
|||||||
@@ -4688,6 +4688,129 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class ConvertSecondaryConstructorToPrimary extends AbstractIntentionTest {
|
||||||
|
public void testAllFilesPresentInConvertSecondaryConstructorToPrimary() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertSecondaryConstructorToPrimary"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("defaultValueChain.kt")
|
||||||
|
public void testDefaultValueChain() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/defaultValueChain.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("init.kt")
|
||||||
|
public void testInit() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/init.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("initAndParams.kt")
|
||||||
|
public void testInitAndParams() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/initAndParams.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("nonReachable.kt")
|
||||||
|
public void testNonReachable() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/nonReachable.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("nonReachableLoop.kt")
|
||||||
|
public void testNonReachableLoop() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/nonReachableLoop.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedConstructor.kt")
|
||||||
|
public void testProtectedConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/protectedConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("simple.kt")
|
||||||
|
public void testSimple() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/simple.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("useParam.kt")
|
||||||
|
public void testUseParam() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/useParam.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("varArg.kt")
|
||||||
|
public void testVarArg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/varArg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("varargVal.kt")
|
||||||
|
public void testVarargVal() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/varargVal.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withBaseClass.kt")
|
||||||
|
public void testWithBaseClass() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClass.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withBaseClassNoArgs.kt")
|
||||||
|
public void testWithBaseClassNoArgs() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withBaseClassNoArgs.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withComposedModifiers.kt")
|
||||||
|
public void testWithComposedModifiers() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withComposedModifiers.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withDelegation.kt")
|
||||||
|
public void testWithDelegation() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withDelegation.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withDifferentTypeProperty.kt")
|
||||||
|
public void testWithDifferentTypeProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withDifferentTypeProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withModifiers.kt")
|
||||||
|
public void testWithModifiers() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withModifiers.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withParameters.kt")
|
||||||
|
public void testWithParameters() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withParameters.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withPrimary.kt")
|
||||||
|
public void testWithPrimary() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withPrimary.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withProperties.kt")
|
||||||
|
public void testWithProperties() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertSecondaryConstructorToPrimary/withProperties.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/intentions/convertToBlockBody")
|
@TestMetadata("idea/testData/intentions/convertToBlockBody")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user