From 68880e6f4769d73a39d939f098fcf0b3c218b353 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Wed, 5 Aug 2020 16:08:03 +0300 Subject: [PATCH] [Gradle, JS] NpmRangeVisitor without nulls ^KT-41054 fixed --- .../gradle/targets/js/npm/NpmRangeVisitor.kt | 43 ++++++++++--------- .../gradle/targets/js/npm/NpmVersions.kt | 10 +---- .../kotlin/gradle/utils/listUtils.kt | 9 ++++ 3 files changed, 33 insertions(+), 29 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/listUtils.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeVisitor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeVisitor.kt index 79106a905c9..dcff285fb01 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeVisitor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeVisitor.kt @@ -9,14 +9,16 @@ import com.github.gundy.semver4j.generated.grammar.NodeSemverExpressionBaseVisit import com.github.gundy.semver4j.generated.grammar.NodeSemverExpressionParser import com.github.gundy.semver4j.model.Version import org.antlr.v4.runtime.tree.TerminalNode +import org.jetbrains.kotlin.gradle.utils.toListOrEmpty -class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { - override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): List = - listOf(null) +class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { + override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): List = + listOf(NpmRange()) - override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): List = - listOf(null) + override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): List = + listOf(NpmRange()) + // TODO check it override fun visitWildcardRange(ctx: NodeSemverExpressionParser.WildcardRangeContext): List = listOf(eq(ctx.partialWildcardSemver().text)) @@ -44,15 +46,16 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { ) } - override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): List = - listOf(null) + override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): List = + listOf(NpmRange()) override fun visitTildeRange(ctx: NodeSemverExpressionParser.TildeRangeContext): List { val version = Version.fromString(ctx.fullSemver().text) val nextVersion = version .incrementMinor() - return listOf(gteq(version)) + return (gteq(version) intersect lt(nextVersion)) + .toListOrEmpty() } override fun visitCaretRange(ctx: NodeSemverExpressionParser.CaretRangeContext): List { @@ -60,41 +63,39 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { val nextVersion = version .incrementMajor() - return lt(version) union gteq(nextVersion) + return (gteq(version) intersect lt(nextVersion)) + .toListOrEmpty() } override fun visitFullySpecifiedSemver(ctx: NodeSemverExpressionParser.FullySpecifiedSemverContext): List = - inverseVersion(ctx.fullSemver().text) + version(ctx.fullSemver().text) - override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): List = + override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): List = try { ctx.simple() .flatMap { visit(it) } - .filterNotNull() .reduce { acc: NpmRange?, next: NpmRange -> val npmRange = if (acc == null) null else acc intersect next npmRange } } catch (e: UnsupportedOperationException) { null - }.let { listOf(it) } + }.toListOrEmpty() - override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): List = + override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): List = ctx.basicRange() .flatMap { visitBasicRange(it) } - .onEach { if (it == null) return listOf(null) } - .filterNotNull() - .fold(listOf()) { ranges, range -> + .fold(listOf()) { ranges, range -> if (ranges.isEmpty()) listOf(range) else ranges .flatMap { it union range } } - private fun inverseVersion(version: String): List = - inverseVersion(Version.fromString(version)) + private fun version(version: String): List = + version(Version.fromString(version)) - private fun inverseVersion(version: Version): List = + private fun version(version: Version): List = gt(version) union lt(version) private fun lt(version: String): NpmRange = @@ -151,6 +152,6 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { const val LTEQ = "<=" const val AND = " " - const val OR = "||" + const val OR = " || " } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt index ce5c283bc49..63b9cc99382 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmVersions.kt @@ -11,7 +11,7 @@ import org.antlr.v4.runtime.ANTLRInputStream import org.antlr.v4.runtime.CommonTokenStream import org.gradle.api.InvalidUserDataException -fun versionToNpmRanges(version: String): List { +fun versionToNpmRanges(version: String): List { val lexer = NodeSemverExpressionLexer(ANTLRInputStream(version)) val tokens = CommonTokenStream(lexer) val parser = NodeSemverExpressionParser(tokens) @@ -26,12 +26,6 @@ fun buildNpmVersion( val includedRange: NpmRange? = try { includedVersions .flatMap { versionToNpmRanges(it) } - .onEach { - if (it == null) { - throw InvalidUserDataException("Problem with parsing of included versions $includedVersions") - } - } - .filterNotNull() .reduce { acc: NpmRange, next: NpmRange -> val intersection = acc intersect next requireNotNull(intersection) { @@ -48,7 +42,7 @@ fun buildNpmVersion( val excludedRanges: List = try { excludedVersions .flatMap { versionToNpmRanges(it) } - .mapNotNull { it?.invert() } + .map { it.invert() } .reduce { acc, next -> acc intersect next } } catch (e: UnsupportedOperationException) { throw InvalidUserDataException("No ranges for excluded versions $excludedVersions") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/listUtils.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/listUtils.kt new file mode 100644 index 00000000000..da25921ac83 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/listUtils.kt @@ -0,0 +1,9 @@ +/* + * 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.utils + +fun T?.toListOrEmpty(): List = + if (this == null) emptyList() else listOf(this) \ No newline at end of file