move ast types into seperate ts file (#169)

This commit is contained in:
Kurt Hutten
2023-07-13 16:57:22 +10:00
committed by GitHub
parent 317dc6d0b2
commit 3fc4d71a1e
28 changed files with 234 additions and 265 deletions

View File

@ -1,9 +1,6 @@
import { useEffect, useState, useRef } from 'react'
import {
abstractSyntaxTree,
BinaryPart,
Value,
} from '../lang/abstractSyntaxTree'
import { abstractSyntaxTree } from '../lang/abstractSyntaxTree'
import { BinaryPart, Value } from '../lang/abstractSyntaxTreeTypes'
import { executor } from '../lang/executor'
import {
createIdentifier,

View File

@ -1,6 +1,6 @@
import { Dialog, Transition } from '@headlessui/react'
import { Fragment, useState } from 'react'
import { Value } from '../lang/abstractSyntaxTree'
import { Value } from '../lang/abstractSyntaxTreeTypes'
import {
AvailableVars,
addToInputHelper,

View File

@ -1,6 +1,6 @@
import { Dialog, Transition } from '@headlessui/react'
import { Fragment, useState } from 'react'
import { Value } from '../lang/abstractSyntaxTree'
import { Value } from '../lang/abstractSyntaxTreeTypes'
import {
AvailableVars,
addToInputHelper,

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from 'react'
import { toolTips, useStore } from '../../useStore'
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTree'
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from 'react'
import { toolTips, useStore } from '../../useStore'
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTree'
import { Value, VariableDeclarator } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from 'react'
import { toolTips, useStore } from '../../useStore'
import { Value } from '../../lang/abstractSyntaxTree'
import { Value } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -5,7 +5,7 @@ import {
BinaryPart,
Value,
VariableDeclarator,
} from '../../lang/abstractSyntaxTree'
} from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,6 +1,6 @@
import { useState, useEffect } from 'react'
import { toolTips, useStore } from '../../useStore'
import { Value } from '../../lang/abstractSyntaxTree'
import { Value } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,7 +1,7 @@
import { useState, useEffect } from 'react'
import { create } from 'react-modal-promise'
import { toolTips, useStore } from '../../useStore'
import { Value } from '../../lang/abstractSyntaxTree'
import { Value } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -5,7 +5,7 @@ import {
BinaryPart,
Value,
VariableDeclarator,
} from '../../lang/abstractSyntaxTree'
} from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -5,7 +5,7 @@ import {
BinaryPart,
Value,
VariableDeclarator,
} from '../../lang/abstractSyntaxTree'
} from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,7 +1,7 @@
import { useState, useEffect } from 'react'
import { create } from 'react-modal-promise'
import { toolTips, useStore } from '../../useStore'
import { Value } from '../../lang/abstractSyntaxTree'
import { Value } from '../../lang/abstractSyntaxTreeTypes'
import {
getNodePathFromSourceRange,
getNodeFromPath,

View File

@ -1,107 +1,31 @@
import { Token } from './tokeniser'
import { parseExpression } from './astMathExpressions'
export type SyntaxType =
| 'Program'
| 'ExpressionStatement'
| 'BinaryExpression'
| 'CallExpression'
| 'Identifier'
| 'BlockStatement'
| 'ReturnStatement'
| 'VariableDeclaration'
| 'VariableDeclarator'
| 'MemberExpression'
| 'ArrayExpression'
| 'ObjectExpression'
| 'ObjectProperty'
| 'FunctionExpression'
| 'PipeExpression'
| 'PipeSubstitution'
| 'Literal'
| 'NoneCodeNode'
| 'UnaryExpression'
// | 'NumberLiteral'
// | 'StringLiteral'
// | 'IfStatement'
// | 'WhileStatement'
// | 'FunctionDeclaration'
// | '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
}
import {
BinaryPart,
BodyItem,
Identifier,
Literal,
NoneCodeMeta,
NoneCodeNode,
ObjectKeyInfo,
ObjectProperty,
PipeSubstitution,
Program,
Value,
VariableDeclaration,
VariableDeclarator,
ArrayExpression,
BinaryExpression,
CallExpression,
FunctionExpression,
MemberExpression,
ObjectExpression,
PipeExpression,
UnaryExpression,
BlockStatement,
ExpressionStatement,
ReturnStatement,
} from './abstractSyntaxTreeTypes'
function makeNoneCodeNode(
tokens: Token[],
@ -129,11 +53,6 @@ function findEndOfNonCodeNode(tokens: Token[], index: number): number {
return index
}
export interface ExpressionStatement extends GeneralStatement {
type: 'ExpressionStatement'
expression: Value
}
function makeExpressionStatement(
tokens: Token[],
index: number
@ -165,13 +84,6 @@ function makeExpressionStatement(
}
}
export interface CallExpression extends GeneralStatement {
type: 'CallExpression'
callee: Identifier
arguments: Value[]
optional: boolean
}
export function makeCallExpression(
tokens: Token[],
index: number
@ -373,12 +285,6 @@ function makeArguments(
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(
tokens: Token[],
index: number
@ -407,19 +313,6 @@ function makeVariableDeclaration(
}
}
export type Value =
| Literal
| Identifier
| BinaryExpression
| FunctionExpression
| CallExpression
| PipeExpression
| PipeSubstitution
| ArrayExpression
| ObjectExpression
| MemberExpression
| UnaryExpression
function makeValue(
tokens: Token[],
index: number
@ -523,12 +416,6 @@ function makeValue(
throw new Error('Expected a previous Value if statement to match')
}
export interface VariableDeclarator extends GeneralStatement {
type: 'VariableDeclarator'
id: Identifier
init: Value
}
function makeVariableDeclarators(
tokens: Token[],
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 {
const currentToken = token[index]
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 {
const token = tokens[index]
const value =
@ -626,11 +486,6 @@ function makeLiteral(tokens: Token[], index: number): Literal {
}
}
export interface ArrayExpression extends GeneralStatement {
type: 'ArrayExpression'
elements: Value[]
}
function makeArrayElements(
tokens: Token[],
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(
tokens: Token[],
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(
tokens: Token[],
index: number
@ -808,12 +645,6 @@ function makeMemberExpression(
}
}
interface ObjectKeyInfo {
key: Identifier | Literal
index: number
computed: boolean
}
function collectObjectKeys(
tokens: Token[],
index: number,
@ -859,13 +690,6 @@ function collectObjectKeys(
])
}
export interface BinaryExpression extends GeneralStatement {
type: 'BinaryExpression'
operator: string
left: BinaryPart
right: BinaryPart
}
export function findEndOfBinaryExpression(
tokens: Token[],
index: number
@ -922,12 +746,6 @@ function makeBinaryExpression(
}
}
export interface UnaryExpression extends GeneralStatement {
type: 'UnaryExpression'
operator: '-' | '!'
argument: BinaryPart
}
function makeUnaryExpression(
tokens: Token[],
index: number
@ -950,12 +768,6 @@ function makeUnaryExpression(
}
}
export interface PipeExpression extends GeneralStatement {
type: 'PipeExpression'
body: Value[]
nonCodeMeta: NoneCodeMeta
}
function makePipeExpression(
tokens: Token[],
index: number
@ -1017,13 +829,6 @@ function makePipeBody(
)
}
export interface FunctionExpression extends GeneralStatement {
type: 'FunctionExpression'
id: Identifier | null
params: Identifier[]
body: BlockStatement
}
function makeFunctionExpression(
tokens: Token[],
index: number
@ -1072,12 +877,6 @@ function makeParams(
])
}
export interface BlockStatement extends GeneralStatement {
type: 'BlockStatement'
body: BodyItem[]
nonCodeMeta: NoneCodeMeta
}
function makeBlockStatement(
tokens: Token[],
index: number
@ -1100,11 +899,6 @@ function makeBlockStatement(
}
}
export interface ReturnStatement extends GeneralStatement {
type: 'ReturnStatement'
argument: Value
}
function makeReturnStatement(
tokens: Token[],
index: number
@ -1123,8 +917,6 @@ function makeReturnStatement(
}
}
export type All = Program | ExpressionStatement[] | BinaryExpression | Literal
function nextMeaningfulToken(
tokens: Token[],
index: number,
@ -1163,8 +955,6 @@ function previousMeaningfulToken(
return { token, index: newIndex }
}
type BodyItem = ExpressionStatement | VariableDeclaration | ReturnStatement
function makeBody(
{
tokens,

View 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

View File

@ -3,6 +3,8 @@ import {
Literal,
Identifier,
CallExpression,
} from './abstractSyntaxTreeTypes'
import {
findClosingBrace,
makeCallExpression,
isNotCodeToken,

View File

@ -9,7 +9,7 @@ import {
CallExpression,
ArrayExpression,
UnaryExpression,
} from './abstractSyntaxTree'
} from './abstractSyntaxTreeTypes'
import { InternalFnNames } from './std/stdTypes'
import { internalFns } from './std/std'
import {

View File

@ -14,7 +14,7 @@ import {
ObjectExpression,
UnaryExpression,
BinaryExpression,
} from './abstractSyntaxTree'
} from './abstractSyntaxTreeTypes'
import {
findAllPreviousVariables,
getNodeFromPath,

View File

@ -10,7 +10,7 @@ import {
VariableDeclaration,
ReturnStatement,
ArrayExpression,
} from './abstractSyntaxTree'
} from './abstractSyntaxTreeTypes'
import { createIdentifier, splitPathAtLastIndex } from './modifyAst'
import { getSketchSegmentFromSourceRange } from './std/sketchConstraints'
import { getAngle } from '../lib/utils'

View File

@ -1,5 +1,6 @@
import { recast } from './recast'
import { Program, abstractSyntaxTree } from './abstractSyntaxTree'
import { abstractSyntaxTree } from './abstractSyntaxTree'
import { Program } from './abstractSyntaxTreeTypes'
import { lexer, Token } from './tokeniser'
import fs from 'node:fs'
import { initPromise } from './rust'

View File

@ -11,7 +11,7 @@ import {
MemberExpression,
PipeExpression,
UnaryExpression,
} from './abstractSyntaxTree'
} from './abstractSyntaxTreeTypes'
import { precedence } from './astMathExpressions'
export function recast(

View File

@ -13,7 +13,7 @@ import {
Value,
Literal,
VariableDeclaration,
} from '../abstractSyntaxTree'
} from '../abstractSyntaxTreeTypes'
import {
getNodeFromPath,
getNodeFromPathCurry,

View File

@ -4,7 +4,7 @@ import {
Program,
VariableDeclarator,
CallExpression,
} from '../abstractSyntaxTree'
} from '../abstractSyntaxTreeTypes'
import { SketchGroup, SourceRange } from '../executor'
import { InternalFn } from './stdTypes'

View File

@ -1,4 +1,5 @@
import { abstractSyntaxTree, Value } from '../abstractSyntaxTree'
import { abstractSyntaxTree } from '../abstractSyntaxTree'
import { Value } from '../abstractSyntaxTreeTypes'
import { lexer } from '../tokeniser'
import {
getConstraintType,

View File

@ -6,7 +6,7 @@ import {
Value,
BinaryPart,
VariableDeclarator,
} from '../abstractSyntaxTree'
} from '../abstractSyntaxTreeTypes'
import {
getNodeFromPath,
getNodeFromPathCurry,

View File

@ -1,5 +1,5 @@
import { ProgramMemory, Path, SourceRange } from '../executor'
import { Program, Value } from '../abstractSyntaxTree'
import { Program, Value } from '../abstractSyntaxTreeTypes'
import { TooTip } from '../../useStore'
import { PathToNode } from '../executor'
import { EngineCommandManager } from './engineConnection'

View File

@ -1,5 +1,5 @@
import { Selections, StoreState } from '../useStore'
import { Program } from './abstractSyntaxTree'
import { Program } from './abstractSyntaxTreeTypes'
import { PathToNode } from './executor'
import { getNodeFromPath } from './queryAst'

View File

@ -1,4 +1,4 @@
import { Program } from '../lang/abstractSyntaxTree'
import { Program } from '../lang/abstractSyntaxTreeTypes'
import { ProgramMemory, _executor } from '../lang/executor'
import { EngineCommandManager } from '../lang/std/engineConnection'

View File

@ -1,7 +1,8 @@
import create from 'zustand'
import { persist } from 'zustand/middleware'
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 {
ProgramMemory,