Skip to content

Commit 7ce294d

Browse files
committed
fix
1 parent 9cf46d7 commit 7ce294d

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

src/message/errors.ts

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import { SourceLocation } from './location'
2+
3+
export interface CompilerError extends SyntaxError {
4+
code: CompilerErrorCodes
5+
loc?: SourceLocation
6+
}
7+
8+
export const enum CompilerErrorCodes {
9+
MISSING_END_BRACE,
10+
MISSING_END_PAREN,
11+
// Special value for higher-order compilers to pick up the last code
12+
// to avoid collision of error codes. This should always be kept as the last
13+
// item.
14+
__EXTEND_POINT__
15+
}
16+
17+
export const errorMessages: { [code: number]: string } = {
18+
// TODO:
19+
[CompilerErrorCodes.MISSING_END_BRACE]: 'foo'
20+
}
21+
22+
export function createCompilerError(
23+
code: CompilerErrorCodes,
24+
loc?: SourceLocation,
25+
messages?: { [code: number]: string }
26+
): CompilerError {
27+
const msg = __DEV__ ? (messages || errorMessages)[code] : code
28+
const error = new SyntaxError(String(msg)) as CompilerError
29+
error.code = code
30+
error.loc = loc
31+
return error
32+
}

src/message/parser.ts

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
1+
import {
2+
CompilerErrorCodes,
3+
CompilerError,
4+
createCompilerError
5+
} from './errors'
16
import { SourceLocation, Position } from './location'
27
import { createTokenizer, Tokenizer, TokenTypes } from './tokenizer'
8+
import { isUnDef } from '../utils'
39

410
export const enum NodeTypes {
511
Resource, // 0
@@ -72,11 +78,40 @@ export interface LinkedModitierNode extends Node {
7278
value: Identifier
7379
}
7480

81+
export type ParserOptions = {
82+
onError?: (error: CompilerError) => void
83+
}
84+
7585
export type Parser = Readonly<{
7686
parse: (source: string) => ResourceNode
7787
}>
7888

79-
export function createParser(): Parser {
89+
export function createParser(/* options: ParserOptions = {} */): Parser {
90+
// TODO:
91+
/*
92+
const { onError } = options
93+
94+
const emitError = (
95+
code: CompilerErrorCodes,
96+
loc: Position,
97+
offset?: number
98+
): void => {
99+
if (offset) {
100+
loc.offset += offset
101+
loc.column += offset
102+
}
103+
if (onError) {
104+
onError(
105+
createCompilerError(code, {
106+
start: loc,
107+
end: loc,
108+
source: ''
109+
})
110+
)
111+
}
112+
}
113+
*/
114+
80115
const startNode = (type: NodeTypes, offset: number, loc: Position): Node => {
81116
return {
82117
type,
@@ -113,11 +148,11 @@ export function createParser(): Parser {
113148
return node
114149
}
115150

116-
const parseList = (tokenizer: Tokenizer, index: number): ListNode => {
151+
const parseList = (tokenizer: Tokenizer, index: string): ListNode => {
117152
const context = tokenizer.context()
118153
const { lastOffset: offset, lastStartLoc: loc } = context // get brace left loc
119154
const node = startNode(NodeTypes.List, offset, loc) as ListNode
120-
node.index = index
155+
node.index = parseInt(index, 10)
121156
tokenizer.nextToken() // skip brach right
122157
endNode(node, tokenizer.currentOffset(), tokenizer.currentPosition())
123158
return node
@@ -202,21 +237,21 @@ export function createParser(): Parser {
202237

203238
switch (token.type) {
204239
case TokenTypes.LinkedKey:
205-
if (!token.value || typeof token.value !== 'string') {
240+
if (isUnDef(token.value)) {
206241
// TODO: should be thrown syntax error
207242
throw new Error()
208243
}
209244
linkedNode.key = parseLinkedKey(tokenizer, token.value)
210245
break
211246
case TokenTypes.Named:
212-
if (!token.value || typeof token.value === 'number') {
247+
if (isUnDef(token.value)) {
213248
// TODO: should be thrown syntax error
214249
throw new Error()
215250
}
216251
linkedNode.key = parseNamed(tokenizer, token.value)
217252
break
218253
case TokenTypes.List:
219-
if (token.value === undefined || typeof token.value === 'string') {
254+
if (isUnDef(token.value)) {
220255
// TODO: should be thrown syntax error
221256
throw new Error()
222257
}
@@ -257,21 +292,21 @@ export function createParser(): Parser {
257292
const token = tokenizer.nextToken()
258293
switch (token.type) {
259294
case TokenTypes.Text:
260-
if (!token.value || typeof token.value === 'number') {
295+
if (isUnDef(token.value)) {
261296
// TODO: should be thrown syntax error
262297
throw new Error()
263298
}
264299
node.items.push(parseText(tokenizer, token.value))
265300
break
266301
case TokenTypes.List:
267-
if (token.value === undefined || typeof token.value === 'string') {
302+
if (isUnDef(token.value)) {
268303
// TODO: should be thrown syntax error
269304
throw new Error()
270305
}
271306
node.items.push(parseList(tokenizer, token.value))
272307
break
273308
case TokenTypes.Named:
274-
if (!token.value || typeof token.value === 'number') {
309+
if (isUnDef(token.value)) {
275310
// TODO: should be thrown syntax error
276311
throw new Error()
277312
}

src/plugin.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export function apply(
3232
app.directive('t', vT as FunctionDirective) // TODO:
3333

3434
// setup global provider
35+
console.log('provide', GlobalI18nSymbol, composer)
3536
app.provide(GlobalI18nSymbol, composer)
3637
}
3738

0 commit comments

Comments
 (0)