1
1
use std:: { ops:: Deref , sync:: LazyLock } ;
2
2
3
3
use pgt_analyse:: {
4
- AnalyserOptions , AnalysisFilter , MetadataRegistry , RegistryRuleParams , RuleDiagnostic ,
5
- RuleRegistry ,
4
+ AnalysedFileContext , AnalyserOptions , AnalysisFilter , MetadataRegistry , RegistryRuleParams ,
5
+ RuleDiagnostic , RuleRegistry ,
6
6
} ;
7
7
pub use registry:: visit_registry;
8
8
@@ -30,8 +30,15 @@ pub struct Analyser<'a> {
30
30
registry : RuleRegistry ,
31
31
}
32
32
33
- pub struct AnalyserContext < ' a > {
34
- pub root : & ' a pgt_query_ext:: NodeEnum ,
33
+ #[ derive( Debug ) ]
34
+ pub struct AnalysableStatement {
35
+ pub root : pgt_query_ext:: NodeEnum ,
36
+ pub range : pgt_text_size:: TextRange ,
37
+ }
38
+
39
+ pub struct AnalyserParams < ' a > {
40
+ pub stmts : Vec < AnalysableStatement > ,
41
+ pub schema_cache : Option < & ' a pgt_schema_cache:: SchemaCache > ,
35
42
}
36
43
37
44
pub struct AnalyserConfig < ' a > {
@@ -52,17 +59,31 @@ impl<'a> Analyser<'a> {
52
59
}
53
60
}
54
61
55
- pub fn run ( & self , ctx : AnalyserContext ) -> Vec < RuleDiagnostic > {
56
- let params = RegistryRuleParams {
57
- root : ctx. root ,
58
- options : self . options ,
59
- } ;
62
+ pub fn run ( & self , params : AnalyserParams ) -> Vec < RuleDiagnostic > {
63
+ let mut diagnostics = vec ! [ ] ;
64
+
65
+ let mut file_context = AnalysedFileContext :: default ( ) ;
66
+
67
+ for stmt in params. stmts {
68
+ let rule_params = RegistryRuleParams {
69
+ root : & stmt. root ,
70
+ options : self . options ,
71
+ analysed_file_context : & file_context,
72
+ schema_cache : params. schema_cache ,
73
+ } ;
60
74
61
- self . registry
62
- . rules
63
- . iter ( )
64
- . flat_map ( |rule| ( rule. run ) ( & params) )
65
- . collect :: < Vec < _ > > ( )
75
+ diagnostics. extend (
76
+ self . registry
77
+ . rules
78
+ . iter ( )
79
+ . flat_map ( |rule| ( rule. run ) ( & rule_params) )
80
+ . map ( |r| r. span ( stmt. range ) ) ,
81
+ ) ;
82
+
83
+ file_context. update_from ( & stmt. root ) ;
84
+ }
85
+
86
+ diagnostics
66
87
}
67
88
}
68
89
@@ -77,9 +98,10 @@ mod tests {
77
98
markup,
78
99
} ;
79
100
use pgt_diagnostics:: PrintDiagnostic ;
101
+ use pgt_text_size:: TextRange ;
80
102
use termcolor:: NoColor ;
81
103
82
- use crate :: Analyser ;
104
+ use crate :: { AnalysableStatement , Analyser } ;
83
105
84
106
#[ ignore]
85
107
#[ test]
@@ -102,6 +124,7 @@ mod tests {
102
124
} ;
103
125
104
126
let ast = pgt_query_ext:: parse ( SQL ) . expect ( "failed to parse SQL" ) ;
127
+ let range = TextRange :: new ( 0 . into ( ) , u32:: try_from ( SQL . len ( ) ) . unwrap ( ) . into ( ) ) ;
105
128
106
129
let options = AnalyserOptions :: default ( ) ;
107
130
@@ -110,7 +133,10 @@ mod tests {
110
133
filter,
111
134
} ) ;
112
135
113
- let results = analyser. run ( crate :: AnalyserContext { root : & ast } ) ;
136
+ let results = analyser. run ( crate :: AnalyserParams {
137
+ stmts : vec ! [ AnalysableStatement { root: ast, range } ] ,
138
+ schema_cache : None ,
139
+ } ) ;
114
140
115
141
println ! ( "*******************" ) ;
116
142
for result in & results {
0 commit comments