Files
endorphin-aster-vm/crates/frontend/editor/ast.schema.json
T

750 lines
15 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "urn:endor:ast:sha256:c7c10c6a61158810fa55044f1aa79f3558ac18ca3be59cbf7f2499b5add8df5b",
"$ref": "#/$defs/AstDocument",
"$defs": {
"Span": {
"type": "object",
"properties": {
"start": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"end": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"start",
"end"
],
"additionalProperties": false
},
"AstDocument": {
"type": "object",
"properties": {
"schema": {
"const": "urn:endor:ast:sha256:c7c10c6a61158810fa55044f1aa79f3558ac18ca3be59cbf7f2499b5add8df5b"
},
"root": {
"$ref": "#/$defs/AstRoot"
}
},
"required": [
"schema",
"root"
],
"additionalProperties": false
},
"AstRoot": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"const": "Module"
},
"data": {
"$ref": "#/$defs/Program"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Expression"
},
"data": {
"$ref": "#/$defs/Expr"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Interactive"
},
"data": {
"$ref": "#/$defs/InteractiveInput"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
}
]
},
"Name": {
"type": "object",
"properties": {
"text": {
"type": "string"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"text",
"span"
],
"additionalProperties": false
},
"Program": {
"type": "object",
"properties": {
"declarations": {
"type": "array",
"items": {
"$ref": "#/$defs/Decl"
}
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"declarations",
"span"
],
"additionalProperties": false
},
"Decl": {
"type": "object",
"properties": {
"kind": {
"$ref": "#/$defs/DeclKind"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"kind",
"span"
],
"additionalProperties": false
},
"DeclKind": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"const": "Function"
},
"data": {
"$ref": "#/$defs/Function"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Class"
},
"data": {
"$ref": "#/$defs/Class"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
}
]
},
"Class": {
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/Name"
},
"base": {
"anyOf": [
{
"$ref": "#/$defs/Name"
},
{
"type": "null"
}
]
},
"fields": {
"type": "array",
"items": {
"$ref": "#/$defs/Parameter"
}
},
"methods": {
"type": "array",
"items": {
"$ref": "#/$defs/Function"
}
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"name",
"fields",
"methods",
"span"
],
"additionalProperties": false
},
"Function": {
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/Name"
},
"parameters": {
"type": "array",
"items": {
"$ref": "#/$defs/Parameter"
}
},
"return_type": {
"$ref": "#/$defs/Name"
},
"body": {
"$ref": "#/$defs/Block"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"name",
"parameters",
"return_type",
"body",
"span"
],
"additionalProperties": false
},
"Parameter": {
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/Name"
},
"type_name": {
"$ref": "#/$defs/Name"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"name",
"type_name",
"span"
],
"additionalProperties": false
},
"Block": {
"type": "object",
"properties": {
"statements": {
"type": "array",
"items": {
"$ref": "#/$defs/Stmt"
}
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"statements",
"span"
],
"additionalProperties": false
},
"Stmt": {
"type": "object",
"properties": {
"kind": {
"$ref": "#/$defs/StmtKind"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"kind",
"span"
],
"additionalProperties": false
},
"StmtKind": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"const": "Binding"
},
"data": {
"$ref": "#/$defs/Binding"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Assignment"
},
"data": {
"$ref": "#/$defs/Assignment"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "MemberAssignment"
},
"data": {
"$ref": "#/$defs/MemberAssignment"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Return"
},
"data": {
"$ref": "#/$defs/ReturnStatement"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Expression"
},
"data": {
"$ref": "#/$defs/Expr"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Declaration"
},
"data": {
"$ref": "#/$defs/Decl"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
}
]
},
"Binding": {
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/Name"
},
"value": {
"$ref": "#/$defs/Expr"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"name",
"value",
"span"
],
"additionalProperties": false
},
"Assignment": {
"type": "object",
"properties": {
"name": {
"$ref": "#/$defs/Name"
},
"value": {
"$ref": "#/$defs/Expr"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"name",
"value",
"span"
],
"additionalProperties": false
},
"MemberAssignment": {
"type": "object",
"properties": {
"object": {
"$ref": "#/$defs/Expr"
},
"name": {
"$ref": "#/$defs/Name"
},
"value": {
"$ref": "#/$defs/Expr"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"object",
"name",
"value",
"span"
],
"additionalProperties": false
},
"ReturnStatement": {
"type": "object",
"properties": {
"value": {
"anyOf": [
{
"$ref": "#/$defs/Expr"
},
{
"type": "null"
}
]
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"span"
],
"additionalProperties": false
},
"InteractiveInput": {
"type": "object",
"properties": {
"statements": {
"type": "array",
"items": {
"$ref": "#/$defs/Stmt"
}
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"statements",
"span"
],
"additionalProperties": false
},
"Expr": {
"type": "object",
"properties": {
"kind": {
"$ref": "#/$defs/ExprKind"
},
"span": {
"$ref": "#/$defs/Span"
}
},
"required": [
"kind",
"span"
],
"additionalProperties": false
},
"ExprKind": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"const": "Name"
},
"data": {
"type": "string"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Number"
},
"data": {
"type": "string"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "String"
},
"data": {
"type": "string"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Symbol"
},
"data": {
"$ref": "#/$defs/Name"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Await"
},
"data": {
"$ref": "#/$defs/Expr"
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Unary"
},
"data": {
"type": "object",
"properties": {
"operation": {
"$ref": "#/$defs/UnaryOp"
},
"operand": {
"$ref": "#/$defs/Expr"
}
},
"required": [
"operation",
"operand"
],
"additionalProperties": false
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Binary"
},
"data": {
"type": "object",
"properties": {
"operation": {
"$ref": "#/$defs/BinaryOp"
},
"left": {
"$ref": "#/$defs/Expr"
},
"right": {
"$ref": "#/$defs/Expr"
}
},
"required": [
"operation",
"left",
"right"
],
"additionalProperties": false
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Member"
},
"data": {
"type": "object",
"properties": {
"object": {
"$ref": "#/$defs/Expr"
},
"name": {
"$ref": "#/$defs/Name"
}
},
"required": [
"object",
"name"
],
"additionalProperties": false
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"const": "Call"
},
"data": {
"type": "object",
"properties": {
"callee": {
"$ref": "#/$defs/Expr"
},
"arguments": {
"type": "array",
"items": {
"$ref": "#/$defs/Expr"
}
}
},
"required": [
"callee",
"arguments"
],
"additionalProperties": false
}
},
"required": [
"kind",
"data"
],
"additionalProperties": false
}
]
},
"UnaryOp": {
"enum": [
"Negate"
]
},
"BinaryOp": {
"enum": [
"Add",
"Subtract",
"Multiply",
"Divide"
]
}
}
}