|  | // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | package class_inliner_lambda_k_style | 
|  |  | 
|  | private var COUNT = 0 | 
|  |  | 
|  | fun next() = "${COUNT++}".padStart(3, '0') | 
|  |  | 
|  | fun main(args: Array<String>) { | 
|  | testKotlinSequencesStateless(produceSequence(10)) | 
|  | testKotlinSequencesStateful(5, 2, produceSequence(10)) | 
|  | testBigExtraMethod() | 
|  | testBigExtraMethodReturningLambda() | 
|  | } | 
|  |  | 
|  | data class Record(val foo: String, val good: Boolean) | 
|  |  | 
|  | fun testKotlinSequencesStateless(strings: Sequence<String>) { | 
|  | useRecord() | 
|  | // Stateless k-style lambda | 
|  | strings.map { Record(it, false) }.forEach { println(it) } | 
|  | } | 
|  |  | 
|  | fun testKotlinSequencesStateful(a: Int, b: Int, strings: Sequence<String>) { | 
|  | useRecord() | 
|  | // Big stateful k-style lambda | 
|  | val capture = next() | 
|  | strings.map { | 
|  | val x = it.toInt() | 
|  | val y = a + x | 
|  | val z = capture.toInt() + b | 
|  | println("logging $x/$y/$z") // Intentional | 
|  | Record(it, y % z == 0) | 
|  | }.forEach { | 
|  | println(it) | 
|  | } | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethod() { | 
|  | useRecord() | 
|  | bigUserWithNotNullChecksAndTwoCalls(next()) { next() } | 
|  | testBigExtraMethod2() | 
|  | testBigExtraMethod3() | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethod2() { | 
|  | bigUserWithNotNullChecksAndTwoCalls(next()) { next() } | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethod3() { | 
|  | bigUserWithNotNullChecksAndTwoCalls(next()) { next() } | 
|  | } | 
|  |  | 
|  | fun bigUserWithNotNullChecksAndTwoCalls(id: String, lambda: () -> String): String { | 
|  | useRecord() | 
|  | println("[A] logging call#$id returning ${lambda()}") | 
|  | return "$id: ${lambda()}" | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethodReturningLambda() { | 
|  | useRecord() | 
|  | bigUserReturningLambda(next()) { next() } // Not used | 
|  | testBigExtraMethodReturningLambda2() | 
|  | testBigExtraMethodReturningLambda3() | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethodReturningLambda2() { | 
|  | bigUserReturningLambda(next()) { next() } // Not used | 
|  | } | 
|  |  | 
|  | fun testBigExtraMethodReturningLambda3() { | 
|  | bigUserReturningLambda(next()) { next() } // Not used | 
|  | } | 
|  |  | 
|  | fun bigUserReturningLambda(id: String, lambda: () -> String): () -> String { | 
|  | useRecord() | 
|  | println("[B] logging call#$id returning ${lambda()}") | 
|  | println("[C] logging call#$id returning ${lambda()}") | 
|  | return lambda | 
|  | } | 
|  |  | 
|  | fun produceSequence(size: Int): Sequence<String> { | 
|  | var count = size | 
|  | return generateSequence { if (count-- > 0) next() else null } | 
|  | } | 
|  |  | 
|  | // Need this to make sure testKotlinSequenceXXX is not processed | 
|  | // concurrently with invoke() on lambdas. | 
|  | @Synchronized fun useRecord() = useRecord2() | 
|  | @Synchronized fun useRecord2() = Record("", true) |