1 |
|
2 |
|
3 |
|
4 | var fs = require("fs")
|
5 | var esprima = require("esprima")
|
6 | var jsTokens = require("./")
|
7 |
|
8 |
|
9 | var typeMap = {
|
10 | Boolean: "name",
|
11 | Identifier: "name",
|
12 | Keyword: "name",
|
13 | Null: "name",
|
14 | Numeric: "number",
|
15 | Punctuator: "punctuator",
|
16 | RegularExpression: "regex",
|
17 | String: "string"
|
18 | }
|
19 |
|
20 | function getEsprimaTokens(code) {
|
21 | var tokens = esprima.tokenize(code, {loc: true})
|
22 | tokens.forEach(function(token) { token.type = typeMap[token.type] })
|
23 | return tokens
|
24 | }
|
25 |
|
26 |
|
27 | function jsTokensTokenize(string) {
|
28 | jsTokens.lastIndex = 0
|
29 | if (string === "") return []
|
30 | var tokens = []
|
31 | var match
|
32 | while (match = jsTokens.exec(string)) {
|
33 | tokens.push(jsTokens.matchToToken(match))
|
34 | }
|
35 | return tokens
|
36 | }
|
37 |
|
38 | var exclusionMap = {
|
39 | comment: true,
|
40 | whitespace: true
|
41 | }
|
42 |
|
43 | function getJsTokensTokens(code) {
|
44 | return jsTokensTokenize(code)
|
45 | .filter(function(token) { return !exclusionMap.hasOwnProperty(token.type) })
|
46 | }
|
47 |
|
48 |
|
49 | function compare(file) {
|
50 | var code = fs.readFileSync(require.resolve(file)).toString()
|
51 | var esprimaTokens = getEsprimaTokens(code)
|
52 | var jsTokensTokens = getJsTokensTokens(code)
|
53 |
|
54 | var length = Math.min(esprimaTokens.length, jsTokensTokens.length)
|
55 | for (var index = 0; index < length; index++) {
|
56 | var esprimaToken = esprimaTokens[index]
|
57 | var jsTokensToken = jsTokensTokens[index]
|
58 | if (
|
59 | esprimaToken.type !== jsTokensToken.type ||
|
60 | esprimaToken.value !== jsTokensToken.value
|
61 | ) {
|
62 | var loc = esprimaToken.loc.start
|
63 | console.error(
|
64 | file + ":" + loc.line + ":" + (loc.column + 1) + ": " +
|
65 | "(token #" + (index + 1) + ")\n" +
|
66 | " esprima: '" + esprimaToken.type + "': " + esprimaToken.value + "\n" +
|
67 | " jsTokens: '" + jsTokensToken.type + "': " + jsTokensToken.value
|
68 | )
|
69 | return false
|
70 | }
|
71 | }
|
72 |
|
73 | if (esprimaTokens.length !== jsTokensTokens.length) {
|
74 | console.error(
|
75 | file + ': Number of tokens mismatch.\n' +
|
76 | " esprima: " + (esprimaTokens.length + 1) + "\n" +
|
77 | " jsTokens: " + (jsTokensTokens.length + 1)
|
78 | )
|
79 | return false
|
80 | }
|
81 |
|
82 | return true
|
83 | }
|
84 |
|
85 |
|
86 | var results = process.argv.slice(2).map(compare)
|
87 |
|
88 | if (results.every(Boolean)) {
|
89 | console.log(
|
90 | "Comparison succeeded: esprima and jsTokens produced the same tokens!"
|
91 | )
|
92 | } else {
|
93 | console.error("Comparison failed.")
|
94 | }
|