diff --git a/src/textual/css/errors.py b/src/textual/css/errors.py index 5830a2077..b1f28f392 100644 --- a/src/textual/css/errors.py +++ b/src/textual/css/errors.py @@ -5,6 +5,7 @@ from rich.traceback import Traceback from ._help_renderables import HelpText from .tokenize import Token +from .tokenizer import TokenError class DeclarationError(Exception): @@ -19,6 +20,10 @@ class StyleTypeError(TypeError): pass +class UnresolvedVariableError(TokenError): + pass + + class StyleValueError(ValueError): """Raised when the value of a style property is not valid diff --git a/src/textual/css/parse.py b/src/textual/css/parse.py index f0e4cce70..5183f5572 100644 --- a/src/textual/css/parse.py +++ b/src/textual/css/parse.py @@ -6,8 +6,8 @@ from typing import Iterator, Iterable, NoReturn, Sequence from rich import print -from textual.css.tokenizer import TokenError -from textual.css.types import Specificity3 +from .errors import UnresolvedVariableError +from .types import Specificity3 from ._styles_builder import StylesBuilder, DeclarationError from .model import ( Declaration, @@ -210,24 +210,24 @@ def parse_declarations(css: str, path: str) -> Styles: return styles_builder.styles -def _unresolved(variable_name: str, variables: Sequence[str], token: Token) -> NoReturn: +def _unresolved(variable_name: str, variables: Iterable[str], token: Token) -> NoReturn: """Raise a TokenError regarding an unresolved variable. Args: variable_name (str): A variable name. - variables (Sequence[str]): Possible choices used to generate suggestion. + variables (Iterable[str]): Possible choices used to generate suggestion. token (Token): The Token. Raises: - TokenError: Always raises a TokenError. + UnresolvedVariableError: Always raises a TokenError. """ message = f"reference to undefined variable '${variable_name}'" - suggested_variable = get_suggestion(variable_name, variables) + suggested_variable = get_suggestion(variable_name, list(variables)) if suggested_variable: - message += f"; did you mean '{suggested_variable}'?" + message += f"; did you mean '${suggested_variable}'?" - raise TokenError( + raise UnresolvedVariableError( token.path, token.code, token.start, diff --git a/src/textual/css/tokenizer.py b/src/textual/css/tokenizer.py index 733ffbe93..bbd7c9f2c 100644 --- a/src/textual/css/tokenizer.py +++ b/src/textual/css/tokenizer.py @@ -76,11 +76,18 @@ class TokenError(Exception): errors.append(highlighter(f" {self.path or ''}:{line_no}:{col_no}")) errors.append(self._get_snippet()) - final_message = "" - for is_last, message_part in loop_last(message.split(";")): - end = "" if is_last else "\n" - final_message += f"• {message_part.strip()};{end}" - errors.append(Padding(highlighter(Text(final_message, "red")), pad=(0, 1))) + + final_message = "\n".join( + f"• {message_part.strip()}" for message_part in message.split(";") + ) + errors.append( + Padding( + highlighter( + Text(final_message, "red"), + ), + pad=(0, 1), + ) + ) return Group(*errors)