KT-9839: intention introduced: convert primary constructor to secondary one
(cherry picked from commit 93aaa48)
This commit is contained in:
committed by
Mikhail Glukhikh
parent
d4418d5686
commit
7f50e6e70e
@@ -28,6 +28,7 @@ import com.intellij.util.LocalTimeCounter
|
|||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.resolve.ImportPath
|
import org.jetbrains.kotlin.resolve.ImportPath
|
||||||
@@ -211,11 +212,17 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return PsiFileFactory.getInstance(project).createFileFromText(fileName, KotlinFileType.INSTANCE, text, LocalTimeCounter.currentTime(), true) as KtFile
|
return PsiFileFactory.getInstance(project).createFileFromText(fileName, KotlinFileType.INSTANCE, text, LocalTimeCounter.currentTime(), true) as KtFile
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createProperty(name: String, type: String?, isVar: Boolean, initializer: String?): KtProperty {
|
fun createProperty(modifiers: String?, name: String, type: String?, isVar: Boolean, initializer: String?): KtProperty {
|
||||||
val text = (if (isVar) "var " else "val ") + name + (if (type != null) ":" + type else "") + (if (initializer == null) "" else " = " + initializer)
|
val text = (modifiers.let { "$it "} ?: "") +
|
||||||
|
(if (isVar) " var " else " val ") + name +
|
||||||
|
(if (type != null) ":" + type else "") + (if (initializer == null) "" else " = " + initializer)
|
||||||
return createProperty(text)
|
return createProperty(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun createProperty(name: String, type: String?, isVar: Boolean, initializer: String?): KtProperty {
|
||||||
|
return createProperty(null, name, type, isVar, initializer)
|
||||||
|
}
|
||||||
|
|
||||||
fun createProperty(name: String, type: String?, isVar: Boolean): KtProperty {
|
fun createProperty(name: String, type: String?, isVar: Boolean): KtProperty {
|
||||||
return createProperty(name, type, isVar, null)
|
return createProperty(name, type, isVar, null)
|
||||||
}
|
}
|
||||||
@@ -548,8 +555,14 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class CallableBuilder(private val target: Target) {
|
class CallableBuilder(private val target: Target) {
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val CONSTRUCTOR_NAME = KtTokens.CONSTRUCTOR_KEYWORD.value
|
||||||
|
}
|
||||||
|
|
||||||
enum class Target {
|
enum class Target {
|
||||||
FUNCTION,
|
FUNCTION,
|
||||||
|
CONSTRUCTOR,
|
||||||
READ_ONLY_PROPERTY
|
READ_ONLY_PROPERTY
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,7 +581,7 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
private var state = State.MODIFIERS
|
private var state = State.MODIFIERS
|
||||||
|
|
||||||
private fun closeParams() {
|
private fun closeParams() {
|
||||||
if (target == Target.FUNCTION) {
|
if (target == Target.FUNCTION || target == Target.CONSTRUCTOR) {
|
||||||
assert(state == State.FIRST_PARAM || state == State.REST_PARAMS)
|
assert(state == State.FIRST_PARAM || state == State.REST_PARAMS)
|
||||||
sb.append(")")
|
sb.append(")")
|
||||||
}
|
}
|
||||||
@@ -584,6 +597,7 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
}
|
}
|
||||||
val keyword = when (target) {
|
val keyword = when (target) {
|
||||||
Target.FUNCTION -> "fun"
|
Target.FUNCTION -> "fun"
|
||||||
|
Target.CONSTRUCTOR -> ""
|
||||||
Target.READ_ONLY_PROPERTY -> "val"
|
Target.READ_ONLY_PROPERTY -> "val"
|
||||||
}
|
}
|
||||||
sb.append("$keyword ")
|
sb.append("$keyword ")
|
||||||
@@ -592,7 +606,7 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun bodyPrefix() = when (target) {
|
private fun bodyPrefix() = when (target) {
|
||||||
Target.FUNCTION -> ""
|
Target.FUNCTION, Target.CONSTRUCTOR -> ""
|
||||||
Target.READ_ONLY_PROPERTY -> "\nget()"
|
Target.READ_ONLY_PROPERTY -> "\nget()"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -604,7 +618,7 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun typeParams(values: Collection<String>): CallableBuilder {
|
fun typeParams(values: Collection<String> = emptyList()): CallableBuilder {
|
||||||
placeKeyword()
|
placeKeyword()
|
||||||
if (!values.isEmpty()) {
|
if (!values.isEmpty()) {
|
||||||
sb.append(values.joinToString(", ", "<", "> ", -1, ""))
|
sb.append(values.joinToString(", ", "<", "> ", -1, ""))
|
||||||
@@ -622,12 +636,13 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun name(name: String): CallableBuilder {
|
fun name(name: String = CONSTRUCTOR_NAME): CallableBuilder {
|
||||||
assert(state == State.NAME || state == State.RECEIVER)
|
assert(state == State.NAME || state == State.RECEIVER)
|
||||||
|
assert(name != CONSTRUCTOR_NAME || target == Target.CONSTRUCTOR)
|
||||||
|
|
||||||
sb.append(name)
|
sb.append(name)
|
||||||
when (target) {
|
when (target) {
|
||||||
Target.FUNCTION -> {
|
Target.FUNCTION, Target.CONSTRUCTOR -> {
|
||||||
sb.append("(")
|
sb.append("(")
|
||||||
state = State.FIRST_PARAM
|
state = State.FIRST_PARAM
|
||||||
}
|
}
|
||||||
@@ -638,14 +653,17 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
fun param(name: String, type: String): CallableBuilder {
|
fun param(name: String, type: String, defaultValue: String? = null): CallableBuilder {
|
||||||
assert(target == Target.FUNCTION)
|
assert(target == Target.FUNCTION || target == Target.CONSTRUCTOR)
|
||||||
assert(state == State.FIRST_PARAM || state == State.REST_PARAMS)
|
assert(state == State.FIRST_PARAM || state == State.REST_PARAMS)
|
||||||
|
|
||||||
if (state == State.REST_PARAMS) {
|
if (state == State.REST_PARAMS) {
|
||||||
sb.append(", ")
|
sb.append(", ")
|
||||||
}
|
}
|
||||||
sb.append(name).append(": ").append(type)
|
sb.append(name).append(": ").append(type)
|
||||||
|
if (defaultValue != null) {
|
||||||
|
sb.append("= ").append(defaultValue)
|
||||||
|
}
|
||||||
if (state == State.FIRST_PARAM) {
|
if (state == State.FIRST_PARAM) {
|
||||||
state = State.REST_PARAMS
|
state = State.REST_PARAMS
|
||||||
}
|
}
|
||||||
@@ -667,7 +685,7 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun typeConstraints(values: Collection<String>): CallableBuilder {
|
fun typeConstraints(values: Collection<String>): CallableBuilder {
|
||||||
assert(state == State.TYPE_CONSTRAINTS)
|
assert(state == State.TYPE_CONSTRAINTS && target != Target.CONSTRUCTOR)
|
||||||
|
|
||||||
if (!values.isEmpty()) {
|
if (!values.isEmpty()) {
|
||||||
sb.append(values.joinToString(", ", " where ", "", -1, ""))
|
sb.append(values.joinToString(", ", " where ", "", -1, ""))
|
||||||
@@ -677,6 +695,15 @@ class KtPsiFactory(private val project: Project) {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun superDelegation(argumentList: String): CallableBuilder {
|
||||||
|
assert(state == State.TYPE_CONSTRAINTS && target == Target.CONSTRUCTOR)
|
||||||
|
|
||||||
|
sb.append(": super").append(argumentList)
|
||||||
|
state = State.BODY
|
||||||
|
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
fun blockBody(body: String): CallableBuilder {
|
fun blockBody(body: String): CallableBuilder {
|
||||||
assert(state == State.BODY || state == State.TYPE_CONSTRAINTS)
|
assert(state == State.BODY || state == State.TYPE_CONSTRAINTS)
|
||||||
|
|
||||||
|
|||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
class Foo {
|
||||||
|
val z = y
|
||||||
|
|
||||||
|
val x: Int
|
||||||
|
|
||||||
|
constructor(x: Int = 4, y: Int) {
|
||||||
|
this.x = x
|
||||||
|
}
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class Foo(val x: Int = 4, y: Int) {
|
||||||
|
val z = y
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
<html>
|
||||||
|
<body>
|
||||||
|
This intention converts primary constructor to secondary one.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1372,6 +1372,11 @@
|
|||||||
<category>Kotlin</category>
|
<category>Kotlin</category>
|
||||||
</intentionAction>
|
</intentionAction>
|
||||||
|
|
||||||
|
<intentionAction>
|
||||||
|
<className>org.jetbrains.kotlin.idea.intentions.ConvertPrimaryConstructorToSecondaryIntention</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"
|
||||||
|
|||||||
+110
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* 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.lexer.KtTokens.THIS_KEYWORD
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens.VARARG_KEYWORD
|
||||||
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
import org.jetbrains.kotlin.psi.KtPsiFactory.CallableBuilder
|
||||||
|
import org.jetbrains.kotlin.psi.KtPsiFactory.CallableBuilder.Target.CONSTRUCTOR
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
|
|
||||||
|
class ConvertPrimaryConstructorToSecondaryIntention : SelfTargetingIntention<KtPrimaryConstructor>(
|
||||||
|
KtPrimaryConstructor::class.java,
|
||||||
|
"Convert to secondary constructor"
|
||||||
|
) {
|
||||||
|
override fun isApplicableTo(element: KtPrimaryConstructor, caretOffset: Int) =
|
||||||
|
element.containingClassOrObject is KtClass && element.valueParameters.all { !it.hasValOrVar() || it.annotationEntries.isEmpty() }
|
||||||
|
|
||||||
|
override fun applyTo(element: KtPrimaryConstructor, editor: Editor?) {
|
||||||
|
val klass = element.containingClassOrObject as? KtClass ?: return
|
||||||
|
val factory = KtPsiFactory(klass)
|
||||||
|
val initializerMap = mutableMapOf<KtProperty, String>()
|
||||||
|
for (property in klass.getProperties()) {
|
||||||
|
if (property.typeReference == null) {
|
||||||
|
SpecifyTypeExplicitlyIntention().applyTo(property, editor)
|
||||||
|
}
|
||||||
|
val initializer = property.initializer ?: continue
|
||||||
|
initializerMap[property] = initializer.text
|
||||||
|
initializer.delete()
|
||||||
|
property.equalsToken!!.delete()
|
||||||
|
}
|
||||||
|
val constructor = factory.createSecondaryConstructor(
|
||||||
|
CallableBuilder(CONSTRUCTOR).apply {
|
||||||
|
element.modifierList?.let { modifier(it.text) }
|
||||||
|
typeParams()
|
||||||
|
name()
|
||||||
|
for (valueParameter in element.valueParameters) {
|
||||||
|
val annotations = valueParameter.annotationEntries.joinToString(separator = " ") { it.text }
|
||||||
|
val vararg = if (valueParameter.isVarArg) VARARG_KEYWORD.value else ""
|
||||||
|
param("$annotations $vararg ${valueParameter.name!!}",
|
||||||
|
valueParameter.typeReference!!.text, valueParameter.defaultValue?.text)
|
||||||
|
}
|
||||||
|
noReturnType()
|
||||||
|
for (superTypeEntry in klass.getSuperTypeListEntries()) {
|
||||||
|
if (superTypeEntry is KtSuperTypeCallEntry) {
|
||||||
|
superDelegation(superTypeEntry.valueArgumentList?.text ?: "")
|
||||||
|
superTypeEntry.replace(factory.createSuperTypeEntry(superTypeEntry.typeReference!!.text))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (element.valueParameters.firstOrNull { it.hasValOrVar() } != null || initializerMap.isNotEmpty()) {
|
||||||
|
val valueParameterInitializers = element.valueParameters.filter { it.hasValOrVar() }.joinToString(separator = "\n") {
|
||||||
|
val name = it.name!!
|
||||||
|
"this.$name = $name"
|
||||||
|
}
|
||||||
|
val classBodyInitializers = klass.declarations.filter {
|
||||||
|
(it is KtProperty && initializerMap[it] != null) || it is KtAnonymousInitializer
|
||||||
|
}.joinToString(separator = "\n") {
|
||||||
|
if (it is KtProperty) {
|
||||||
|
val name = it.name!!
|
||||||
|
val text = initializerMap[it]
|
||||||
|
if (text != null) {
|
||||||
|
"${THIS_KEYWORD.value}.$name = $text"
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
((it as KtAnonymousInitializer).body as? KtBlockExpression)?.statements?.joinToString(separator = "\n") {
|
||||||
|
it.text
|
||||||
|
} ?: ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
blockBody(listOf(valueParameterInitializers, classBodyInitializers)
|
||||||
|
.filter(String::isNotEmpty).joinToString(separator = "\n"))
|
||||||
|
}
|
||||||
|
}.asString()
|
||||||
|
)
|
||||||
|
klass.addDeclarationBefore(constructor, null)
|
||||||
|
for (valueParameter in element.valueParameters.reversed()) {
|
||||||
|
if (!valueParameter.hasValOrVar()) continue
|
||||||
|
val isVararg = valueParameter.hasModifier(VARARG_KEYWORD)
|
||||||
|
valueParameter.removeModifier(VARARG_KEYWORD)
|
||||||
|
val typeText = valueParameter.typeReference?.text
|
||||||
|
val property = factory.createProperty(valueParameter.modifierList?.text, valueParameter.name!!,
|
||||||
|
if (isVararg && typeText != null) "Array<out $typeText>" else typeText,
|
||||||
|
valueParameter.isMutable, null)
|
||||||
|
klass.addDeclarationBefore(property, null)
|
||||||
|
}
|
||||||
|
for (anonymousInitializer in klass.getAnonymousInitializers()) {
|
||||||
|
anonymousInitializer.delete()
|
||||||
|
}
|
||||||
|
element.delete()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
org.jetbrains.kotlin.idea.intentions.ConvertPrimaryConstructorToSecondaryIntention
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
annotation class Ann(val t: String)
|
||||||
|
|
||||||
|
class Annotated @Ann("42") constructor<caret>()
|
||||||
Vendored
+5
@@ -0,0 +1,5 @@
|
|||||||
|
annotation class Ann(val t: String)
|
||||||
|
|
||||||
|
class Annotated {
|
||||||
|
@Ann("42") constructor()
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
annotation class Ann
|
||||||
|
|
||||||
|
class AnnotatedParam<caret>(@Ann x: Double) {
|
||||||
|
val y = x
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
annotation class Ann
|
||||||
|
|
||||||
|
class AnnotatedParam {
|
||||||
|
constructor(@Ann x: Double) {
|
||||||
|
this.y = x
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Double
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
// IS_APPLICABLE: false
|
||||||
|
|
||||||
|
annotation class Ann
|
||||||
|
|
||||||
|
class AnnotatedParam<caret>(val v: Double, @Ann val x: Int, var s: String)
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class DefaultValueChain(val<caret> x1: Int, x2: Int = x1, val x3: Int = x2, x4: Int = x3, val x5: Int = x4)
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
class DefaultValueChain {
|
||||||
|
val x1: Int
|
||||||
|
val x3: Int
|
||||||
|
val x5: Int
|
||||||
|
|
||||||
|
constructor(x1: Int, x2: Int = x1, x3: Int = x2, x4: Int = x3, x5: Int = x4) {
|
||||||
|
this.x1 = x1
|
||||||
|
this.x3 = x3
|
||||||
|
this.x5 = x5
|
||||||
|
}
|
||||||
|
}
|
||||||
+13
@@ -0,0 +1,13 @@
|
|||||||
|
class InitAndParams<caret>(x: Int, z: Int) {
|
||||||
|
val y = x
|
||||||
|
|
||||||
|
val w: Int
|
||||||
|
|
||||||
|
init {
|
||||||
|
w = foo(y)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun foo(arg: Int) = arg
|
||||||
|
|
||||||
|
val v = w + z
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
class InitAndParams {
|
||||||
|
constructor(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
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
class ParamAndProperties<caret>(x: Int, val y: Int, z: Int, val w: Int) {
|
||||||
|
val r = x + z
|
||||||
|
|
||||||
|
val s = r + y
|
||||||
|
|
||||||
|
val t = s + w
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
class ParamAndProperties {
|
||||||
|
val y: Int
|
||||||
|
val w: Int
|
||||||
|
|
||||||
|
constructor(x: Int, y: Int, z: Int, w: Int) {
|
||||||
|
this.y = y
|
||||||
|
this.w = w
|
||||||
|
this.r = x + z
|
||||||
|
this.s = r + y
|
||||||
|
this.t = s + w
|
||||||
|
}
|
||||||
|
|
||||||
|
val r: Int
|
||||||
|
|
||||||
|
val s: Int
|
||||||
|
|
||||||
|
val t: Int
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class Protected protected<caret> constructor(internal var s: String)
|
||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
class Protected {
|
||||||
|
internal var s: String
|
||||||
|
|
||||||
|
protected constructor(s: String) {
|
||||||
|
this.s = s
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
class My<caret>()
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class My {
|
||||||
|
constructor()
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
class UseParam<caret>(x: Int) {
|
||||||
|
val y = x
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
class UseParam {
|
||||||
|
constructor(x: Int) {
|
||||||
|
this.y = x
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Int
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
class UseParam<caret>(x: Int) {
|
||||||
|
val y = x
|
||||||
|
|
||||||
|
val z = 2 * y
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
class UseParam {
|
||||||
|
constructor(x: Int) {
|
||||||
|
this.y = x
|
||||||
|
this.z = 2 * y
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Int
|
||||||
|
|
||||||
|
val z: Int
|
||||||
|
}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarArg(<caret>vararg x: String) {
|
||||||
|
val strList = x.toList()
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarArg {
|
||||||
|
constructor(vararg x: String) {
|
||||||
|
this.strList = x.toList()
|
||||||
|
}
|
||||||
|
|
||||||
|
val strList: List<String>
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarargVal<caret>(vararg val param: String)
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
class VarargVal {
|
||||||
|
val param: Array<out String>
|
||||||
|
|
||||||
|
constructor(vararg param: String) {
|
||||||
|
this.param = param
|
||||||
|
}
|
||||||
|
}
|
||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
abstract class Base(val x: Int)
|
||||||
|
|
||||||
|
class Derived<caret>(x: Int) : Base(x) {
|
||||||
|
val y = 2 * x
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
abstract class Base(val x: Int)
|
||||||
|
|
||||||
|
class Derived : Base {
|
||||||
|
constructor(x: Int) : super(x) {
|
||||||
|
this.y = 2 * x
|
||||||
|
}
|
||||||
|
|
||||||
|
val y: Int
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
interface A {
|
||||||
|
val s: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface B {
|
||||||
|
val x: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class C(open val d: Double)
|
||||||
|
|
||||||
|
class D(<caret>open val y: Int, override val d: Double) : A, C(d), B {
|
||||||
|
override val s = "$y -> $d"
|
||||||
|
|
||||||
|
override val x = y * y
|
||||||
|
}
|
||||||
Vendored
+25
@@ -0,0 +1,25 @@
|
|||||||
|
interface A {
|
||||||
|
val s: String
|
||||||
|
}
|
||||||
|
|
||||||
|
interface B {
|
||||||
|
val x: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract class C(open val d: Double)
|
||||||
|
|
||||||
|
class D : A, C, B {
|
||||||
|
open val y: Int
|
||||||
|
override val d: Double
|
||||||
|
|
||||||
|
constructor(y: Int, d: Double) : super(d) {
|
||||||
|
this.y = y
|
||||||
|
this.d = d
|
||||||
|
this.s = "$y -> $d"
|
||||||
|
this.x = y * y
|
||||||
|
}
|
||||||
|
|
||||||
|
override val s: String
|
||||||
|
|
||||||
|
override val x: Int
|
||||||
|
}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class WithProperties<caret>(val x: Int, val y: Int = 7, private val z: Int = 13)
|
||||||
+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) {
|
||||||
|
this.x = x
|
||||||
|
this.y = y
|
||||||
|
this.z = z
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
// "class org.jetbrains.kotlin.idea.quickfix.AddTypeAnnotationToValueParameterFix" "false"
|
// "class org.jetbrains.kotlin.idea.quickfix.AddTypeAnnotationToValueParameterFix" "false"
|
||||||
// ERROR: A type annotation is required on a value parameter
|
// ERROR: A type annotation is required on a value parameter
|
||||||
// ACTION: Create test
|
// ACTION: Create test
|
||||||
|
// ACTION: Convert to secondary constructor
|
||||||
|
|
||||||
class Foo(val bar<caret>)
|
class Foo(val bar<caret>)
|
||||||
+1
@@ -3,5 +3,6 @@
|
|||||||
// ACTION: Make private
|
// ACTION: Make private
|
||||||
// ACTION: Make protected
|
// ACTION: Make protected
|
||||||
// ACTION: Create test
|
// ACTION: Create test
|
||||||
|
// ACTION: Convert to secondary constructor
|
||||||
class C(<caret>val x: String) {
|
class C(<caret>val x: String) {
|
||||||
}
|
}
|
||||||
@@ -4358,6 +4358,105 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary")
|
||||||
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
public static class ConvertPrimaryConstructorToSecondary extends AbstractIntentionTest {
|
||||||
|
public void testAllFilesPresentInConvertPrimaryConstructorToSecondary() throws Exception {
|
||||||
|
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/intentions/convertPrimaryConstructorToSecondary"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotatedConstructor.kt")
|
||||||
|
public void testAnnotatedConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/annotatedConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotatedParam.kt")
|
||||||
|
public void testAnnotatedParam() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/annotatedParam.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("annotatedProperty.kt")
|
||||||
|
public void testAnnotatedProperty() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/annotatedProperty.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("defaultValueChain.kt")
|
||||||
|
public void testDefaultValueChain() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/defaultValueChain.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("initAndParams.kt")
|
||||||
|
public void testInitAndParams() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/initAndParams.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("paramsAndProperties.kt")
|
||||||
|
public void testParamsAndProperties() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/paramsAndProperties.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("protectedConstructor.kt")
|
||||||
|
public void testProtectedConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/protectedConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("simple.kt")
|
||||||
|
public void testSimple() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/simple.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("useParam.kt")
|
||||||
|
public void testUseParam() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/useParam.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("useParamChain.kt")
|
||||||
|
public void testUseParamChain() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/useParamChain.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("vararg.kt")
|
||||||
|
public void testVararg() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/vararg.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("varargVal.kt")
|
||||||
|
public void testVarargVal() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/varargVal.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withBaseClass.kt")
|
||||||
|
public void testWithBaseClass() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/withBaseClass.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withMultipleInheritance.kt")
|
||||||
|
public void testWithMultipleInheritance() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/withMultipleInheritance.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("withProperties.kt")
|
||||||
|
public void testWithProperties() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/withProperties.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("idea/testData/intentions/convertPropertyInitializerToGetter")
|
@TestMetadata("idea/testData/intentions/convertPropertyInitializerToGetter")
|
||||||
@TestDataPath("$PROJECT_ROOT")
|
@TestDataPath("$PROJECT_ROOT")
|
||||||
@RunWith(JUnit3RunnerWithInners.class)
|
@RunWith(JUnit3RunnerWithInners.class)
|
||||||
|
|||||||
Reference in New Issue
Block a user