KT-34644 Give return keyword more priority in completion where appropriate

- See `returnExpressionItems::returnIsProbableInPosition` to get an idea where return is supposed to be more appropriate
  - End of the block (except for top level block of unit function or cycle) or as single expression in if or when
  - Right side of the elvis operator (which is not already in return)
- Add additional `probable_keyword` weigher to signalize about probable keyword (for now it is only for `return`)
- ^KT-34644 Fixed
This commit is contained in:
Roman Golyshev
2019-11-08 18:23:58 +03:00
committed by Roman Golyshev
parent de11b4cb64
commit faf4c05fc8
32 changed files with 546 additions and 4 deletions
@@ -0,0 +1,11 @@
fun returnFun() {}
fun usage() {
if (true) {
re<caret>
return
}
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,9 @@
fun returnFun() {}
fun usage() {
re<caret>
return
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,10 @@
fun returnFun() {}
fun usage() {
if (true) {
re<caret>
}
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,8 @@
fun returnFun() {}
fun usage() {
re<caret>
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,10 @@
fun returnFun() {}
fun usage() {
for (i in 1..10) {
re<caret>
}
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,8 @@
fun returnFun() {}
fun usage() {
for (i in 1..10) re<caret>
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,8 @@
fun returnFun() {}
fun usage() {
if (true) re<caret>
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,9 @@
fun returnFun() {}
fun usage(a: Int?) {
a ?: re<caret>
return
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,12 @@
fun returnFun(): Int = 10
fun <T> returnAnything(): T = null!!
fun usage(a: Int?) {
a ?: re<caret>
}
// function of the same type as `a` is preferred to return in this case
// ORDER: returnFun
// ORDER: return
// ORDER: returnAnything
@@ -0,0 +1,11 @@
fun returnFun() {}
fun usage(a: Int) {
when (a) {
10 -> re<caret>
}
return
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,13 @@
fun returnFun() {}
fun usage(a: Int) {
when (a) {
10 -> {
re<caret>
}
}
return
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,13 @@
fun returnFun(): Int = 10
fun usage(): Int {
if (true) {
re<caret>
return 20
}
return 10
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,9 @@
fun returnFun(): Int = 10
fun usage(): Int {
re<caret>
return 10
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,12 @@
fun returnFun(): Int = 10
fun usage(): Int {
if (true) {
re<caret>
}
return 10
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,8 @@
fun returnFun(): Int = 10
fun usage(): Int {
re<caret>
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,12 @@
fun returnFun(): Int = 10
fun usage(): Int {
for (i in 1..10) {
re<caret>
}
return 10
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,10 @@
fun returnFun(): Int = 10
fun usage(): Int {
for (i in 1..10) re<caret>
return 10
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,10 @@
fun returnFun(): Int = 10
fun usage(): Int {
if (true) re<caret>
return 10
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,9 @@
fun returnFun() {}
fun usage(a: Int?): Int {
a ?: re<caret>
return 10
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,8 @@
fun reportError(): Nothing
fun usage(a: Int?): Int {
return a ?: a ?: a ?: re<caret>
}
// ORDER: reportError
// ORDER: return
@@ -0,0 +1,13 @@
fun returnFun(): Int = 10
fun <T> returnAnything(): T = null!!
fun usage(a: Int?): Int {
a ?: re<caret>
return 10
}
// function of the same type as `a` is preferred to return in this case
// ORDER: returnFun
// ORDER: return
// ORDER: returnAnything
@@ -0,0 +1,8 @@
fun reportError(): Nothing
fun usage(a: Int?): Int {
return if (a == null) re<caret> else a
}
// ORDER: reportError
// ORDER: return
@@ -0,0 +1,16 @@
fun reportError(): Nothing
fun usage(a: Int?): Int {
return when {
a == null -> {
if (true) { re<caret> }
10
}
else -> a
}
}
// ORDER: return
// ORDER: reportError
@@ -0,0 +1,9 @@
fun returnFun(): String = ""
fun usage(a: Int?): Int {
a to re<caret>
return 10
}
// ORDER: returnFun
// ORDER: return
@@ -0,0 +1,11 @@
fun reportError(): Nothing
fun usage(a: Int?): Int {
return when {
a == null -> re<caret>
else -> a
}
}
// ORDER: reportError
// ORDER: return
@@ -0,0 +1,11 @@
fun returnFun(): Int = 10
fun usage(a: Int): Int {
when (a) {
10 -> re<caret>
}
return 10
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,13 @@
fun returnFun(): Int = 10
fun usage(a: Int): Int {
when (a) {
10 -> {
re<caret>
}
}
return 10
}
// ORDER: return
// ORDER: returnFun
@@ -0,0 +1,11 @@
fun reportError(): Nothing
fun usage(a: Int?): Int {
return when {
a == null -> re<caret>
else -> a
}
}
// ORDER: reportError
// ORDER: return