Skip to content

Commit 6e795ed

Browse files
committed
Merge branch 'topic/482' into 'master'
lkql check: add a warning when different LKQL files declare checkers with identical name Closes #482 See merge request eng/libadalang/langkit-query-language!502
2 parents c211779 + cc2aef9 commit 6e795ed

File tree

11 files changed

+49
-1
lines changed

11 files changed

+49
-1
lines changed

lkql_jit/language/src/main/java/com/adacore/lkql_jit/LKQLContext.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ public String[] getRuleDirectories() {
366366
if (additionalRulesDirs != null) {
367367
rulesDirsList.addAll(Arrays.asList(StringUtils.splitPaths(additionalRulesDirs)));
368368
}
369+
rulesDirsList.sort(null);
369370
this.ruleDirectories = rulesDirsList.toArray(new String[0]);
370371
}
371372
return this.ruleDirectories;

lkql_jit/language/src/main/java/com/adacore/lkql_jit/checker/BaseChecker.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,11 @@ public void setAlias(String alias) {
118118
/** Create a deep copy of the current checker and return it. */
119119
public abstract BaseChecker copy();
120120

121+
/** Get the checker path name. */
122+
public String getPath() {
123+
return function.rootNode.getBody().getSourceSection().getSource().getPath();
124+
}
125+
121126
// ----- Inner classes -----
122127

123128
/** This enum represents the valid remediation levels */

lkql_jit/language/src/main/java/com/adacore/lkql_jit/nodes/TopLevelList.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ public void addRuleImports() {
141141
if (ruleDirectoryFiles != null) {
142142
ruleImports.addAll(
143143
Arrays.stream(ruleDirectoryFiles)
144+
.sorted()
144145
.filter(File::canRead)
145146
.map(f ->
146147
new Import(

lkql_jit/language/src/main/java/com/adacore/lkql_jit/runtime/GlobalScope.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,19 @@ public Map<String, BaseChecker> getCheckers() {
8686
*/
8787
@CompilerDirectives.TruffleBoundary
8888
public void addChecker(String name, BaseChecker checker) {
89-
this.checkers.put(name, checker);
89+
BaseChecker previousValue = this.checkers.put(name, checker);
90+
91+
if (previousValue != null) {
92+
System.err.println(
93+
"Warning: a checker named \"" +
94+
name +
95+
"\" from: " +
96+
previousValue.getPath() +
97+
", has been replaced by the one from: " +
98+
checker.getPath() +
99+
". Note: checkers should have unique names."
100+
);
101+
}
90102
}
91103

92104
/**

testsuite/drivers/checker_driver.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
from drivers.base_driver import BaseDriver, TaggedLines
44

5+
from e3.testsuite.driver.diff import OutputRefiner, Substitute
56

67
class CheckerDriver(BaseDriver):
78
"""
@@ -111,3 +112,9 @@ def parse_flagged_lines(self, output: str) -> dict[str, TaggedLines]:
111112

112113
# Return the result
113114
return res
115+
116+
@property
117+
def output_refiners(self) -> list[OutputRefiner]:
118+
result = super().output_refiners
119+
result.append(Substitute(self.test_env['test_dir'], "<test-dir>"))
120+
return result
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@check(message="Rule1")
2+
fun my_rule(node) =
3+
node is DefiningName
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@check(message="Rule2")
2+
fun my_rule(node) =
3+
node is NullStmt
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
@check(message="Rule3")
2+
fun my_rule(node) =
3+
node is DefiningName
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
procedure P is -- FLAG
2+
begin
3+
null;
4+
end P;
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
Warning: a checker named "my_rule" from: <test-dir>/rule1.lkql, has been replaced by the one from: <test-dir>/rule2.lkql. Note: checkers should have unique names.
2+
Warning: a checker named "my_rule" from: <test-dir>/rule2.lkql, has been replaced by the one from: <test-dir>/rule3.lkql. Note: checkers should have unique names.
3+
test.adb:1:11: rule violation: Rule3
4+
1 | procedure P is -- FLAG
5+
| ^
6+

0 commit comments

Comments
 (0)