Skip to content

Commit

Permalink
Fix: didn't work if AST is reused
Browse files Browse the repository at this point in the history
  • Loading branch information
mysticatea committed Jan 7, 2018
1 parent 7a4717a commit 812fd21
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 7 deletions.
19 changes: 13 additions & 6 deletions src/parser-services.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,20 @@ export function define(rootAST: ESLintProgram) {

const programExitHandler = scriptVisitor["Program:exit"]
scriptVisitor["Program:exit"] = function() {
if (typeof programExitHandler === "function") {
programExitHandler.apply(this, arguments) //eslint-disable-line prefer-rest-params
}
try {
if (typeof programExitHandler === "function") {
programExitHandler.apply(this, arguments) //eslint-disable-line prefer-rest-params
}

// Traverse template body.
const generator = new NodeEventGenerator(emitter as EventEmitter)
traverseNodes(rootAST.templateBody as VElement, generator)
// Traverse template body.
const generator = new NodeEventGenerator(emitter as EventEmitter)
traverseNodes(rootAST.templateBody as VElement, generator)
}
finally {
// @ts-ignore
scriptVisitor["Program:exit"] = programExitHandler
emitters.delete(rootAST)
}
}
}

Expand Down
32 changes: 31 additions & 1 deletion test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@ const path = require("path")
const fs = require("fs-extra")
const parse = require("..").parse
const parseForESLint = require("..").parseForESLint
const CLIEngine = require("./fixtures/eslint").CLIEngine
const eslint = require("./fixtures/eslint")
const CLIEngine = eslint.CLIEngine
const Linter = eslint.Linter

//------------------------------------------------------------------------------
// Helpers
Expand Down Expand Up @@ -513,4 +515,32 @@ describe("Basic tests", () => {
)
})
})

describe("parserServices.defineTemplateBodyVisitor", () => {
it("should work even if AST object was reused.", () => {
const code = "<template><div/></template>"
const config = {
parser: PARSER_PATH,
rules: {
"test-rule": "error",
},
}
const linter = new Linter()

//eslint-disable-next-line no-shadow
linter.defineRule("test-rule", (context) => context.parserServices.defineTemplateBodyVisitor({
"VElement[name='div']"(node) {
context.report({ node, message: "OK" })
},
}))

const messages1 = linter.verify(code, config)
const messages2 = linter.verify(linter.getSourceCode(), config)

assert.equal(messages1.length, 1)
assert.equal(messages1[0].message, "OK")
assert.equal(messages2.length, 1)
assert.equal(messages1[0].message, "OK")
})
})
})

0 comments on commit 812fd21

Please sign in to comment.