Convert async {}.await() to withContext(DefaultDispatcher) {}

This fixes incorrect transformation related to KT-24235
This commit is contained in:
Mikhail Glukhikh
2018-05-23 14:59:55 +03:00
parent 4ed4754d80
commit fbb0a3e06c
10 changed files with 38 additions and 34 deletions
@@ -45,8 +45,8 @@ class DeferredResultUnusedInspection(@JvmField var standardOnly: Boolean = true)
companion object { companion object {
private val shortNames = setOf("async") private val shortNames = setOf("async")
private val fqNames: Set<FqName> = shortNames.mapTo(mutableSetOf()) { FqName("kotlinx.coroutines.experimental.$it") } private val fqNames: Set<FqName> = shortNames.mapTo(mutableSetOf()) { FqName("$COROUTINE_PACKAGE.$it") }
private val deferred = FqName("kotlinx.coroutines.experimental.Deferred") private val deferred = FqName("$COROUTINE_PACKAGE.Deferred")
} }
} }
@@ -35,8 +35,9 @@ class RedundantAsyncInspection : AbstractCallChainChecker() {
if (defaultParent != true) return if (defaultParent != true) return
if (defaultContext!! && !defaultStart!!) return if (defaultContext!! && !defaultStart!!) return
val replacement = var replacement = conversion.replacement
if (defaultContext!! && defaultStart!!) "kotlinx.coroutines.experimental.runBlocking" else conversion.replacement if (defaultContext!! && defaultStart!!) replacement += "($defaultAsyncArgument)"
val descriptor = holder.manager.createProblemDescriptor( val descriptor = holder.manager.createProblemDescriptor(
expression, expression,
expression.firstCalleeExpression()!!.textRange.shiftRight(-expression.startOffset), expression.firstCalleeExpression()!!.textRange.shiftRight(-expression.startOffset),
@@ -51,13 +52,16 @@ class RedundantAsyncInspection : AbstractCallChainChecker() {
private val conversionGroups = conversions.group() private val conversionGroups = conversions.group()
companion object { companion object {
private val conversions = listOf( private val conversions = listOf(
Conversion( Conversion(
"kotlinx.coroutines.experimental.async", "$COROUTINE_PACKAGE.async",
"kotlinx.coroutines.experimental.Deferred.await", "$COROUTINE_PACKAGE.Deferred.await",
"kotlinx.coroutines.experimental.withContext" "$COROUTINE_PACKAGE.withContext"
) )
) )
private val defaultAsyncArgument = "$COROUTINE_PACKAGE.DefaultDispatcher"
} }
} }
internal const val COROUTINE_PACKAGE = "kotlinx.coroutines.experimental"
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -44,5 +44,5 @@ suspend fun <T> withContext(
} }
suspend fun test() { suspend fun test() {
runBlocking { 42 } withContext(DefaultDispatcher) { 42 }
} }
@@ -9,7 +9,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -21,7 +21,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -30,7 +30,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -8,7 +8,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -20,7 +20,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -29,7 +29,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()
@@ -9,7 +9,7 @@ interface Deferred<T> {
interface CoroutineContext interface CoroutineContext
object DefaultContext : CoroutineContext object DefaultDispatcher : CoroutineContext
enum class CoroutineStart { enum class CoroutineStart {
DEFAULT, DEFAULT,
@@ -21,7 +21,7 @@ enum class CoroutineStart {
interface Job interface Job
fun <T> async( fun <T> async(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
start: CoroutineStart = CoroutineStart.DEFAULT, start: CoroutineStart = CoroutineStart.DEFAULT,
parent: Job? = null, parent: Job? = null,
f: suspend () -> T f: suspend () -> T
@@ -30,7 +30,7 @@ fun <T> async(
} }
fun <T> runBlocking( fun <T> runBlocking(
context: CoroutineContext = DefaultContext, context: CoroutineContext = DefaultDispatcher,
f: suspend () -> T f: suspend () -> T
) { ) {
TODO() TODO()