move ast types into seperate ts file (#169)
This commit is contained in:
@ -1,9 +1,6 @@
|
|||||||
import { useEffect, useState, useRef } from 'react'
|
import { useEffect, useState, useRef } from 'react'
|
||||||
import {
|
import { abstractSyntaxTree } from '../lang/abstractSyntaxTree'
|
||||||
abstractSyntaxTree,
|
import { BinaryPart, Value } from '../lang/abstractSyntaxTreeTypes'
|
||||||
BinaryPart,
|
|
||||||
Value,
|
|
||||||
} from '../lang/abstractSyntaxTree'
|
|
||||||
import { executor } from '../lang/executor'
|
import { executor } from '../lang/executor'
|
||||||
import {
|
import {
|
||||||
createIdentifier,
|
createIdentifier,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Dialog, Transition } from '@headlessui/react'
|
import { Dialog, Transition } from '@headlessui/react'
|
||||||
import { Fragment, useState } from 'react'
|
import { Fragment, useState } from 'react'
|
||||||
import { Value } from '../lang/abstractSyntaxTree'
|
import { Value } from '../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
AvailableVars,
|
AvailableVars,
|
||||||
addToInputHelper,
|
addToInputHelper,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Dialog, Transition } from '@headlessui/react'
|
import { Dialog, Transition } from '@headlessui/react'
|
||||||
import { Fragment, useState } from 'react'
|
import { Fragment, useState } from 'react'
|
||||||
import { Value } from '../lang/abstractSyntaxTree'
|
import { Value } from '../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
AvailableVars,
|
AvailableVars,
|
||||||
addToInputHelper,
|
addToInputHelper,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTree'
|
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTree'
|
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value } from '../../lang/abstractSyntaxTree'
|
import { Value } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
BinaryPart,
|
BinaryPart,
|
||||||
Value,
|
Value,
|
||||||
VariableDeclarator,
|
VariableDeclarator,
|
||||||
} from '../../lang/abstractSyntaxTree'
|
} from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value } from '../../lang/abstractSyntaxTree'
|
import { Value } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { create } from 'react-modal-promise'
|
import { create } from 'react-modal-promise'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value } from '../../lang/abstractSyntaxTree'
|
import { Value } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
BinaryPart,
|
BinaryPart,
|
||||||
Value,
|
Value,
|
||||||
VariableDeclarator,
|
VariableDeclarator,
|
||||||
} from '../../lang/abstractSyntaxTree'
|
} from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -5,7 +5,7 @@ import {
|
|||||||
BinaryPart,
|
BinaryPart,
|
||||||
Value,
|
Value,
|
||||||
VariableDeclarator,
|
VariableDeclarator,
|
||||||
} from '../../lang/abstractSyntaxTree'
|
} from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { useState, useEffect } from 'react'
|
import { useState, useEffect } from 'react'
|
||||||
import { create } from 'react-modal-promise'
|
import { create } from 'react-modal-promise'
|
||||||
import { toolTips, useStore } from '../../useStore'
|
import { toolTips, useStore } from '../../useStore'
|
||||||
import { Value } from '../../lang/abstractSyntaxTree'
|
import { Value } from '../../lang/abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodePathFromSourceRange,
|
getNodePathFromSourceRange,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -1,107 +1,31 @@
|
|||||||
import { Token } from './tokeniser'
|
import { Token } from './tokeniser'
|
||||||
import { parseExpression } from './astMathExpressions'
|
import { parseExpression } from './astMathExpressions'
|
||||||
|
import {
|
||||||
export type SyntaxType =
|
BinaryPart,
|
||||||
| 'Program'
|
BodyItem,
|
||||||
| 'ExpressionStatement'
|
Identifier,
|
||||||
| 'BinaryExpression'
|
Literal,
|
||||||
| 'CallExpression'
|
NoneCodeMeta,
|
||||||
| 'Identifier'
|
NoneCodeNode,
|
||||||
| 'BlockStatement'
|
ObjectKeyInfo,
|
||||||
| 'ReturnStatement'
|
ObjectProperty,
|
||||||
| 'VariableDeclaration'
|
PipeSubstitution,
|
||||||
| 'VariableDeclarator'
|
Program,
|
||||||
| 'MemberExpression'
|
Value,
|
||||||
| 'ArrayExpression'
|
VariableDeclaration,
|
||||||
| 'ObjectExpression'
|
VariableDeclarator,
|
||||||
| 'ObjectProperty'
|
ArrayExpression,
|
||||||
| 'FunctionExpression'
|
BinaryExpression,
|
||||||
| 'PipeExpression'
|
CallExpression,
|
||||||
| 'PipeSubstitution'
|
FunctionExpression,
|
||||||
| 'Literal'
|
MemberExpression,
|
||||||
| 'NoneCodeNode'
|
ObjectExpression,
|
||||||
| 'UnaryExpression'
|
PipeExpression,
|
||||||
// | 'NumberLiteral'
|
UnaryExpression,
|
||||||
// | 'StringLiteral'
|
BlockStatement,
|
||||||
// | 'IfStatement'
|
ExpressionStatement,
|
||||||
// | 'WhileStatement'
|
ReturnStatement,
|
||||||
// | 'FunctionDeclaration'
|
} from './abstractSyntaxTreeTypes'
|
||||||
// | 'AssignmentExpression'
|
|
||||||
// | 'Property'
|
|
||||||
// | 'LogicalExpression'
|
|
||||||
// | 'ConditionalExpression'
|
|
||||||
// | 'ForStatement'
|
|
||||||
// | 'ForInStatement'
|
|
||||||
// | 'ForOfStatement'
|
|
||||||
// | 'BreakStatement'
|
|
||||||
// | 'ContinueStatement'
|
|
||||||
// | 'SwitchStatement'
|
|
||||||
// | 'SwitchCase'
|
|
||||||
// | 'ThrowStatement'
|
|
||||||
// | 'TryStatement'
|
|
||||||
// | 'CatchClause'
|
|
||||||
// | 'ClassDeclaration'
|
|
||||||
// | 'ClassBody'
|
|
||||||
// | 'MethodDefinition'
|
|
||||||
// | 'NewExpression'
|
|
||||||
// | 'ThisExpression'
|
|
||||||
// | 'UpdateExpression'
|
|
||||||
// | 'YieldExpression'
|
|
||||||
// | 'AwaitExpression'
|
|
||||||
// | 'ImportDeclaration'
|
|
||||||
// | 'ImportSpecifier'
|
|
||||||
// | 'ImportDefaultSpecifier'
|
|
||||||
// | 'ImportNamespaceSpecifier'
|
|
||||||
// | 'ExportNamedDeclaration'
|
|
||||||
// | 'ExportDefaultDeclaration'
|
|
||||||
// | 'ExportAllDeclaration'
|
|
||||||
// | 'ExportSpecifier'
|
|
||||||
// | 'TaggedTemplateExpression'
|
|
||||||
// | 'TemplateLiteral'
|
|
||||||
// | 'TemplateElement'
|
|
||||||
// | 'SpreadElement'
|
|
||||||
// | 'RestElement'
|
|
||||||
// | 'SequenceExpression'
|
|
||||||
// | 'DebuggerStatement'
|
|
||||||
// | 'LabeledStatement'
|
|
||||||
// | 'DoWhileStatement'
|
|
||||||
// | 'WithStatement'
|
|
||||||
// | 'EmptyStatement'
|
|
||||||
// | 'ArrayPattern'
|
|
||||||
// | 'ObjectPattern'
|
|
||||||
// | 'AssignmentPattern'
|
|
||||||
// | 'MetaProperty'
|
|
||||||
// | 'Super'
|
|
||||||
// | 'Import'
|
|
||||||
// | 'RegExpLiteral'
|
|
||||||
// | 'BooleanLiteral'
|
|
||||||
// | 'NullLiteral'
|
|
||||||
// | 'TypeAnnotation'
|
|
||||||
|
|
||||||
export interface Program {
|
|
||||||
type: SyntaxType
|
|
||||||
start: number
|
|
||||||
end: number
|
|
||||||
body: BodyItem[]
|
|
||||||
nonCodeMeta: NoneCodeMeta
|
|
||||||
}
|
|
||||||
interface GeneralStatement {
|
|
||||||
type: SyntaxType
|
|
||||||
start: number
|
|
||||||
end: number
|
|
||||||
}
|
|
||||||
|
|
||||||
interface NoneCodeNode extends GeneralStatement {
|
|
||||||
type: 'NoneCodeNode'
|
|
||||||
value: string
|
|
||||||
}
|
|
||||||
|
|
||||||
interface NoneCodeMeta {
|
|
||||||
// Stores the whitespace/comments that go after the statement who's index we're using here
|
|
||||||
[statementIndex: number]: NoneCodeNode
|
|
||||||
// Which is why we also need `start` for and whitespace at the start of the file/block
|
|
||||||
start?: NoneCodeNode
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeNoneCodeNode(
|
function makeNoneCodeNode(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
@ -129,11 +53,6 @@ function findEndOfNonCodeNode(tokens: Token[], index: number): number {
|
|||||||
return index
|
return index
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ExpressionStatement extends GeneralStatement {
|
|
||||||
type: 'ExpressionStatement'
|
|
||||||
expression: Value
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeExpressionStatement(
|
function makeExpressionStatement(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -165,13 +84,6 @@ function makeExpressionStatement(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface CallExpression extends GeneralStatement {
|
|
||||||
type: 'CallExpression'
|
|
||||||
callee: Identifier
|
|
||||||
arguments: Value[]
|
|
||||||
optional: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
export function makeCallExpression(
|
export function makeCallExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -373,12 +285,6 @@ function makeArguments(
|
|||||||
throw new Error('Expected a previous Argument if statement to match')
|
throw new Error('Expected a previous Argument if statement to match')
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface VariableDeclaration extends GeneralStatement {
|
|
||||||
type: 'VariableDeclaration'
|
|
||||||
declarations: VariableDeclarator[]
|
|
||||||
kind: 'const' | 'unknown' | 'fn' //| "solid" | "surface" | "face"
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeVariableDeclaration(
|
function makeVariableDeclaration(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -407,19 +313,6 @@ function makeVariableDeclaration(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Value =
|
|
||||||
| Literal
|
|
||||||
| Identifier
|
|
||||||
| BinaryExpression
|
|
||||||
| FunctionExpression
|
|
||||||
| CallExpression
|
|
||||||
| PipeExpression
|
|
||||||
| PipeSubstitution
|
|
||||||
| ArrayExpression
|
|
||||||
| ObjectExpression
|
|
||||||
| MemberExpression
|
|
||||||
| UnaryExpression
|
|
||||||
|
|
||||||
function makeValue(
|
function makeValue(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -523,12 +416,6 @@ function makeValue(
|
|||||||
throw new Error('Expected a previous Value if statement to match')
|
throw new Error('Expected a previous Value if statement to match')
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface VariableDeclarator extends GeneralStatement {
|
|
||||||
type: 'VariableDeclarator'
|
|
||||||
id: Identifier
|
|
||||||
init: Value
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeVariableDeclarators(
|
function makeVariableDeclarators(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number,
|
index: number,
|
||||||
@ -576,29 +463,6 @@ function makeVariableDeclarators(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type BinaryPart =
|
|
||||||
| Literal
|
|
||||||
| Identifier
|
|
||||||
| BinaryExpression
|
|
||||||
| CallExpression
|
|
||||||
| UnaryExpression
|
|
||||||
// | MemberExpression
|
|
||||||
// | ArrayExpression
|
|
||||||
// | ObjectExpression
|
|
||||||
// | LogicalExpression
|
|
||||||
// | ConditionalExpression
|
|
||||||
|
|
||||||
export interface Literal extends GeneralStatement {
|
|
||||||
type: 'Literal'
|
|
||||||
value: string | number | boolean | null
|
|
||||||
raw: string
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface Identifier extends GeneralStatement {
|
|
||||||
type: 'Identifier'
|
|
||||||
name: string
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeIdentifier(token: Token[], index: number): Identifier {
|
function makeIdentifier(token: Token[], index: number): Identifier {
|
||||||
const currentToken = token[index]
|
const currentToken = token[index]
|
||||||
return {
|
return {
|
||||||
@ -609,10 +473,6 @@ function makeIdentifier(token: Token[], index: number): Identifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PipeSubstitution extends GeneralStatement {
|
|
||||||
type: 'PipeSubstitution'
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeLiteral(tokens: Token[], index: number): Literal {
|
function makeLiteral(tokens: Token[], index: number): Literal {
|
||||||
const token = tokens[index]
|
const token = tokens[index]
|
||||||
const value =
|
const value =
|
||||||
@ -626,11 +486,6 @@ function makeLiteral(tokens: Token[], index: number): Literal {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ArrayExpression extends GeneralStatement {
|
|
||||||
type: 'ArrayExpression'
|
|
||||||
elements: Value[]
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeArrayElements(
|
function makeArrayElements(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number,
|
index: number,
|
||||||
@ -686,17 +541,6 @@ function makeArrayExpression(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ObjectExpression extends GeneralStatement {
|
|
||||||
type: 'ObjectExpression'
|
|
||||||
properties: ObjectProperty[]
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ObjectProperty extends GeneralStatement {
|
|
||||||
type: 'ObjectProperty'
|
|
||||||
key: Identifier
|
|
||||||
value: Value
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeObjectExpression(
|
function makeObjectExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -765,13 +609,6 @@ function makeObjectProperties(
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface MemberExpression extends GeneralStatement {
|
|
||||||
type: 'MemberExpression'
|
|
||||||
object: MemberExpression | Identifier
|
|
||||||
property: Identifier | Literal
|
|
||||||
computed: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeMemberExpression(
|
function makeMemberExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -808,12 +645,6 @@ function makeMemberExpression(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ObjectKeyInfo {
|
|
||||||
key: Identifier | Literal
|
|
||||||
index: number
|
|
||||||
computed: boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
function collectObjectKeys(
|
function collectObjectKeys(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number,
|
index: number,
|
||||||
@ -859,13 +690,6 @@ function collectObjectKeys(
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BinaryExpression extends GeneralStatement {
|
|
||||||
type: 'BinaryExpression'
|
|
||||||
operator: string
|
|
||||||
left: BinaryPart
|
|
||||||
right: BinaryPart
|
|
||||||
}
|
|
||||||
|
|
||||||
export function findEndOfBinaryExpression(
|
export function findEndOfBinaryExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -922,12 +746,6 @@ function makeBinaryExpression(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface UnaryExpression extends GeneralStatement {
|
|
||||||
type: 'UnaryExpression'
|
|
||||||
operator: '-' | '!'
|
|
||||||
argument: BinaryPart
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeUnaryExpression(
|
function makeUnaryExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -950,12 +768,6 @@ function makeUnaryExpression(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface PipeExpression extends GeneralStatement {
|
|
||||||
type: 'PipeExpression'
|
|
||||||
body: Value[]
|
|
||||||
nonCodeMeta: NoneCodeMeta
|
|
||||||
}
|
|
||||||
|
|
||||||
function makePipeExpression(
|
function makePipeExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -1017,13 +829,6 @@ function makePipeBody(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface FunctionExpression extends GeneralStatement {
|
|
||||||
type: 'FunctionExpression'
|
|
||||||
id: Identifier | null
|
|
||||||
params: Identifier[]
|
|
||||||
body: BlockStatement
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeFunctionExpression(
|
function makeFunctionExpression(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -1072,12 +877,6 @@ function makeParams(
|
|||||||
])
|
])
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface BlockStatement extends GeneralStatement {
|
|
||||||
type: 'BlockStatement'
|
|
||||||
body: BodyItem[]
|
|
||||||
nonCodeMeta: NoneCodeMeta
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeBlockStatement(
|
function makeBlockStatement(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -1100,11 +899,6 @@ function makeBlockStatement(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface ReturnStatement extends GeneralStatement {
|
|
||||||
type: 'ReturnStatement'
|
|
||||||
argument: Value
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeReturnStatement(
|
function makeReturnStatement(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number
|
index: number
|
||||||
@ -1123,8 +917,6 @@ function makeReturnStatement(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export type All = Program | ExpressionStatement[] | BinaryExpression | Literal
|
|
||||||
|
|
||||||
function nextMeaningfulToken(
|
function nextMeaningfulToken(
|
||||||
tokens: Token[],
|
tokens: Token[],
|
||||||
index: number,
|
index: number,
|
||||||
@ -1163,8 +955,6 @@ function previousMeaningfulToken(
|
|||||||
return { token, index: newIndex }
|
return { token, index: newIndex }
|
||||||
}
|
}
|
||||||
|
|
||||||
type BodyItem = ExpressionStatement | VariableDeclaration | ReturnStatement
|
|
||||||
|
|
||||||
function makeBody(
|
function makeBody(
|
||||||
{
|
{
|
||||||
tokens,
|
tokens,
|
||||||
|
177
src/lang/abstractSyntaxTreeTypes.ts
Normal file
177
src/lang/abstractSyntaxTreeTypes.ts
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
export type SyntaxType =
|
||||||
|
| 'Program'
|
||||||
|
| 'ExpressionStatement'
|
||||||
|
| 'BinaryExpression'
|
||||||
|
| 'CallExpression'
|
||||||
|
| 'Identifier'
|
||||||
|
| 'BlockStatement'
|
||||||
|
| 'ReturnStatement'
|
||||||
|
| 'VariableDeclaration'
|
||||||
|
| 'VariableDeclarator'
|
||||||
|
| 'MemberExpression'
|
||||||
|
| 'ArrayExpression'
|
||||||
|
| 'ObjectExpression'
|
||||||
|
| 'ObjectProperty'
|
||||||
|
| 'FunctionExpression'
|
||||||
|
| 'PipeExpression'
|
||||||
|
| 'PipeSubstitution'
|
||||||
|
| 'Literal'
|
||||||
|
| 'NoneCodeNode'
|
||||||
|
| 'UnaryExpression'
|
||||||
|
|
||||||
|
export interface Program {
|
||||||
|
type: SyntaxType
|
||||||
|
start: number
|
||||||
|
end: number
|
||||||
|
body: BodyItem[]
|
||||||
|
nonCodeMeta: NoneCodeMeta
|
||||||
|
}
|
||||||
|
interface GeneralStatement {
|
||||||
|
type: SyntaxType
|
||||||
|
start: number
|
||||||
|
end: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export type BodyItem =
|
||||||
|
| ExpressionStatement
|
||||||
|
| VariableDeclaration
|
||||||
|
| ReturnStatement
|
||||||
|
|
||||||
|
export type Value =
|
||||||
|
| Literal
|
||||||
|
| Identifier
|
||||||
|
| BinaryExpression
|
||||||
|
| FunctionExpression
|
||||||
|
| CallExpression
|
||||||
|
| PipeExpression
|
||||||
|
| PipeSubstitution
|
||||||
|
| ArrayExpression
|
||||||
|
| ObjectExpression
|
||||||
|
| MemberExpression
|
||||||
|
| UnaryExpression
|
||||||
|
|
||||||
|
export type BinaryPart =
|
||||||
|
| Literal
|
||||||
|
| Identifier
|
||||||
|
| BinaryExpression
|
||||||
|
| CallExpression
|
||||||
|
| UnaryExpression
|
||||||
|
|
||||||
|
export interface NoneCodeNode extends GeneralStatement {
|
||||||
|
type: 'NoneCodeNode'
|
||||||
|
value: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface NoneCodeMeta {
|
||||||
|
// Stores the whitespace/comments that go after the statement who's index we're using here
|
||||||
|
[statementIndex: number]: NoneCodeNode
|
||||||
|
// Which is why we also need `start` for and whitespace at the start of the file/block
|
||||||
|
start?: NoneCodeNode
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ExpressionStatement extends GeneralStatement {
|
||||||
|
type: 'ExpressionStatement'
|
||||||
|
expression: Value
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CallExpression extends GeneralStatement {
|
||||||
|
type: 'CallExpression'
|
||||||
|
callee: Identifier
|
||||||
|
arguments: Value[]
|
||||||
|
optional: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VariableDeclaration extends GeneralStatement {
|
||||||
|
type: 'VariableDeclaration'
|
||||||
|
declarations: VariableDeclarator[]
|
||||||
|
kind: 'const' | 'unknown' | 'fn' //| "solid" | "surface" | "face"
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface VariableDeclarator extends GeneralStatement {
|
||||||
|
type: 'VariableDeclarator'
|
||||||
|
id: Identifier
|
||||||
|
init: Value
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Literal extends GeneralStatement {
|
||||||
|
type: 'Literal'
|
||||||
|
value: string | number | boolean | null
|
||||||
|
raw: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Identifier extends GeneralStatement {
|
||||||
|
type: 'Identifier'
|
||||||
|
name: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PipeSubstitution extends GeneralStatement {
|
||||||
|
type: 'PipeSubstitution'
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ArrayExpression extends GeneralStatement {
|
||||||
|
type: 'ArrayExpression'
|
||||||
|
elements: Value[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ObjectExpression extends GeneralStatement {
|
||||||
|
type: 'ObjectExpression'
|
||||||
|
properties: ObjectProperty[]
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ObjectProperty extends GeneralStatement {
|
||||||
|
type: 'ObjectProperty'
|
||||||
|
key: Identifier
|
||||||
|
value: Value
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface MemberExpression extends GeneralStatement {
|
||||||
|
type: 'MemberExpression'
|
||||||
|
object: MemberExpression | Identifier
|
||||||
|
property: Identifier | Literal
|
||||||
|
computed: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ObjectKeyInfo {
|
||||||
|
key: Identifier | Literal
|
||||||
|
index: number
|
||||||
|
computed: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BinaryExpression extends GeneralStatement {
|
||||||
|
type: 'BinaryExpression'
|
||||||
|
operator: string
|
||||||
|
left: BinaryPart
|
||||||
|
right: BinaryPart
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UnaryExpression extends GeneralStatement {
|
||||||
|
type: 'UnaryExpression'
|
||||||
|
operator: '-' | '!'
|
||||||
|
argument: BinaryPart
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PipeExpression extends GeneralStatement {
|
||||||
|
type: 'PipeExpression'
|
||||||
|
body: Value[]
|
||||||
|
nonCodeMeta: NoneCodeMeta
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface FunctionExpression extends GeneralStatement {
|
||||||
|
type: 'FunctionExpression'
|
||||||
|
id: Identifier | null
|
||||||
|
params: Identifier[]
|
||||||
|
body: BlockStatement
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface BlockStatement extends GeneralStatement {
|
||||||
|
type: 'BlockStatement'
|
||||||
|
body: BodyItem[]
|
||||||
|
nonCodeMeta: NoneCodeMeta
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ReturnStatement extends GeneralStatement {
|
||||||
|
type: 'ReturnStatement'
|
||||||
|
argument: Value
|
||||||
|
}
|
||||||
|
|
||||||
|
export type All = Program | ExpressionStatement[] | BinaryExpression | Literal
|
@ -3,6 +3,8 @@ import {
|
|||||||
Literal,
|
Literal,
|
||||||
Identifier,
|
Identifier,
|
||||||
CallExpression,
|
CallExpression,
|
||||||
|
} from './abstractSyntaxTreeTypes'
|
||||||
|
import {
|
||||||
findClosingBrace,
|
findClosingBrace,
|
||||||
makeCallExpression,
|
makeCallExpression,
|
||||||
isNotCodeToken,
|
isNotCodeToken,
|
||||||
|
@ -9,7 +9,7 @@ import {
|
|||||||
CallExpression,
|
CallExpression,
|
||||||
ArrayExpression,
|
ArrayExpression,
|
||||||
UnaryExpression,
|
UnaryExpression,
|
||||||
} from './abstractSyntaxTree'
|
} from './abstractSyntaxTreeTypes'
|
||||||
import { InternalFnNames } from './std/stdTypes'
|
import { InternalFnNames } from './std/stdTypes'
|
||||||
import { internalFns } from './std/std'
|
import { internalFns } from './std/std'
|
||||||
import {
|
import {
|
||||||
|
@ -14,7 +14,7 @@ import {
|
|||||||
ObjectExpression,
|
ObjectExpression,
|
||||||
UnaryExpression,
|
UnaryExpression,
|
||||||
BinaryExpression,
|
BinaryExpression,
|
||||||
} from './abstractSyntaxTree'
|
} from './abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
findAllPreviousVariables,
|
findAllPreviousVariables,
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
|
@ -10,7 +10,7 @@ import {
|
|||||||
VariableDeclaration,
|
VariableDeclaration,
|
||||||
ReturnStatement,
|
ReturnStatement,
|
||||||
ArrayExpression,
|
ArrayExpression,
|
||||||
} from './abstractSyntaxTree'
|
} from './abstractSyntaxTreeTypes'
|
||||||
import { createIdentifier, splitPathAtLastIndex } from './modifyAst'
|
import { createIdentifier, splitPathAtLastIndex } from './modifyAst'
|
||||||
import { getSketchSegmentFromSourceRange } from './std/sketchConstraints'
|
import { getSketchSegmentFromSourceRange } from './std/sketchConstraints'
|
||||||
import { getAngle } from '../lib/utils'
|
import { getAngle } from '../lib/utils'
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
import { recast } from './recast'
|
import { recast } from './recast'
|
||||||
import { Program, abstractSyntaxTree } from './abstractSyntaxTree'
|
import { abstractSyntaxTree } from './abstractSyntaxTree'
|
||||||
|
import { Program } from './abstractSyntaxTreeTypes'
|
||||||
import { lexer, Token } from './tokeniser'
|
import { lexer, Token } from './tokeniser'
|
||||||
import fs from 'node:fs'
|
import fs from 'node:fs'
|
||||||
import { initPromise } from './rust'
|
import { initPromise } from './rust'
|
||||||
|
@ -11,7 +11,7 @@ import {
|
|||||||
MemberExpression,
|
MemberExpression,
|
||||||
PipeExpression,
|
PipeExpression,
|
||||||
UnaryExpression,
|
UnaryExpression,
|
||||||
} from './abstractSyntaxTree'
|
} from './abstractSyntaxTreeTypes'
|
||||||
import { precedence } from './astMathExpressions'
|
import { precedence } from './astMathExpressions'
|
||||||
|
|
||||||
export function recast(
|
export function recast(
|
||||||
|
@ -13,7 +13,7 @@ import {
|
|||||||
Value,
|
Value,
|
||||||
Literal,
|
Literal,
|
||||||
VariableDeclaration,
|
VariableDeclaration,
|
||||||
} from '../abstractSyntaxTree'
|
} from '../abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
getNodeFromPathCurry,
|
getNodeFromPathCurry,
|
||||||
|
@ -4,7 +4,7 @@ import {
|
|||||||
Program,
|
Program,
|
||||||
VariableDeclarator,
|
VariableDeclarator,
|
||||||
CallExpression,
|
CallExpression,
|
||||||
} from '../abstractSyntaxTree'
|
} from '../abstractSyntaxTreeTypes'
|
||||||
import { SketchGroup, SourceRange } from '../executor'
|
import { SketchGroup, SourceRange } from '../executor'
|
||||||
import { InternalFn } from './stdTypes'
|
import { InternalFn } from './stdTypes'
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
import { abstractSyntaxTree, Value } from '../abstractSyntaxTree'
|
import { abstractSyntaxTree } from '../abstractSyntaxTree'
|
||||||
|
import { Value } from '../abstractSyntaxTreeTypes'
|
||||||
import { lexer } from '../tokeniser'
|
import { lexer } from '../tokeniser'
|
||||||
import {
|
import {
|
||||||
getConstraintType,
|
getConstraintType,
|
||||||
|
@ -6,7 +6,7 @@ import {
|
|||||||
Value,
|
Value,
|
||||||
BinaryPart,
|
BinaryPart,
|
||||||
VariableDeclarator,
|
VariableDeclarator,
|
||||||
} from '../abstractSyntaxTree'
|
} from '../abstractSyntaxTreeTypes'
|
||||||
import {
|
import {
|
||||||
getNodeFromPath,
|
getNodeFromPath,
|
||||||
getNodeFromPathCurry,
|
getNodeFromPathCurry,
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { ProgramMemory, Path, SourceRange } from '../executor'
|
import { ProgramMemory, Path, SourceRange } from '../executor'
|
||||||
import { Program, Value } from '../abstractSyntaxTree'
|
import { Program, Value } from '../abstractSyntaxTreeTypes'
|
||||||
import { TooTip } from '../../useStore'
|
import { TooTip } from '../../useStore'
|
||||||
import { PathToNode } from '../executor'
|
import { PathToNode } from '../executor'
|
||||||
import { EngineCommandManager } from './engineConnection'
|
import { EngineCommandManager } from './engineConnection'
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { Selections, StoreState } from '../useStore'
|
import { Selections, StoreState } from '../useStore'
|
||||||
import { Program } from './abstractSyntaxTree'
|
import { Program } from './abstractSyntaxTreeTypes'
|
||||||
import { PathToNode } from './executor'
|
import { PathToNode } from './executor'
|
||||||
import { getNodeFromPath } from './queryAst'
|
import { getNodeFromPath } from './queryAst'
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Program } from '../lang/abstractSyntaxTree'
|
import { Program } from '../lang/abstractSyntaxTreeTypes'
|
||||||
import { ProgramMemory, _executor } from '../lang/executor'
|
import { ProgramMemory, _executor } from '../lang/executor'
|
||||||
import { EngineCommandManager } from '../lang/std/engineConnection'
|
import { EngineCommandManager } from '../lang/std/engineConnection'
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
import create from 'zustand'
|
import create from 'zustand'
|
||||||
import { persist } from 'zustand/middleware'
|
import { persist } from 'zustand/middleware'
|
||||||
import { addLineHighlight, EditorView } from './editor/highlightextension'
|
import { addLineHighlight, EditorView } from './editor/highlightextension'
|
||||||
import { Program, abstractSyntaxTree } from './lang/abstractSyntaxTree'
|
import { abstractSyntaxTree } from './lang/abstractSyntaxTree'
|
||||||
|
import { Program } from './lang/abstractSyntaxTreeTypes'
|
||||||
import { getNodeFromPath } from './lang/queryAst'
|
import { getNodeFromPath } from './lang/queryAst'
|
||||||
import {
|
import {
|
||||||
ProgramMemory,
|
ProgramMemory,
|
||||||
|
Reference in New Issue
Block a user