11use std:: { ops:: Deref , sync:: LazyLock } ;
22
33use pgt_analyse:: {
4- AnalyserOptions , AnalysisFilter , MetadataRegistry , RegistryRuleParams , RuleDiagnostic ,
5- RuleRegistry ,
4+ AnalysedFileContext , AnalyserOptions , AnalysisFilter , MetadataRegistry , RegistryRuleParams ,
5+ RuleDiagnostic , RuleRegistry ,
66} ;
77pub use registry:: visit_registry;
88
@@ -30,8 +30,15 @@ pub struct Analyser<'a> {
3030 registry : RuleRegistry ,
3131}
3232
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 > ,
3542}
3643
3744pub struct AnalyserConfig < ' a > {
@@ -52,17 +59,31 @@ impl<'a> Analyser<'a> {
5259 }
5360 }
5461
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+ } ;
6074
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
6687 }
6788}
6889
@@ -77,9 +98,10 @@ mod tests {
7798 markup,
7899 } ;
79100 use pgt_diagnostics:: PrintDiagnostic ;
101+ use pgt_text_size:: TextRange ;
80102 use termcolor:: NoColor ;
81103
82- use crate :: Analyser ;
104+ use crate :: { AnalysableStatement , Analyser } ;
83105
84106 #[ ignore]
85107 #[ test]
@@ -102,6 +124,7 @@ mod tests {
102124 } ;
103125
104126 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 ( ) ) ;
105128
106129 let options = AnalyserOptions :: default ( ) ;
107130
@@ -110,7 +133,10 @@ mod tests {
110133 filter,
111134 } ) ;
112135
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+ } ) ;
114140
115141 println ! ( "*******************" ) ;
116142 for result in & results {
0 commit comments