From 37f03221789ab6629a8d672821ea1810cfdfa49d Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 27 Nov 2025 17:06:43 +0200 Subject: [PATCH 1/2] CE-115 multiple include --- .../plugin/gen/parser/OapParser.java | 30 ++++++++---- grammars/oap.bnf | 6 +-- .../plugin/ref/ValidParametersInspection.kt | 48 +++++++++++++++++++ src/main/resources/META-INF/plugin.xml | 5 ++ .../plugin/inspection/OapParametersTest.kt | 20 ++++++++ .../plugin/parser/OapParserTest.kt | 3 ++ testdata/parser/Include2.oap | 7 +++ testdata/parser/Include2.txt | 48 +++++++++++++++++++ 8 files changed, 155 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt create mode 100644 src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt create mode 100644 testdata/parser/Include2.oap create mode 100644 testdata/parser/Include2.txt diff --git a/gen/oap/application/plugin/gen/parser/OapParser.java b/gen/oap/application/plugin/gen/parser/OapParser.java index bcfb5e9..cb4bc12 100644 --- a/gen/oap/application/plugin/gen/parser/OapParser.java +++ b/gen/oap/application/plugin/gen/parser/OapParser.java @@ -580,11 +580,11 @@ private static boolean id_value_1_1(PsiBuilder b, int l) { // [] // module_name_pair // ( &'enabled' module_enabled )? - // ( &'include' module_include )? + // ( &'include' module_include )* // ( &'dependsOn' module_depends_on )? - // ( &'include' module_include )? + // ( &'include' module_include )* // ( &'services' module_services )? - // ( &'include' module_include )? + // ( &'include' module_include )* // ( &'configurations' module_configurations )? static boolean module(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module")) return false; @@ -637,10 +637,14 @@ private static boolean module_2_0_0(PsiBuilder b, int l) { return r; } - // ( &'include' module_include )? + // ( &'include' module_include )* private static boolean module_3(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module_3")) return false; - module_3_0(b, l + 1); + while (true) { + int c = current_position_(b); + if (!module_3_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "module_3", c)) break; + } return true; } @@ -693,10 +697,14 @@ private static boolean module_4_0_0(PsiBuilder b, int l) { return r; } - // ( &'include' module_include )? + // ( &'include' module_include )* private static boolean module_5(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module_5")) return false; - module_5_0(b, l + 1); + while (true) { + int c = current_position_(b); + if (!module_5_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "module_5", c)) break; + } return true; } @@ -749,10 +757,14 @@ private static boolean module_6_0_0(PsiBuilder b, int l) { return r; } - // ( &'include' module_include )? + // ( &'include' module_include )* private static boolean module_7(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module_7")) return false; - module_7_0(b, l + 1); + while (true) { + int c = current_position_(b); + if (!module_7_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "module_7", c)) break; + } return true; } diff --git a/grammars/oap.bnf b/grammars/oap.bnf index 25598f7..a1ff206 100644 --- a/grammars/oap.bnf +++ b/grammars/oap.bnf @@ -92,11 +92,11 @@ module ::= [] module_name_pair ( &'enabled' module_enabled )? - ( &'include' module_include )? + ( &'include' module_include )* ( &'dependsOn' module_depends_on )? - ( &'include' module_include )? + ( &'include' module_include )* ( &'services' module_services )? - ( &'include' module_include )? + ( &'include' module_include )* ( &'configurations' module_configurations )? { pin = 1 recoverWhile=recover_module diff --git a/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt b/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt new file mode 100644 index 0000000..f2a5dde --- /dev/null +++ b/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt @@ -0,0 +1,48 @@ +package oap.application.plugin.ref + +import com.intellij.codeInspection.LocalInspectionTool +import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.codeInspection.ProblemsHolder +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiElementVisitor +import com.intellij.psi.stubs.StubIndex +import oap.application.plugin.gen.psi.OapModuleDependsOnName +import oap.application.plugin.psi.ModuleUtils +import oap.application.plugin.stub.OapModuleNameIndex + +class ValidParametersInspection : LocalInspectionTool() { + override fun buildVisitor(holder: ProblemsHolder, isOnTheFly: Boolean): PsiElementVisitor { + return object : PsiElementVisitor() { + override fun visitElement(element: PsiElement) { + if (element is OapModuleDependsOnName) { +// val project: Project = element.project +// +// var allKeys: Collection = StubIndex.getInstance().getAllKeys(OapModuleNameIndex.KEY, project) +// +// val moduleName: String? = element.text +// +// val thisModuleName: String? = ModuleUtils.getModuleName(element.containingFile) +// +// if (thisModuleName != null && thisModuleName == moduleName) { +// holder.registerProblem( +// element, +// "Cycle reference to self", +// ProblemHighlightType.ERROR +// ) +// } +// +// if (!allKeys.contains(moduleName)) { +// holder.registerProblem( +// element, +// "Module '${moduleName ?: ""}' not found", +// ProblemHighlightType.ERROR +// ) +// } + } else { + super.visitElement(element) + } + } + } + } +} \ No newline at end of file diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index ea63ad4..9752b92 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -83,6 +83,11 @@ displayName="Required valid module name" groupName="OAP" enabledByDefault="true" level="ERROR"/> + + diff --git a/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt new file mode 100644 index 0000000..68d1fa6 --- /dev/null +++ b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt @@ -0,0 +1,20 @@ +package oap.application.plugin.inspection + +import com.intellij.psi.PsiFile +import oap.application.plugin.OapFixtureTestCase +import oap.application.plugin.ref.ValidModuleDependsOnInspection +import oap.application.plugin.ref.ValidParametersInspection +import oap.application.plugin.ref.ValidServiceDependsOnInspection + +class OapParametersTest : OapFixtureTestCase() { + protected override fun setUp() { + super.setUp() + + myFixture.enableInspections(ValidParametersInspection::class.java) + } + + override fun getBasePath(): String { + return "inspection" + } + +} \ No newline at end of file diff --git a/src/test/kotlin/oap/application/plugin/parser/OapParserTest.kt b/src/test/kotlin/oap/application/plugin/parser/OapParserTest.kt index 846a1d4..59ae698 100644 --- a/src/test/kotlin/oap/application/plugin/parser/OapParserTest.kt +++ b/src/test/kotlin/oap/application/plugin/parser/OapParserTest.kt @@ -41,6 +41,9 @@ class OapParserTest : ParsingTestCase("parser", "oap", OapParserDefinition()) { fun testInclude() { doTest(false) } + fun testInclude2() { + doTest(false) + } fun testInvalidServices() { doTest(true) diff --git a/testdata/parser/Include2.oap b/testdata/parser/Include2.oap new file mode 100644 index 0000000..bb11141 --- /dev/null +++ b/testdata/parser/Include2.oap @@ -0,0 +1,7 @@ +name = Include2 + +include required("1") +include required("2") +include required("3") +include required("4") +include required("5") diff --git a/testdata/parser/Include2.txt b/testdata/parser/Include2.txt new file mode 100644 index 0000000..597b6a5 --- /dev/null +++ b/testdata/parser/Include2.txt @@ -0,0 +1,48 @@ +OAP_FILE + OAP_MODULE_NAME_PAIR + PsiElement(name)('name') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + OAP_MODULE_NAME + PsiElement(key_value)('Include2') + PsiWhiteSpace('\n\n') + OAP_MODULE_INCLUDE + PsiElement(include)('include') + PsiWhiteSpace(' ') + PsiElement(required)('required') + PsiElement(()('(') + PsiElement(include_resource_name)('"1"') + PsiElement())(')') + PsiWhiteSpace('\n') + OAP_MODULE_INCLUDE + PsiElement(include)('include') + PsiWhiteSpace(' ') + PsiElement(required)('required') + PsiElement(()('(') + PsiElement(include_resource_name)('"2"') + PsiElement())(')') + PsiWhiteSpace('\n') + OAP_MODULE_INCLUDE + PsiElement(include)('include') + PsiWhiteSpace(' ') + PsiElement(required)('required') + PsiElement(()('(') + PsiElement(include_resource_name)('"3"') + PsiElement())(')') + PsiWhiteSpace('\n') + OAP_MODULE_INCLUDE + PsiElement(include)('include') + PsiWhiteSpace(' ') + PsiElement(required)('required') + PsiElement(()('(') + PsiElement(include_resource_name)('"4"') + PsiElement())(')') + PsiWhiteSpace('\n') + OAP_MODULE_INCLUDE + PsiElement(include)('include') + PsiWhiteSpace(' ') + PsiElement(required)('required') + PsiElement(()('(') + PsiElement(include_resource_name)('"5"') + PsiElement())(')') \ No newline at end of file From c31206814a1774df70a0e8bf7cd906325e75a14c Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Thu, 27 Nov 2025 17:15:09 +0200 Subject: [PATCH 2/2] CE-115 multiple include --- .../oap/application/plugin/inspection/OapParametersTest.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt index 68d1fa6..c3a1250 100644 --- a/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt +++ b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt @@ -1,10 +1,7 @@ package oap.application.plugin.inspection -import com.intellij.psi.PsiFile import oap.application.plugin.OapFixtureTestCase -import oap.application.plugin.ref.ValidModuleDependsOnInspection import oap.application.plugin.ref.ValidParametersInspection -import oap.application.plugin.ref.ValidServiceDependsOnInspection class OapParametersTest : OapFixtureTestCase() { protected override fun setUp() { @@ -17,4 +14,7 @@ class OapParametersTest : OapFixtureTestCase() { return "inspection" } + fun testParameterAsField() { + + } } \ No newline at end of file