Skip to content

Commit b14a744

Browse files
committed
Add Lowercase_Keywords check
1 parent ace6994 commit b14a744

File tree

4 files changed

+77
-0
lines changed

4 files changed

+77
-0
lines changed

lkql_checker/doc/generated/list_of_rules.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ GNATcheck rules.
8787
* :ref:`Local_Instantiations`
8888
* :ref:`Local_Packages`
8989
* :ref:`Local_USE_Clauses`
90+
* :ref:`Lowercase_Keywords`
9091
* :ref:`Max_Identifier_Length`
9192
* :ref:`Maximum_Expression_Complexity`
9293
* :ref:`Maximum_Lines`

lkql_checker/doc/generated/predefined_rules.rst

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5963,6 +5963,31 @@ the definition of exemption sections are:
59635963
59645964
59655965
5966+
.. _Lowercase_Keywords:
5967+
5968+
``Lowercase_Keywords``
5969+
^^^^^^^^^^^^^^^^^^^^^^
5970+
5971+
.. index:: Lowercase_Keywords
5972+
5973+
Flag Ada keywords that are not purely lowercase, such as ``BEGIN`` or
5974+
``beGin``.
5975+
5976+
Please note that this check is **not** language version sensitive. Every
5977+
keyword from Ada 83 to Ada 2012 will be flagged. This means that this
5978+
check might give false positives on usage of identifiers that are
5979+
keywords in newer versions of Ada.
5980+
5981+
.. rubric:: Example
5982+
5983+
.. code-block:: ada
5984+
:emphasize-lines: 1,2
5985+
5986+
packagE Foo is -- FLAG
5987+
END Foo; -- FLAG
5988+
5989+
5990+
59665991
.. _Max_Identifier_Length:
59675992

59685993
``Max_Identifier_Length``
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
val re_83 =
2+
"abort|abs|accept|access|aliased|all|and|array|"
3+
& "at|begin|body|case|constant|declare|delay|delta|digits|"
4+
& "do|else|elsif|end|entry|exception|exit|for|function|"
5+
& "generic|goto|if|in|is|limited|loop|mod|new|"
6+
& "not|null|others|out|of|or|package|pragma|"
7+
& "private|procedure|raise|range|record|rem|"
8+
& "renames|return|reverse|select|separate|"
9+
& "subtype|task|terminate|then|type|"
10+
& "use|when|while|with|xor"
11+
val re_95 = "abstract|protected|requeue|tagged|until"
12+
val re_2005 = "interface|overriding|synchronized"
13+
val re_2012 = "some"
14+
15+
@memoized
16+
fun keyword_matcher(language_version) =
17+
|" Return a regex matcher that matches keywords, given a language version
18+
pattern("^(" & (match language_version
19+
| "ada_83" => re_83
20+
| "ada_95" => re_83 & "|" & re_95
21+
| "ada_2005" => re_83 & "|" & re_95 & "|" & re_2005
22+
| "ada_2012" => re_83 & "|" & re_95 & "|" & re_2005 & "|" & re_2012
23+
| "ada_2022" => re_83 & "|" & re_95 & "|" & re_2005 & "|" & re_2012) & ")$")
24+
25+
val match_uppercase = pattern("[A-Z]+")
26+
27+
@unit_check(category="Style", subcategory="Readability")
28+
fun lowercase_keywords(unit, language_version="ada_2022") =
29+
|" Flag Ada keywords that are not purely lowercase, such as ``BEGIN`` or
30+
|" ``beGin``.
31+
|"
32+
|" Please note that this check is **not** language version sensitive. Every
33+
|" keyword from Ada 83 to Ada 2012 will be flagged. This means that this
34+
|" check might give false positives on usage of identifiers that are
35+
|" keywords in newer versions of Ada.
36+
|"
37+
|" .. rubric:: Example
38+
|"
39+
|" .. code-block:: ada
40+
|" :emphasize-lines: 1,2
41+
|"
42+
|" packagE Foo is -- FLAG
43+
|" END Foo; -- FLAG
44+
[
45+
{message: "Keyword should be lowercase", loc: tok}
46+
for tok in unit.tokens
47+
if tok.text.to_lower_case.contains(keyword_matcher(language_version))
48+
and tok.text.contains(match_uppercase)
49+
]

testsuite/tests/gnatcheck/xml_help/test.out

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,7 @@ testsuite_driver: No output file generated by gnatcheck
386386
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Access_Suffix=_A"/>
387387
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Constant_Suffix=_C"/>
388388
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Renaming_Suffix=_R"/>
389+
<field switch="+Rlowercase_keywords" separator=":" label="lowercase_keywords"/>
389390
<spin switch="+Rmax_identifier_length" label="maximal identifier length" min="0" max="99999" default="-1" separator=":"/>
390391
<spin switch="+Rmin_identifier_length" label="identifier too short" min="0" max="99999" default="-1" separator=":"/>
391392
<check switch="+Rmisnamed_controlling_parameters" label="first parameter should have name 'This' and proper type"/>
@@ -899,6 +900,7 @@ testsuite_driver: No output file generated by gnatcheck
899900
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Access_Suffix=_A"/>
900901
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Constant_Suffix=_C"/>
901902
<default-value-dependency master-switch="+Ridentifier_suffixes:Default" slave-switch="+Ridentifier_suffixes:Renaming_Suffix=_R"/>
903+
<field switch="+Rlowercase_keywords" separator=":" label="lowercase_keywords"/>
902904
<spin switch="+Rmax_identifier_length" label="maximal identifier length" min="0" max="99999" default="-1" separator=":"/>
903905
<spin switch="+Rmin_identifier_length" label="identifier too short" min="0" max="99999" default="-1" separator=":"/>
904906
<check switch="+Rmisnamed_controlling_parameters" label="first parameter should have name 'This' and proper type"/>

0 commit comments

Comments
 (0)