fix: incorrect scope when using assign with for, fixes #115

* remove AssignScope, CaptureScope, IncrementScope, DecrementScope concepts
* introduce Scope.environments for decrement/increment
* assign to scopes[0] for assign/capture
This commit is contained in:
harttle
2019-03-22 20:38:54 +08:00
parent b7b92c63cf
commit defbb58e66
10 changed files with 37 additions and 131 deletions
+1 -4
View File
@@ -1,6 +1,5 @@
import assert from '../../util/assert'
import { identifier } from '../../parser/lexical'
import { AssignScope } from '../../scope/scopes'
import TagToken from '../../parser/tag-token'
import Scope from '../../scope/scope'
import ITagImplOptions from '../../template/tag/itag-impl-options'
@@ -15,8 +14,6 @@ export default {
this.value = match[2]
},
render: async function (scope: Scope) {
const ctx = new AssignScope()
ctx[this.key] = await this.liquid.evalValue(this.value, scope)
scope.push(ctx)
scope.contexts[0][this.key] = await this.liquid.evalValue(this.value, scope)
}
} as ITagImplOptions
+1 -4
View File
@@ -1,6 +1,5 @@
import assert from '../../util/assert'
import { identifier } from '../../parser/lexical'
import { CaptureScope } from '../../scope/scopes'
import TagToken from '../../parser/tag-token'
import Token from '../../parser/token'
import Scope from '../../scope/scope'
@@ -26,8 +25,6 @@ export default {
},
render: async function (scope: Scope) {
const html = await this.liquid.renderer.renderTemplates(this.templates, scope)
const ctx = new CaptureScope()
ctx[this.variable] = html
scope.push(ctx)
scope.contexts[0][this.variable] = html
}
} as ITagImplOptions
+5 -15
View File
@@ -1,6 +1,5 @@
import assert from '../../util/assert'
import { identifier } from '../../parser/lexical'
import { CaptureScope, AssignScope, DecrementScope } from '../../scope/scopes'
import TagToken from '../../parser/tag-token'
import Scope from '../../scope/scope'
import ITagImplOptions from '../../template/tag/itag-impl-options'
@@ -11,20 +10,11 @@ export default {
assert(match, `illegal identifier ${token.args}`)
this.variable = match[0]
},
render: function (scope: Scope) {
let context = scope.findContextFor(
this.variable,
ctx => {
return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)
}
)
if (!context) {
context = new DecrementScope()
scope.unshift(context)
render: function (context: Scope) {
const scope = context.environments
if (typeof scope[this.variable] !== 'number') {
scope[this.variable] = 0
}
if (typeof context[this.variable] !== 'number') {
context[this.variable] = 0
}
return --context[this.variable]
return --scope[this.variable]
}
} as ITagImplOptions
+6 -16
View File
@@ -1,6 +1,5 @@
import assert from '../../util/assert'
import { identifier } from '../../parser/lexical'
import { CaptureScope, AssignScope, IncrementScope } from '../../scope/scopes'
import ITagImplOptions from '../../template/tag/itag-impl-options'
export default {
@@ -9,22 +8,13 @@ export default {
assert(match, `illegal identifier ${token.args}`)
this.variable = match![0]
},
render: function (scope) {
let context = scope.findContextFor(
this.variable,
ctx => {
return !(ctx instanceof CaptureScope) && !(ctx instanceof AssignScope)
}
)
if (!context) {
context = new IncrementScope()
scope.unshift(context)
render: function (context) {
const scope = context.environments
if (typeof scope[this.variable] !== 'number') {
scope[this.variable] = 0
}
if (typeof context[this.variable] !== 'number') {
context[this.variable] = 0
}
const val = context[this.variable]
context[this.variable]++
const val = scope[this.variable]
scope[this.variable]++
return val
}
} as ITagImplOptions