Skip to content

Commit e35885b

Browse files
author
Steve Ramage
committed
feat: Add support for Token Based validators (WIP #2)
1 parent 729d58f commit e35885b

File tree

14 files changed

+863
-88
lines changed

14 files changed

+863
-88
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.intentions
2+
3+
import com.intellij.codeInspection.LocalQuickFix
4+
import com.intellij.codeInspection.ProblemDescriptor
5+
import com.intellij.openapi.project.Project
6+
import com.intellij.psi.util.PsiTreeUtil
7+
import net.sjrx.intellij.plugins.systemdunitfiles.psi.impl.UnitFilePropertyImpl
8+
9+
class ReplaceInvalidLiteralChoiceQuickFix(val offset: Int, val invalidToken : String, val replacementToken : String) : LocalQuickFix {
10+
11+
override fun getName(): String {
12+
return "Replace '${invalidToken}' with '${replacementToken}'"
13+
}
14+
15+
override fun getFamilyName(): String {
16+
return "Replace invalid value"
17+
}
18+
19+
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
20+
val fullPropertyValue = descriptor.psiElement.text
21+
22+
val newText = fullPropertyValue.substring(0, offset) + replacementToken + fullPropertyValue.substring(offset+invalidToken.length)
23+
val newElement = UnitElementFactory.createProperty(project, (descriptor.psiElement.parent as UnitFilePropertyImpl).key, newText)
24+
val property = PsiTreeUtil.getParentOfType(descriptor.psiElement, UnitFilePropertyImpl::class.java)?: return
25+
26+
property.replace(newElement)
27+
}
28+
}

src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/semanticdata/SemanticDataRepository.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,6 @@ import com.intellij.openapi.util.NotNullLazyValue
1212
import com.intellij.openapi.util.text.StringUtil
1313
import com.intellij.util.ObjectUtils
1414
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.*
15-
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.AllGrammarOptions
16-
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.GrammarOptionValue
17-
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.IOLimitOptionValue
1815
import org.apache.commons.io.IOUtils
1916
import java.io.BufferedReader
2017
import java.io.IOException
@@ -90,8 +87,11 @@ class SemanticDataRepository private constructor() {
9087
validatorMap.putAll(AllowedCpuSetOptionValue.validators)
9188
validatorMap.putAll(TtySizeOptionValue.validators)
9289
validatorMap.putAll(ExecDirectoriesOptionValue.validators)
90+
validatorMap.putAll(CPUWeightOptionValue.validators)
9391
validatorMap.putAll(IOLimitOptionValue.validators)
94-
validatorMap.putAll(AllGrammarOptions.validators)
92+
validatorMap.putAll(ImagePolicyOptionValue.validators)
93+
validatorMap.putAll(CPUWeightOptionValue.validators)
94+
validatorMap.putAll(CPUSharesOptionValue.validators)
9595

9696
// Scopes are not supported since they aren't standard unit files.
9797

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.*
5+
6+
7+
class CPUSharesOptionValue : GrammarOptionValue(validatorName, GRAMMAR) {
8+
9+
companion object {
10+
val validatorName = "config_parse_cpu_shares"
11+
12+
val GRAMMAR =
13+
SequenceCombinator(
14+
IntegerTerminal(2, 262145),
15+
EOF()
16+
)
17+
18+
val validators = mapOf(
19+
Validator(validatorName, "0") to CPUSharesOptionValue()
20+
)
21+
}
22+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.*
5+
6+
7+
class CPUWeightOptionValue : GrammarOptionValue(validatorName, GRAMMAR) {
8+
9+
companion object {
10+
val validatorName = "config_parse_cg_cpu_weight"
11+
12+
val GRAMMAR =
13+
SequenceCombinator(
14+
AlternativeCombinator(
15+
FlexibleLiteralChoiceTerminal("idle"),
16+
IntegerTerminal(1, 10001)
17+
),
18+
EOF()
19+
)
20+
21+
val validators = mapOf(
22+
Validator(validatorName, "0") to CPUWeightOptionValue()
23+
)
24+
}
25+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.*
5+
6+
7+
8+
class IOLimitOptionValue() : GrammarOptionValue("config_parse_io_limit", GRAMMAR) {
9+
10+
companion object {
11+
val GRAMMAR = SequenceCombinator(OneOrMore(SequenceCombinator(DEVICE, BYTES)), EOF())
12+
13+
val validators = mapOf(
14+
Validator("config_parse_io_limit", "0") to IOLimitOptionValue()
15+
)
16+
}
17+
}
18+
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues
2+
3+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.Validator
4+
import net.sjrx.intellij.plugins.systemdunitfiles.semanticdata.optionvalues.grammar.*
5+
6+
class ImagePolicyOptionValue : GrammarOptionValue(validatorName, IMAGE_POLICY_COMBINATOR) {
7+
8+
companion object {
9+
val validatorName = "config_parse_image_policy"
10+
11+
// Image Polcies
12+
// https://www.freedesktop.org/software/systemd/man/latest/systemd.image-policy.html
13+
val IMAGE_POLICY_SEPARATOR = LiteralChoiceTerminal(":")
14+
val PARTITION_IDENTIFIER = FlexibleLiteralChoiceTerminal( "root", "usr", "home", "srv", "esp", "xbootldr", "swap", "root-verity", "root-verity-sig", "usr-verity", "usr-verity-sig", "tmp", "var")
15+
val PARTITION_POLICY_FLAG = FlexibleLiteralChoiceTerminal("unprotected", "verity", "signed", "encrypted", "unused", "absent", "read-only-off", "read-only-on", "growfs-off", "growfs-on")
16+
val PARTITION_POLICY_FLAG_SEPARATOR = LiteralChoiceTerminal("+")
17+
val PARTITION_IDENTIFIER_FLAG_SEPARATOR = LiteralChoiceTerminal("=")
18+
19+
20+
val PARTITION_POLICY_FLAGS = SequenceCombinator(PARTITION_POLICY_FLAG, ZeroOrMore(SequenceCombinator(PARTITION_POLICY_FLAG_SEPARATOR, PARTITION_POLICY_FLAG)))
21+
22+
23+
val SINGLE_EXPLICIT_IMAGE_POLICY = SequenceCombinator(PARTITION_IDENTIFIER, PARTITION_IDENTIFIER_FLAG_SEPARATOR, PARTITION_POLICY_FLAGS)
24+
val DEFAULT_IMAGE_POLICY = SequenceCombinator(PARTITION_POLICY_FLAG_SEPARATOR, PARTITION_POLICY_FLAGS)
25+
var IMAGE_POLICY= AlternativeCombinator(SINGLE_EXPLICIT_IMAGE_POLICY, DEFAULT_IMAGE_POLICY)
26+
val IMAGE_POLICY_COMBINATOR = SequenceCombinator(IMAGE_POLICY, ZeroOrMore(SequenceCombinator(IMAGE_POLICY_SEPARATOR, IMAGE_POLICY)), EOF())
27+
28+
val validators = mapOf(
29+
Validator(validatorName, "0") to ImagePolicyOptionValue()
30+
)
31+
}
32+
33+
}

0 commit comments

Comments
 (0)