Create from usage: make new member function/property private by default

#KT-6689 Fixed
This commit is contained in:
Alexey Sedunov
2015-02-03 21:10:58 +03:00
parent eac735e91a
commit 57763e10e0
30 changed files with 76 additions and 26 deletions
@@ -72,6 +72,7 @@ import com.intellij.openapi.editor.LogicalPosition
import com.intellij.openapi.editor.actions.EditorActionUtil import com.intellij.openapi.editor.actions.EditorActionUtil
import com.intellij.openapi.editor.actions.LineEndAction import com.intellij.openapi.editor.actions.LineEndAction
import com.intellij.openapi.editor.actions.EnterAction import com.intellij.openapi.editor.actions.EnterAction
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
private val TYPE_PARAMETER_LIST_VARIABLE_NAME = "typeParameterList" private val TYPE_PARAMETER_LIST_VARIABLE_NAME = "typeParameterList"
private val TEMPLATE_FROM_USAGE_FUNCTION_BODY = "New Kotlin Function Body.kt" private val TEMPLATE_FROM_USAGE_FUNCTION_BODY = "New Kotlin Function Body.kt"
@@ -392,8 +393,13 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
val psiFactory = JetPsiFactory(currentFile) val psiFactory = JetPsiFactory(currentFile)
val modifiers =
if (containingElement is JetClassOrObject && containingElement.isAncestor(config.originalElement))
"private "
else ""
val declaration : JetNamedDeclaration = when (callableInfo.kind) { val declaration : JetNamedDeclaration = when (callableInfo.kind) {
CallableKind.FUNCTION -> psiFactory.createFunction("fun<> $header {}") CallableKind.FUNCTION -> psiFactory.createFunction("${modifiers}fun<> $header {}")
CallableKind.CONSTRUCTOR -> { CallableKind.CONSTRUCTOR -> {
with((callableInfo as ConstructorInfo).classInfo) { with((callableInfo as ConstructorInfo).classInfo) {
val classBody = when (kind) { val classBody = when (kind) {
@@ -422,7 +428,7 @@ class CallableBuilder(val config: CallableBuilderConfiguration) {
} }
CallableKind.PROPERTY -> { CallableKind.PROPERTY -> {
val valVar = if ((callableInfo as PropertyInfo).writable) "var" else "val" val valVar = if ((callableInfo as PropertyInfo).writable) "var" else "val"
psiFactory.createProperty("$valVar<> $header") psiFactory.createProperty("$modifiers$valVar<> $header")
} }
} }
@@ -6,7 +6,7 @@ class A {
return foo(2, "2") return foo(2, "2")
} }
fun foo(i: Int, s: String): Int { private fun foo(i: Int, s: String): Int {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -5,7 +5,7 @@ import kotlin.properties.ReadOnlyProperty
class A<T>(val t: T) { class A<T>(val t: T) {
val x: A<Int> by foo(t, "") val x: A<Int> by foo(t, "")
fun foo(t: T, s: String): ReadOnlyProperty<A<T>, A<Int>> { private fun foo(t: T, s: String): ReadOnlyProperty<A<T>, A<Int>> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -5,7 +5,7 @@ import kotlin.properties.ReadWriteProperty
class A<T>(val t: T) { class A<T>(val t: T) {
var x: A<Int> by foo(t, "") var x: A<Int> by foo(t, "")
fun foo(t: T, s: String): ReadWriteProperty<A<T>, A<Int>> { private fun foo(t: T, s: String): ReadWriteProperty<A<T>, A<Int>> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -6,7 +6,7 @@ class A {
return foo(2, "2") return foo(2, "2")
} }
fun foo(i: Int, s: String): Int { private fun foo(i: Int, s: String): Int {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -0,0 +1,10 @@
// "Create function 'foo'" "true"
class A {
fun test() {
foo()
}
private fun foo() {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
}
}
@@ -5,7 +5,7 @@ class A<T>(val n: T) {
return this.foo(2, "2") return this.foo(2, "2")
} }
fun foo(i: Int, s: String): A<Int> { private fun foo(i: Int, s: String): A<Int> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -6,7 +6,7 @@ class A<T>(val n: T) {
return this.foo(2, "2") return this.foo(2, "2")
} }
fun foo(i: Int, s: String): A<Int> { private fun foo(i: Int, s: String): A<Int> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -7,7 +7,7 @@ class A<T>(val n: T) {
} }
} }
fun foo(i: Int, s: String): A<Int> { private fun foo(i: Int, s: String): A<Int> {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -0,0 +1,6 @@
// "Create function 'foo'" "true"
class A {
fun test() {
<caret>foo()
}
}
@@ -4,7 +4,7 @@ class Foo<T> {
val z: Iterable<T> = y[""] val z: Iterable<T> = y[""]
} }
fun get(s: String): T { private fun get(s: String): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -4,7 +4,7 @@ class Foo<T> {
val z: Iterable<T> = y["", w] val z: Iterable<T> = y["", w]
} }
fun get(s: String, w: T): T { private fun get(s: String, w: T): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -8,7 +8,7 @@ class Foo<T> {
bar(z) bar(z)
} }
fun <V> get(s: String, w: ArrayList<V>): String { private fun <V> get(s: String, w: ArrayList<V>): String {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -4,7 +4,7 @@ class Foo<T> {
val z: Iterable<S> = y[""] val z: Iterable<S> = y[""]
} }
fun get(s: String): T { private fun get(s: String): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -4,7 +4,7 @@ class Foo<T, S: Iterable<T>> {
val z: U = y[""] val z: U = y[""]
} }
fun get(s: String): T { private fun get(s: String): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -4,7 +4,7 @@ class Foo<T> {
val z: Iterable<T> = y["", w] val z: Iterable<T> = y["", w]
} }
fun <V> get(s: String, w: Iterable<V>): T { private fun <V> get(s: String, w: Iterable<V>): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -6,7 +6,7 @@ class Foo<T> {
val z: Iterable<T> = y["", w, v] val z: Iterable<T> = y["", w, v]
} }
fun <V, T1> get(s: String, w: ArrayList<V>, v: T1): T { private fun <V, T1> get(s: String, w: ArrayList<V>, v: T1): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -6,7 +6,7 @@ class Foo<T> {
val z: Iterable<T> = y["", w] val z: Iterable<T> = y["", w]
} }
fun get(s: String, w: T): T { private fun get(s: String, w: T): T {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -6,7 +6,7 @@ class Foo<S> {
val z: Iterable<T> = y["", w] val z: Iterable<T> = y["", w]
} }
fun get(s: String, w: S): S { private fun get(s: String, w: S): S {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -4,7 +4,7 @@ class Foo<T> {
y["", w] = w y["", w] = w
} }
fun set(s: String, w: T, value: T) { private fun set(s: String, w: T, value: T) {
throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates. throw UnsupportedOperationException("not implemented") //To change body of created functions use File | Settings | File Templates.
} }
} }
@@ -5,6 +5,6 @@
import kotlin.properties.ReadOnlyProperty import kotlin.properties.ReadOnlyProperty
class A<T> { class A<T> {
val foo: ReadOnlyProperty<A<T>, A<Int>> private val foo: ReadOnlyProperty<A<T>, A<Int>>
val x: A<Int> by foo val x: A<Int> by foo
} }
@@ -3,7 +3,7 @@
class A { class A {
class B { class B {
val foo: Int private val foo: Int
fun test(): Int { fun test(): Int {
return foo return foo
@@ -5,6 +5,6 @@
import kotlin.properties.ReadWriteProperty import kotlin.properties.ReadWriteProperty
class A<T> { class A<T> {
val foo: ReadWriteProperty<A<T>, A<Int>> private val foo: ReadWriteProperty<A<T>, A<Int>>
var x: A<Int> by foo var x: A<Int> by foo
} }
@@ -3,7 +3,7 @@
class A { class A {
object B { object B {
val foo: Int private val foo: Int
fun test(): Int { fun test(): Int {
return foo return foo
@@ -0,0 +1,9 @@
// "Create property 'foo'" "true"
// ERROR: Property must be initialized or be abstract
class A {
private var foo: Int
fun test() {
foo = 1
}
}
@@ -2,7 +2,7 @@
// ERROR: Property must be initialized or be abstract // ERROR: Property must be initialized or be abstract
class A<T>(val n: T) { class A<T>(val n: T) {
val foo: A<Int> private val foo: A<Int>
fun test(): A<Int> { fun test(): A<Int> {
return this.foo return this.foo
@@ -3,7 +3,7 @@
class A<T>(val n: T) { class A<T>(val n: T) {
inner class B<U>(val m: U) { inner class B<U>(val m: U) {
val foo: A<Int> private val foo: A<Int>
fun test(): A<Int> { fun test(): A<Int> {
return this.foo return this.foo
@@ -2,7 +2,7 @@
// ERROR: Property must be initialized or be abstract // ERROR: Property must be initialized or be abstract
class A<T>(val n: T) { class A<T>(val n: T) {
val foo: A<Int> private val foo: A<Int>
inner class B<U>(val m: U) { inner class B<U>(val m: U) {
fun test(): A<Int> { fun test(): A<Int> {
@@ -0,0 +1,7 @@
// "Create property 'foo'" "true"
// ERROR: Property must be initialized or be abstract
class A {
fun test() {
<caret>foo = 1
}
}
@@ -1660,6 +1660,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("beforePrivateForMembers.kt")
public void testPrivateForMembers() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforePrivateForMembers.kt");
doTest(fileName);
}
@TestMetadata("beforePropertyOnUserType.kt") @TestMetadata("beforePropertyOnUserType.kt")
public void testPropertyOnUserType() throws Exception { public void testPropertyOnUserType() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforePropertyOnUserType.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createFunction/call/beforePropertyOnUserType.kt");
@@ -2519,6 +2525,12 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("beforePrivateForMembers.kt")
public void testPrivateForMembers() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/beforePrivateForMembers.kt");
doTest(fileName);
}
@TestMetadata("beforeThisInClass.kt") @TestMetadata("beforeThisInClass.kt")
public void testThisInClass() throws Exception { public void testThisInClass() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/beforeThisInClass.kt"); String fileName = JetTestUtils.navigationMetadata("idea/testData/quickfix/createFromUsage/createVariable/property/beforeThisInClass.kt");