Skip to content

Commit 738b48a

Browse files
committed
Allow enum shape field labels
1 parent 016b948 commit 738b48a

2 files changed

Lines changed: 34 additions & 1 deletion

File tree

vibes/parser_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ func (p *parser) parseTypeShape() *TypeExpr {
197197

198198
func (p *parser) parseTypeShapeFieldName() (string, bool) {
199199
switch p.curToken.Type {
200-
case tokenIdent, tokenString, tokenSymbol:
200+
case tokenIdent, tokenString, tokenSymbol, tokenEnum:
201201
return p.curToken.Literal, true
202202
default:
203203
p.errorExpected(p.curToken, "shape field name")

vibes/parser_types_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,39 @@ end`
8282
}
8383
}
8484

85+
func TestParserTypeShapeAllowsEnumFieldName(t *testing.T) {
86+
source := `def run(payload: { enum: string, nested: { enum: int } })
87+
payload
88+
end`
89+
90+
p := newParser(source)
91+
program, errs := p.ParseProgram()
92+
if len(errs) > 0 {
93+
t.Fatalf("expected no parse errors, got %v", errs)
94+
}
95+
if len(program.Statements) != 1 {
96+
t.Fatalf("expected 1 statement, got %d", len(program.Statements))
97+
}
98+
fn, ok := program.Statements[0].(*FunctionStmt)
99+
if !ok {
100+
t.Fatalf("expected function statement, got %T", program.Statements[0])
101+
}
102+
payloadType := fn.Params[0].Type
103+
if payloadType == nil || payloadType.Kind != TypeShape {
104+
t.Fatalf("expected shape payload type, got %#v", payloadType)
105+
}
106+
if field, ok := payloadType.Shape["enum"]; !ok || field.Kind != TypeString {
107+
t.Fatalf("expected enum string field, got %#v", field)
108+
}
109+
nestedType, ok := payloadType.Shape["nested"]
110+
if !ok || nestedType.Kind != TypeShape {
111+
t.Fatalf("expected nested shape field, got %#v", nestedType)
112+
}
113+
if field, ok := nestedType.Shape["enum"]; !ok || field.Kind != TypeInt {
114+
t.Fatalf("expected nested enum int field, got %#v", field)
115+
}
116+
}
117+
85118
func TestParserTypeSyntaxTypedBlockParameters(t *testing.T) {
86119
source := `def run(values)
87120
values.map do |value: int | string, label: string?|

0 commit comments

Comments
 (0)