diff --git a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/settings/ExperimentalSettings.kt b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/settings/ExperimentalSettings.kt index 070aae6d..d01b40b1 100644 --- a/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/settings/ExperimentalSettings.kt +++ b/src/main/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/settings/ExperimentalSettings.kt @@ -22,12 +22,26 @@ class ExperimentalSettings : PersistentStateComponent? { + + val psiFile = PsiManager.getInstance(project).findFile(file) ?: return null + + if (psiFile.language != UnitFileLanguage.INSTANCE) { + return null + } + + val state = ExperimentalSettings.getInstance(project).state + if (!state.useGrammarParseEngine) { + return null + } + + if (state.newEngineBannerDismissed) { + return null + } + + return Function { fileEditor -> + val panel = EditorNotificationPanel(fileEditor, EditorNotificationPanel.Status.Info) + + panel.text = "Unit File Support (systemd) use a new experimental engine for validating systemd values. Having problems, switch back and report it." + panel.createActionLabel("Dismiss") { + state.newEngineBannerDismissed = true + EditorNotifications.getInstance(project).updateAllNotifications() + DaemonCodeAnalyzer.getInstance(project).restart() + } + + panel.createActionLabel("Switch back") { + state.useGrammarParseEngine = false + EditorNotifications.getInstance(project).updateAllNotifications() + DaemonCodeAnalyzer.getInstance(project).restart() + } + panel + + } + } +} diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 72b2ed2a..d4902b93 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -102,6 +102,7 @@ displayName="systemd Unit Files" parentId="tools"/> + diff --git a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/AbstractUnitFileTest.kt b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/AbstractUnitFileTest.kt index ad4ad0b9..571ee203 100644 --- a/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/AbstractUnitFileTest.kt +++ b/src/test/kotlin/net/sjrx/intellij/plugins/systemdunitfiles/AbstractUnitFileTest.kt @@ -2,22 +2,34 @@ package net.sjrx.intellij.plugins.systemdunitfiles import com.intellij.codeInsight.completion.CompletionType import com.intellij.codeInsight.daemon.impl.HighlightInfo -import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInspection.LocalInspectionTool import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.tree.IElementType import com.intellij.psi.util.PsiTreeUtil import com.intellij.testFramework.fixtures.BasePlatformTestCase -import com.intellij.testFramework.utils.module.assertContains -import junit.framework.TestCase import net.sjrx.intellij.plugins.systemdunitfiles.generated.UnitFileElementTypeHolder +import net.sjrx.intellij.plugins.systemdunitfiles.settings.ExperimentalSettings import org.hamcrest.CoreMatchers.hasItem import org.hamcrest.MatcherAssert.assertThat -import java.util.* import java.util.stream.Collectors abstract class AbstractUnitFileTest : BasePlatformTestCase() { + + override fun setUp() { + super.setUp() + // Pin the grammar-engine flag to false (its historical default) so the shipped production default + // — flipped to true in #467 — does not leak into tests. This keeps the CI matrix meaningful: + // * -Dsystemd.unit.grammarParseEngine=false -> flag false + FORCE_PARSE_ENGINE false: the OLD + // validation engine is exercised (still reachable in production via "Switch back"), so it stays + // covered even though it is no longer the default. + // * -Dsystemd.unit.grammarParseEngine=true -> FORCE_PARSE_ENGINE forces the NEW validation + // engine regardless of the flag. + // Tests that need the new engine's flag-gated features (grammar coloring, completion, IPv6 + // inspection) set useGrammarParseEngine = true explicitly, overriding this. + ExperimentalSettings.getInstance(project).state.useGrammarParseEngine = false + } + protected fun enableInspection(cls: Class?) { myFixture.enableInspections(cls) } @@ -63,15 +75,12 @@ abstract class AbstractUnitFileTest : BasePlatformTestCase() { @JvmStatic protected fun assertStringContains(subject: String, value: String) { - TestCase.assertTrue("Expected that $value contains $subject", value.contains(subject)) + assertTrue("Expected that $value contains $subject", value.contains(subject)) } @JvmStatic protected fun assertContainsQuickfix(info: HighlightInfo, quickfixName: String) { - - var found = false val quickFixes = info.quickFixActionRanges.map { - it -> it.first.action.text }