11package com.github.xepozz.crontab.ide
22
33import com.github.xepozz.crontab.language.psi.CrontabTimeList
4+ import com.github.xepozz.crontab.language.psi.impl.CrontabImplUtil
45
56object CrontabTimeRangeUtil {
6- fun expandRanges (element : CrontabTimeList ): Set <Int > {
7- val input = element.timeListItemList
8- .mapNotNull {
9- when {
10- it.timeRange != null -> " ${it.timeRange!! .text} "
11- it.timeExactNumber != null -> " ${it.timeExactNumber!! .text} "
12- else -> null
13- }
7+ fun canCollapseRanges (element : CrontabTimeList ): Boolean {
8+ return element.timeListItemList.all {
9+ val range = it.timeRange
10+ when {
11+ it.timeExactNumber != null -> true
12+ range != null -> CrontabImplUtil .getFirst(range) <= CrontabImplUtil .getSecond(range)
13+ else -> false
1414 }
15- return expandRanges(input)
15+ }
16+ }
17+
18+ fun expandRanges (element : CrontabTimeList ): Set <Int > {
19+ return expandRanges(element.numericItems())
1620 }
1721
1822 fun collapseRanges (element : CrontabTimeList ): List <String > {
19- val input = element.timeListItemList
20- .mapNotNull {
21- when {
22- it.timeRange != null -> " ${it.timeRange!! .text} "
23- it.timeExactNumber != null -> " ${it.timeExactNumber!! .text} "
24- else -> null
25- }
26- }
27- return collapseRanges(input)
23+ return collapseRanges(element.numericItems())
2824 }
2925
3026 fun collapseRanges (input : List <String >): List <String > {
@@ -37,28 +33,29 @@ object CrontabTimeRangeUtil {
3733 var rangeStart = sortedNumbers[0 ]
3834 var rangeEnd = sortedNumbers[0 ]
3935
36+ fun addRange (start : Int , end : Int ) {
37+ when {
38+ start == end -> result.add(" $start " )
39+ start + 1 == end -> {
40+ result.add(" $start " )
41+ result.add(" $end " )
42+ }
43+
44+ else -> result.add(" $start -$end " )
45+ }
46+ }
47+
4048 for (i in 1 until sortedNumbers.size) {
4149 if (sortedNumbers[i] == rangeEnd + 1 ) {
4250 rangeEnd = sortedNumbers[i]
4351 } else {
44- if (rangeStart == rangeEnd) {
45- result.add(" $rangeStart " )
46- } else {
47- result.add(" $rangeStart -$rangeEnd " )
48- }
52+ addRange(rangeStart, rangeEnd)
4953 rangeStart = sortedNumbers[i]
5054 rangeEnd = sortedNumbers[i]
5155 }
5256 }
5357
54- // Add the last range
55- if (rangeStart == rangeEnd) {
56- result.add(" $rangeStart " )
57- } else if (rangeStart + 1 == rangeEnd) {
58- result.add(" $rangeStart ,$rangeEnd " )
59- } else {
60- result.add(" $rangeStart -$rangeEnd " )
61- }
58+ addRange(rangeStart, rangeEnd)
6259
6360 return result
6461 }
@@ -69,17 +66,22 @@ object CrontabTimeRangeUtil {
6966
7067 // Parse the input and collect all individual numbers and ranges
7168 for (item in input) {
72- if (item.contains(" -" )) {
73- // Handle range
69+ if (" -" in item) {
7470 val parts = item.split(" -" )
71+ if (parts.size != 2 ) continue
7572 val start = parts[0 ].toIntOrNull() ? : continue
7673 val end = parts[1 ].toIntOrNull() ? : continue
7774 numbers.addAll(start.. end)
7875 } else {
79- // Handle individual number
8076 numbers.add(item.toIntOrNull() ? : continue )
8177 }
8278 }
8379 return numbers
8480 }
85- }
81+
82+ private fun CrontabTimeList.numericItems (): List <String > {
83+ return timeListItemList.mapNotNull {
84+ it.timeRange?.text ? : it.timeExactNumber?.text
85+ }
86+ }
87+ }
0 commit comments