feat(cli): highlight midas keywords
This commit is contained in:
@@ -50,4 +50,8 @@ span {
|
|||||||
--border: 2px;
|
--border: 2px;
|
||||||
z-index: 10;
|
z-index: 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.keyword {
|
||||||
|
color: rgb(211, 72, 9);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
|
||||||
}
|
|
||||||
@@ -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):
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user