Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 /* Any copyright is dedicated to the Public Domain.
2 http://creativecommons.org/publicdomain/zero/1.0/ */
4 /**
5 * Test that inferring anonymous function information is done correctly.
6 */
8 function test() {
9 let { Parser, ParserHelpers, SyntaxTreeVisitor } =
10 Cu.import("resource:///modules/devtools/Parser.jsm", {});
12 function verify(source, predicate, details) {
13 let { name, chain } = details;
14 let [[sline, scol], [eline, ecol]] = details.loc;
15 let ast = Parser.reflectionAPI.parse(source);
16 let node = SyntaxTreeVisitor.filter(ast, predicate).pop();
17 let info = ParserHelpers.inferFunctionExpressionInfo(node);
19 is(info.name, name,
20 "The function expression assignment property name is correct.");
21 is(chain ? info.chain.toSource() : info.chain, chain ? chain.toSource() : chain,
22 "The function expression assignment property chain is correct.");
23 is(info.loc.start.toSource(), { line: sline, column: scol }.toSource(),
24 "The start location was correct for the identifier in: '" + source + "'.");
25 is(info.loc.end.toSource(), { line: eline, column: ecol }.toSource(),
26 "The end location was correct for the identifier in: '" + source + "'.");
27 }
29 // VariableDeclarator
31 verify("var foo=function(){}", e => e.type == "FunctionExpression", {
32 name: "foo",
33 chain: null,
34 loc: [[1, 4], [1, 7]]
35 });
36 verify("\nvar\nfoo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", {
37 name: "foo",
38 chain: null,
39 loc: [[3, 0], [3, 3]]
40 });
42 // AssignmentExpression
44 verify("foo=function(){}", e => e.type == "FunctionExpression",
45 { name: "foo", chain: [], loc: [[1, 0], [1, 3]] });
47 verify("\nfoo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression",
48 { name: "foo", chain: [], loc: [[2, 0], [2, 3]] });
50 verify("foo.bar=function(){}", e => e.type == "FunctionExpression",
51 { name: "bar", chain: ["foo"], loc: [[1, 0], [1, 7]] });
53 verify("\nfoo.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression",
54 { name: "bar", chain: ["foo"], loc: [[2, 0], [2, 7]] });
56 verify("this.foo=function(){}", e => e.type == "FunctionExpression",
57 { name: "foo", chain: ["this"], loc: [[1, 0], [1, 8]] });
59 verify("\nthis.foo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression",
60 { name: "foo", chain: ["this"], loc: [[2, 0], [2, 8]] });
62 verify("this.foo.bar=function(){}", e => e.type == "FunctionExpression",
63 { name: "bar", chain: ["this", "foo"], loc: [[1, 0], [1, 12]] });
65 verify("\nthis.foo.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression",
66 { name: "bar", chain: ["this", "foo"], loc: [[2, 0], [2, 12]] });
68 verify("foo.this.bar=function(){}", e => e.type == "FunctionExpression",
69 { name: "bar", chain: ["foo", "this"], loc: [[1, 0], [1, 12]] });
71 verify("\nfoo.this.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression",
72 { name: "bar", chain: ["foo", "this"], loc: [[2, 0], [2, 12]] });
74 // ObjectExpression
76 verify("({foo:function(){}})", e => e.type == "FunctionExpression",
77 { name: "foo", chain: [], loc: [[1, 2], [1, 5]] });
79 verify("(\n{\nfoo\n:\nfunction\n(\n)\n{\n}\n}\n)", e => e.type == "FunctionExpression",
80 { name: "foo", chain: [], loc: [[3, 0], [3, 3]] });
82 verify("({foo:{bar:function(){}}})", e => e.type == "FunctionExpression",
83 { name: "bar", chain: ["foo"], loc: [[1, 7], [1, 10]] });
85 verify("(\n{\nfoo\n:\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n}\n)", e => e.type == "FunctionExpression",
86 { name: "bar", chain: ["foo"], loc: [[6, 0], [6, 3]] });
88 // AssignmentExpression + ObjectExpression
90 verify("foo={bar:function(){}}", e => e.type == "FunctionExpression",
91 { name: "bar", chain: ["foo"], loc: [[1, 5], [1, 8]] });
93 verify("\nfoo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
94 { name: "bar", chain: ["foo"], loc: [[5, 0], [5, 3]] });
96 verify("foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
97 { name: "baz", chain: ["foo", "bar"], loc: [[1, 10], [1, 13]] });
99 verify("\nfoo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
100 { name: "baz", chain: ["foo", "bar"], loc: [[8, 0], [8, 3]] });
102 verify("nested.foo={bar:function(){}}", e => e.type == "FunctionExpression",
103 { name: "bar", chain: ["nested", "foo"], loc: [[1, 12], [1, 15]] });
105 verify("\nnested.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
106 { name: "bar", chain: ["nested", "foo"], loc: [[5, 0], [5, 3]] });
108 verify("nested.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
109 { name: "baz", chain: ["nested", "foo", "bar"], loc: [[1, 17], [1, 20]] });
111 verify("\nnested.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
112 { name: "baz", chain: ["nested", "foo", "bar"], loc: [[8, 0], [8, 3]] });
114 verify("this.foo={bar:function(){}}", e => e.type == "FunctionExpression",
115 { name: "bar", chain: ["this", "foo"], loc: [[1, 10], [1, 13]] });
117 verify("\nthis.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
118 { name: "bar", chain: ["this", "foo"], loc: [[5, 0], [5, 3]] });
120 verify("this.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
121 { name: "baz", chain: ["this", "foo", "bar"], loc: [[1, 15], [1, 18]] });
123 verify("\nthis.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
124 { name: "baz", chain: ["this", "foo", "bar"], loc: [[8, 0], [8, 3]] });
126 verify("this.nested.foo={bar:function(){}}", e => e.type == "FunctionExpression",
127 { name: "bar", chain: ["this", "nested", "foo"], loc: [[1, 17], [1, 20]] });
129 verify("\nthis.nested.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
130 { name: "bar", chain: ["this", "nested", "foo"], loc: [[5, 0], [5, 3]] });
132 verify("this.nested.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
133 { name: "baz", chain: ["this", "nested", "foo", "bar"], loc: [[1, 22], [1, 25]] });
135 verify("\nthis.nested.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
136 { name: "baz", chain: ["this", "nested", "foo", "bar"], loc: [[8, 0], [8, 3]] });
138 verify("nested.this.foo={bar:function(){}}", e => e.type == "FunctionExpression",
139 { name: "bar", chain: ["nested", "this", "foo"], loc: [[1, 17], [1, 20]] });
141 verify("\nnested.this.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
142 { name: "bar", chain: ["nested", "this", "foo"], loc: [[5, 0], [5, 3]] });
144 verify("nested.this.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
145 { name: "baz", chain: ["nested", "this", "foo", "bar"], loc: [[1, 22], [1, 25]] });
147 verify("\nnested.this.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
148 { name: "baz", chain: ["nested", "this", "foo", "bar"], loc: [[8, 0], [8, 3]] });
150 // VariableDeclarator + AssignmentExpression + ObjectExpression
152 verify("let foo={bar:function(){}}", e => e.type == "FunctionExpression",
153 { name: "bar", chain: ["foo"], loc: [[1, 9], [1, 12]] });
155 verify("\nlet\nfoo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression",
156 { name: "bar", chain: ["foo"], loc: [[6, 0], [6, 3]] });
158 verify("let foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression",
159 { name: "baz", chain: ["foo", "bar"], loc: [[1, 14], [1, 17]] });
161 verify("\nlet\nfoo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression",
162 { name: "baz", chain: ["foo", "bar"], loc: [[9, 0], [9, 3]] });
164 // New/CallExpression + AssignmentExpression + ObjectExpression
166 verify("foo({bar:function(){}})", e => e.type == "FunctionExpression",
167 { name: "bar", chain: [], loc: [[1, 5], [1, 8]] });
169 verify("\nfoo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
170 { name: "bar", chain: [], loc: [[5, 0], [5, 3]] });
172 verify("foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
173 { name: "baz", chain: ["bar"], loc: [[1, 10], [1, 13]] });
175 verify("\nfoo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
176 { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] });
178 verify("nested.foo({bar:function(){}})", e => e.type == "FunctionExpression",
179 { name: "bar", chain: [], loc: [[1, 12], [1, 15]] });
181 verify("\nnested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
182 { name: "bar", chain: [], loc: [[5, 0], [5, 3]] });
184 verify("nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
185 { name: "baz", chain: ["bar"], loc: [[1, 17], [1, 20]] });
187 verify("\nnested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
188 { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] });
190 verify("this.foo({bar:function(){}})", e => e.type == "FunctionExpression",
191 { name: "bar", chain: [], loc: [[1, 10], [1, 13]] });
193 verify("\nthis.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
194 { name: "bar", chain: [], loc: [[5, 0], [5, 3]] });
196 verify("this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
197 { name: "baz", chain: ["bar"], loc: [[1, 15], [1, 18]] });
199 verify("\nthis.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
200 { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] });
202 verify("this.nested.foo({bar:function(){}})", e => e.type == "FunctionExpression",
203 { name: "bar", chain: [], loc: [[1, 17], [1, 20]] });
205 verify("\nthis.nested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
206 { name: "bar", chain: [], loc: [[5, 0], [5, 3]] });
208 verify("this.nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
209 { name: "baz", chain: ["bar"], loc: [[1, 22], [1, 25]] });
211 verify("\nthis.nested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
212 { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] });
214 verify("nested.this.foo({bar:function(){}})", e => e.type == "FunctionExpression",
215 { name: "bar", chain: [], loc: [[1, 17], [1, 20]] });
217 verify("\nnested.this.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
218 { name: "bar", chain: [], loc: [[5, 0], [5, 3]] });
220 verify("nested.this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
221 { name: "baz", chain: ["bar"], loc: [[1, 22], [1, 25]] });
223 verify("\nnested.this.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
224 { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] });
226 // New/CallExpression + VariableDeclarator + AssignmentExpression + ObjectExpression
228 verify("let target=foo({bar:function(){}})", e => e.type == "FunctionExpression",
229 { name: "bar", chain: ["target"], loc: [[1, 16], [1, 19]] });
231 verify("\nlet\ntarget=\nfoo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
232 { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] });
234 verify("let target=foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
235 { name: "baz", chain: ["target", "bar"], loc: [[1, 21], [1, 24]] });
237 verify("\nlet\ntarget=\nfoo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
238 { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] });
240 verify("let target=nested.foo({bar:function(){}})", e => e.type == "FunctionExpression",
241 { name: "bar", chain: ["target"], loc: [[1, 23], [1, 26]] });
243 verify("\nlet\ntarget=\nnested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
244 { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] });
246 verify("let target=nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
247 { name: "baz", chain: ["target", "bar"], loc: [[1, 28], [1, 31]] });
249 verify("\nlet\ntarget=\nnested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
250 { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] });
252 verify("let target=this.foo({bar:function(){}})", e => e.type == "FunctionExpression",
253 { name: "bar", chain: ["target"], loc: [[1, 21], [1, 24]] });
255 verify("\nlet\ntarget=\nthis.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
256 { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] });
258 verify("let target=this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
259 { name: "baz", chain: ["target", "bar"], loc: [[1, 26], [1, 29]] });
261 verify("\nlet\ntarget=\nthis.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
262 { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] });
264 verify("let target=this.nested.foo({bar:function(){}})", e => e.type == "FunctionExpression",
265 { name: "bar", chain: ["target"], loc: [[1, 28], [1, 31]] });
267 verify("\nlet\ntarget=\nthis.nested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
268 { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] });
270 verify("let target=this.nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
271 { name: "baz", chain: ["target", "bar"], loc: [[1, 33], [1, 36]] });
273 verify("\nlet\ntarget=\nthis.nested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
274 { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] });
276 verify("let target=nested.this.foo({bar:function(){}})", e => e.type == "FunctionExpression",
277 { name: "bar", chain: ["target"], loc: [[1, 28], [1, 31]] });
279 verify("\nlet\ntarget=\nnested.this.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression",
280 { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] });
282 verify("let target=nested.this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression",
283 { name: "baz", chain: ["target", "bar"], loc: [[1, 33], [1, 36]] });
285 verify("\nlet\ntarget=\nnested.this.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression",
286 { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] });
288 finish();
289 }