1919 */
2020package org .sonar .python .checks .quickfix ;
2121
22- import com .sonar .sslr .api .AstNode ;
2322import java .net .URI ;
2423import java .util .ArrayList ;
2524import java .util .Arrays ;
2625import java .util .Collections ;
2726import java .util .Comparator ;
2827import java .util .List ;
28+ import java .util .function .Function ;
2929import java .util .stream .Collectors ;
3030import java .util .stream .Stream ;
3131import org .sonar .plugins .python .api .PythonCheck ;
3232import org .sonar .plugins .python .api .PythonCheck .PreciseIssue ;
3333import org .sonar .plugins .python .api .PythonFile ;
3434import org .sonar .plugins .python .api .PythonSubscriptionCheck ;
3535import org .sonar .plugins .python .api .PythonVisitorContext ;
36- import org .sonar .plugins .python .api .tree .FileInput ;
36+ import org .sonar .plugins .python .api .quickfix .PythonQuickFix ;
37+ import org .sonar .plugins .python .api .quickfix .PythonTextEdit ;
3738import org .sonar .python .SubscriptionVisitor ;
3839import org .sonar .python .caching .CacheContextImpl ;
3940import org .sonar .python .parser .PythonParser ;
40- import org .sonar .plugins .python .api .quickfix .PythonQuickFix ;
41- import org .sonar .plugins .python .api .quickfix .PythonTextEdit ;
4241import org .sonar .python .semantic .ProjectLevelSymbolTable ;
42+ import org .sonar .python .tree .IPythonTreeMaker ;
4343import org .sonar .python .tree .PythonTreeMaker ;
4444
4545import static org .assertj .core .api .Assertions .assertThat ;
@@ -49,8 +49,32 @@ private PythonQuickFixVerifier() {
4949 }
5050
5151 public static void verify (PythonCheck check , String codeWithIssue , String ... codesFixed ) {
52+ verify (PythonQuickFixVerifier ::createPythonVisitorContext , check , codeWithIssue , codesFixed );
53+ }
54+
55+ public static void verifyNoQuickFixes (PythonCheck check , String codeWithIssue ) {
56+ verifyNoQuickFixes (PythonQuickFixVerifier ::createPythonVisitorContext , check , codeWithIssue );
57+ }
58+
59+ public static void verifyQuickFixMessages (PythonCheck check , String codeWithIssue , String ... expectedMessages ) {
60+ verifyQuickFixMessages (PythonQuickFixVerifier ::createPythonVisitorContext , check , codeWithIssue , expectedMessages );
61+ }
62+
63+ public static void verifyIPython (PythonCheck check , String codeWithIssue , String ... codesFixed ) {
64+ verify (PythonQuickFixVerifier ::createIPythonVisitorContext , check , codeWithIssue , codesFixed );
65+ }
66+
67+ public static void verifyIPythonNoQuickFixes (PythonCheck check , String codeWithIssue ) {
68+ verifyNoQuickFixes (PythonQuickFixVerifier ::createIPythonVisitorContext , check , codeWithIssue );
69+ }
70+
71+ public static void verifyIPythonQuickFixMessages (PythonCheck check , String codeWithIssue , String ... expectedMessages ) {
72+ verifyQuickFixMessages (PythonQuickFixVerifier ::createIPythonVisitorContext , check , codeWithIssue , expectedMessages );
73+ }
74+
75+ public static void verify (Function <String , PythonVisitorContext > createVisitorContext , PythonCheck check , String codeWithIssue , String ... codesFixed ) {
5276 List <PythonCheck .PreciseIssue > issues = PythonQuickFixVerifier
53- .getIssuesWithQuickFix (check , codeWithIssue );
77+ .getIssuesWithQuickFix (createVisitorContext , check , codeWithIssue );
5478
5579 assertThat (issues )
5680 .as ("Number of issues" )
@@ -73,9 +97,9 @@ public static void verify(PythonCheck check, String codeWithIssue, String... cod
7397 .isEqualTo (Arrays .asList (codesFixed ));
7498 }
7599
76- public static void verifyNoQuickFixes (PythonCheck check , String codeWithIssue ) {
100+ public static void verifyNoQuickFixes (Function < String , PythonVisitorContext > createVisitorContext , PythonCheck check , String codeWithIssue ) {
77101 List <PythonCheck .PreciseIssue > issues = PythonQuickFixVerifier
78- .getIssuesWithQuickFix (check , codeWithIssue );
102+ .getIssuesWithQuickFix (createVisitorContext , check , codeWithIssue );
79103
80104 assertThat (issues )
81105 .as ("Number of issues" )
@@ -89,9 +113,12 @@ public static void verifyNoQuickFixes(PythonCheck check, String codeWithIssue) {
89113 .isEmpty ();
90114 }
91115
92- public static void verifyQuickFixMessages (PythonCheck check , String codeWithIssue , String ... expectedMessages ) {
116+ public static void verifyQuickFixMessages (Function <String , PythonVisitorContext > createVisitorContext ,
117+ PythonCheck check ,
118+ String codeWithIssue ,
119+ String ... expectedMessages ) {
93120 Stream <String > descriptions = PythonQuickFixVerifier
94- .getIssuesWithQuickFix (check , codeWithIssue )
121+ .getIssuesWithQuickFix (createVisitorContext , check , codeWithIssue )
95122 .stream ()
96123 .flatMap (issue -> issue .quickFixes ().stream ())
97124 .map (PythonQuickFix ::getDescription );
@@ -107,17 +134,27 @@ private static List<PreciseIssue> scanFileForIssues(PythonCheck check, PythonVis
107134 return context .getIssues ();
108135 }
109136
110- private static List <PreciseIssue > getIssuesWithQuickFix (PythonCheck check , String codeWithIssue ) {
111- PythonParser parser = PythonParser .create ();
112- PythonQuickFixFile pythonFile = new PythonQuickFixFile (codeWithIssue );
113- AstNode astNode = parser .parse (pythonFile .content ());
114- FileInput parse = new PythonTreeMaker ().fileInput (astNode );
137+ private static List <PreciseIssue > getIssuesWithQuickFix (Function <String , PythonVisitorContext > createVisitorContext , PythonCheck check , String codeWithIssue ) {
138+ var visitorContext = createVisitorContext .apply (codeWithIssue );
139+ return scanFileForIssues (check , visitorContext );
140+ }
141+
142+ private static PythonVisitorContext createPythonVisitorContext (String code ) {
143+ return createVisitorContext (PythonParser .create (), new PythonTreeMaker (), code );
144+ }
145+
146+ private static PythonVisitorContext createIPythonVisitorContext (String code ) {
147+ return createVisitorContext (PythonParser .createIPythonParser (), new IPythonTreeMaker (), code );
148+ }
115149
116- PythonVisitorContext visitorContext = new PythonVisitorContext (parse ,
150+ private static PythonVisitorContext createVisitorContext (PythonParser parser , PythonTreeMaker treeMaker , String code ) {
151+ var pythonFile = new PythonQuickFixFile (code );
152+ var astNode = parser .parse (pythonFile .content ());
153+ var fileInput = treeMaker .fileInput (astNode );
154+
155+ return new PythonVisitorContext (fileInput ,
117156 pythonFile , null , "" ,
118157 ProjectLevelSymbolTable .empty (), CacheContextImpl .dummyCache ());
119-
120- return scanFileForIssues (check , visitorContext );
121158 }
122159
123160 private static String applyQuickFix (String codeWithIssue , PythonQuickFix quickFix ) {
0 commit comments