From 0492d81a8c41eae2cf1c48e60277141b2b1c9dc0 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 12 May 2020 13:51:56 +0300 Subject: [PATCH] [Gradle, JS] Process quoted value in yarn.lock #KT-38990 fixed --- .../kotlin/gradle/targets/js/yarn/YarnLock.kt | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLock.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLock.kt index e7039af9837..57f48e7c69a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLock.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnLock.kt @@ -1,6 +1,6 @@ /* - * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license - * that can be found in the license/LICENSE.txt file. + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.gradle.targets.js.yarn @@ -68,15 +68,36 @@ data class YarnLock(val entries: List) { } else line if (line1.isNotEmpty()) { - val values = line1.substring(indentPos).split(" ").map { value -> - val value1 = value.removeSuffix(",") - if (value1.startsWith("\"")) - try { - JsonReader(StringReader(value1)).nextString() - } catch (e: Throwable) { - value1.removePrefix("\"").removeSuffix("\"") + var line2: String = line1 + val quotedValues = QUOTED_VALUE.findAll(line1) + .flatMap { it.groupValues.drop(1).asSequence() } + .toList() + .apply { + forEachIndexed { index, item -> + line2 = line2.replace( + """ + "$item" + """.trimIndent(), + """ + "$$index" + """.trimIndent() + ) } - else value1 + } + + val values = line2.substring(indentPos).split(" ").map { value -> + val value1 = value.removeSuffix(",") + if (value1.startsWith("\"")) { + val (index) = QUOTED_PLACEHOLDER.find(value1)!!.destructured + val value2 = """ + "${quotedValues[index.toInt()]}" + """.trimIndent() + try { + JsonReader(StringReader(value2)).nextString() + } catch (e: Throwable) { + value2.removePrefix("\"").removeSuffix("\"") + } + } else value1 } if (onNewLevel) { @@ -106,3 +127,6 @@ data class YarnLock(val entries: List) { } } } + +private val QUOTED_VALUE = """"(.+?)"""".toRegex() +private val QUOTED_PLACEHOLDER = """\$(\d+)""".toRegex() \ No newline at end of file