Skip to content

Commit 8f55421

Browse files
author
Steve Ramage
committed
wip: feat: add support for Network.Address (blocked see MR)
1 parent ddbacfd commit 8f55421

File tree

14 files changed

+79
-45
lines changed

14 files changed

+79
-45
lines changed

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/AlternativeCombinator.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ open class AlternativeCombinator(vararg val tokens: Combinator) : Combinator {
3737
override fun SemanticMatch(value: String, offset: Int): MatchResult {
3838
return match(value, offset, Combinator::SemanticMatch)
3939
}
40+
41+
override fun toString(): String {
42+
return "Alt(" + tokens.joinToString(",") { it.toString() } + ")"
43+
}
4044
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Combinators.kt

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,19 +18,25 @@ val DOUBLE_COLON = LiteralChoiceTerminal("::")
1818

1919

2020
val IPV6_FULL_SPECIFIED = SequenceCombinator(IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET)
21-
val IPV6_ZERO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 8)), IPV6_HEXTET)
22-
val IPV6_ONE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 7)), IPV6_HEXTET)
23-
val IPV6_TWO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON, IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 6)), IPV6_HEXTET)
24-
val IPV6_THREE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 5)), IPV6_HEXTET)
25-
val IPV6_FOUR_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 4)), IPV6_HEXTET)
26-
val IPV6_FIVE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 3)), IPV6_HEXTET)
27-
val IPV6_SIX_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 2)), IPV6_HEXTET)
21+
val IPV6_ZERO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 8), IPV6_HEXTET)))
22+
val IPV6_ONE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator( Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 7), IPV6_HEXTET)))
23+
val IPV6_TWO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON, IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 6), IPV6_HEXTET)))
24+
val IPV6_THREE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 5), IPV6_HEXTET)))
25+
val IPV6_FOUR_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 4), IPV6_HEXTET)))
26+
val IPV6_FIVE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 3), IPV6_HEXTET)))
27+
val IPV6_SIX_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 2), IPV6_HEXTET)))
2828
val IPV6_SEVEN_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, COLON,IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(IPV6_HEXTET))
29+
30+
31+
val IPV6_IPV4_SUFFIX_FULL = SequenceCombinator(IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV6_HEXTET, COLON, IPV4_ADDR)
32+
val IPV6_IPV4_SUFFIX_ZERO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 6), IPV4_ADDR)))
33+
val IPV6_IPV4_SUFFIX_ONE_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 5), IPV4_ADDR)))
34+
val IPV6_IPV4_SUFFIX_TWO_HEXTET_BEFORE_ZERO_COMP = SequenceCombinator(IPV6_HEXTET, COLON, IPV6_HEXTET, DOUBLE_COLON, ZeroOrOne(SequenceCombinator(Repeat(SequenceCombinator(IPV6_HEXTET, COLON), 0, 4), IPV4_ADDR)))
35+
2936
val IPV6_ALL_ZEROS = DOUBLE_COLON
3037

3138
val IPV6_ADDR = AlternativeCombinator(
3239
IPV6_FULL_SPECIFIED,
33-
// Reverse the order of these
3440
IPV6_SEVEN_HEXTET_BEFORE_ZERO_COMP,
3541
IPV6_SIX_HEXTET_BEFORE_ZERO_COMP,
3642
IPV6_FIVE_HEXTET_BEFORE_ZERO_COMP,
@@ -40,12 +46,15 @@ val IPV6_ADDR = AlternativeCombinator(
4046
IPV6_ONE_HEXTET_BEFORE_ZERO_COMP,
4147
// Must go last because it's the most general
4248
IPV6_ZERO_HEXTET_BEFORE_ZERO_COMP,
43-
IPV6_ALL_ZEROS,
49+
50+
// IPV6_IPV4_SUFFIX_ONE_HEXTET_BEFORE_ZERO_COMP,
51+
// IPV6_IPV4_SUFFIX_TWO_HEXTET_BEFORE_ZERO_COMP,
52+
// IPV6_ALL_ZEROS,
4453
)
4554

4655
val IPV6_ADDR_AND_PREFIX_LENGTH = SequenceCombinator(IPV6_ADDR, CIDR_SEPARATOR, IntegerTerminal(64, 129))
4756

4857

4958
var IP_ADDR_AND_PREFIX_LENGTH = AlternativeCombinator(
50-
IPV4_ADDR_AND_PREFIX_LENGTH,
59+
//IPV4_ADDR_AND_PREFIX_LENGTH,
5160
IPV6_ADDR_AND_PREFIX_LENGTH)

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/FlexibleLiteralChoiceTerminal.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,5 +91,11 @@ class FlexibleLiteralChoiceTerminal(vararg val choices: String) : TerminalCombin
9191
return NoMatch.copy(longestMatch = offset)
9292
}
9393

94-
94+
override fun toString(): String {
95+
return if (choices.size == 1) {
96+
"FlexLitChoice(\"${choices[0]}\")"
97+
} else {
98+
"FlexLitChoice(" + choices.joinToString(",") { "\"$it\"" } + ")"
99+
}
100+
}
95101
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/IntegerTerminal.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,8 @@ class IntegerTerminal(private val minInclusive: Int,private val maxExclusive: In
2222

2323
return MatchResult(listOf(matchResult.value), offset + matchResult.value.length, listOf(this), offset + matchResult.value.length)
2424
}
25+
26+
override fun toString(): String {
27+
return "Int($minInclusive,$maxExclusive)"
28+
}
2529
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/LiteralChoiceTerminal.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,12 @@ class LiteralChoiceTerminal(vararg var choices: String) : TerminalCombinator {
2323
override fun SemanticMatch(value: String, offset: Int): MatchResult {
2424
return match(value, offset)
2525
}
26+
27+
override fun toString(): String {
28+
return if (choices.size == 1) {
29+
"Literal(\"${choices[0]}\")"
30+
} else {
31+
"LitChoice(" + choices.joinToString(",") { "\"$it\"" } + ")"
32+
}
33+
}
2634
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/OneOrMore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ class OneOrMore(val combinator : Combinator) : Combinator {
3939
override fun SemanticMatch(value: String, offset: Int): MatchResult {
4040
return match(value, offset, combinator::SemanticMatch)
4141
}
42+
43+
override fun toString(): String {
44+
return "OneOrMore(${combinator})"
45+
}
4246
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/OptionalWhitespacePrefix.kt

Lines changed: 5 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -5,30 +5,9 @@ class OptionalWhitespacePrefix(val combinator: Combinator):
55
SequenceCombinator(WhitespaceTerminal(), combinator),
66
combinator
77
) {
8-
//
9-
// override fun SyntacticMatch(value: String, offset: Int): MatchResult {
10-
// var newOffset = offset
11-
// for(o in offset..<value.length) {
12-
// if (value[o].isWhitespace()) {
13-
// newOffset = o + 1
14-
// } else {
15-
// break
16-
// }
17-
// }
18-
//
19-
// return combinator.SyntacticMatch(value, newOffset)
20-
// }
21-
//
22-
// override fun SemanticMatch(value: String, offset: Int): MatchResult {
23-
// var newOffset = offset
24-
// for(o in offset..<value.length) {
25-
// if (value[o].isWhitespace()) {
26-
// newOffset = o + 1
27-
// } else {
28-
// break
29-
// }
30-
// }
31-
//
32-
// return combinator.SemanticMatch(value, newOffset)
33-
// }
8+
9+
10+
override fun toString(): String {
11+
return "\\s*{${combinator}}"
12+
}
3413
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/RegexTerminal.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,8 @@ class RegexTerminal(syntaticMatchStr : String, semanticMatchStr: String ) : Term
1717

1818
return MatchResult(listOf(matchResult.value), offset + matchResult.value.length, listOf(this), offset + matchResult.value.length)
1919
}
20+
21+
override fun toString(): String {
22+
return "Regex(\"${semanticMatch.pattern}\")"
23+
}
2024
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/Repeat.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,8 @@ class Repeat(val combinator : Combinator, val minInclusive: Int, val maxExclusiv
6161
override fun SemanticMatch(value: String, offset: Int): MatchResult {
6262
return match(value, offset, combinator::SemanticMatch)
6363
}
64+
65+
override fun toString(): String {
66+
return "Repeat(${combinator},$minInclusive,$maxExclusive)"
67+
}
6468
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/SequenceCombinator.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,4 +54,8 @@ open class SequenceCombinator(vararg val tokens: Combinator) : Combinator {
5454
}
5555
return MatchResult(resultTokens, index, resultTerminals, maxLength)
5656
}
57+
58+
override fun toString(): String {
59+
return "Seq(" + tokens.joinToString(",") { it.toString() } + ")"
60+
}
5761
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/WhitespaceTerminal.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,8 @@ class WhitespaceTerminal : TerminalCombinator {
2626
override fun SemanticMatch(value: String, offset: Int): MatchResult {
2727
return match(value, offset)
2828
}
29+
30+
override fun toString(): String {
31+
return "\\s+"
32+
}
2933
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ZeroOrMore.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,8 @@ class ZeroOrMore(val combinator : Combinator) : Combinator {
4141
override fun SemanticMatch(value: String, offset: Int): MatchResult {
4242
return match(value, offset, combinator::SemanticMatch)
4343
}
44+
45+
override fun toString(): String {
46+
return "ZeroOrMore(${combinator})"
47+
}
4448
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/optionvalues/grammar/ZeroOrOne.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ class ZeroOrOne(val combinator : Combinator) : Combinator {
3939
override fun SemanticMatch(value: String, offset: Int): MatchResult {
4040
return match(value, offset, combinator::SemanticMatch)
4141
}
42+
43+
override fun toString(): String {
44+
return "ZeroOrOne(${combinator})"
45+
}
4246
}

src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/inspections/InvalidValueForNetworkAddressesTest.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ class InvalidValueForNetworkAddressesTest : AbstractUnitFileTest() {
5353
fun testNoWarningWhenValidIPv6NetworkAddressSet() {
5454
// Fixture Setup
5555

56-
/*
57-
Address=::ffff/64
56+
// language="unit file (systemd)"
57+
val file="""
58+
[Network]
59+
Address=::ffff/64
5860
Address=::FFFF/64
5961
Address=::/64
6062
Address=::1/128
@@ -73,12 +75,6 @@ class InvalidValueForNetworkAddressesTest : AbstractUnitFileTest() {
7375
Address=::1/127
7476
Address=2001:db8::/65
7577
Address=ff02::1/128
76-
*/
77-
// language="unit file (systemd)"
78-
val file="""
79-
[Network]
80-
Address=2001:db8::/65
81-
8278
""".trimIndent()
8379

8480
// Execute SUT

0 commit comments

Comments
 (0)