From d0bfa7225a617ef11f8348a267b532e9a9fd4017 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Fri, 28 Nov 2025 11:14:55 +0200 Subject: [PATCH 1/2] CE-110 validation: parameters names --- gen/oap/application/plugin/gen/OapTypes.java | 8 + .../plugin/gen/parser/OapParser.java | 159 +++++++++++------- .../OapModuleServicesServiceParameters.java | 9 +- .../plugin/gen/psi/OapParameterKeyValue.java | 4 +- .../plugin/gen/psi/OapVisitor.java | 8 + ...apModuleServicesServiceParametersImpl.java | 18 +- .../psi/impl/OapParameterKeyValueImpl.java | 6 +- grammars/oap.bnf | 15 +- .../editor/OapServiceLineMarkerProvider.kt | 2 +- .../plugin/ref/ValidParametersInspection.kt | 85 ++++++---- .../ValidParameters.html | 5 + .../application/plugin/TestJavaService.java | 29 ++++ .../plugin/inspection/OapParametersTest.kt | 94 ++++++++++- testdata/parser/Parameters.txt | 81 +++++---- testdata/parser/ParametersArray1.txt | 31 ++-- testdata/parser/ParametersArray2.txt | 33 ++-- testdata/parser/ParametersArrayRefs.txt | 17 +- testdata/parser/ParametersDotPath.txt | 17 +- testdata/parser/ParametersDotPath2.txt | 16 +- testdata/parser/ParametersEnv.txt | 25 +-- testdata/parser/ParametersErrorReference.txt | 65 ++++--- testdata/parser/ParametersFunctions.txt | 25 +-- testdata/parser/ParametersFunctionsArray.txt | 25 +-- testdata/parser/ParametersMap.txt | 23 +-- testdata/parser/ParametersObjectComma.txt | 23 +-- testdata/parser/ParametersValueDotNumber.txt | 17 +- testdata/parser/ServiceDotNames.txt | 38 +++-- 27 files changed, 577 insertions(+), 301 deletions(-) create mode 100644 src/main/resources/inspectionDescriptions/ValidParameters.html create mode 100644 src/test/java/oap/application/plugin/TestJavaService.java diff --git a/gen/oap/application/plugin/gen/OapTypes.java b/gen/oap/application/plugin/gen/OapTypes.java index 13b47f9..79e73ac 100644 --- a/gen/oap/application/plugin/gen/OapTypes.java +++ b/gen/oap/application/plugin/gen/OapTypes.java @@ -25,6 +25,7 @@ public interface OapTypes { IElementType OAP_ENV_VALUE = new OapCompositeElementType("OAP_ENV_VALUE"); IElementType OAP_FUNCTION = new OapCompositeElementType("OAP_FUNCTION"); IElementType OAP_ID_VALUE = new OapCompositeElementType("OAP_ID_VALUE"); + IElementType OAP_JAVA_PARAMETER_KEY_VALUE = new OapCompositeElementType("OAP_JAVA_PARAMETER_KEY_VALUE"); IElementType OAP_MODULE_CONFIGURATION = new OapCompositeElementType("OAP_MODULE_CONFIGURATION"); IElementType OAP_MODULE_CONFIGURATIONS = new OapCompositeElementType("OAP_MODULE_CONFIGURATIONS"); IElementType OAP_MODULE_CONFIGURATION_ENTRIES = new OapCompositeElementType("OAP_MODULE_CONFIGURATION_ENTRIES"); @@ -64,6 +65,7 @@ public interface OapTypes { IElementType OAP_PARAMETERS_ARRAY_ITEM = new OapCompositeElementType("OAP_PARAMETERS_ARRAY_ITEM"); IElementType OAP_PARAMETERS_OBJECT = new OapCompositeElementType("OAP_PARAMETERS_OBJECT"); IElementType OAP_PARAMETER_KEY_VALUE = new OapCompositeElementType("OAP_PARAMETER_KEY_VALUE"); + IElementType OAP_PARAMETER_KEY_VALUE_FIRST_ID = new OapCompositeElementType("OAP_PARAMETER_KEY_VALUE_FIRST_ID"); IElementType OAP_REFERENCE_KERNEL_VALUE = new OapCompositeElementType("OAP_REFERENCE_KERNEL_VALUE"); IElementType OAP_REFERENCE_KERNEL_VALUE_IN = new OapCompositeElementType("OAP_REFERENCE_KERNEL_VALUE_IN"); IElementType OAP_REFERENCE_MODULES_NAME = new OapCompositeElementType("OAP_REFERENCE_MODULES_NAME"); @@ -206,6 +208,9 @@ else if (type == OAP_FUNCTION) { else if (type == OAP_ID_VALUE) { return new OapIdValueImpl(node); } + else if (type == OAP_JAVA_PARAMETER_KEY_VALUE) { + return new OapJavaParameterKeyValueImpl(node); + } else if (type == OAP_MODULE_CONFIGURATION) { return new OapModuleConfigurationImpl(node); } @@ -323,6 +328,9 @@ else if (type == OAP_PARAMETERS_OBJECT) { else if (type == OAP_PARAMETER_KEY_VALUE) { return new OapParameterKeyValueImpl(node); } + else if (type == OAP_PARAMETER_KEY_VALUE_FIRST_ID) { + return new OapParameterKeyValueFirstIdImpl(node); + } else if (type == OAP_REFERENCE_KERNEL_VALUE) { return new OapReferenceKernelValueImpl(node); } diff --git a/gen/oap/application/plugin/gen/parser/OapParser.java b/gen/oap/application/plugin/gen/parser/OapParser.java index cb4bc12..d2bf3cc 100644 --- a/gen/oap/application/plugin/gen/parser/OapParser.java +++ b/gen/oap/application/plugin/gen/parser/OapParser.java @@ -423,14 +423,14 @@ public static boolean dot_module_services_service_link_field(PsiBuilder b, int l } /* ********************************************************** */ - // '.' parameter_key_value + // '.' java_parameter_key_value static boolean dot_parameters(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "dot_parameters")) return false; if (!nextTokenIs(b, OAP_DOT)) return false; boolean r; Marker m = enter_section_(b); r = consumeToken(b, OAP_DOT); - r = r && parameter_key_value(b, l + 1); + r = r && java_parameter_key_value(b, l + 1); exit_section_(b, m, null, r); return r; } @@ -576,6 +576,70 @@ private static boolean id_value_1_1(PsiBuilder b, int l) { return true; } + /* ********************************************************** */ + // parameter_key_value + public static boolean java_parameter_key_value(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameter_key_value")) return false; + if (!nextTokenIs(b, OAP_KEY_NAME)) return false; + boolean r; + Marker m = enter_section_(b); + r = parameter_key_value(b, l + 1); + exit_section_(b, m, OAP_JAVA_PARAMETER_KEY_VALUE, r); + return r; + } + + /* ********************************************************** */ + // '{' java_parameter_key_value? (','? java_parameter_key_value )* '}' + static boolean java_parameters_object(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameters_object")) return false; + if (!nextTokenIs(b, OAP_LEFTBRACE)) return false; + boolean r, p; + Marker m = enter_section_(b, l, _NONE_); + r = consumeToken(b, OAP_LEFTBRACE); + p = r; // pin = 1 + r = r && report_error_(b, java_parameters_object_1(b, l + 1)); + r = p && report_error_(b, java_parameters_object_2(b, l + 1)) && r; + r = p && consumeToken(b, OAP_RIGHTBRACE) && r; + exit_section_(b, l, m, r, p, null); + return r || p; + } + + // java_parameter_key_value? + private static boolean java_parameters_object_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameters_object_1")) return false; + java_parameter_key_value(b, l + 1); + return true; + } + + // (','? java_parameter_key_value )* + private static boolean java_parameters_object_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameters_object_2")) return false; + while (true) { + int c = current_position_(b); + if (!java_parameters_object_2_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "java_parameters_object_2", c)) break; + } + return true; + } + + // ','? java_parameter_key_value + private static boolean java_parameters_object_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameters_object_2_0")) return false; + boolean r; + Marker m = enter_section_(b); + r = java_parameters_object_2_0_0(b, l + 1); + r = r && java_parameter_key_value(b, l + 1); + exit_section_(b, m, null, r); + return r; + } + + // ','? + private static boolean java_parameters_object_2_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "java_parameters_object_2_0_0")) return false; + consumeToken(b, OAP_COMMA); + return true; + } + /* ********************************************************** */ // [] // module_name_pair @@ -1801,7 +1865,7 @@ private static boolean module_services_service_listen_1_0_0(PsiBuilder b, int l) } /* ********************************************************** */ - // module_services_service_parameters_id ( &'.' dot_parameters | parameters_object ) + // module_services_service_parameters_id ( &'.' dot_parameters | java_parameters_object ) public static boolean module_services_service_parameters(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module_services_service_parameters")) return false; if (!nextTokenIs(b, OAP_ID_PARAMETERS)) return false; @@ -1814,13 +1878,13 @@ public static boolean module_services_service_parameters(PsiBuilder b, int l) { return r || p; } - // &'.' dot_parameters | parameters_object + // &'.' dot_parameters | java_parameters_object private static boolean module_services_service_parameters_1(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "module_services_service_parameters_1")) return false; boolean r; Marker m = enter_section_(b); r = module_services_service_parameters_1_0(b, l + 1); - if (!r) r = parameters_object(b, l + 1); + if (!r) r = java_parameters_object(b, l + 1); exit_section_(b, m, null, r); return r; } @@ -2250,69 +2314,34 @@ static boolean object_service(PsiBuilder b, int l) { } /* ********************************************************** */ - // &'include' module_include - // | parameter_key_value_key + // parameter_key_value_first_id ('.' key_name)* (&'=' parameter_key_value_key_eq | parameter_key_value_key_object ) public static boolean parameter_key_value(PsiBuilder b, int l) { if (!recursion_guard_(b, l, "parameter_key_value")) return false; - if (!nextTokenIs(b, "", OAP_ID_INCLUDE, OAP_KEY_NAME)) return false; - boolean r; - Marker m = enter_section_(b, l, _NONE_, OAP_PARAMETER_KEY_VALUE, ""); - r = parameter_key_value_0(b, l + 1); - if (!r) r = parameter_key_value_key(b, l + 1); - exit_section_(b, l, m, r, false, null); - return r; - } - - // &'include' module_include - private static boolean parameter_key_value_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_0")) return false; - boolean r; - Marker m = enter_section_(b); - r = parameter_key_value_0_0(b, l + 1); - r = r && module_include(b, l + 1); - exit_section_(b, m, null, r); - return r; - } - - // &'include' - private static boolean parameter_key_value_0_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_0_0")) return false; - boolean r; - Marker m = enter_section_(b, l, _AND_); - r = consumeToken(b, OAP_ID_INCLUDE); - exit_section_(b, l, m, r, false, null); - return r; - } - - /* ********************************************************** */ - // key_name ('.' key_name)* (&'=' parameter_key_value_key_eq | parameter_key_value_key_object ) - static boolean parameter_key_value_key(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key")) return false; if (!nextTokenIs(b, OAP_KEY_NAME)) return false; boolean r, p; - Marker m = enter_section_(b, l, _NONE_); - r = consumeToken(b, OAP_KEY_NAME); + Marker m = enter_section_(b, l, _NONE_, OAP_PARAMETER_KEY_VALUE, null); + r = parameter_key_value_first_id(b, l + 1); p = r; // pin = 1 - r = r && report_error_(b, parameter_key_value_key_1(b, l + 1)); - r = p && parameter_key_value_key_2(b, l + 1) && r; + r = r && report_error_(b, parameter_key_value_1(b, l + 1)); + r = p && parameter_key_value_2(b, l + 1) && r; exit_section_(b, l, m, r, p, null); return r || p; } // ('.' key_name)* - private static boolean parameter_key_value_key_1(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key_1")) return false; + private static boolean parameter_key_value_1(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_1")) return false; while (true) { int c = current_position_(b); - if (!parameter_key_value_key_1_0(b, l + 1)) break; - if (!empty_element_parsed_guard_(b, "parameter_key_value_key_1", c)) break; + if (!parameter_key_value_1_0(b, l + 1)) break; + if (!empty_element_parsed_guard_(b, "parameter_key_value_1", c)) break; } return true; } // '.' key_name - private static boolean parameter_key_value_key_1_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key_1_0")) return false; + private static boolean parameter_key_value_1_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_1_0")) return false; boolean r; Marker m = enter_section_(b); r = consumeTokens(b, 0, OAP_DOT, OAP_KEY_NAME); @@ -2321,30 +2350,30 @@ private static boolean parameter_key_value_key_1_0(PsiBuilder b, int l) { } // &'=' parameter_key_value_key_eq | parameter_key_value_key_object - private static boolean parameter_key_value_key_2(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key_2")) return false; + private static boolean parameter_key_value_2(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_2")) return false; boolean r; Marker m = enter_section_(b); - r = parameter_key_value_key_2_0(b, l + 1); + r = parameter_key_value_2_0(b, l + 1); if (!r) r = parameter_key_value_key_object(b, l + 1); exit_section_(b, m, null, r); return r; } // &'=' parameter_key_value_key_eq - private static boolean parameter_key_value_key_2_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key_2_0")) return false; + private static boolean parameter_key_value_2_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_2_0")) return false; boolean r; Marker m = enter_section_(b); - r = parameter_key_value_key_2_0_0(b, l + 1); + r = parameter_key_value_2_0_0(b, l + 1); r = r && parameter_key_value_key_eq(b, l + 1); exit_section_(b, m, null, r); return r; } // &'=' - private static boolean parameter_key_value_key_2_0_0(PsiBuilder b, int l) { - if (!recursion_guard_(b, l, "parameter_key_value_key_2_0_0")) return false; + private static boolean parameter_key_value_2_0_0(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_2_0_0")) return false; boolean r; Marker m = enter_section_(b, l, _AND_); r = consumeToken(b, OAP_EQ); @@ -2352,6 +2381,18 @@ private static boolean parameter_key_value_key_2_0_0(PsiBuilder b, int l) { return r; } + /* ********************************************************** */ + // key_name + public static boolean parameter_key_value_first_id(PsiBuilder b, int l) { + if (!recursion_guard_(b, l, "parameter_key_value_first_id")) return false; + if (!nextTokenIs(b, OAP_KEY_NAME)) return false; + boolean r; + Marker m = enter_section_(b); + r = consumeToken(b, OAP_KEY_NAME); + exit_section_(b, m, OAP_PARAMETER_KEY_VALUE_FIRST_ID, r); + return r; + } + /* ********************************************************** */ // '=' ( &'[' parameters_array | &'<' any_reference | function | bool_value | id_value ) static boolean parameter_key_value_key_eq(PsiBuilder b, int l) { diff --git a/gen/oap/application/plugin/gen/psi/OapModuleServicesServiceParameters.java b/gen/oap/application/plugin/gen/psi/OapModuleServicesServiceParameters.java index 459455e..a414df4 100644 --- a/gen/oap/application/plugin/gen/psi/OapModuleServicesServiceParameters.java +++ b/gen/oap/application/plugin/gen/psi/OapModuleServicesServiceParameters.java @@ -8,16 +8,19 @@ public interface OapModuleServicesServiceParameters extends OapCompositeElement { + @NotNull + List getJavaParameterKeyValueList(); + @NotNull OapModuleServicesServiceParametersId getModuleServicesServiceParametersId(); @Nullable - OapParameterKeyValue getParameterKeyValue(); + PsiElement getDot(); @Nullable - OapParametersObject getParametersObject(); + PsiElement getLeftbrace(); @Nullable - PsiElement getDot(); + PsiElement getRightbrace(); } diff --git a/gen/oap/application/plugin/gen/psi/OapParameterKeyValue.java b/gen/oap/application/plugin/gen/psi/OapParameterKeyValue.java index 3f5910a..b7a433c 100644 --- a/gen/oap/application/plugin/gen/psi/OapParameterKeyValue.java +++ b/gen/oap/application/plugin/gen/psi/OapParameterKeyValue.java @@ -20,8 +20,8 @@ public interface OapParameterKeyValue extends OapCompositeElement { @Nullable OapIdValue getIdValue(); - @Nullable - OapModuleInclude getModuleInclude(); + @NotNull + OapParameterKeyValueFirstId getParameterKeyValueFirstId(); @Nullable OapParametersArray getParametersArray(); diff --git a/gen/oap/application/plugin/gen/psi/OapVisitor.java b/gen/oap/application/plugin/gen/psi/OapVisitor.java index 8c5e676..b276d51 100644 --- a/gen/oap/application/plugin/gen/psi/OapVisitor.java +++ b/gen/oap/application/plugin/gen/psi/OapVisitor.java @@ -70,6 +70,10 @@ public void visitIdValue(@NotNull OapIdValue o) { visitCompositeElement(o); } + public void visitJavaParameterKeyValue(@NotNull OapJavaParameterKeyValue o) { + visitCompositeElement(o); + } + public void visitModuleConfiguration(@NotNull OapModuleConfiguration o) { visitKeyValuePairWithIndentNormal(o); } @@ -216,6 +220,10 @@ public void visitParameterKeyValue(@NotNull OapParameterKeyValue o) { visitCompositeElement(o); } + public void visitParameterKeyValueFirstId(@NotNull OapParameterKeyValueFirstId o) { + visitCompositeElement(o); + } + public void visitParametersArray(@NotNull OapParametersArray o) { visitCompositeElement(o); } diff --git a/gen/oap/application/plugin/gen/psi/impl/OapModuleServicesServiceParametersImpl.java b/gen/oap/application/plugin/gen/psi/impl/OapModuleServicesServiceParametersImpl.java index 50d15b9..19dbce5 100644 --- a/gen/oap/application/plugin/gen/psi/impl/OapModuleServicesServiceParametersImpl.java +++ b/gen/oap/application/plugin/gen/psi/impl/OapModuleServicesServiceParametersImpl.java @@ -28,6 +28,12 @@ public void accept(@NotNull PsiElementVisitor visitor) { else super.accept(visitor); } + @Override + @NotNull + public List getJavaParameterKeyValueList() { + return PsiTreeUtil.getChildrenOfTypeAsList(this, OapJavaParameterKeyValue.class); + } + @Override @NotNull public OapModuleServicesServiceParametersId getModuleServicesServiceParametersId() { @@ -36,20 +42,20 @@ public OapModuleServicesServiceParametersId getModuleServicesServiceParametersId @Override @Nullable - public OapParameterKeyValue getParameterKeyValue() { - return PsiTreeUtil.getChildOfType(this, OapParameterKeyValue.class); + public PsiElement getDot() { + return findChildByType(OAP_DOT); } @Override @Nullable - public OapParametersObject getParametersObject() { - return PsiTreeUtil.getChildOfType(this, OapParametersObject.class); + public PsiElement getLeftbrace() { + return findChildByType(OAP_LEFTBRACE); } @Override @Nullable - public PsiElement getDot() { - return findChildByType(OAP_DOT); + public PsiElement getRightbrace() { + return findChildByType(OAP_RIGHTBRACE); } } diff --git a/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueImpl.java b/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueImpl.java index 107ab42..8416a86 100644 --- a/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueImpl.java +++ b/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueImpl.java @@ -53,9 +53,9 @@ public OapIdValue getIdValue() { } @Override - @Nullable - public OapModuleInclude getModuleInclude() { - return PsiTreeUtil.getChildOfType(this, OapModuleInclude.class); + @NotNull + public OapParameterKeyValueFirstId getParameterKeyValueFirstId() { + return notNullChild(PsiTreeUtil.getChildOfType(this, OapParameterKeyValueFirstId.class)); } @Override diff --git a/grammars/oap.bnf b/grammars/oap.bnf index a1ff206..d538e7a 100644 --- a/grammars/oap.bnf +++ b/grammars/oap.bnf @@ -80,6 +80,7 @@ id_cron='cron' id_kernel='kernel' + key_name="regexp:\w+" key_value="regexp:\w+" nextline='regexp:\r\n|\n' @@ -254,23 +255,25 @@ module_services_service_default ::= 'default' '=' reference_modules_value {pin=1 // parameters { module_services_service_parameters_id ::= 'parameters' -module_services_service_parameters ::= module_services_service_parameters_id ( &'.' dot_parameters | parameters_object ) { +module_services_service_parameters ::= module_services_service_parameters_id ( &'.' dot_parameters | java_parameters_object ) { pin=1 mixin="oap.application.plugin.psi.OapModuleServicesServiceParametersMixin" } -private dot_parameters ::= '.' parameter_key_value +private dot_parameters ::= '.' java_parameter_key_value parameters_object ::= '{' parameter_key_value? (','? parameter_key_value )* '}' {pin=1} parameters_array ::= '[' parameters_array_item? (','? parameters_array_item)* ']' {pin=1} parameters_array_item ::= &'<' any_reference | &'{' parameters_object | function | bool_value | id_value { implements="oap.application.plugin.psi.IndentNormal" } -parameter_key_value ::= - &'include' module_include - | parameter_key_value_key { +java_parameter_key_value ::= parameter_key_value +private java_parameters_object ::= '{' java_parameter_key_value? (','? java_parameter_key_value )* '}' {pin=1} + +parameter_key_value_first_id ::= key_name +parameter_key_value ::= parameter_key_value_first_id ('.' key_name)* (&'=' parameter_key_value_key_eq | parameter_key_value_key_object ) { + pin=1 mixin="oap.application.plugin.psi.OapModuleServicesServiceParameterKeyValueMixin" } -private parameter_key_value_key ::= key_name ('.' key_name)* (&'=' parameter_key_value_key_eq | parameter_key_value_key_object ) { pin=1 } private parameter_key_value_key_eq ::= '=' ( &'[' parameters_array | &'<' any_reference | function | bool_value | id_value ) { pin=1 } private parameter_key_value_key_object ::= parameters_object // } parameters diff --git a/src/main/kotlin/oap/application/plugin/editor/OapServiceLineMarkerProvider.kt b/src/main/kotlin/oap/application/plugin/editor/OapServiceLineMarkerProvider.kt index 6e4e5df..ed31ef5 100644 --- a/src/main/kotlin/oap/application/plugin/editor/OapServiceLineMarkerProvider.kt +++ b/src/main/kotlin/oap/application/plugin/editor/OapServiceLineMarkerProvider.kt @@ -21,7 +21,7 @@ class OapServiceLineMarkerProvider : LineMarkerProvider { .setTargets(listOf(psiClass)) .setTooltipText(psiClass.qualifiedName!!) .setAlignment(GutterIconRenderer.Alignment.RIGHT) - .createLineMarkerInfo(element) + .createLineMarkerInfo(element.serviceName.keyName) } } diff --git a/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt b/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt index f2a5dde..f1d0a64 100644 --- a/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt +++ b/src/main/kotlin/oap/application/plugin/ref/ValidParametersInspection.kt @@ -3,46 +3,63 @@ 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 +import com.intellij.openapi.util.text.Strings +import com.intellij.psi.* +import com.intellij.psi.util.PsiTreeUtil +import oap.application.plugin.gen.psi.OapJavaParameterKeyValue +import oap.application.plugin.gen.psi.OapModuleServicesService +import oap.application.plugin.gen.psi.OapParameterKeyValueFirstId +import oap.application.plugin.psi.OapClassValueMixin 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) + if (element is OapJavaParameterKeyValue) { + + val service: OapModuleServicesService? = PsiTreeUtil.getParentOfType(element, OapModuleServicesService::class.java) + val psiClass: PsiClass? = (service?.moduleServicesServiceImplementation?.classNamePsi as? OapClassValueMixin)?.getPsiClass() + if (psiClass != null) { + val firstId: OapParameterKeyValueFirstId? = PsiTreeUtil.findChildOfType(element, OapParameterKeyValueFirstId::class.java) + val propertyName: String? = firstId?.keyName?.text + if (propertyName == null) { + return; + } + val setter: Boolean = psiClass.methods.firstOrNull { m -> m.name.startsWith("set" + Strings.capitalize(propertyName)) && m.parameterList.parametersCount == 1 } == null + if (!setter) { + return; + } + val parameter: Boolean = psiClass.constructors.flatMap { c -> c.parameters.mapNotNull { p -> p.name } }.distinct().contains(propertyName) + if (parameter) { + return; + } + val psiField: PsiField? = psiClass.allFields.firstOrNull { f -> f.name.equals(propertyName) } + if (psiField == null) { + holder.registerProblem( + firstId, + "Unknown field", + ProblemHighlightType.ERROR + ) + return; + } else if (psiField.hasModifierProperty(PsiModifier.FINAL)) { + val type: PsiType = psiField.type + + val classType: PsiClassType? = type as? PsiClassType; + + if ((classType != null && classType.className != "String")) { + return; + } + + + holder.registerProblem( + firstId, + "Final field", + ProblemHighlightType.ERROR + ) + } + } } } } } -} \ No newline at end of file +} diff --git a/src/main/resources/inspectionDescriptions/ValidParameters.html b/src/main/resources/inspectionDescriptions/ValidParameters.html new file mode 100644 index 0000000..010c015 --- /dev/null +++ b/src/main/resources/inspectionDescriptions/ValidParameters.html @@ -0,0 +1,5 @@ + + +Parameters + + \ No newline at end of file diff --git a/src/test/java/oap/application/plugin/TestJavaService.java b/src/test/java/oap/application/plugin/TestJavaService.java new file mode 100644 index 0000000..1bd2a1c --- /dev/null +++ b/src/test/java/oap/application/plugin/TestJavaService.java @@ -0,0 +1,29 @@ +package oap.application.plugin; + +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; + +public class TestJavaService { + public final String finalStringField = "1"; + public final Map finalMap = new HashMap<>(); + public final CopyOnWriteArrayList finalList = new CopyOnWriteArrayList<>(); + public final LinkedHashSet finalSet; + + public String stringField; + public int intField; + public Integer integerField; + private String privateStringField; + + public TestJavaService(String constructor1StringField) { + finalSet = new LinkedHashSet<>(); + } + + public TestJavaService(String constructor2StringField, String constructor2IntField) { + finalSet = new LinkedHashSet<>(); + } + + public void setSetterMethodString(String setterMethod) { + } +} diff --git a/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt index c3a1250..3be506d 100644 --- a/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt +++ b/src/test/kotlin/oap/application/plugin/inspection/OapParametersTest.kt @@ -1,7 +1,9 @@ package oap.application.plugin.inspection +import com.intellij.psi.PsiFile import oap.application.plugin.OapFixtureTestCase import oap.application.plugin.ref.ValidParametersInspection +import java.io.File class OapParametersTest : OapFixtureTestCase() { protected override fun setUp() { @@ -10,11 +12,99 @@ class OapParametersTest : OapFixtureTestCase() { myFixture.enableInspections(ValidParametersInspection::class.java) } - override fun getBasePath(): String { - return "inspection" + override fun getTestDataPath(): String { + return File("src/test/java").absolutePath } fun testParameterAsField() { + myFixture.configureByFile("oap/application/plugin/TestJavaService.java") + val file: PsiFile = myFixture.configureByText( + "testParameterAsField.oap", """ + name = testParameterAsField + services { + testParameterAsField { + implementation = oap.application.plugin.TestJavaService + parameters { + finalStringField = fff + stringField = "dfg" + unknownField = "dfg" + } + } + } + """.trimIndent() + ) + + myFixture.openFileInEditor(file.virtualFile) + + myFixture.checkHighlighting() + } + + fun testParameterAsConstructor() { + myFixture.configureByFile("oap/application/plugin/TestJavaService.java") + + val file: PsiFile = myFixture.configureByText( + "testParameterAsField.oap", """ + name = testParameterAsField + services { + testParameterAsField { + implementation = oap.application.plugin.TestJavaService + parameters { + constructor1StringField = "dfg" + } + } + } + """.trimIndent() + ) + + myFixture.openFileInEditor(file.virtualFile) + + myFixture.checkHighlighting() + } + + fun testParameterAsSetterMethod() { + myFixture.configureByFile("oap/application/plugin/TestJavaService.java") + + val file: PsiFile = myFixture.configureByText( + "testParameterAsField.oap", """ + name = testParameterAsField + services { + testParameterAsField { + implementation = oap.application.plugin.TestJavaService + parameters { + SetterMethodString = "dfg" + } + } + } + """.trimIndent() + ) + + myFixture.openFileInEditor(file.virtualFile) + + myFixture.checkHighlighting() + } + + fun testFinalParameterAsSetListMap() { + myFixture.configureByFile("oap/application/plugin/TestJavaService.java") + + val file: PsiFile = myFixture.configureByText( + "testParameterAsField.oap", """ + name = testParameterAsField + services { + testParameterAsField { + implementation = oap.application.plugin.TestJavaService + parameters { + finalMap.a = b + finalList = [a,b] + finalSet = d + } + } + } + """.trimIndent() + ) + + myFixture.openFileInEditor(file.virtualFile) + + myFixture.checkHighlighting() } } \ No newline at end of file diff --git a/testdata/parser/Parameters.txt b/testdata/parser/Parameters.txt index 94f0bc1..e5c6dc3 100644 --- a/testdata/parser/Parameters.txt +++ b/testdata/parser/Parameters.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('uniqueName') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('uniqueName') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -55,10 +56,12 @@ OAP_FILE OAP_REFERENCE_TYPE_SERVICES_PROPERTY PsiElement(reference_value)('name') PsiElement(>)('>') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('kernel') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('kernel') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -71,10 +74,12 @@ OAP_FILE PsiElement(.)('.') PsiElement(self)('self') PsiElement(>)('>') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -91,63 +96,75 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME PsiElement(reference_value)('bidder-filter') PsiElement(>)('>') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('syncPeriod') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('syncPeriod') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('300') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('flightAheadMultiplier') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('flightAheadMultiplier') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('1.2') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('watch') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('watch') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_BOOL_VALUE PsiElement(bool)('true') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('collectionName') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('collectionName') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('advertizers') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('dirForFailures') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('dirForFailures') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('/tmp/dsp') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('prefix') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('prefix') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('/static/ pixel.png') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersArray1.txt b/testdata/parser/ParametersArray1.txt index ad7af22..1829029 100644 --- a/testdata/parser/ParametersArray1.txt +++ b/testdata/parser/ParametersArray1.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('complexes') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('complexes') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -52,7 +53,8 @@ OAP_FILE PsiWhiteSpace('\n') PsiWhiteSpace(' ') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('i') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('i') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -64,10 +66,12 @@ OAP_FILE PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('complexes2') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('complexes2') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -77,7 +81,8 @@ OAP_FILE OAP_PARAMETERS_OBJECT PsiElement({)('{') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('i') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('i') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -85,9 +90,9 @@ OAP_FILE PsiElement(key_value)('2') PsiElement(})('}') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersArray2.txt b/testdata/parser/ParametersArray2.txt index 3126131..34dc452 100644 --- a/testdata/parser/ParametersArray2.txt +++ b/testdata/parser/ParametersArray2.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('enums') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('enums') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -53,19 +54,23 @@ OAP_FILE OAP_ID_VALUE PsiElement(key_value)('TWO') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('new value // pubilc final String') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('al') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('al') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -75,9 +80,9 @@ OAP_FILE OAP_ID_VALUE PsiElement(key_value)('"val"') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersArrayRefs.txt b/testdata/parser/ParametersArrayRefs.txt index 14f361d..38d1724 100644 --- a/testdata/parser/ParametersArrayRefs.txt +++ b/testdata/parser/ParametersArrayRefs.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('deps') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('deps') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -79,9 +80,9 @@ OAP_FILE PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersDotPath.txt b/testdata/parser/ParametersDotPath.txt index c623e36..f7d275e 100644 --- a/testdata/parser/ParametersDotPath.txt +++ b/testdata/parser/ParametersDotPath.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('key') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('key') PsiElement(.)('.') PsiElement(key_name)('v1') PsiElement(.)('.') @@ -50,9 +51,9 @@ OAP_FILE PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('123') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersDotPath2.txt b/testdata/parser/ParametersDotPath2.txt index 1b2ee9d..6557ba9 100644 --- a/testdata/parser/ParametersDotPath2.txt +++ b/testdata/parser/ParametersDotPath2.txt @@ -33,13 +33,15 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiElement(.)('.') - OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('i') - PsiWhiteSpace(' ') - PsiElement(=)('=') - PsiWhiteSpace(' ') - OAP_ID_VALUE - PsiElement(key_value)('10') + OAP_JAVA_PARAMETER_KEY_VALUE + OAP_PARAMETER_KEY_VALUE + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('i') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + OAP_ID_VALUE + PsiElement(key_value)('10') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersEnv.txt b/testdata/parser/ParametersEnv.txt index b046264..c165735 100644 --- a/testdata/parser/ParametersEnv.txt +++ b/testdata/parser/ParametersEnv.txt @@ -33,21 +33,24 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('name') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('name') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('a') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('service3') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('service3') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -65,9 +68,9 @@ OAP_FILE OAP_ID_VALUE PsiElement(key_value)('/beanFromPathFile.conf ') PsiElement())(')') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersErrorReference.txt b/testdata/parser/ParametersErrorReference.txt index 77a9113..78bf04a 100644 --- a/testdata/parser/ParametersErrorReference.txt +++ b/testdata/parser/ParametersErrorReference.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a1') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a1') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -46,10 +47,12 @@ OAP_FILE PsiElement(<)('<') PsiErrorElement: expected, got 'a2' - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a2') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a2') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -58,10 +61,12 @@ OAP_FILE PsiErrorElement: expected, got 'm' PsiElement(reference_value)('m') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a3') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a3') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -71,10 +76,12 @@ OAP_FILE PsiElement(reference_value)('msdfsdf') PsiElement(.)('.') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a4') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a4') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -92,8 +99,10 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a4') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a4') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -113,8 +122,10 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME PsiErrorElement:'.' or reference_value expected, got 'a5' + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a5') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a5') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -133,8 +144,10 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME PsiErrorElement:reference_value expected, got 'a6' + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a6') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a6') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -153,8 +166,10 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME PsiErrorElement:reference_value expected, got 'a7' + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a7') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a7') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -172,10 +187,12 @@ OAP_FILE PsiElement(reference_value)('ffff') PsiErrorElement:'>' expected, got 'a8' - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a8') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a8') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -192,9 +209,9 @@ OAP_FILE OAP_REFERENCE_MODULES_SERVICE_NAME PsiElement(reference_value)('ffff') PsiElement(>)('>') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersFunctions.txt b/testdata/parser/ParametersFunctions.txt index a2d6688..11fc037 100644 --- a/testdata/parser/ParametersFunctions.txt +++ b/testdata/parser/ParametersFunctions.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('service3') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('service3') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -49,10 +50,12 @@ OAP_FILE OAP_ID_VALUE PsiElement(key_value)('/oap/application/KernelTest/beanFromClasspathFile.conf') PsiElement())(')') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('service3Field') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('service3Field') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -63,9 +66,9 @@ OAP_FILE OAP_ID_VALUE PsiElement(key_value)('"{\"name\":\"from resource\",\"timeout\":1234}"') PsiElement())(')') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersFunctionsArray.txt b/testdata/parser/ParametersFunctionsArray.txt index 88a3d51..e810e57 100644 --- a/testdata/parser/ParametersFunctionsArray.txt +++ b/testdata/parser/ParametersFunctionsArray.txt @@ -33,12 +33,13 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('service3') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('service3') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -67,10 +68,12 @@ OAP_FILE PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('service3Field') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('service3Field') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -85,9 +88,9 @@ OAP_FILE PsiElement(key_value)('"{\"name\":\"from resource\",\"timeout\":1234}"') PsiElement())(')') PsiElement(])(']') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersMap.txt b/testdata/parser/ParametersMap.txt index b6dbd0b..07bb361 100644 --- a/testdata/parser/ParametersMap.txt +++ b/testdata/parser/ParametersMap.txt @@ -33,26 +33,29 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('map') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('map') PsiWhiteSpace(' ') OAP_PARAMETERS_OBJECT PsiElement({)('{') PsiWhiteSpace('\n') PsiWhiteSpace(' ') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('inMap') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('inMap') PsiWhiteSpace(' ') OAP_PARAMETERS_OBJECT PsiElement({)('{') PsiWhiteSpace('\n') PsiWhiteSpace(' ') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a') PsiElement(.)('.') PsiElement(key_name)('b') PsiWhiteSpace(' ') @@ -66,9 +69,9 @@ OAP_FILE PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersObjectComma.txt b/testdata/parser/ParametersObjectComma.txt index ccb15fa..6c6f640 100644 --- a/testdata/parser/ParametersObjectComma.txt +++ b/testdata/parser/ParametersObjectComma.txt @@ -33,17 +33,19 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('test') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('test') PsiWhiteSpace(' ') OAP_PARAMETERS_OBJECT PsiElement({)('{') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('a') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('a') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') @@ -52,16 +54,17 @@ OAP_FILE PsiElement(,)(',') PsiWhiteSpace(' ') OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('b') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('b') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('AAA') PsiElement(})('}') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ParametersValueDotNumber.txt b/testdata/parser/ParametersValueDotNumber.txt index 56e0807..ec1cd42 100644 --- a/testdata/parser/ParametersValueDotNumber.txt +++ b/testdata/parser/ParametersValueDotNumber.txt @@ -33,20 +33,21 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiWhiteSpace(' ') - OAP_PARAMETERS_OBJECT - PsiElement({)('{') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') + PsiElement({)('{') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + OAP_JAVA_PARAMETER_KEY_VALUE OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('version') + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('version') PsiWhiteSpace(' ') PsiElement(=)('=') PsiWhiteSpace(' ') OAP_ID_VALUE PsiElement(key_value)('0.0.1') - PsiWhiteSpace('\n') - PsiWhiteSpace(' ') - PsiElement(})('}') + PsiWhiteSpace('\n') + PsiWhiteSpace(' ') + PsiElement(})('}') PsiWhiteSpace('\n') PsiWhiteSpace(' ') PsiElement(})('}') diff --git a/testdata/parser/ServiceDotNames.txt b/testdata/parser/ServiceDotNames.txt index 531d8db..9f62b08 100644 --- a/testdata/parser/ServiceDotNames.txt +++ b/testdata/parser/ServiceDotNames.txt @@ -56,24 +56,26 @@ OAP_FILE OAP_MODULE_SERVICES_SERVICE_PARAMETERS_ID PsiElement(parameters)('parameters') PsiElement(.)('.') - OAP_PARAMETER_KEY_VALUE - PsiElement(key_name)('reference') - PsiWhiteSpace(' ') - PsiElement(=)('=') - PsiWhiteSpace(' ') - OAP_ANY_REFERENCE - PsiElement(<)('<') - OAP_ANY_REFERENCE_IN - OAP_REFERENCE_MODULES_VALUE_IN - OAP_REFERENCE_TYPE_MODULES - PsiElement(modules)('modules') - PsiElement(.)('.') - OAP_REFERENCE_MODULES_NAME - PsiElement(this)('this') - PsiElement(.)('.') - OAP_REFERENCE_MODULES_SERVICE_NAME - PsiElement(reference_value)('link1') - PsiElement(>)('>') + OAP_JAVA_PARAMETER_KEY_VALUE + OAP_PARAMETER_KEY_VALUE + OAP_PARAMETER_KEY_VALUE_FIRST_ID + PsiElement(key_name)('reference') + PsiWhiteSpace(' ') + PsiElement(=)('=') + PsiWhiteSpace(' ') + OAP_ANY_REFERENCE + PsiElement(<)('<') + OAP_ANY_REFERENCE_IN + OAP_REFERENCE_MODULES_VALUE_IN + OAP_REFERENCE_TYPE_MODULES + PsiElement(modules)('modules') + PsiElement(.)('.') + OAP_REFERENCE_MODULES_NAME + PsiElement(this)('this') + PsiElement(.)('.') + OAP_REFERENCE_MODULES_SERVICE_NAME + PsiElement(reference_value)('link1') + PsiElement(>)('>') PsiWhiteSpace('\n') PsiWhiteSpace(' ') OAP_MODULE_SERVICES_SERVICE_LINK From a82e2c8a23e1b36d231b2b6b7fc5118f52877c12 Mon Sep 17 00:00:00 2001 From: "igor.petrenko" Date: Fri, 28 Nov 2025 11:22:49 +0200 Subject: [PATCH 2/2] CE-110 validation: parameters names --- .../gen/psi/OapJavaParameterKeyValue.java | 14 +++++++ .../gen/psi/OapParameterKeyValueFirstId.java | 14 +++++++ .../impl/OapJavaParameterKeyValueImpl.java | 37 +++++++++++++++++++ .../impl/OapParameterKeyValueFirstIdImpl.java | 37 +++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 gen/oap/application/plugin/gen/psi/OapJavaParameterKeyValue.java create mode 100644 gen/oap/application/plugin/gen/psi/OapParameterKeyValueFirstId.java create mode 100644 gen/oap/application/plugin/gen/psi/impl/OapJavaParameterKeyValueImpl.java create mode 100644 gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueFirstIdImpl.java diff --git a/gen/oap/application/plugin/gen/psi/OapJavaParameterKeyValue.java b/gen/oap/application/plugin/gen/psi/OapJavaParameterKeyValue.java new file mode 100644 index 0000000..d5bbdc9 --- /dev/null +++ b/gen/oap/application/plugin/gen/psi/OapJavaParameterKeyValue.java @@ -0,0 +1,14 @@ +// This is a generated file. Not intended for manual editing. +package oap.application.plugin.gen.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; +import oap.application.plugin.psi.OapCompositeElement; + +public interface OapJavaParameterKeyValue extends OapCompositeElement { + + @NotNull + OapParameterKeyValue getParameterKeyValue(); + +} diff --git a/gen/oap/application/plugin/gen/psi/OapParameterKeyValueFirstId.java b/gen/oap/application/plugin/gen/psi/OapParameterKeyValueFirstId.java new file mode 100644 index 0000000..23ffffe --- /dev/null +++ b/gen/oap/application/plugin/gen/psi/OapParameterKeyValueFirstId.java @@ -0,0 +1,14 @@ +// This is a generated file. Not intended for manual editing. +package oap.application.plugin.gen.psi; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.psi.PsiElement; +import oap.application.plugin.psi.OapCompositeElement; + +public interface OapParameterKeyValueFirstId extends OapCompositeElement { + + @NotNull + PsiElement getKeyName(); + +} diff --git a/gen/oap/application/plugin/gen/psi/impl/OapJavaParameterKeyValueImpl.java b/gen/oap/application/plugin/gen/psi/impl/OapJavaParameterKeyValueImpl.java new file mode 100644 index 0000000..78cbe63 --- /dev/null +++ b/gen/oap/application/plugin/gen/psi/impl/OapJavaParameterKeyValueImpl.java @@ -0,0 +1,37 @@ +// This is a generated file. Not intended for manual editing. +package oap.application.plugin.gen.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import static oap.application.plugin.gen.OapTypes.*; +import oap.application.plugin.psi.impl.OapCompositeElementImpl; +import oap.application.plugin.gen.psi.*; +import oap.application.plugin.psi.impl.GrammarPsiImplUtil; + +public class OapJavaParameterKeyValueImpl extends OapCompositeElementImpl implements OapJavaParameterKeyValue { + + public OapJavaParameterKeyValueImpl(@NotNull ASTNode node) { + super(node); + } + + public void accept(@NotNull OapVisitor visitor) { + visitor.visitJavaParameterKeyValue(this); + } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof OapVisitor) accept((OapVisitor)visitor); + else super.accept(visitor); + } + + @Override + @NotNull + public OapParameterKeyValue getParameterKeyValue() { + return notNullChild(PsiTreeUtil.getChildOfType(this, OapParameterKeyValue.class)); + } + +} diff --git a/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueFirstIdImpl.java b/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueFirstIdImpl.java new file mode 100644 index 0000000..1878f35 --- /dev/null +++ b/gen/oap/application/plugin/gen/psi/impl/OapParameterKeyValueFirstIdImpl.java @@ -0,0 +1,37 @@ +// This is a generated file. Not intended for manual editing. +package oap.application.plugin.gen.psi.impl; + +import java.util.List; +import org.jetbrains.annotations.*; +import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiElementVisitor; +import com.intellij.psi.util.PsiTreeUtil; +import static oap.application.plugin.gen.OapTypes.*; +import oap.application.plugin.psi.impl.OapCompositeElementImpl; +import oap.application.plugin.gen.psi.*; +import oap.application.plugin.psi.impl.GrammarPsiImplUtil; + +public class OapParameterKeyValueFirstIdImpl extends OapCompositeElementImpl implements OapParameterKeyValueFirstId { + + public OapParameterKeyValueFirstIdImpl(@NotNull ASTNode node) { + super(node); + } + + public void accept(@NotNull OapVisitor visitor) { + visitor.visitParameterKeyValueFirstId(this); + } + + @Override + public void accept(@NotNull PsiElementVisitor visitor) { + if (visitor instanceof OapVisitor) accept((OapVisitor)visitor); + else super.accept(visitor); + } + + @Override + @NotNull + public PsiElement getKeyName() { + return notNullChild(findChildByType(OAP_KEY_NAME)); + } + +}