diff --git a/midas/ast/printer/midas.py b/midas/ast/printer/midas.py index 56d7ce8..f064751 100644 --- a/midas/ast/printer/midas.py +++ b/midas/ast/printer/midas.py @@ -1,6 +1,9 @@ +from typing import final + import midas.ast.midas as m +@final class MidasPrinter( m.Expr.Visitor[str], m.Stmt.Visitor[str], diff --git a/midas/ast/printer/midas_ast.py b/midas/ast/printer/midas_ast.py index d2e5daf..2e8103b 100644 --- a/midas/ast/printer/midas_ast.py +++ b/midas/ast/printer/midas_ast.py @@ -1,7 +1,10 @@ +from typing import final + import midas.ast.midas as m from midas.ast.printer.base import AstPrinter +@final class MidasAstPrinter( AstPrinter, m.Expr.Visitor[None], diff --git a/midas/ast/printer/python_ast.py b/midas/ast/printer/python_ast.py index d2214e0..70a2223 100644 --- a/midas/ast/printer/python_ast.py +++ b/midas/ast/printer/python_ast.py @@ -1,9 +1,11 @@ import ast +from typing import final import midas.ast.python as p from midas.ast.printer.base import AstPrinter +@final class PythonAstPrinter( AstPrinter, p.MidasType.Visitor[None], diff --git a/midas/checker/evaluator.py b/midas/checker/evaluator.py index 79dc9c1..a3b4f96 100644 --- a/midas/checker/evaluator.py +++ b/midas/checker/evaluator.py @@ -1,5 +1,5 @@ from dataclasses import dataclass -from typing import Any, Callable, Optional +from typing import Any, Callable, Optional, final import midas.ast.midas as m from midas.ast.location import Location @@ -18,6 +18,7 @@ class PartialPredicate(Predicate): """A dictionary of already applied parameters""" +@final class Evaluator(m.Expr.Visitor[Any]): """Helper class to evaluate an expression diff --git a/midas/checker/midas.py b/midas/checker/midas.py index cd691ea..4ec4f73 100644 --- a/midas/checker/midas.py +++ b/midas/checker/midas.py @@ -1,6 +1,6 @@ import logging from pathlib import Path -from typing import Optional +from typing import Optional, final import midas.ast.midas as m from midas.ast.location import Location @@ -30,6 +30,7 @@ from midas.lexer.token import Token, TokenType from midas.parser.midas import MidasParser +@final class MidasTyper(m.Stmt.Visitor[None], m.Expr.Visitor[Type], m.Type.Visitor[Type]): """A resolver which evaluates Midas type definitions and build a registry""" diff --git a/midas/checker/python.py b/midas/checker/python.py index 15f4b62..b2995d0 100644 --- a/midas/checker/python.py +++ b/midas/checker/python.py @@ -1,6 +1,6 @@ import ast import logging -from typing import Any, Optional +from typing import Any, Optional, final import midas.ast.python as p from midas.ast.location import Location @@ -55,6 +55,7 @@ class UndefinedMethodException(Exception): pass +@final class PythonTyper( p.Stmt.Visitor[None], p.Expr.Visitor[Type], diff --git a/midas/checker/resolver.py b/midas/checker/resolver.py index 7c9e4e4..70747e9 100644 --- a/midas/checker/resolver.py +++ b/midas/checker/resolver.py @@ -1,3 +1,5 @@ +from typing import final + import midas.ast.python as p from midas.ast.location import Location from midas.checker.reporter import FileReporter @@ -6,6 +8,7 @@ from midas.checker.reporter import FileReporter class ResolverError(Exception): ... +@final class Resolver(p.Stmt.Visitor[None], p.Expr.Visitor[None]): """A variable assignment and reference resolver diff --git a/midas/cli/highlighter.py b/midas/cli/highlighter.py index 4929b0c..6086463 100644 --- a/midas/cli/highlighter.py +++ b/midas/cli/highlighter.py @@ -3,7 +3,7 @@ from __future__ import annotations from abc import ABC, abstractmethod from dataclasses import dataclass from pathlib import Path -from typing import Generic, Optional, Protocol, TextIO, TypeVar +from typing import Generic, Optional, Protocol, TextIO, TypeVar, final import midas.ast.midas as m import midas.ast.python as p @@ -121,6 +121,7 @@ class Highlighter(ABC): self.openings.setdefault((l + 1, 0), []).append(opening) +@final class PythonHighlighter( Highlighter, p.MidasType.Visitor[None], @@ -255,6 +256,7 @@ class PythonHighlighter( def visit_raw_stmt(self, stmt: p.RawStmt) -> None: ... +@final class MidasHighlighter( Highlighter, m.Stmt.Visitor[None], m.Expr.Visitor[None], m.Type.Visitor[None] ): @@ -352,6 +354,7 @@ class MidasHighlighter( self.wrap(column, "column") +@final class DiagnosticsHighlighter(Highlighter): EXTRA_CSS_PATH: Optional[Path] = Path(__file__).parent / "hl_diagnostic.css" diff --git a/midas/generator/constraints.py b/midas/generator/constraints.py index 75c9a15..b663a9a 100644 --- a/midas/generator/constraints.py +++ b/midas/generator/constraints.py @@ -1,5 +1,5 @@ import ast -from typing import Optional +from typing import Optional, final import midas.ast.midas as m from midas.checker.registry import TypesRegistry @@ -39,6 +39,7 @@ COMPARISON_OPERATORS: dict[TokenType, type[ast.cmpop]] = { } +@final class ConstraintGenerator(m.Expr.Visitor[ast.expr]): """Class to generate Python code for constraint expressions""" diff --git a/midas/generator/generator.py b/midas/generator/generator.py index 3cf2423..fe3b92e 100644 --- a/midas/generator/generator.py +++ b/midas/generator/generator.py @@ -3,7 +3,7 @@ import logging import shutil from dataclasses import dataclass, field from pathlib import Path -from typing import Optional, assert_never +from typing import Optional, assert_never, final import midas.ast.midas as m import midas.ast.python as p @@ -47,6 +47,7 @@ class Scope: """A list of aliases defined in the scope, that can be discard afterwards""" +@final class Generator(p.Stmt.Visitor[ast.stmt], p.Expr.Visitor[ast.expr]): """ A class to translate the custom Python AST back into raw `ast` nodes diff --git a/tests/serializer/midas.py b/tests/serializer/midas.py index 599482b..38640f6 100644 --- a/tests/serializer/midas.py +++ b/tests/serializer/midas.py @@ -1,4 +1,4 @@ -from typing import Optional, Sequence +from typing import Optional, Sequence, final from midas.ast.midas import ( AliasStmt, @@ -28,6 +28,7 @@ from midas.ast.midas import ( ) +@final class MidasAstJsonSerializer( Stmt.Visitor[dict], Expr.Visitor[dict], Type.Visitor[dict] ): diff --git a/tests/serializer/python.py b/tests/serializer/python.py index 89a097c..dca4cb2 100644 --- a/tests/serializer/python.py +++ b/tests/serializer/python.py @@ -1,5 +1,5 @@ import ast -from typing import Optional, Sequence, Type +from typing import Optional, Sequence, Type, final from midas.ast.python import ( AssignStmt, @@ -78,6 +78,7 @@ boolean_ops: dict[Type[ast.boolop], str] = { } +@final class PythonAstJsonSerializer( Stmt.Visitor[dict], Expr.Visitor[dict], MidasType.Visitor[dict] ):