Add ability to parse external types

pull/204/head
Jonathan Arnett 2021-12-14 00:00:17 +07:00
parent 3cb2569f12
commit 2f1624e1dd
5 changed files with 2412 additions and 1885 deletions

@ -0,0 +1,17 @@
===============
External types
===============
external type IODevice
external type Map(key, value)
---
(source_file
(external_type
name: (type_name))
(external_type
name: (type_name)
arguments: (external_type_arguments
(external_type_argument)
(external_type_argument))))

@ -16,8 +16,8 @@ module.exports = grammar({
choice(
$.import,
$.public_constant,
$.constant
/* $.external_type, */
$.constant,
$.external_type
/* $.external_function, */
/* $._public_extenal_type_or_function, */
/* $.function, */
@ -171,6 +171,19 @@ module.exports = grammar({
_constant_type_constructor: ($) =>
seq($._upname, optional(seq("(", series_of($._constant_type, ","), ")"))),
/* External types */
external_type: ($) =>
seq(
"external",
"type",
field("name", alias($._upname, $.type_name)),
optional(
field("arguments", seq("(", optional($.external_type_arguments), ")"))
)
),
external_type_arguments: ($) =>
series_of(alias($._name, $.external_type_argument), ","),
/* Literals */
_literal: ($) =>
choice(

@ -83,6 +83,10 @@
{
"type": "SYMBOL",
"name": "constant"
},
{
"type": "SYMBOL",
"name": "external_type"
}
]
},
@ -1062,6 +1066,104 @@
}
]
},
"external_type": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "external"
},
{
"type": "STRING",
"value": "type"
},
{
"type": "FIELD",
"name": "name",
"content": {
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_upname"
},
"named": true,
"value": "type_name"
}
},
{
"type": "CHOICE",
"members": [
{
"type": "FIELD",
"name": "arguments",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": "("
},
{
"type": "CHOICE",
"members": [
{
"type": "SYMBOL",
"name": "external_type_arguments"
},
{
"type": "BLANK"
}
]
},
{
"type": "STRING",
"value": ")"
}
]
}
},
{
"type": "BLANK"
}
]
}
]
},
"external_type_arguments": {
"type": "SEQ",
"members": [
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_name"
},
"named": true,
"value": "external_type_argument"
},
{
"type": "REPEAT",
"content": {
"type": "SEQ",
"members": [
{
"type": "STRING",
"value": ","
},
{
"type": "ALIAS",
"content": {
"type": "SYMBOL",
"name": "_name"
},
"named": true,
"value": "external_type_argument"
}
]
}
}
]
},
"_literal": {
"type": "CHOICE",
"members": [

@ -349,6 +349,55 @@
}
}
},
{
"type": "external_type",
"named": true,
"fields": {
"arguments": {
"multiple": true,
"required": false,
"types": [
{
"type": "(",
"named": false
},
{
"type": ")",
"named": false
},
{
"type": "external_type_arguments",
"named": true
}
]
},
"name": {
"multiple": false,
"required": true,
"types": [
{
"type": "type_name",
"named": true
}
]
}
}
},
{
"type": "external_type_arguments",
"named": true,
"fields": {},
"children": {
"multiple": true,
"required": true,
"types": [
{
"type": "external_type_argument",
"named": true
}
]
}
},
{
"type": "import",
"named": true,
@ -621,6 +670,10 @@
"type": "constant",
"named": true
},
{
"type": "external_type",
"named": true
},
{
"type": "import",
"named": true
@ -664,6 +717,10 @@
"type": "constant",
"named": true
},
{
"type": "external_type",
"named": true
},
{
"type": "import",
"named": true
@ -929,6 +986,14 @@
"type": "erlang",
"named": false
},
{
"type": "external",
"named": false
},
{
"type": "external_type_argument",
"named": true
},
{
"type": "float",
"named": true
@ -959,16 +1024,24 @@
},
{
"type": "size",
"named": true
"named": false
},
{
"type": "size",
"named": false
"named": true
},
{
"type": "string",
"named": true
},
{
"type": "type",
"named": false
},
{
"type": "type_name",
"named": true
},
{
"type": "unit",
"named": false

File diff suppressed because it is too large Load Diff