Skip to content

Commit fbd8452

Browse files
pshirshovclaude
andcommitted
feat(intellij/T39): add has/mirror keywords, id_def rule, extraction_def rule
Baboon.flex: add KW_ID, KW_HAS, KW_MIRROR token rules Baboon.bnf: - Add KW_ID, KW_HAS, KW_MIRROR to token declarations - Add id_def with optional template_head and dto_member body - Add template_head rule for [T, U, ...] syntax on id_def - Add extraction_def rule for `has (mirror|contract) <name>` - Add extraction_def to dto_member and adt_member alternatives - Wire id_def into main_member BaboonTokenType.kt: add KW_ID, KW_HAS, KW_MIRROR to BABOON_KEYWORDS (covers syntax highlighting and remapIfKeyword softness for field names) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent f8bd2ff commit fbd8452

3 files changed

Lines changed: 19 additions & 5 deletions

File tree

src/main/grammar/Baboon.bnf

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
// keywords
1616
KW_DATA = "data"
1717
KW_STRUCT = "struct"
18+
KW_ID = "id"
1819
KW_ROOT = "root"
1920
KW_MODEL = "model"
2021
KW_CONTRACT = "contract"
@@ -37,6 +38,8 @@
3738
KW_WAS = "was"
3839
KW_PRAGMA = "pragma"
3940
KW_TYPE = "type"
41+
KW_HAS = "has"
42+
KW_MIRROR = "mirror"
4043

4144
LBRACE = "{"
4245
RBRACE = "}"
@@ -96,7 +99,7 @@ include ::= KW_INCLUDE string_literal;
9699
member ::= main_member | namespace;
97100
namespace ::= KW_NAMESPACE IDENTIFIER (LBRACE content* RBRACE | LPAREN content* RPAREN);
98101

99-
main_member ::= KW_ROOT? (choice | dto | adt | foreign | contract | service | type_alias);
102+
main_member ::= KW_ROOT? (choice | dto | id_def | adt | foreign | contract | service | type_alias);
100103
type_alias ::= KW_TYPE class_name EQUAL type_ref;
101104

102105
class_name ::= IDENTIFIER {
@@ -124,7 +127,15 @@ choice_member_rename ::= COLON KW_WAS LBRACK IDENTIFIER RBRACK;
124127

125128
// dto
126129
dto ::= KW_DATA class_name member_meta? (LBRACE dto_member* RBRACE | LPAREN dto_member* RPAREN);
127-
dto_member ::= field_def | parent_def | unfield_def | unparent_def | intersection_def | extended_contract_def;
130+
dto_member ::= field_def | parent_def | unfield_def | unparent_def | intersection_def | extended_contract_def | extraction_def;
131+
132+
// id (identifier type, M18 / T39) — same shape as dto with optional template-head.
133+
// template_head carries the type-parameter names: `[T]`, `[K, V]`, etc.
134+
id_def ::= KW_ID class_name template_head? member_meta? (LBRACE dto_member* RBRACE | LPAREN dto_member* RPAREN);
135+
template_head ::= LBRACK IDENTIFIER (COMMA IDENTIFIER)* RBRACK;
136+
137+
// extraction clause (T37/T39): `has (mirror | contract) <bare-identifier>`
138+
extraction_def ::= KW_HAS (KW_MIRROR | KW_CONTRACT) IDENTIFIER;
128139

129140
field_def ::= field_name COLON type_ref field_rename?;
130141
field_rename ::= KW_WAS field_name;
@@ -144,7 +155,7 @@ extended_contract_def ::= KW_IS non_generic_type_ref;
144155

145156
// adt
146157
adt ::= KW_ADT class_name member_meta? (LBRACE adt_member* RBRACE | LPAREN adt_member* RPAREN);
147-
adt_member ::= (dto | contract) | extended_contract_def;
158+
adt_member ::= (dto | contract) | extended_contract_def | extraction_def;
148159

149160
// foreign
150161
foreign ::= KW_FOREIGN class_name member_meta? (LBRACE foreign_member* RBRACE | LPAREN foreign_member* RPAREN);

src/main/grammar/Baboon.flex

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ BI_TYPE = "bit"|"i08"|"i16"|"i32"|"i64"|"u08"|"u16"|"u32"|"u64"|"f32"|"f64"|"f12
3737
<YYINITIAL> {
3838
"data" { return BaboonTypes.KW_DATA; }
3939
"struct" { return BaboonTypes.KW_STRUCT; }
40+
"id" { return BaboonTypes.KW_ID; }
4041
"root" { return BaboonTypes.KW_ROOT; }
4142
"model" { yybegin(IN_MODEL_NAME); return BaboonTypes.KW_MODEL; }
4243
"contract" { return BaboonTypes.KW_CONTRACT; }
@@ -59,6 +60,8 @@ BI_TYPE = "bit"|"i08"|"i16"|"i32"|"i64"|"u08"|"u16"|"u32"|"u64"|"f32"|"f64"|"f12
5960
"was" { return BaboonTypes.KW_WAS; }
6061
"pragma" { return BaboonTypes.KW_PRAGMA; }
6162
"type" { return BaboonTypes.KW_TYPE; }
63+
"has" { return BaboonTypes.KW_HAS; }
64+
"mirror" { return BaboonTypes.KW_MIRROR; }
6265

6366
"{" { return BaboonTypes.LBRACE; }
6467
"}" { return BaboonTypes.RBRACE; }

src/main/kotlin/io/septimalmind/baboon/baboonintellij/psi/BaboonTokenType.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,10 @@ class BaboonTokenType(debugName: String) : IElementType(debugName, BaboonLanguag
1010
val BABOON_COMMENTS = TokenSet.create(LINE_COMMENT, BLOCK_COMMENT, DOC_COMMENT)
1111

1212
val BABOON_KEYWORDS = TokenSet.create(
13-
KW_DATA, KW_STRUCT, KW_ROOT, KW_MODEL, KW_CONTRACT, KW_SERVICE, KW_CHOICE,
13+
KW_DATA, KW_STRUCT, KW_ID, KW_ROOT, KW_MODEL, KW_CONTRACT, KW_SERVICE, KW_CHOICE,
1414
KW_ADT, KW_FOREIGN, KW_VERSION, KW_INCLUDE, KW_NAMESPACE, KW_WITH,
1515
KW_IS, KW_IN, KW_OUT, KW_ERR, KW_DEF, KW_DERIVED, KW_IMPORT, KW_WITHOUT,
16-
KW_WAS, KW_PRAGMA, KW_TYPE
16+
KW_WAS, KW_PRAGMA, KW_TYPE, KW_HAS, KW_MIRROR
1717
)
1818

1919
val OPERATION_SIGNS = TokenSet.create(

0 commit comments

Comments
 (0)