feat(cli): highlight midas keywords

This commit is contained in:
2026-05-26 10:14:23 +02:00
parent 170101aa37
commit 6524b3591a
5 changed files with 31 additions and 19 deletions

View File

@@ -50,4 +50,8 @@ span {
--border: 2px; --border: 2px;
z-index: 10; z-index: 10;
} }
&.keyword {
color: rgb(211, 72, 9);
}
} }

View File

@@ -1,11 +1,12 @@
import ast import ast
from dataclasses import dataclass
from typing import Optional, TextIO from typing import Optional, TextIO
import click import click
from midas.ast.location import Location
import midas.ast.midas as m import midas.ast.midas as m
import midas.ast.python as p import midas.ast.python as p
from midas.ast.location import Location
from midas.ast.printer import PythonAstPrinter from midas.ast.printer import PythonAstPrinter
from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter from midas.cli.highlighter import Highlighter, MidasHighlighter, PythonHighlighter
from midas.lexer.midas import MidasLexer from midas.lexer.midas import MidasLexer
@@ -73,20 +74,24 @@ def highlight_midas(source: str, path: str) -> Highlighter:
parser = MidasParser(tokens) parser = MidasParser(tokens)
stmts: list[m.Stmt] = parser.parse() stmts: list[m.Stmt] = parser.parse()
highlighter = MidasHighlighter(source) highlighter = MidasHighlighter(source)
for err in parser.errors:
print(err.get_report())
@dataclass(frozen=True)
class LocatableToken: class LocatableToken:
def __init__(self, token: Token): token: Token
self.token: Token = token
@property @property
def location(self) -> Location: def location(self) -> Location:
return self.token.get_location() return self.token.get_location()
for stmt in stmts:
highlighter.highlight(stmt)
for token in tokens: for token in tokens:
if token.type == TokenType.COMMENT: if token.type == TokenType.COMMENT:
highlighter.wrap(LocatableToken(token), "comment") highlighter.wrap(LocatableToken(token), "comment")
for stmt in stmts: elif token.is_keyword:
highlighter.highlight(stmt) highlighter.wrap(LocatableToken(token), "keyword")
return highlighter return highlighter

View File

@@ -1,12 +0,0 @@
from midas.lexer.token import TokenType
KEYWORDS: dict[str, TokenType] = {
"type": TokenType.TYPE,
"op": TokenType.OP,
"predicate": TokenType.PREDICATE,
"extend": TokenType.EXTEND,
"where": TokenType.WHERE,
"true": TokenType.TRUE,
"false": TokenType.FALSE,
"none": TokenType.NONE,
}

View File

@@ -1,6 +1,5 @@
from midas.lexer.base import Lexer from midas.lexer.base import Lexer
from midas.lexer.keyword import KEYWORDS from midas.lexer.token import KEYWORDS, TokenType
from midas.lexer.token import TokenType
class MidasLexer(Lexer): class MidasLexer(Lexer):

View File

@@ -58,6 +58,18 @@ class TokenType(Enum):
NEWLINE = auto() NEWLINE = auto()
KEYWORDS: dict[str, TokenType] = {
"type": TokenType.TYPE,
"op": TokenType.OP,
"predicate": TokenType.PREDICATE,
"extend": TokenType.EXTEND,
"where": TokenType.WHERE,
"true": TokenType.TRUE,
"false": TokenType.FALSE,
"none": TokenType.NONE,
}
@dataclass(frozen=True) @dataclass(frozen=True)
class Token: class Token:
"""A scanned token""" """A scanned token"""
@@ -86,3 +98,7 @@ class Token:
def location_to(self, to: Token) -> Location: def location_to(self, to: Token) -> Location:
return Location.span(self.get_location(), to.get_location()) return Location.span(self.get_location(), to.get_location())
@property
def is_keyword(self) -> bool:
return self.lexeme in KEYWORDS