diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRange.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRange.kt index 9d2d2cccbd7..8db96b48639 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRange.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRange.kt @@ -9,7 +9,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmRangeVisitor.Companion.GT import org.jetbrains.kotlin.gradle.targets.js.npm.NpmRangeVisitor.Companion.GTEQ import org.jetbrains.kotlin.gradle.targets.js.npm.NpmRangeVisitor.Companion.LT import org.jetbrains.kotlin.gradle.targets.js.npm.NpmRangeVisitor.Companion.LTEQ -import org.jetbrains.kotlin.gradle.utils.toListOrEmpty +import org.jetbrains.kotlin.gradle.utils.toSetOrEmpty /** [startVersion] or [endVersion] equaling null means Infinite on appropriate edge, @@ -47,8 +47,8 @@ data class NpmRange( } } -infix fun NpmRange.union(other: NpmRange): List { - if (!hasIntersection(other)) return listOf(this, other) +infix fun NpmRange.union(other: NpmRange): Set { + if (!hasIntersection(other)) return setOf(this, other) val startVersion = minStart(this, other) @@ -59,13 +59,13 @@ infix fun NpmRange.union(other: NpmRange): List { startInclusive = if (startVersion == other.startVersion) other.startInclusive else this.startInclusive, endVersion = endVersion, endInclusive = if (endVersion == other.endVersion) other.endInclusive else this.endInclusive - ).toListOrEmpty() + ).toSetOrEmpty() } -fun NpmRange.invert(): List { - if (startVersion == null && endVersion == null) return emptyList() +fun NpmRange.invert(): Set { + if (startVersion == null && endVersion == null) return emptySet() - val result = mutableListOf() + val result = mutableSetOf() if (startVersion != null || endVersion == null) { result.add( NpmRange( @@ -84,10 +84,10 @@ fun NpmRange.invert(): List { ) } - return result.distinct() + return result } -infix fun List.intersect(others: List): List = flatMap { current -> +infix fun Set.intersect(others: Set): Set = flatMapTo(mutableSetOf()) { current -> others.mapNotNull { other -> current intersect other } 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 9aa1cab73c9..6035953d2b0 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,16 +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 +import org.jetbrains.kotlin.gradle.utils.toSetOrEmpty -class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { - override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): List = - listOf(NpmRange()) +class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { + override fun visitEmptyRange(ctx: NodeSemverExpressionParser.EmptyRangeContext): Set = + setOf(NpmRange()) - override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): List = - listOf(NpmRange()) + override fun visitWildcard(ctx: NodeSemverExpressionParser.WildcardContext): Set = + setOf(NpmRange()) - override fun visitWildcardRange(ctx: NodeSemverExpressionParser.WildcardRangeContext): List { + override fun visitWildcardRange(ctx: NodeSemverExpressionParser.WildcardRangeContext): Set { val partialWildcardSemver = ctx.partialWildcardSemver() val versionText = partialWildcardSemver.text val version = versionText @@ -34,10 +34,10 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { } return (gteq(version) intersect lt(nextVersion)) - .toListOrEmpty() + .toSetOrEmpty() } - override fun visitOperator(ctx: NodeSemverExpressionParser.OperatorContext): List { + override fun visitOperator(ctx: NodeSemverExpressionParser.OperatorContext): Set { val eq: TerminalNode? = ctx.unaryOperator().EQ() val gt: TerminalNode? = ctx.unaryOperator().GT() val lt: TerminalNode? = ctx.unaryOperator().LT() @@ -45,54 +45,54 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { val version = ctx.partialWildcardSemver().text if (gt == null && lt == null) { - return listOf(eq(version)) + return setOf(eq(version)) } val eqToken = eq != null if (lt != null) { - return listOf( + return setOf( if (eqToken) lteq(version) else lt(version) ) } - return listOf( + return setOf( if (eqToken) gteq(version) else gt(version) ) } - override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): List = - listOf(NpmRange()) + override fun visitWildcardOperator(ctx: NodeSemverExpressionParser.WildcardOperatorContext): Set = + setOf(NpmRange()) - override fun visitTildeRange(ctx: NodeSemverExpressionParser.TildeRangeContext): List { + override fun visitTildeRange(ctx: NodeSemverExpressionParser.TildeRangeContext): Set { val version = Version.fromString(ctx.fullSemver().text) val nextVersion = version .incrementMinor() return (gteq(version) intersect lt(nextVersion)) - .toListOrEmpty() + .toSetOrEmpty() } - override fun visitCaretRange(ctx: NodeSemverExpressionParser.CaretRangeContext): List { + override fun visitCaretRange(ctx: NodeSemverExpressionParser.CaretRangeContext): Set { val version = Version.fromString(ctx.fullSemver().text) val nextVersion = version .incrementMajor() return (gteq(version) intersect lt(nextVersion)) - .toListOrEmpty() + .toSetOrEmpty() } - override fun visitFullySpecifiedSemver(ctx: NodeSemverExpressionParser.FullySpecifiedSemverContext): List = + override fun visitFullySpecifiedSemver(ctx: NodeSemverExpressionParser.FullySpecifiedSemverContext): Set = visitFullSemver(ctx.fullSemver()) - override fun visitFullSemver(ctx: NodeSemverExpressionParser.FullSemverContext): List = + override fun visitFullSemver(ctx: NodeSemverExpressionParser.FullSemverContext): Set = version(ctx.text) - override fun visitHyphenatedRangeOfFullySpecifiedVersions(ctx: NodeSemverExpressionParser.HyphenatedRangeOfFullySpecifiedVersionsContext): List = + override fun visitHyphenatedRangeOfFullySpecifiedVersions(ctx: NodeSemverExpressionParser.HyphenatedRangeOfFullySpecifiedVersionsContext): Set = (gteq(ctx.left.text) intersect lteq(ctx.right.text)) - .toListOrEmpty() + .toSetOrEmpty() - override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): List = + override fun visitLogicalAndOfSimpleExpressions(ctx: NodeSemverExpressionParser.LogicalAndOfSimpleExpressionsContext): Set = try { ctx.simple() .flatMap { visit(it) } @@ -102,23 +102,22 @@ class NpmRangeVisitor : NodeSemverExpressionBaseVisitor>() { } } catch (e: UnsupportedOperationException) { null - }.toListOrEmpty() + }.toSetOrEmpty() - override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): List = + override fun visitLogicalOrOfMultipleRanges(ctx: NodeSemverExpressionParser.LogicalOrOfMultipleRangesContext): Set = ctx.basicRange() .flatMap { visitBasicRange(it) } - .fold(listOf()) { ranges, range -> - if (ranges.isEmpty()) listOf(range) + .fold(setOf()) { ranges, range -> + if (ranges.isEmpty()) setOf(range) else ranges - .flatMap { it union range } - + .flatMapTo(mutableSetOf()) { it union range } } - private fun version(version: String): List = + private fun version(version: String): Set = version(Version.fromString(version)) - private fun version(version: Version): List = - (gteq(version) intersect lteq(version)).toListOrEmpty() + private fun version(version: Version): Set = + (gteq(version) intersect lteq(version)).toSetOrEmpty() private fun lt(version: String): NpmRange = lt(Version.fromString(version)) 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 051fccd648a..182f92565d4 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): Set { val lexer = NodeSemverExpressionLexer(ANTLRInputStream(version)) val tokens = CommonTokenStream(lexer) val parser = NodeSemverExpressionParser(tokens) @@ -43,7 +43,7 @@ fun buildNpmVersion( if (excludedVersions.isEmpty()) return includedRange.toString() - val excludedRanges: List = try { + val excludedRanges: Set = try { excludedVersions .flatMap { versionToNpmRanges(it) } .map { it.invert() } 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/setUtils.kt similarity index 72% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/listUtils.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/utils/setUtils.kt index da25921ac83..a5d4d422682 100644 --- 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/setUtils.kt @@ -5,5 +5,5 @@ package org.jetbrains.kotlin.gradle.utils -fun T?.toListOrEmpty(): List = - if (this == null) emptyList() else listOf(this) \ No newline at end of file +fun T?.toSetOrEmpty(): Set = + if (this == null) emptySet() else setOf(this) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeTest.kt b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeTest.kt index e43b572efe6..5e85d601517 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/test/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmRangeTest.kt @@ -89,26 +89,26 @@ class NpmRangeTest { @Test fun unionTest() { - fun assertUnion(range1: NpmRange, range2: NpmRange, expected: List) { + fun assertUnion(range1: NpmRange, range2: NpmRange, expected: Set) { val union = (range1 union range2) assertTrue("Range $range1 and $range2 expected to have union $expected, but actual is $union") { - union.toSet() == expected.toSet() + union == expected } val symUnion = range2 union range1 assertTrue("Range $range2 and $range1 expected to have union $expected, but actual is $symUnion") { - symUnion.toSet() == expected.toSet() + symUnion == expected } } val range1 = npmRange(startMajor = 1, endMajor = 2) val range2 = npmRange(startMajor = 3, endMajor = 4) - assertUnion(range1, range2, listOf(range1, range2)) + assertUnion(range1, range2, setOf(range1, range2)) assertUnion( npmRange(startMajor = 1, endMajor = 3), npmRange(startMajor = 2, endMajor = 4), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 4 @@ -119,7 +119,7 @@ class NpmRangeTest { assertUnion( npmRange(startMajor = 1, endMajor = 3), npmRange(startMajor = 2, endMajor = 4, startInclusive = true, endInclusive = true), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 4, @@ -131,7 +131,7 @@ class NpmRangeTest { assertUnion( npmRange(startMajor = 1, endMajor = 3, startInclusive = true, endInclusive = true), npmRange(startMajor = 2, endMajor = 4, startInclusive = true, endInclusive = true), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 4, @@ -144,7 +144,7 @@ class NpmRangeTest { assertUnion( npmRange(startMajor = 1, endMajor = 4, startInclusive = true, endInclusive = true), npmRange(startMajor = 2, endMajor = 3, startInclusive = true, endInclusive = true), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 4, @@ -157,7 +157,7 @@ class NpmRangeTest { assertUnion( npmRange(startMajor = 1, endMajor = 2), npmRange(startMajor = 2, endMajor = 3), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 2 @@ -172,7 +172,7 @@ class NpmRangeTest { assertUnion( npmRange(startMajor = 1, endMajor = 2, endInclusive = true), npmRange(startMajor = 2, endMajor = 3, startInclusive = true), - listOf( + setOf( npmRange( startMajor = 1, endMajor = 3 @@ -183,23 +183,23 @@ class NpmRangeTest { @Test fun rangeInvertTest() { - fun assertInvert(invertible: NpmRange, expected: List) { + fun assertInvert(invertible: NpmRange, expected: Set) { val invert = invertible.invert() assertTrue("Inverted $invertible should be $expected but found $invert") { - invert.toSet() == expected.toSet() + invert == expected } } - assertInvert(npmRange(), emptyList()) + assertInvert(npmRange(), emptySet()) - assertInvert(npmRange(endMajor = 1), listOf(npmRange(startMajor = 1, startInclusive = true))) - assertInvert(npmRange(startMajor = 1), listOf(npmRange(endMajor = 1, endInclusive = true))) - assertInvert(npmRange(endMajor = 1, endInclusive = true), listOf(npmRange(startMajor = 1))) - assertInvert(npmRange(startMajor = 1, startInclusive = true), listOf(npmRange(endMajor = 1))) + assertInvert(npmRange(endMajor = 1), setOf(npmRange(startMajor = 1, startInclusive = true))) + assertInvert(npmRange(startMajor = 1), setOf(npmRange(endMajor = 1, endInclusive = true))) + assertInvert(npmRange(endMajor = 1, endInclusive = true), setOf(npmRange(startMajor = 1))) + assertInvert(npmRange(startMajor = 1, startInclusive = true), setOf(npmRange(endMajor = 1))) assertInvert( npmRange(startMajor = 1, endMajor = 2), - listOf( + setOf( npmRange(endMajor = 1, endInclusive = true), npmRange(startMajor = 2, startInclusive = true) )