feat(grammar): add type system nodes to tree-sitter
Added grammar rules for v0.3 type system declarations: - concept_declaration: semicolon-terminated base type - sub_concept: enum and record forms with dot notation - concept_comparison: nested pattern matching with variant_pattern - any_type: named node for the 'any' keyword - template species extension: optional ': Species' syntax Updated query files: - highlights.scm: new keywords and named field highlights - outline.scm: concept/sub_concept/concept_comparison in outline - indents.scm: indentation for new brace-delimited nodes Fixed pre-existing query issues: - Replaced invalid repeat_node reference with decorator_node - Removed invalid '?' punctuation reference Added comprehensive test corpus (type_system.txt) covering: - concept declaration (simple and multiple) - sub_concept enum and record forms - concept_comparison with any/is conditions - template with species extension - full combined example
This commit is contained in:
@@ -20,7 +20,8 @@ module.exports = grammar({
|
||||
],
|
||||
|
||||
conflicts: $ => [
|
||||
[$.path_segments]
|
||||
[$.path_segments],
|
||||
[$.sub_concept_enum_body, $.sub_concept_record_body]
|
||||
],
|
||||
|
||||
word: $ => $.identifier,
|
||||
@@ -45,7 +46,10 @@ module.exports = grammar({
|
||||
$.relationship,
|
||||
$.location,
|
||||
$.species,
|
||||
$.enum_declaration
|
||||
$.enum_declaration,
|
||||
$.concept_declaration,
|
||||
$.sub_concept,
|
||||
$.concept_comparison
|
||||
),
|
||||
|
||||
// Use declarations
|
||||
@@ -78,6 +82,7 @@ module.exports = grammar({
|
||||
template: $ => seq(
|
||||
'template',
|
||||
field('name', $.identifier),
|
||||
optional(seq(':', field('species', $.identifier))),
|
||||
optional('strict'),
|
||||
'{',
|
||||
repeat($.include),
|
||||
@@ -374,6 +379,80 @@ module.exports = grammar({
|
||||
'}'
|
||||
),
|
||||
|
||||
// Concept declaration - base type with no structure
|
||||
concept_declaration: $ => seq(
|
||||
'concept',
|
||||
field('name', $.identifier),
|
||||
';'
|
||||
),
|
||||
|
||||
// Sub-concept declaration - enum or record subtype with dot notation
|
||||
sub_concept: $ => seq(
|
||||
'sub_concept',
|
||||
field('parent', $.identifier),
|
||||
'.',
|
||||
field('name', $.identifier),
|
||||
'{',
|
||||
field('body', choice(
|
||||
$.sub_concept_record_body,
|
||||
$.sub_concept_enum_body
|
||||
)),
|
||||
'}'
|
||||
),
|
||||
|
||||
// Enum form: Variant1, Variant2, Variant3
|
||||
sub_concept_enum_body: $ => commaSep1($.identifier),
|
||||
|
||||
// Record form: field_name: Type, field_name: any
|
||||
sub_concept_record_body: $ => commaSep1($.sub_concept_field),
|
||||
|
||||
sub_concept_field: $ => seq(
|
||||
field('name', $.identifier),
|
||||
':',
|
||||
field('type', choice($.identifier, $.any_type))
|
||||
),
|
||||
|
||||
any_type: $ => 'any',
|
||||
|
||||
// Concept comparison - compile-time pattern matching
|
||||
concept_comparison: $ => seq(
|
||||
'concept_comparison',
|
||||
field('name', $.identifier),
|
||||
'{',
|
||||
commaSep1($.variant_pattern),
|
||||
'}'
|
||||
),
|
||||
|
||||
// A named variant with field conditions
|
||||
variant_pattern: $ => seq(
|
||||
field('name', $.identifier),
|
||||
':',
|
||||
'{',
|
||||
commaSep1($.field_condition),
|
||||
'}'
|
||||
),
|
||||
|
||||
// A condition on a sub_concept field
|
||||
field_condition: $ => seq(
|
||||
field('sub_concept', $.dotted_path),
|
||||
':',
|
||||
field('condition', $.condition_expr)
|
||||
),
|
||||
|
||||
// Condition: either 'any' or 'Type is Value or Type is Value2'
|
||||
condition_expr: $ => choice(
|
||||
$.any_type,
|
||||
$.is_condition
|
||||
),
|
||||
|
||||
// Pattern: DottedPath is Ident [or DottedPath is Ident]*
|
||||
is_condition: $ => seq(
|
||||
$.dotted_path,
|
||||
'is',
|
||||
$.identifier,
|
||||
repeat(seq('or', $.dotted_path, 'is', $.identifier))
|
||||
),
|
||||
|
||||
// Expressions (for conditions in life arcs)
|
||||
expression: $ => choice(
|
||||
$.or_expression,
|
||||
|
||||
@@ -18,6 +18,9 @@
|
||||
"species"
|
||||
"enum"
|
||||
"state"
|
||||
"concept"
|
||||
"sub_concept"
|
||||
"concept_comparison"
|
||||
] @keyword.declaration
|
||||
|
||||
; Keywords - Control flow and modifiers
|
||||
@@ -45,6 +48,7 @@
|
||||
"remove"
|
||||
"append"
|
||||
"is"
|
||||
"any"
|
||||
] @keyword.special
|
||||
|
||||
; Boolean literals
|
||||
@@ -74,9 +78,16 @@
|
||||
(species name: (identifier) @type.species)
|
||||
(enum_declaration name: (identifier) @type.enum)
|
||||
(arc_state name: (identifier) @type.state)
|
||||
(concept_declaration name: (identifier) @type.concept)
|
||||
(sub_concept parent: (identifier) @type.concept)
|
||||
(sub_concept name: (identifier) @type.sub_concept)
|
||||
(concept_comparison name: (identifier) @type.concept_comparison)
|
||||
(variant_pattern name: (identifier) @type.variant)
|
||||
(template species: (identifier) @type.builtin)
|
||||
|
||||
; Field names
|
||||
(field name: (dotted_path) @property)
|
||||
(sub_concept_field name: (identifier) @property)
|
||||
|
||||
; Species reference
|
||||
(character species: (identifier) @type.builtin)
|
||||
@@ -124,14 +135,10 @@
|
||||
"."
|
||||
".."
|
||||
"*"
|
||||
"?"
|
||||
"@"
|
||||
] @punctuation.delimiter
|
||||
|
||||
; Behavior tree nodes
|
||||
(selector_node "?" @keyword.behavior.selector)
|
||||
(sequence_node ">" @keyword.behavior.sequence)
|
||||
(repeat_node "*" @keyword.behavior.repeat)
|
||||
(action_node (identifier) @function.action)
|
||||
|
||||
; Transitions
|
||||
|
||||
@@ -38,8 +38,12 @@
|
||||
(enum_declaration)
|
||||
(selector_node)
|
||||
(sequence_node)
|
||||
(repeat_node)
|
||||
(decorator_node)
|
||||
(sub_concept)
|
||||
(concept_comparison)
|
||||
(variant_pattern)
|
||||
] @indent.begin
|
||||
|
||||
; Dedent after semicolon at top level
|
||||
(use_declaration ";" @indent.end)
|
||||
(concept_declaration ";" @indent.end)
|
||||
|
||||
@@ -55,3 +55,18 @@
|
||||
(enum_declaration
|
||||
name: (identifier) @name
|
||||
) @symbol.enum
|
||||
|
||||
; Concepts
|
||||
(concept_declaration
|
||||
name: (identifier) @name
|
||||
) @symbol.concept
|
||||
|
||||
; Sub-concepts
|
||||
(sub_concept
|
||||
name: (identifier) @name
|
||||
) @symbol.sub_concept
|
||||
|
||||
; Concept comparisons
|
||||
(concept_comparison
|
||||
name: (identifier) @name
|
||||
) @symbol.concept_comparison
|
||||
|
||||
@@ -91,6 +91,18 @@
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "enum_declaration"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "concept_declaration"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "sub_concept"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "concept_comparison"
|
||||
}
|
||||
]
|
||||
},
|
||||
@@ -350,6 +362,31 @@
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "species",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
@@ -1704,6 +1741,396 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"concept_declaration": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "concept"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ";"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_concept": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "sub_concept"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "parent",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "."
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "{"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "body",
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "sub_concept_record_body"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "sub_concept_enum_body"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_concept_enum_body": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_concept_record_body": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "sub_concept_field"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "sub_concept_field"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_concept_field": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "type",
|
||||
"content": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "any_type"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"any_type": {
|
||||
"type": "STRING",
|
||||
"value": "any"
|
||||
},
|
||||
"concept_comparison": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "concept_comparison"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "{"
|
||||
},
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "variant_pattern"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "variant_pattern"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"variant_pattern": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "name",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "{"
|
||||
},
|
||||
{
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "field_condition"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "field_condition"
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ","
|
||||
},
|
||||
{
|
||||
"type": "BLANK"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"field_condition": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "sub_concept",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "dotted_path"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": ":"
|
||||
},
|
||||
{
|
||||
"type": "FIELD",
|
||||
"name": "condition",
|
||||
"content": {
|
||||
"type": "SYMBOL",
|
||||
"name": "condition_expr"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"condition_expr": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "any_type"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "is_condition"
|
||||
}
|
||||
]
|
||||
},
|
||||
"is_condition": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "dotted_path"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "is"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
},
|
||||
{
|
||||
"type": "REPEAT",
|
||||
"content": {
|
||||
"type": "SEQ",
|
||||
"members": [
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "or"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "dotted_path"
|
||||
},
|
||||
{
|
||||
"type": "STRING",
|
||||
"value": "is"
|
||||
},
|
||||
{
|
||||
"type": "SYMBOL",
|
||||
"name": "identifier"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"expression": {
|
||||
"type": "CHOICE",
|
||||
"members": [
|
||||
@@ -1914,6 +2341,10 @@
|
||||
"conflicts": [
|
||||
[
|
||||
"path_segments"
|
||||
],
|
||||
[
|
||||
"sub_concept_enum_body",
|
||||
"sub_concept_record_body"
|
||||
]
|
||||
],
|
||||
"precedences": [],
|
||||
|
||||
@@ -269,6 +269,67 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "concept_comparison",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "variant_pattern",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "concept_declaration",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "condition_expr",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "any_type",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "is_condition",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "condition_node",
|
||||
"named": true,
|
||||
@@ -301,6 +362,14 @@
|
||||
"type": "character",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "concept_comparison",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "concept_declaration",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "enum_declaration",
|
||||
"named": true
|
||||
@@ -329,6 +398,10 @@
|
||||
"type": "species",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sub_concept",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "template",
|
||||
"named": true
|
||||
@@ -531,6 +604,32 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "field_condition",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"condition": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "condition_expr",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"sub_concept": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "dotted_path",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "if_decorator_node",
|
||||
"named": true,
|
||||
@@ -598,6 +697,25 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "is_condition",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "dotted_path",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "life_arc",
|
||||
"named": true,
|
||||
@@ -1119,6 +1237,106 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sub_concept",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"body": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "sub_concept_enum_body",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sub_concept_record_body",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"parent": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sub_concept_enum_body",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sub_concept_field",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "any_type",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "sub_concept_record_body",
|
||||
"named": true,
|
||||
"fields": {},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "sub_concept_field",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "subtree_node",
|
||||
"named": true,
|
||||
@@ -1147,6 +1365,16 @@
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"species": {
|
||||
"multiple": false,
|
||||
"required": false,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"children": {
|
||||
@@ -1283,6 +1511,32 @@
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "variant_pattern",
|
||||
"named": true,
|
||||
"fields": {
|
||||
"name": {
|
||||
"multiple": false,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "identifier",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
"children": {
|
||||
"multiple": true,
|
||||
"required": true,
|
||||
"types": [
|
||||
{
|
||||
"type": "field_condition",
|
||||
"named": true
|
||||
}
|
||||
]
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "(",
|
||||
"named": false
|
||||
@@ -1355,6 +1609,10 @@
|
||||
"type": "and",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "any_type",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "append",
|
||||
"named": false
|
||||
@@ -1379,6 +1637,14 @@
|
||||
"type": "choose",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "concept",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "concept_comparison",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "cooldown",
|
||||
"named": false
|
||||
@@ -1515,6 +1781,10 @@
|
||||
"type": "string",
|
||||
"named": true
|
||||
},
|
||||
{
|
||||
"type": "sub_concept",
|
||||
"named": false
|
||||
},
|
||||
{
|
||||
"type": "succeed_always",
|
||||
"named": false
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
360
tree-sitter-storybook/test/corpus/type_system.txt
Normal file
360
tree-sitter-storybook/test/corpus/type_system.txt
Normal file
@@ -0,0 +1,360 @@
|
||||
==================
|
||||
Concept declaration
|
||||
==================
|
||||
|
||||
concept Cup;
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_declaration
|
||||
name: (identifier))))
|
||||
|
||||
==================
|
||||
Multiple concept declarations
|
||||
==================
|
||||
|
||||
concept Cup;
|
||||
concept Customer;
|
||||
concept Vendor;
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_declaration
|
||||
name: (identifier)))
|
||||
(declaration
|
||||
(concept_declaration
|
||||
name: (identifier)))
|
||||
(declaration
|
||||
(concept_declaration
|
||||
name: (identifier))))
|
||||
|
||||
==================
|
||||
Sub-concept - enum form
|
||||
==================
|
||||
|
||||
sub_concept Cup.Size {
|
||||
Small,
|
||||
Medium,
|
||||
Large
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(sub_concept
|
||||
parent: (identifier)
|
||||
name: (identifier)
|
||||
body: (sub_concept_enum_body
|
||||
(identifier)
|
||||
(identifier)
|
||||
(identifier)))))
|
||||
|
||||
==================
|
||||
Sub-concept - record form with any
|
||||
==================
|
||||
|
||||
sub_concept Vendor.Inventory {
|
||||
Bread: any,
|
||||
Pastries: any,
|
||||
Cakes: any,
|
||||
Cup: any
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(sub_concept
|
||||
parent: (identifier)
|
||||
name: (identifier)
|
||||
body: (sub_concept_record_body
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (any_type))
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (any_type))
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (any_type))
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (any_type))))))
|
||||
|
||||
==================
|
||||
Sub-concept - record form with typed fields
|
||||
==================
|
||||
|
||||
sub_concept Vendor.Inventory {
|
||||
Bread: any,
|
||||
Pastries: Number
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(sub_concept
|
||||
parent: (identifier)
|
||||
name: (identifier)
|
||||
body: (sub_concept_record_body
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (any_type))
|
||||
(sub_concept_field
|
||||
name: (identifier)
|
||||
type: (identifier))))))
|
||||
|
||||
==================
|
||||
Concept comparison with any conditions
|
||||
==================
|
||||
|
||||
concept_comparison NotInterested {
|
||||
NotInterested: {
|
||||
Cup.Size: any,
|
||||
Cup.Type: any,
|
||||
Cup.Color: any
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_comparison
|
||||
name: (identifier)
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(any_type)))
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(any_type)))
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(any_type)))))))
|
||||
|
||||
==================
|
||||
Concept comparison with is conditions
|
||||
==================
|
||||
|
||||
concept_comparison Interest {
|
||||
Interested: {
|
||||
Cup.Type: Cup.Type is Glass or Cup.Type is Plastic,
|
||||
Cup.Color: Cup.Color is Red
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_comparison
|
||||
name: (identifier)
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier)
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier))))
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier))))))))
|
||||
|
||||
==================
|
||||
Concept comparison with multiple variants
|
||||
==================
|
||||
|
||||
concept_comparison FoodQuality {
|
||||
Excellent: {
|
||||
Food.Freshness: Food.Freshness is Fresh
|
||||
},
|
||||
Poor: {
|
||||
Food.Freshness: Food.Freshness is Stale or Food.Freshness is Spoiled
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_comparison
|
||||
name: (identifier)
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier)))))
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier)
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier))))))))
|
||||
|
||||
==================
|
||||
Template with species extension
|
||||
==================
|
||||
|
||||
template Person: Human {
|
||||
age: 0..100
|
||||
name: ""
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(template
|
||||
name: (identifier)
|
||||
species: (identifier)
|
||||
(field
|
||||
name: (dotted_path (identifier))
|
||||
value: (value (range (integer) (integer))))
|
||||
(field
|
||||
name: (dotted_path (identifier))
|
||||
value: (value (string))))))
|
||||
|
||||
==================
|
||||
Full type system example
|
||||
==================
|
||||
|
||||
concept Cup;
|
||||
|
||||
sub_concept Cup.Size {
|
||||
Small,
|
||||
Medium,
|
||||
Large
|
||||
}
|
||||
|
||||
sub_concept Cup.Type {
|
||||
Ceramic,
|
||||
Glass,
|
||||
Plastic
|
||||
}
|
||||
|
||||
concept_comparison CupPreference {
|
||||
Preferred: {
|
||||
Cup.Size: any,
|
||||
Cup.Type: Cup.Type is Glass or Cup.Type is Ceramic
|
||||
},
|
||||
Avoided: {
|
||||
Cup.Size: any,
|
||||
Cup.Type: Cup.Type is Plastic
|
||||
}
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(source_file
|
||||
(declaration
|
||||
(concept_declaration
|
||||
name: (identifier)))
|
||||
(declaration
|
||||
(sub_concept
|
||||
parent: (identifier)
|
||||
name: (identifier)
|
||||
body: (sub_concept_enum_body
|
||||
(identifier)
|
||||
(identifier)
|
||||
(identifier))))
|
||||
(declaration
|
||||
(sub_concept
|
||||
parent: (identifier)
|
||||
name: (identifier)
|
||||
body: (sub_concept_enum_body
|
||||
(identifier)
|
||||
(identifier)
|
||||
(identifier))))
|
||||
(declaration
|
||||
(concept_comparison
|
||||
name: (identifier)
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(any_type)))
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier)
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier)))))
|
||||
(variant_pattern
|
||||
name: (identifier)
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(any_type)))
|
||||
(field_condition
|
||||
sub_concept: (dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
condition: (condition_expr
|
||||
(is_condition
|
||||
(dotted_path
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier))))))))
|
||||
Reference in New Issue
Block a user