Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lexer/lexer.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ fn lex_tokens(
preserve_comment~ : (Comment, Int, Int) -> Unit,
) -> Unit {
fn metavar_enabled() -> Bool {
env.enable_metavar && !env.is_interpolation
env.enable_metavar
}

fn typed_metavar_payload(
Expand Down
16 changes: 16 additions & 0 deletions lexer/metavar_test.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,22 @@ test "double-dollar metavariable prefix remains unsupported" {
}
}

///|
test "metavariable syntax remains enabled in interpolation sublexing" {
let result = tokens_from_string(
"$x",
comment=false,
is_interpolation=true,
enable_metavar=true,
)
guard result.errors.is_empty() else {
fail("expected metavariable syntax in interpolation sublexing")
}
guard result.tokens[0].0 is LIDENT("$x") else {
fail("expected interpolation sublexer to preserve metavariable tokens")
}
}

///|
test "multiline interpolation keeps precedence over metavariable syntax" {
let result = tokens_from_string("$|hello", comment=false, enable_metavar=true)
Expand Down
2 changes: 1 addition & 1 deletion lexer/moon.mod
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "moonbitlang/lexer"

version = "0.3.14"
version = "0.3.15"

repository = "https://github.com/moonbitlang/parser"

Expand Down
6 changes: 3 additions & 3 deletions moon.mod
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
name = "moonbitlang/parser"

version = "0.3.16"
version = "0.3.17"

import {
"moonbitlang/x@0.4.39",
"moonbitlang/lexer@0.3.14",
"moonbitlang/moon_config@0.3.13",
"moonbitlang/lexer@0.3.15",
"moonbitlang/moon_config@0.3.14",
"moonbitlang/async@0.20.3",
"moonbit-community/prettyprinter@0.4.10",
}
Expand Down
4 changes: 2 additions & 2 deletions moon_config/moon.mod
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name = "moonbitlang/moon_config"

version = "0.3.13"
version = "0.3.14"

import {
"moonbitlang/lexer@0.3.14",
"moonbitlang/lexer@0.3.15",
}

repository = "https://github.com/moonbitlang/parser"
Expand Down
12 changes: 10 additions & 2 deletions untyped_cst/api.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ fn parse_with_state(
source : String,
diagnostics : Array[Report],
docstrings : Array[List[(Location, Comment)]],
enable_metavar : Bool,
parse_root : (ParserState) -> CstNode,
) -> ParseResult {
let state = new_state(tokens, source, diagnostics)
let state = new_state(tokens, source, diagnostics, enable_metavar)
let root = parse_root(state)
parse_result(root, state.reports, docstrings)
}
Expand All @@ -30,7 +31,14 @@ fn parse_source(
comment=true,
)
let diagnostics = reports_from_lex_errors(lex.errors)
parse_with_state(lex.tokens, source, diagnostics, lex.docstrings, parse_root)
parse_with_state(
lex.tokens,
source,
diagnostics,
lex.docstrings,
enable_metavar,
parse_root,
)
}

///|
Expand Down
20 changes: 20 additions & 0 deletions untyped_cst/api_test.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,26 @@ test "parse entry points gate metavariable syntax" {
)
}

///|
test "metavariable option propagates into interpolation expressions" {
for source in ["\"\\{$x}\"", "\"\\{\"\\{$x}\"}\""] {
@test.assert_eq(
@untyped_cst.parse_expression(source).diagnostics_view().is_empty(),
false,
)
let expression = @untyped_cst.parse_expression(source, enable_metavar=true)
@test.assert_eq(expression.diagnostics_view().is_empty(), true)
@test.assert_eq(
api_has_string_value(
expression.root(),
fn(kind) { kind is Syntax_Identifier },
"$x",
),
true,
)
}
}

///|
test "constant kinds and normalized payloads are parser semantics" {
let cases : Array[(String, String, String)] = [
Expand Down
8 changes: 7 additions & 1 deletion untyped_cst/parse.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -11887,12 +11887,18 @@ fn parse_interp_source_expr(
interp_source.source,
start_pos=interp_source.loc.start,
is_interpolation=true,
enable_metavar=state.enable_metavar,
Comment thread
myfreess marked this conversation as resolved.
comment=true,
)
for report in reports_from_lex_errors(lex.errors) {
state.reports.push(report)
}
let inner_state = new_state(lex.tokens, state.source, state.reports)
let inner_state = new_state(
lex.tokens,
state.source,
state.reports,
state.enable_metavar,
)
parse_expr_until(inner_state, [TokenKind::TK_EOF])
}

Expand Down
3 changes: 3 additions & 0 deletions untyped_cst/state.mbt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ priv struct ParserState {
tokens : Triples
mut pos : Int
reports : Array[Report]
enable_metavar : Bool
mut abort_current_decl : Bool
mut abort_infix_chain : Bool
mut report_next_top_level_start : Bool
Expand Down Expand Up @@ -391,12 +392,14 @@ fn new_state(
tokens : Triples,
source : String,
reports : Array[Report],
enable_metavar : Bool,
) -> ParserState {
let mapper = default_location_mapper(source)
ParserState::{
tokens,
pos: 0,
reports,
enable_metavar,
abort_current_decl: false,
abort_infix_chain: false,
report_next_top_level_start: false,
Expand Down
Loading