Skip to content

Commit 50553bc

Browse files
Remove the interface "ChecksGoTemplate" (#1474)
1 parent 452b964 commit 50553bc

File tree

10 files changed

+62
-131
lines changed

10 files changed

+62
-131
lines changed

iac-common/src/main/java/org/sonar/iac/common/extension/analyzer/CrossFileAnalyzer.java

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public boolean analyseFiles(SensorContext sensorContext, Collection<InputFile> i
5959
.toList();
6060

6161
// Parse files
62-
List<FileWithAsts> filesWithAst = new ArrayList<>();
62+
List<FileWithAst> filesWithAst = new ArrayList<>();
6363
for (InputFileContext inputFileContext : inputFileContextList) {
6464
if (sensorContext.isCancelled()) {
6565
progressReportParser.cancel();
@@ -70,7 +70,7 @@ public boolean analyseFiles(SensorContext sensorContext, Collection<InputFile> i
7070
var content = readContent(inputFileContext);
7171
if (content != null) {
7272
Tree tree = statistics.time("Parse", () -> parse(content, inputFileContext));
73-
filesWithAst.add(fileWithAsts(inputFileContext, tree));
73+
filesWithAst.add(new FileWithAst(inputFileContext, tree));
7474
}
7575
} catch (ParseException e) {
7676
reportParseError(e, inputFileContext);
@@ -83,37 +83,26 @@ public boolean analyseFiles(SensorContext sensorContext, Collection<InputFile> i
8383
var progressReportVisitors = new ProgressReport(progressReportThreadName(languageName, " analysis"),
8484
PROGRESS_REPORT_PERIOD_MILLIS, "analyzed");
8585
progressReportVisitors.start(filenames);
86-
if (!applyVisitors(sensorContext, filesWithAst, visitors, progressReportVisitors, false)) {
86+
if (!applyVisitors(sensorContext, filesWithAst, visitors, progressReportVisitors)) {
8787
return false;
8888
}
8989

9090
var progressReportCheckVisitor = new ProgressReport(progressReportThreadName(languageName, " analysis"),
9191
PROGRESS_REPORT_PERIOD_MILLIS, "checked");
9292
progressReportCheckVisitor.start(filenames);
93-
return applyVisitors(sensorContext, filesWithAst, List.of(checksVisitor), progressReportCheckVisitor, true);
93+
return applyVisitors(sensorContext, filesWithAst, List.of(checksVisitor), progressReportCheckVisitor);
9494
}
9595

96-
/**
97-
* @param visitAdditionalTrees indicates whether additional trees associated with the same input file should be visited. This applies for example
98-
* for Helm files where the main tree is the Kubernetes tree and the additional tree is the Go template tree.
99-
* We don't want to run metrics and highlighting visitors on the additional tree, because it's been already measured
100-
* as part of the main tree. We want to run checks visitors on it though.
101-
*/
102-
private boolean applyVisitors(SensorContext sensorContext, List<FileWithAsts> filesWithAsts, List<TreeVisitor<InputFileContext>> visitorsToBeApplied,
103-
ProgressReport progressReport, boolean visitAdditionalTrees) {
96+
private boolean applyVisitors(SensorContext sensorContext, List<FileWithAst> filesWithAsts, List<TreeVisitor<InputFileContext>> visitorsToBeApplied,
97+
ProgressReport progressReport) {
10498
// Visit files
105-
for (FileWithAsts fileWithAsts : filesWithAsts) {
99+
for (FileWithAst fileWithAsts : filesWithAsts) {
106100
if (sensorContext.isCancelled()) {
107101
progressReport.cancel();
108102
return false;
109103
}
110104

111105
visit(visitorsToBeApplied, fileWithAsts.inputFileContext, fileWithAsts.tree);
112-
if (visitAdditionalTrees) {
113-
for (Tree additionalTree : fileWithAsts.additionalTrees) {
114-
visit(visitorsToBeApplied, fileWithAsts.inputFileContext, additionalTree);
115-
}
116-
}
117106
progressReport.nextFile();
118107
}
119108
progressReport.stop();
@@ -124,10 +113,6 @@ private static String progressReportThreadName(String language, String phase) {
124113
return "Progress of the " + language + " " + phase;
125114
}
126115

127-
protected FileWithAsts fileWithAsts(InputFileContext inputFileContext, Tree tree) {
128-
return new FileWithAsts(inputFileContext, tree, List.of());
129-
}
130-
131-
public record FileWithAsts(InputFileContext inputFileContext, Tree tree, Collection<Tree> additionalTrees) {
116+
private record FileWithAst(InputFileContext inputFileContext, Tree tree) {
132117
}
133118
}

iac-common/src/test/java/org/sonar/iac/common/extension/analyzer/CrossFileAnalyzerTest.java

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,7 @@
3535
import static org.mockito.ArgumentMatchers.eq;
3636
import static org.mockito.Mockito.doAnswer;
3737
import static org.mockito.Mockito.mock;
38-
import static org.mockito.Mockito.never;
3938
import static org.mockito.Mockito.spy;
40-
import static org.mockito.Mockito.verify;
4139
import static org.mockito.Mockito.when;
4240

4341
class CrossFileAnalyzerTest extends AbstractAnalyzerTest {
@@ -106,22 +104,4 @@ void shouldAlsoBeCancellableDuringTheChecksVisitorPart() {
106104
List<InputFile> files = List.of(fileWithContent);
107105
assertThat(analyzer.analyseFiles(context, files, "iac")).isFalse();
108106
}
109-
110-
@Test
111-
void shouldExecuteChecksVisitorOnAdditionalTrees() {
112-
TreeVisitor<InputFileContext> visitor = mock(TreeVisitor.class);
113-
TreeVisitor<InputFileContext> checksVisitor = mock(TreeVisitor.class);
114-
var additionalTree = mock(Tree.class);
115-
116-
var analyzer = new CrossFileAnalyzer("iac", parser, List.of(visitor), checksVisitor, durationStatistics) {
117-
@Override
118-
protected FileWithAsts fileWithAsts(InputFileContext inputFileContext, Tree tree) {
119-
return new FileWithAsts(inputFileContext, tree, List.of(additionalTree));
120-
}
121-
};
122-
123-
assertThat(analyzer.analyseFiles(context, List.of(fileWithContent), "iac")).isTrue();
124-
verify(visitor, never()).scan(any(), eq(additionalTree));
125-
verify(checksVisitor).scan(any(), eq(additionalTree));
126-
}
127107
}

iac-extensions/kubernetes/src/main/java/org/sonar/iac/kubernetes/checks/DeprecatedCodeCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.sonar.iac.kubernetes.visitors.KubernetesCheckContext;
3232

3333
@Rule(key = "S1874")
34-
public class DeprecatedCodeCheck implements ChecksGoTemplate, IacCheck {
34+
public class DeprecatedCodeCheck implements IacCheck {
3535
private static final String MESSAGE = "Remove this deprecated use of \"Capabilities.KubeVersion.GitVersion\", use \"Capabilities" +
3636
".KubeVersion.Version\" instead.";
3737

iac-extensions/kubernetes/src/main/java/org/sonar/iac/kubernetes/checks/VariableNameConventionCheck.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
import org.sonar.iac.kubernetes.visitors.KubernetesCheckContext;
3434

3535
@Rule(key = "S117")
36-
public class VariableNameConventionCheck implements ChecksGoTemplate, IacCheck {
36+
public class VariableNameConventionCheck implements IacCheck {
3737
private static final String MESSAGE = "Rename this variable \"%s\" to match the regular expression '%s'.";
3838
private static final String DEFAULT_FORMAT = "^\\$[a-z][a-zA-Z0-9]*$";
3939

iac-extensions/kubernetes/src/main/java/org/sonar/iac/kubernetes/plugin/KubernetesAnalyzer.java

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
import java.io.IOException;
2323
import java.util.List;
24-
import java.util.Set;
2524
import java.util.regex.Pattern;
2625
import javax.annotation.Nullable;
2726
import org.sonar.api.batch.fs.InputFile;
@@ -33,7 +32,6 @@
3332
import org.sonar.iac.common.extension.analyzer.CrossFileAnalyzer;
3433
import org.sonar.iac.common.extension.visitors.InputFileContext;
3534
import org.sonar.iac.common.extension.visitors.TreeVisitor;
36-
import org.sonar.iac.kubernetes.tree.impl.HelmFileTreeImpl;
3735
import org.sonar.iac.kubernetes.visitors.HelmInputFileContext;
3836

3937
import static org.sonar.iac.common.yaml.YamlFileUtils.splitLines;
@@ -80,17 +78,6 @@ public Tree parse(String content, @Nullable InputFileContext inputFileContext) {
8078
}
8179
}
8280

83-
@Override
84-
protected FileWithAsts fileWithAsts(InputFileContext inputFileContext, Tree tree) {
85-
if (tree instanceof HelmFileTreeImpl helmFileTree) {
86-
Tree additionalTree = helmFileTree.getGoTemplateAst();
87-
if (additionalTree != null) {
88-
return new FileWithAsts(inputFileContext, tree, Set.of(additionalTree));
89-
}
90-
}
91-
return super.fileWithAsts(inputFileContext, tree);
92-
}
93-
9481
protected static boolean isHelmFile(InputFile inputFile) {
9582
try {
9683
return hasHelmContent(inputFile.contents());

iac-extensions/kubernetes/src/main/java/org/sonar/iac/kubernetes/tree/impl/HelmFileTreeImpl.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import java.util.List;
2323
import javax.annotation.CheckForNull;
2424
import javax.annotation.Nullable;
25+
import org.sonar.iac.common.api.tree.Tree;
2526
import org.sonar.iac.common.yaml.tree.FileTree;
2627
import org.sonar.iac.common.yaml.tree.FileTreeImpl;
2728
import org.sonar.iac.common.yaml.tree.YamlTree;
@@ -47,4 +48,13 @@ public static HelmFileTreeImpl fromFileTree(FileTree fileTree, @Nullable GoTempl
4748
public GoTemplateTree getGoTemplateAst() {
4849
return goTemplateAst;
4950
}
51+
52+
@Override
53+
public List<Tree> children() {
54+
List<Tree> children = super.children();
55+
if (goTemplateAst != null) {
56+
children.add(goTemplateAst);
57+
}
58+
return children;
59+
}
5060
}

iac-extensions/kubernetes/src/test/java/org/sonar/iac/kubernetes/checks/AbstractChecksGoTemplateTest.java renamed to iac-extensions/kubernetes/src/test/java/org/sonar/iac/kubernetes/checks/GoTemplateAstVerifierTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import org.sonar.iac.helm.tree.api.FieldNode;
2828
import org.sonar.iac.kubernetes.visitors.KubernetesCheckContext;
2929

30-
class ChecksGoTemplateTest {
30+
class GoTemplateAstVerifierTest {
3131
@Test
3232
void testVisitor() {
3333
KubernetesVerifier.verify("ChecksGoTemplate/helm/templates/capabilities-pod.yaml", new DummyChecksGoAst(), List.of(
@@ -40,7 +40,7 @@ void testVisitorWithGoComments() {
4040
KubernetesVerifier.verify("ChecksGoTemplate/helm/templates/capabilities-pod.yaml", new DummyChecksGoAst());
4141
}
4242

43-
private static class DummyChecksGoAst implements ChecksGoTemplate, IacCheck {
43+
private static class DummyChecksGoAst implements IacCheck {
4444
@Override
4545
public void initialize(InitContext init) {
4646
init.register(FieldNode.class, (ctx, node) -> {

iac-extensions/kubernetes/src/test/java/org/sonar/iac/kubernetes/checks/KubernetesVerifier.java

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
import org.sonar.iac.kubernetes.plugin.KubernetesLanguage;
6565
import org.sonar.iac.kubernetes.plugin.KubernetesParserStatistics;
6666
import org.sonar.iac.kubernetes.plugin.filesystem.DefaultFileSystemProvider;
67-
import org.sonar.iac.kubernetes.tree.impl.HelmFileTreeImpl;
6867
import org.sonar.iac.kubernetes.visitors.HelmInputFileContext;
6968
import org.sonar.iac.kubernetes.visitors.KubernetesCheckContext;
7069
import org.sonar.iac.kubernetes.visitors.LocationShifter;
@@ -85,23 +84,12 @@ public class KubernetesVerifier {
8584
private static final SensorContextTester SENSOR_CONTEXT = SensorContextTester.create(BASE_DIR.toAbsolutePath());
8685
private static final KubernetesAnalyzer KUBERNETES_ANALYZER = initializeKubernetesAnalyzer();
8786
private static final TreeParser<Tree> PARSER = KUBERNETES_ANALYZER::parse;
88-
private static final TreeParser<Tree> GO_PARSER = (String content, InputFileContext inputFileContext) -> {
89-
var yamlTree = PARSER.parse(content, inputFileContext);
90-
return ((HelmFileTreeImpl) yamlTree).getGoTemplateAst();
91-
};
92-
93-
private static TreeParser<? extends Tree> parserFor(IacCheck check) {
94-
if (check instanceof ChecksGoTemplate) {
95-
return GO_PARSER;
96-
}
97-
return PARSER;
98-
}
9987

10088
public static void verify(String templateFileName, IacCheck check, String... fileNames) {
10189
var initialization = initializeVerification(templateFileName, fileNames);
10290
var inputFileContext = initialization.first();
10391
var commentsVisitor = initialization.second();
104-
Verifier.verify(parserFor(check), inputFileContext, check,
92+
Verifier.verify(PARSER, inputFileContext, check,
10593
multiFileVerifier -> {
10694
// Prepare project context inside this lambda so that it happens after parsing. HelmInputFileContext
10795
// is fully initialized during parsing (i.e. additional files are discovered and added).
@@ -115,7 +103,7 @@ public static void verify(String templateFileName, IacCheck check, List<Verifier
115103
var initialization = initializeVerification(templateFileName, fileNames);
116104
var inputFileContext = initialization.first();
117105
var commentsVisitor = initialization.second();
118-
Verifier.verify(parserFor(check), inputFileContext, check,
106+
Verifier.verify(PARSER, inputFileContext, check,
119107
multiFileVerifier -> {
120108
var projectContext = prepareProjectContext(inputFileContext, fileNames);
121109
return new KubernetesTestContext(multiFileVerifier, inputFileContext, projectContext);
@@ -127,7 +115,7 @@ public static void verify(String templateFileName, IacCheck check, List<Verifier
127115
var initialization = initializeVerification(templateFileName);
128116
var inputFileContext = initialization.first();
129117
var commentsVisitor = initialization.second();
130-
Verifier.verify(parserFor(check), inputFileContext, check,
118+
Verifier.verify(PARSER, inputFileContext, check,
131119
multiFileVerifier -> {
132120
var projectContext = prepareProjectContext(inputFileContext);
133121
return new KubernetesTestContext(multiFileVerifier, inputFileContext, projectContext);
@@ -152,15 +140,15 @@ public static void verifyContent(String content, IacCheck check) {
152140
var tempFile = contentToTmp(content);
153141
var inputFileContext = new HelmInputFileContext(SENSOR_CONTEXT, inputFile(tempFile.getName(), tempFile.getParentFile().toPath(),
154142
KubernetesLanguage.NAME));
155-
Verifier.verify(parserFor(check), tempFile.toPath(), check, multiFileVerifier -> new KubernetesTestContext(multiFileVerifier, inputFileContext,
143+
Verifier.verify(PARSER, tempFile.toPath(), check, multiFileVerifier -> new KubernetesTestContext(multiFileVerifier, inputFileContext,
156144
new ProjectContext()));
157145
}
158146

159147
public static void verifyNoIssue(String templateFileName, IacCheck check, String... fileNames) {
160148
var initialization = initializeVerification(templateFileName, fileNames);
161149
var inputFileContext = initialization.first();
162150
var commentsVisitor = initialization.second();
163-
Verifier.verifyNoIssue(parserFor(check), inputFileContext, check,
151+
Verifier.verifyNoIssue(PARSER, inputFileContext, check,
164152
multiFileVerifier -> {
165153
var projectContext = prepareProjectContext(inputFileContext, fileNames);
166154
return new KubernetesTestContext(multiFileVerifier, inputFileContext, projectContext);
@@ -355,7 +343,8 @@ protected void reportIssue(TextRange textRange, String message, List<SecondaryLo
355343
}
356344
}
357345

358-
private HelmInputFileContext computeHelmInputFileContextForSecondaryLocation(SecondaryLocation secondaryLocation, HelmInputFileContext defaultHelmContext) {
346+
private HelmInputFileContext computeHelmInputFileContextForSecondaryLocation(SecondaryLocation secondaryLocation,
347+
HelmInputFileContext defaultHelmContext) {
359348
InputFileContext context = null;
360349
if (secondaryLocation.filePath != null) {
361350
context = projectContext.getInputFileContext(secondaryLocation.filePath);

0 commit comments

Comments
 (0)