1212from pathlib import Path
1313from typing import Any , BinaryIO , TextIO
1414
15- from astroid import AstroidSyntaxError , NodeNG # type: ignore
16- from sqlglot import Expression , parse as parse_sql , ParseError as SqlParseError
15+ from astroid import NodeNG # type: ignore
16+ from sqlglot import Expression , parse as parse_sql
17+ from sqlglot .errors import SqlglotError
1718
1819from databricks .sdk .service import compute
1920from databricks .sdk .service .workspace import Language
2021
2122from databricks .labs .blueprint .paths import WorkspacePath
2223
23- from databricks .labs .ucx .source_code .python .python_ast import Tree
2424
2525if sys .version_info >= (3 , 11 ):
2626 from typing import Self
@@ -137,12 +137,13 @@ class SqlLinter(Linter):
137137
138138 def lint (self , code : str ) -> Iterable [Advice ]:
139139 try :
140+ # TODO: unify with SqlParser.walk_expressions(...)
140141 expressions = parse_sql (code , read = 'databricks' )
141142 for expression in expressions :
142143 if not expression :
143144 continue
144145 yield from self .lint_expression (expression )
145- except SqlParseError as e :
146+ except SqlglotError as e :
146147 logger .debug (f"Failed to parse SQL: { code } " , exc_info = e )
147148 yield self .sql_parse_failure (code )
148149
@@ -162,16 +163,6 @@ def sql_parse_failure(code: str) -> Failure:
162163 def lint_expression (self , expression : Expression ) -> Iterable [Advice ]: ...
163164
164165
165- class PythonLinter (Linter ):
166-
167- def lint (self , code : str ) -> Iterable [Advice ]:
168- tree = Tree .normalize_and_parse (code )
169- yield from self .lint_tree (tree )
170-
171- @abstractmethod
172- def lint_tree (self , tree : Tree ) -> Iterable [Advice ]: ...
173-
174-
175166class Fixer (ABC ):
176167
177168 @property
@@ -271,20 +262,6 @@ class UsedTableNode:
271262 node : NodeNG
272263
273264
274- class TablePyCollector (TableCollector , ABC ):
275-
276- def collect_tables (self , source_code : str ) -> Iterable [UsedTable ]:
277- try :
278- tree = Tree .normalize_and_parse (source_code )
279- for table_node in self .collect_tables_from_tree (tree ):
280- yield table_node .table
281- except AstroidSyntaxError as e :
282- logger .warning ('syntax-error' , exc_info = e )
283-
284- @abstractmethod
285- def collect_tables_from_tree (self , tree : Tree ) -> Iterable [UsedTableNode ]: ...
286-
287-
288265class TableSqlCollector (TableCollector , ABC ): ...
289266
290267
@@ -309,17 +286,6 @@ class DfsaCollector(ABC):
309286 def collect_dfsas (self , source_code : str ) -> Iterable [DirectFsAccess ]: ...
310287
311288
312- class DfsaPyCollector (DfsaCollector , ABC ):
313-
314- def collect_dfsas (self , source_code : str ) -> Iterable [DirectFsAccess ]:
315- tree = Tree .normalize_and_parse (source_code )
316- for dfsa_node in self .collect_dfsas_from_tree (tree ):
317- yield dfsa_node .dfsa
318-
319- @abstractmethod
320- def collect_dfsas_from_tree (self , tree : Tree ) -> Iterable [DirectFsAccessNode ]: ...
321-
322-
323289class DfsaSqlCollector (DfsaCollector , ABC ): ...
324290
325291
@@ -395,83 +361,6 @@ def collect_tables(self, source_code: str) -> Iterable[UsedTable]:
395361 yield from collector .collect_tables (source_code )
396362
397363
398- class PythonSequentialLinter (Linter , DfsaCollector , TableCollector ):
399-
400- def __init__ (
401- self ,
402- linters : list [PythonLinter ],
403- dfsa_collectors : list [DfsaPyCollector ],
404- table_collectors : list [TablePyCollector ],
405- ):
406- self ._linters = linters
407- self ._dfsa_collectors = dfsa_collectors
408- self ._table_collectors = table_collectors
409- self ._tree : Tree | None = None
410-
411- def lint (self , code : str ) -> Iterable [Advice ]:
412- try :
413- tree = self ._parse_and_append (code )
414- yield from self .lint_tree (tree )
415- except AstroidSyntaxError as e :
416- yield Failure ('syntax-error' , str (e ), 0 , 0 , 0 , 0 )
417-
418- def lint_tree (self , tree : Tree ) -> Iterable [Advice ]:
419- for linter in self ._linters :
420- yield from linter .lint_tree (tree )
421-
422- def _parse_and_append (self , code : str ) -> Tree :
423- tree = Tree .normalize_and_parse (code )
424- self .append_tree (tree )
425- return tree
426-
427- def append_tree (self , tree : Tree ) -> None :
428- self ._make_tree ().append_tree (tree )
429-
430- def append_nodes (self , nodes : list [NodeNG ]) -> None :
431- self ._make_tree ().append_nodes (nodes )
432-
433- def append_globals (self , globs : dict ) -> None :
434- self ._make_tree ().append_globals (globs )
435-
436- def process_child_cell (self , code : str ) -> None :
437- try :
438- this_tree = self ._make_tree ()
439- tree = Tree .normalize_and_parse (code )
440- this_tree .append_tree (tree )
441- except AstroidSyntaxError as e :
442- # error already reported when linting enclosing notebook
443- logger .warning (f"Failed to parse Python cell: { code } " , exc_info = e )
444-
445- def collect_dfsas (self , source_code : str ) -> Iterable [DirectFsAccess ]:
446- try :
447- tree = self ._parse_and_append (source_code )
448- for dfsa_node in self .collect_dfsas_from_tree (tree ):
449- yield dfsa_node .dfsa
450- except AstroidSyntaxError as e :
451- logger .warning ('syntax-error' , exc_info = e )
452-
453- def collect_dfsas_from_tree (self , tree : Tree ) -> Iterable [DirectFsAccessNode ]:
454- for collector in self ._dfsa_collectors :
455- yield from collector .collect_dfsas_from_tree (tree )
456-
457- def collect_tables (self , source_code : str ) -> Iterable [UsedTable ]:
458- try :
459- tree = self ._parse_and_append (source_code )
460- for table_node in self .collect_tables_from_tree (tree ):
461- yield table_node .table
462- except AstroidSyntaxError as e :
463- logger .warning ('syntax-error' , exc_info = e )
464-
465- def collect_tables_from_tree (self , tree : Tree ) -> Iterable [UsedTableNode ]:
466- for collector in self ._table_collectors :
467- yield from collector .collect_tables_from_tree (tree )
468-
469- def _make_tree (self ) -> Tree :
470- if self ._tree is None :
471- self ._tree = Tree .new_module ()
472- return self ._tree
473-
474-
475364SUPPORTED_EXTENSION_LANGUAGES = {
476365 '.py' : Language .PYTHON ,
477366 '.sql' : Language .SQL ,
0 commit comments