[Gradle, JS] NpmRangeVisitor without nulls
^KT-41054 fixed
This commit is contained in:
+22
-21
@@ -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.generated.grammar.NodeSemverExpressionParser
|
||||||
import com.github.gundy.semver4j.model.Version
|
import com.github.gundy.semver4j.model.Version
|
||||||
import org.antlr.v4.runtime.tree.TerminalNode
|
import org.antlr.v4.runtime.tree.TerminalNode
|
||||||
|
import org.jetbrains.kotlin.gradle.utils.toListOrEmpty
|
||||||
|
|
||||||
class NpmRangeVisitor : NodeSemverExpressionBaseVisitor<List<NpmRange?>>() {
|
class NpmRangeVisitor : NodeSemverExpressionBaseVisitor<List<NpmRange>>() {
|
||||||
override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): List<NpmRange?> =
|
override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): List<NpmRange> =
|
||||||
listOf(null)
|
listOf(NpmRange())
|
||||||
|
|
||||||
override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): List<NpmRange?> =
|
override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): List<NpmRange> =
|
||||||
listOf(null)
|
listOf(NpmRange())
|
||||||
|
|
||||||
|
// TODO check it
|
||||||
override fun visitWildcardRange(ctx: NodeSemverExpressionParser.WildcardRangeContext): List<NpmRange> =
|
override fun visitWildcardRange(ctx: NodeSemverExpressionParser.WildcardRangeContext): List<NpmRange> =
|
||||||
listOf(eq(ctx.partialWildcardSemver().text))
|
listOf(eq(ctx.partialWildcardSemver().text))
|
||||||
|
|
||||||
@@ -44,15 +46,16 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor<List<NpmRange?>>() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): List<NpmRange?> =
|
override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): List<NpmRange> =
|
||||||
listOf(null)
|
listOf(NpmRange())
|
||||||
|
|
||||||
override fun visitTildeRange(ctx: NodeSemverExpressionParser.TildeRangeContext): List<NpmRange> {
|
override fun visitTildeRange(ctx: NodeSemverExpressionParser.TildeRangeContext): List<NpmRange> {
|
||||||
val version = Version.fromString(ctx.fullSemver().text)
|
val version = Version.fromString(ctx.fullSemver().text)
|
||||||
val nextVersion = version
|
val nextVersion = version
|
||||||
.incrementMinor()
|
.incrementMinor()
|
||||||
|
|
||||||
return listOf(gteq(version))
|
return (gteq(version) intersect lt(nextVersion))
|
||||||
|
.toListOrEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitCaretRange(ctx: NodeSemverExpressionParser.CaretRangeContext): List<NpmRange> {
|
override fun visitCaretRange(ctx: NodeSemverExpressionParser.CaretRangeContext): List<NpmRange> {
|
||||||
@@ -60,41 +63,39 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor<List<NpmRange?>>() {
|
|||||||
val nextVersion = version
|
val nextVersion = version
|
||||||
.incrementMajor()
|
.incrementMajor()
|
||||||
|
|
||||||
return lt(version) union gteq(nextVersion)
|
return (gteq(version) intersect lt(nextVersion))
|
||||||
|
.toListOrEmpty()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitFullySpecifiedSemver(ctx: NodeSemverExpressionParser.FullySpecifiedSemverContext): List<NpmRange> =
|
override fun visitFullySpecifiedSemver(ctx: NodeSemverExpressionParser.FullySpecifiedSemverContext): List<NpmRange> =
|
||||||
inverseVersion(ctx.fullSemver().text)
|
version(ctx.fullSemver().text)
|
||||||
|
|
||||||
override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): List<NpmRange?> =
|
override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): List<NpmRange> =
|
||||||
try {
|
try {
|
||||||
ctx.simple()
|
ctx.simple()
|
||||||
.flatMap { visit(it) }
|
.flatMap { visit(it) }
|
||||||
.filterNotNull()
|
|
||||||
.reduce { acc: NpmRange?, next: NpmRange ->
|
.reduce { acc: NpmRange?, next: NpmRange ->
|
||||||
val npmRange = if (acc == null) null else acc intersect next
|
val npmRange = if (acc == null) null else acc intersect next
|
||||||
npmRange
|
npmRange
|
||||||
}
|
}
|
||||||
} catch (e: UnsupportedOperationException) {
|
} catch (e: UnsupportedOperationException) {
|
||||||
null
|
null
|
||||||
}.let { listOf(it) }
|
}.toListOrEmpty()
|
||||||
|
|
||||||
override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): List<NpmRange?> =
|
override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): List<NpmRange> =
|
||||||
ctx.basicRange()
|
ctx.basicRange()
|
||||||
.flatMap { visitBasicRange(it) }
|
.flatMap { visitBasicRange(it) }
|
||||||
.onEach { if (it == null) return listOf(null) }
|
.fold(listOf()) { ranges, range ->
|
||||||
.filterNotNull()
|
|
||||||
.fold(listOf<NpmRange>()) { ranges, range ->
|
|
||||||
if (ranges.isEmpty()) listOf(range)
|
if (ranges.isEmpty()) listOf(range)
|
||||||
else ranges
|
else ranges
|
||||||
.flatMap { it union range }
|
.flatMap { it union range }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun inverseVersion(version: String): List<NpmRange> =
|
private fun version(version: String): List<NpmRange> =
|
||||||
inverseVersion(Version.fromString(version))
|
version(Version.fromString(version))
|
||||||
|
|
||||||
private fun inverseVersion(version: Version): List<NpmRange> =
|
private fun version(version: Version): List<NpmRange> =
|
||||||
gt(version) union lt(version)
|
gt(version) union lt(version)
|
||||||
|
|
||||||
private fun lt(version: String): NpmRange =
|
private fun lt(version: String): NpmRange =
|
||||||
@@ -151,6 +152,6 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor<List<NpmRange?>>() {
|
|||||||
const val LTEQ = "<="
|
const val LTEQ = "<="
|
||||||
|
|
||||||
const val AND = " "
|
const val AND = " "
|
||||||
const val OR = "||"
|
const val OR = " || "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+2
-8
@@ -11,7 +11,7 @@ import org.antlr.v4.runtime.ANTLRInputStream
|
|||||||
import org.antlr.v4.runtime.CommonTokenStream
|
import org.antlr.v4.runtime.CommonTokenStream
|
||||||
import org.gradle.api.InvalidUserDataException
|
import org.gradle.api.InvalidUserDataException
|
||||||
|
|
||||||
fun versionToNpmRanges(version: String): List<NpmRange?> {
|
fun versionToNpmRanges(version: String): List<NpmRange> {
|
||||||
val lexer = NodeSemverExpressionLexer(ANTLRInputStream(version))
|
val lexer = NodeSemverExpressionLexer(ANTLRInputStream(version))
|
||||||
val tokens = CommonTokenStream(lexer)
|
val tokens = CommonTokenStream(lexer)
|
||||||
val parser = NodeSemverExpressionParser(tokens)
|
val parser = NodeSemverExpressionParser(tokens)
|
||||||
@@ -26,12 +26,6 @@ fun buildNpmVersion(
|
|||||||
val includedRange: NpmRange? = try {
|
val includedRange: NpmRange? = try {
|
||||||
includedVersions
|
includedVersions
|
||||||
.flatMap { versionToNpmRanges(it) }
|
.flatMap { versionToNpmRanges(it) }
|
||||||
.onEach {
|
|
||||||
if (it == null) {
|
|
||||||
throw InvalidUserDataException("Problem with parsing of included versions $includedVersions")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.filterNotNull()
|
|
||||||
.reduce { acc: NpmRange, next: NpmRange ->
|
.reduce { acc: NpmRange, next: NpmRange ->
|
||||||
val intersection = acc intersect next
|
val intersection = acc intersect next
|
||||||
requireNotNull(intersection) {
|
requireNotNull(intersection) {
|
||||||
@@ -48,7 +42,7 @@ fun buildNpmVersion(
|
|||||||
val excludedRanges: List<NpmRange> = try {
|
val excludedRanges: List<NpmRange> = try {
|
||||||
excludedVersions
|
excludedVersions
|
||||||
.flatMap { versionToNpmRanges(it) }
|
.flatMap { versionToNpmRanges(it) }
|
||||||
.mapNotNull { it?.invert() }
|
.map { it.invert() }
|
||||||
.reduce { acc, next -> acc intersect next }
|
.reduce { acc, next -> acc intersect next }
|
||||||
} catch (e: UnsupportedOperationException) {
|
} catch (e: UnsupportedOperationException) {
|
||||||
throw InvalidUserDataException("No ranges for excluded versions $excludedVersions")
|
throw InvalidUserDataException("No ranges for excluded versions $excludedVersions")
|
||||||
|
|||||||
+9
@@ -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 : Any> T?.toListOrEmpty(): List<T> =
|
||||||
|
if (this == null) emptyList() else listOf(this)
|
||||||
Reference in New Issue
Block a user