Skip to content

Commit 553d547

Browse files
committed
feat(app): create NodeVariable interface
1 parent b472309 commit 553d547

File tree

3 files changed

+52
-20
lines changed

3 files changed

+52
-20
lines changed

packages/app/modules/evaluation/parser/parser.spec.ts

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { describe, it, expect } from 'vitest'
22

33
import { createParser } from './parser'
4-
import { NodeType } from '../types/node'
4+
import { NodeType, NodeVariable } from '../types/node'
55

66
describe('Parser', () => {
77
const parser = createParser()
@@ -18,11 +18,16 @@ describe('Parser', () => {
1818
])('should convert %o to variable node', (code) => {
1919
const result = parser.toNodes(code)
2020

21+
const node = result[0] as NodeVariable
22+
2123
expect(result.length).toBe(1)
22-
expect(result[0].start).toEqual(0)
23-
expect(result[0].end).toEqual(code.length)
24-
expect(result[0].type).toEqual(NodeType.Variable)
25-
expect(result[0].tokens).toEqual(parser.toTokens(code))
24+
25+
expect(node.name).toEqual('code')
26+
expect(node.value).toBe(code.slice(13))
27+
expect(node.start).toEqual(0)
28+
expect(node.end).toEqual(code.length)
29+
expect(node.type).toEqual(NodeType.Variable)
30+
expect(node.tokens).toEqual(parser.toTokens(code))
2631
})
2732

2833
it.each([

packages/app/modules/evaluation/parser/processor.variable.ts

Lines changed: 36 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
import { TokenType } from '@language-kit/lexer'
22
import { defineProcessor } from '../helpers/define-processor'
3-
import { Node, NodeType } from '../types/node'
3+
import { Node, NodeType, NodeVariable } from '../types/node'
4+
import { ParserToken } from '../types/token'
5+
6+
function findName(tokens: ParserToken[]) {
7+
return tokens.slice(1).find((t) => t.type === TokenType.Word)
8+
}
9+
10+
function findDeclaration(tokens: ParserToken[]) {
11+
const declarationIndex = tokens.findIndex((t, i) => {
12+
const prev = tokens[i - 2]
13+
14+
return prev && prev.value === '='
15+
})
16+
17+
return tokens[declarationIndex]
18+
}
419

520
export default defineProcessor({
621
process(options) {
@@ -13,20 +28,17 @@ export default defineProcessor({
1328
}
1429

1530
const current = tokens[0]
31+
const name = findName(tokens)
32+
const declaration = findDeclaration(tokens)
33+
const declarationIndex = tokens.indexOf(declaration)
1634

17-
const isVariable = ['const', 'let', 'var'].includes(current.value)
18-
19-
if (!isVariable) return result
20-
21-
const declarationIndex = tokens.findIndex((t, i) => {
22-
const prev = tokens[i - 2]
23-
24-
return prev && prev.value === '='
25-
})
26-
27-
const declaration = tokens[declarationIndex]
35+
if (!current || !declaration || !name) {
36+
return result
37+
}
2838

29-
if (!declaration) return result
39+
if (!['const', 'let', 'var'].includes(current.value)) {
40+
return result
41+
}
3042

3143
const openCloseCases = [
3244
{ open: '"', close: '"' },
@@ -67,11 +79,20 @@ export default defineProcessor({
6779

6880
if (endIndex === -1) return result
6981

70-
const node: Node = {
82+
const nodeTokens = tokens.slice(0, endIndex + 1)
83+
84+
const value = nodeTokens
85+
.slice(declarationIndex)
86+
.map((t) => t.value)
87+
.join('')
88+
89+
const node: NodeVariable = {
7190
start: current.start,
91+
name: name.value,
92+
value: value,
7293
end: tokens[endIndex].end,
7394
type: NodeType.Variable,
74-
tokens: tokens.slice(0, endIndex + 1),
95+
tokens: nodeTokens,
7596
}
7697

7798
result.processed = true

packages/app/modules/evaluation/types/node.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,9 @@ export interface Node {
1212
type: NodeType
1313
tokens: ParserToken[]
1414
}
15+
16+
export interface NodeVariable extends Node {
17+
type: NodeType.Variable
18+
name: string
19+
value: string
20+
}

0 commit comments

Comments
 (0)