Coverage for src/castep_linter/fortran/parser.py: 100%
27 statements
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2023-11-23 18:07 +0000
1"""Tests for Fortran code in CASTEP"""
2from importlib import resources as impresources
3from typing import Generator
5from tree_sitter import Language, Parser, Tree
7from castep_linter.fortran.fortran_node import FortranNode
10def traverse_tree(tree: Tree) -> Generator[FortranNode, None, None]:
11 """Traverse a tree-sitter tree in a depth first search"""
12 cursor = tree.walk()
14 reached_root = False
15 while not reached_root:
16 yield FortranNode(cursor.node)
18 if cursor.goto_first_child():
19 continue
21 if cursor.goto_next_sibling():
22 continue
24 retracing = True
25 while retracing:
26 if not cursor.goto_parent():
27 retracing = False
28 reached_root = True
30 if cursor.goto_next_sibling():
31 retracing = False
34def get_fortran_parser():
35 """Get a tree-sitter-fortran parser from src"""
37 tree_sitter_src_ref = impresources.files("castep_linter") / "tree_sitter_fortran"
38 with impresources.as_file(tree_sitter_src_ref) as tree_sitter_src:
39 fortran_language = Language(tree_sitter_src / "fortran.so", "fortran")
41 parser = Parser()
42 parser.set_language(fortran_language)
43 return parser