Initial implementation of loop-to-call-chain intention

This commit is contained in:
Valentin Kipyatkov
2016-03-08 18:12:23 +01:00
parent c50cf13611
commit 12b1a99a6a
80 changed files with 3462 additions and 17 deletions
+1
View File
@@ -0,0 +1 @@
org.jetbrains.kotlin.idea.intentions.loopToCallChain.LoopToCallChainIntention
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var found = false
<caret>for (s in list) {
if (s.length > 0) {
found = true
break
}
}
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
<caret>val found = list.any { it.length > 0 }
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>for (s in list) {
if (s.length > 0) {
return true
}
}
return false
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>return list.any { it.length > 0 }
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>for (s in list) {
return true
}
return false
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>return list.any()
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<Any>): Int? {
<caret>for (o in list) {
if (o is String) {
val length = o.length
return length
}
}
return null
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<Any>): Int? {
return list
.filterIsInstance<String>()
.map { it.length }
.firstOrNull()
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<Any>): Int? {
<caret>for (o in list) {
if (o !is String) continue
val length = o.length
return length
}
return null
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<Any>): Int? {
return list
.filterIsInstance<String>()
.map { it.length }
.firstOrNull()
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String?>): Int? {
<caret>for (s in list) {
if (s != null) {
val length = s.length
return length
}
}
return null
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String?>): Int? {
<caret>return list
.filterNotNull()
.map { it.length }
.firstOrNull()
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<Any?>): Int? {
<caret>for (o in list) {
if (o == null) continue
val code = o.hashCode()
return code
}
return null
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<Any?>): Int? {
<caret>return list
.filterNotNull()
.map { it.hashCode() }
.firstOrNull()
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>for (s in list) {
if (s.isEmpty()) continue
val l = s.length
return l
}
return null
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>return list
.filterNot { it.isEmpty() }
.map { it.length }
.firstOrNull()
}
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
if (s.isEmpty()) continue
return s
}
return null
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list.firstOrNull { !it.isEmpty() }
}
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
if (!s.isEmpty()) continue
return s
}
return null
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list.firstOrNull { it.isEmpty() }
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
if (s.isEmpty()) {
continue
}
return s
}
return null
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list.firstOrNull { !it.isEmpty() }
}
@@ -0,0 +1,16 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(): String? {
Loop@
while (x()) {
<caret>for (s in list()) {
if (s.isEmpty()) continue@Loop
return s
}
return null
}
return null
}
fun x(): Boolean = false
fun list(): List<String> = listOf()
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var result: String? = null
<caret>for (s in list) {
if (s.length > 0) {
result = s
break
}
}
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
<caret>val result: String? = list.firstOrNull { it.length > 0 }
}
@@ -0,0 +1,16 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo() {
MainLoop@
for (i in 1..10) {
var result: String? = null
<caret>for (s in list()) {
if (s.length > 0) {
result = s
break@MainLoop
}
}
}
}
fun list(): List<String> = listOf()
@@ -0,0 +1,12 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var result: String? = null
<caret>for (s in list) {
if (s.length > 0) {
result = s
break
}
}
result += "1"
}
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
<caret>var result: String? = list.firstOrNull { it.length > 0 }
result += "1"
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
var result: String? = null
<caret>for (s in list) { // search for first non-empty string in the list
if (s.length > 0) { // string should be non-empty
result = s // save it into result
break
}
}
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String>) {
<caret>val result: String? = list.firstOrNull { // search for first non-empty string in the list
it.length > 0
}// string should be non-empty
// save it into result
}
@@ -0,0 +1,11 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>) {
var result: String? = null
<caret>for (s in list) {
if (s != result) {
result = s
break
}
}
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
if (s.length > 0) {
return s
}
}
return null
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list.firstOrNull { it.length > 0 }
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
return s
}
return null
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list.firstOrNull()
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): Int? {
<caret>for (s in list) {
if (s.isNotEmpty()) {
return s.length
}
}
return null
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): String {
<caret>for (s in list) {
if (s.isNotEmpty()) {
return s
}
}
return ""
}
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
return s
}
// return null if not found
return null
}
@@ -0,0 +1,5 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
// return null if not found
return list.firstOrNull()
}
+9
View File
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>for (s in list) {
for (line in s.lines()) {
if (line.isNotBlank()) return line
}
}
return null
}
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>return list
.flatMap { it.lines() }
.firstOrNull { it.isNotBlank() }
}
@@ -0,0 +1,14 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
var result: String? = null
MainLoop@
<caret>for (s in list) {
for (line in s.lines()) {
if (line.isNotBlank()) {
result = line
break@MainLoop
}
}
}
return result
}
@@ -0,0 +1,7 @@
// WITH_RUNTIME
fun foo(list: List<String>): String? {
<caret>val result: String? = list
.flatMap { it.lines() }
.firstOrNull { it.isNotBlank() }
return result
}
@@ -0,0 +1,14 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): String? {
var result: String? = null
<caret>for (s in list) {
for (line in s.lines()) {
if (line.isNotBlank()) {
result = line
break
}
}
}
return result
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): Char? {
<caret>for (s in list) {
for (c in s) {
if (c != ' ') return c
}
}
return null
}
@@ -0,0 +1,10 @@
// WITH_RUNTIME
fun foo(list: List<String>, it: Int) {
var found = false
<caret>for (s in list) {
if (s.length > it) {
found = true
break
}
}
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>, it: Int) {
<caret>val found = list.any { s -> s.length > it }
}
+8
View File
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>for (s in list) {
val length = s.length
if (length > 0) return length
}
return null
}
+6
View File
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>return list
.map { it.length }
.firstOrNull { it > 0 }
}
+8
View File
@@ -0,0 +1,8 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>for (s in list) {
var length = s.length
if (length > 0) return length
}
return null
}
@@ -0,0 +1,6 @@
// WITH_RUNTIME
fun foo(list: List<String>): Int? {
<caret>return list
.map { it.length }
.firstOrNull { it > 0 }
}
+9
View File
@@ -0,0 +1,9 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): Int? {
<caret>for (s in list) {
var length = s.length
if (length > 0) return ++length
}
return null
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
// IS_APPLICABLE: false
fun foo(list: List<String>): String? {
<caret>for (s in list) {
val length = s.length
if (length > 0) return s + length
}
return null
}
@@ -0,0 +1,9 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>for (s in list) {
if (s.length > 0) {
return false
}
}
return true
}
@@ -0,0 +1,4 @@
// WITH_RUNTIME
fun foo(list: List<String>): Boolean {
<caret>return list.none { it.length > 0 }
}