Skip to content

Commit bb58d3e

Browse files
committed
refactor: delay creation of operatorsTrie and hide this implementation
BREAKING CHANGE: use `operators` instead of `operatorsTrie` as Tokenizer constructor argument, #500
1 parent ff112a4 commit bb58d3e

21 files changed

+86
-96
lines changed

rollup.config.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const treeshake = {
1616
propertyReadSideEffects: false
1717
}
1818
const tsconfig = (target) => ({
19+
check: true,
1920
tsconfigOverride: {
2021
include: [ 'src' ],
2122
exclude: [ 'test', 'benchmark' ],

src/liquid-options.ts

+1-8
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { LRU } from './cache/lru'
44
import { FS } from './fs/fs'
55
import * as fs from './fs/node'
66
import { defaultOperators, Operators } from './render/operator'
7-
import { createTrie, Trie } from './util/operator-trie'
87
import { filters } from './filters'
98
import { assert } from './types'
109

@@ -99,7 +98,6 @@ interface NormalizedOptions extends LiquidOptions {
9998
layouts?: string[];
10099
cache?: LiquidCache;
101100
outputEscape?: OutputEscape;
102-
operatorsTrie?: Trie;
103101
}
104102

105103
export interface NormalizedFullOptions extends NormalizedOptions {
@@ -130,7 +128,6 @@ export interface NormalizedFullOptions extends NormalizedOptions {
130128
globals: object;
131129
keepOutputType: boolean;
132130
operators: Operators;
133-
operatorsTrie: Trie;
134131
}
135132

136133
export const defaultOptions: NormalizedFullOptions = {
@@ -160,14 +157,10 @@ export const defaultOptions: NormalizedFullOptions = {
160157
lenientIf: false,
161158
globals: {},
162159
keepOutputType: false,
163-
operators: defaultOperators,
164-
operatorsTrie: createTrie(defaultOperators)
160+
operators: defaultOperators
165161
}
166162

167163
export function normalize (options: LiquidOptions): NormalizedFullOptions {
168-
if (options.hasOwnProperty('operators')) {
169-
(options as NormalizedOptions).operatorsTrie = createTrie(options.operators!)
170-
}
171164
if (options.hasOwnProperty('root')) {
172165
if (!options.hasOwnProperty('partials')) options.partials = options.root
173166
if (!options.hasOwnProperty('layouts')) options.layouts = options.root

src/parser/parser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export default class Parser {
2929
this.loader = new Loader(this.liquid.options)
3030
}
3131
public parse (html: string, filepath?: string): Template[] {
32-
const tokenizer = new Tokenizer(html, this.liquid.options.operatorsTrie, filepath)
32+
const tokenizer = new Tokenizer(html, this.liquid.options.operators, filepath)
3333
const tokens = tokenizer.readTopLevelTokens(this.liquid.options)
3434
return this.parseTokens(tokens)
3535
}

src/parser/tokenizer.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -22,21 +22,24 @@ import { TokenizationError } from '../util/error'
2222
import { NormalizedFullOptions, defaultOptions } from '../liquid-options'
2323
import { TYPES, QUOTE, BLANK, IDENTIFIER } from '../util/character'
2424
import { matchOperator } from './match-operator'
25-
import { Trie } from '../util/operator-trie'
25+
import { Trie, createTrie } from '../util/operator-trie'
2626
import { Expression } from '../render/expression'
27+
import { Operators } from '../render/operator'
2728
import { LiquidTagToken } from '../tokens/liquid-tag-token'
2829

2930
export class Tokenizer {
3031
p = 0
3132
N: number
3233
private rawBeginAt = -1
34+
private opTrie: Trie
3335

3436
constructor (
3537
public input: string,
36-
private trie: Trie = defaultOptions.operatorsTrie,
38+
operators: Operators = defaultOptions.operators,
3739
public file: string = ''
3840
) {
3941
this.N = input.length
42+
this.opTrie = createTrie(operators)
4043
}
4144

4245
readExpression () {
@@ -62,7 +65,7 @@ export class Tokenizer {
6265
}
6366
readOperator (): OperatorToken | undefined {
6467
this.skipBlank()
65-
const end = matchOperator(this.input, this.p, this.trie)
68+
const end = matchOperator(this.input, this.p, this.opTrie)
6669
if (end === -1) return
6770
return new OperatorToken(this.input, this.p, (this.p = end), this.file)
6871
}

src/tags/assign.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Value, Tokenizer, assert, TagImplOptions, TagToken, Context } from '../
22

33
export default {
44
parse: function (token: TagToken) {
5-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
5+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
66
this.key = tokenizer.readIdentifier().content
77
tokenizer.skipBlank()
88
assert(tokenizer.peek() === '=', () => `illegal token ${token.getText()}`)

src/tags/capture.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { evalQuotedToken } from '../render/expression'
33

44
export default {
55
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
6-
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)
6+
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operators)
77
this.variable = readVariableName(tokenizer)
88
assert(this.variable, () => `${tagToken.args} not valid identifier`)
99

src/tags/case.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default {
1212
.on('tag:when', (token: TagToken) => {
1313
p = []
1414

15-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
15+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
1616

1717
while (!tokenizer.end()) {
1818
const value = tokenizer.readValue()

src/tags/cycle.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Tokenizer } from '../parser/tokenizer'
44

55
export default {
66
parse: function (tagToken: TagToken) {
7-
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)
7+
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operators)
88
const group = tokenizer.readValue()
99
tokenizer.skipBlank()
1010

src/tags/decrement.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { isNumber, stringify } from '../util/underscore'
33

44
export default {
55
parse: function (token: TagToken) {
6-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
6+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
77
this.variable = tokenizer.readIdentifier().content
88
},
99
render: function (context: Context, emitter: Emitter) {

src/tags/for.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ type valueof<T> = T[keyof T]
1010
export default {
1111
type: 'block',
1212
parse: function (token: TagToken, remainTokens: TopLevelToken[]) {
13-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
13+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
1414

1515
const variable = tokenizer.readIdentifier()
1616
const inStr = tokenizer.readIdentifier()

src/tags/include.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default {
77
renderFilePath,
88
parse: function (token: TagToken) {
99
const args = token.args
10-
const tokenizer = new Tokenizer(args, this.liquid.options.operatorsTrie)
10+
const tokenizer = new Tokenizer(args, this.liquid.options.operators)
1111
this['file'] = this.parseFilePath(tokenizer, this.liquid)
1212
this['currentFile'] = token.file
1313

src/tags/increment.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Tokenizer, Emitter, TagToken, Context, TagImplOptions } from '../types'
33

44
export default {
55
parse: function (token: TagToken) {
6-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
6+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
77
this.variable = tokenizer.readIdentifier().content
88
},
99
render: function (context: Context, emitter: Emitter) {

src/tags/layout.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export default {
77
parseFilePath,
88
renderFilePath,
99
parse: function (token: TagToken, remainTokens: TopLevelToken[]) {
10-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
10+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
1111
this['file'] = this.parseFilePath(tokenizer, this.liquid)
1212
this['currentFile'] = token.file
1313
this.hash = new Hash(tokenizer.remaining())

src/tags/liquid.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Tokenizer } from '../parser/tokenizer'
44

55
export default {
66
parse: function (token: TagToken) {
7-
const tokenizer = new Tokenizer(token.args, this.liquid.options.operatorsTrie)
7+
const tokenizer = new Tokenizer(token.args, this.liquid.options.operators)
88
const tokens = tokenizer.readLiquidTagTokens(this.liquid.options)
99
this.tpls = this.liquid.parser.parseTokens(tokens)
1010
},

src/tags/render.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default {
1010
renderFilePath,
1111
parse: function (token: TagToken) {
1212
const args = token.args
13-
const tokenizer = new Tokenizer(args, this.liquid.options.operatorsTrie)
13+
const tokenizer = new Tokenizer(args, this.liquid.options.operators)
1414
this['file'] = this.parseFilePath(tokenizer, this.liquid)
1515
this['currentFile'] = token.file
1616
while (!tokenizer.end()) {

src/tags/tablerow.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { Tokenizer } from '../parser/tokenizer'
55

66
export default {
77
parse: function (tagToken: TagToken, remainTokens: TopLevelToken[]) {
8-
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operatorsTrie)
8+
const tokenizer = new Tokenizer(tagToken.args, this.liquid.options.operators)
99

1010
const variable = tokenizer.readIdentifier()
1111
tokenizer.skipBlank()

src/template/value.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export class Value {
1212
* @param str the value to be valuated, eg.: "foobar" | truncate: 3
1313
*/
1414
public constructor (str: string, liquid: Liquid) {
15-
const tokenizer = new Tokenizer(str, liquid.options.operatorsTrie)
15+
const tokenizer = new Tokenizer(str, liquid.options.operators)
1616
this.initial = tokenizer.readExpression()
1717
this.filters = tokenizer.readFilters().map(({ name, args }) => new Filter(name, liquid.filters.get(name), args, liquid))
1818
}

src/tokens/liquid-tag-token.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export class LiquidTagToken extends DelimitedToken {
2222
this.name = ''
2323
this.args = ''
2424
} else {
25-
const tokenizer = new Tokenizer(this.content, options.operatorsTrie)
25+
const tokenizer = new Tokenizer(this.content, options.operators)
2626
this.name = tokenizer.readTagName()
2727
if (!this.name) throw new TokenizationError(`illegal liquid tag syntax`, this)
2828

src/tokens/tag-token.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export class TagToken extends DelimitedToken {
1818
const value = input.slice(begin + tagDelimiterLeft.length, end - tagDelimiterRight.length)
1919
super(TokenKind.Tag, value, input, begin, end, trimTagLeft, trimTagRight, file)
2020

21-
const tokenizer = new Tokenizer(this.content, options.operatorsTrie)
21+
const tokenizer = new Tokenizer(this.content, options.operators)
2222
this.name = tokenizer.readTagName()
2323
if (!this.name) throw new TokenizationError(`illegal tag syntax`, this)
2424

0 commit comments

Comments
 (0)