From f1b8c622316a6a82daedcc859e2198d7cb96c554 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 3 Aug 2020 18:15:53 +0300 Subject: [PATCH] [Gradle, JS] Use rejected versions ^KT-41054 fixed --- .../targets/js/npm/NpmVersionConstraint.kt | 24 ++++++++++----- .../js/npm/NpmVersionInvertedVisitor.kt | 2 +- .../targets/js/npm/NpmVersionInverter.kt | 29 +++++++++++++++++++ 3 files changed, 47 insertions(+), 8 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInverter.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt index 08bd545186c..78b847852a7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionConstraint.kt @@ -13,23 +13,33 @@ class NpmVersionConstraint( ) : DefaultMutableVersionConstraint(version) { override fun rejectAll() { super.rejectAll() - reject("0.0.0") + reject(NONE_VERSION) } fun toSemVer(): String { if (requiredVersion.isEmpty()) { - return preferredVersion + return buildNpmVersion( + includedVersions = listOf(preferredVersion), + excludedVersions = rejectedVersions + ) } if (strictVersion.isNotEmpty()) { - return strictVersion + return buildNpmVersion( + includedVersions = listOf(strictVersion), + excludedVersions = rejectedVersions + ) } - val requiredRange = "^$requiredVersion" - return if (SemVer.valid(requiredRange) && SemVer.satisfies(requiredVersion, requiredRange)) { + val version = buildNpmVersion(listOf(requiredVersion), rejectedVersions) + + val requiredRange = "^$version" + return if (SemVer.valid(requiredRange) && SemVer.satisfies(version, requiredRange)) { requiredRange } else { - requiredVersion + version } } -} \ No newline at end of file +} + +const val NONE_VERSION = "0.0.0" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInvertedVisitor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInvertedVisitor.kt index 4084e01a893..9c3bcf7d7a3 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInvertedVisitor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInvertedVisitor.kt @@ -12,7 +12,7 @@ import org.antlr.v4.runtime.tree.TerminalNode class NpmVersionInvertedVisitor : NodeSemverExpressionBaseVisitor() { override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): String = - WILDCARD_VERSION + NONE_VERSION override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): String = NONE_VERSION diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInverter.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInverter.kt new file mode 100644 index 00000000000..88ce5dfa680 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersionInverter.kt @@ -0,0 +1,29 @@ +/* + * 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.npm + +import com.github.gundy.semver4j.generated.grammar.NodeSemverExpressionLexer +import com.github.gundy.semver4j.generated.grammar.NodeSemverExpressionParser +import org.antlr.v4.runtime.ANTLRInputStream +import org.antlr.v4.runtime.CommonTokenStream +import org.jetbrains.kotlin.gradle.targets.js.npm.NpmVersionInvertedVisitor.Companion.AND + +fun invertNpmVersion(version: String): String { + val lexer = NodeSemverExpressionLexer(ANTLRInputStream(version)) + val tokens = CommonTokenStream(lexer) + val parser = NodeSemverExpressionParser(tokens) + return NpmVersionInvertedVisitor() + .visit(parser.rangeSet())!! +} + +fun buildNpmVersion( + includedVersions: List, + excludedVersions: List +): String = + includedVersions + .joinToString(AND) { it.trimIndent() } + + excludedVersions + .joinToString(prefix = AND, separator = AND) { invertNpmVersion(it.trimIndent()) } \ No newline at end of file