1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/browser/devtools/debugger/test/browser_dbg_parser-08.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,289 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +/** 1.8 + * Test that inferring anonymous function information is done correctly. 1.9 + */ 1.10 + 1.11 +function test() { 1.12 + let { Parser, ParserHelpers, SyntaxTreeVisitor } = 1.13 + Cu.import("resource:///modules/devtools/Parser.jsm", {}); 1.14 + 1.15 + function verify(source, predicate, details) { 1.16 + let { name, chain } = details; 1.17 + let [[sline, scol], [eline, ecol]] = details.loc; 1.18 + let ast = Parser.reflectionAPI.parse(source); 1.19 + let node = SyntaxTreeVisitor.filter(ast, predicate).pop(); 1.20 + let info = ParserHelpers.inferFunctionExpressionInfo(node); 1.21 + 1.22 + is(info.name, name, 1.23 + "The function expression assignment property name is correct."); 1.24 + is(chain ? info.chain.toSource() : info.chain, chain ? chain.toSource() : chain, 1.25 + "The function expression assignment property chain is correct."); 1.26 + is(info.loc.start.toSource(), { line: sline, column: scol }.toSource(), 1.27 + "The start location was correct for the identifier in: '" + source + "'."); 1.28 + is(info.loc.end.toSource(), { line: eline, column: ecol }.toSource(), 1.29 + "The end location was correct for the identifier in: '" + source + "'."); 1.30 + } 1.31 + 1.32 + // VariableDeclarator 1.33 + 1.34 + verify("var foo=function(){}", e => e.type == "FunctionExpression", { 1.35 + name: "foo", 1.36 + chain: null, 1.37 + loc: [[1, 4], [1, 7]] 1.38 + }); 1.39 + verify("\nvar\nfoo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", { 1.40 + name: "foo", 1.41 + chain: null, 1.42 + loc: [[3, 0], [3, 3]] 1.43 + }); 1.44 + 1.45 + // AssignmentExpression 1.46 + 1.47 + verify("foo=function(){}", e => e.type == "FunctionExpression", 1.48 + { name: "foo", chain: [], loc: [[1, 0], [1, 3]] }); 1.49 + 1.50 + verify("\nfoo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", 1.51 + { name: "foo", chain: [], loc: [[2, 0], [2, 3]] }); 1.52 + 1.53 + verify("foo.bar=function(){}", e => e.type == "FunctionExpression", 1.54 + { name: "bar", chain: ["foo"], loc: [[1, 0], [1, 7]] }); 1.55 + 1.56 + verify("\nfoo.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", 1.57 + { name: "bar", chain: ["foo"], loc: [[2, 0], [2, 7]] }); 1.58 + 1.59 + verify("this.foo=function(){}", e => e.type == "FunctionExpression", 1.60 + { name: "foo", chain: ["this"], loc: [[1, 0], [1, 8]] }); 1.61 + 1.62 + verify("\nthis.foo\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", 1.63 + { name: "foo", chain: ["this"], loc: [[2, 0], [2, 8]] }); 1.64 + 1.65 + verify("this.foo.bar=function(){}", e => e.type == "FunctionExpression", 1.66 + { name: "bar", chain: ["this", "foo"], loc: [[1, 0], [1, 12]] }); 1.67 + 1.68 + verify("\nthis.foo.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", 1.69 + { name: "bar", chain: ["this", "foo"], loc: [[2, 0], [2, 12]] }); 1.70 + 1.71 + verify("foo.this.bar=function(){}", e => e.type == "FunctionExpression", 1.72 + { name: "bar", chain: ["foo", "this"], loc: [[1, 0], [1, 12]] }); 1.73 + 1.74 + verify("\nfoo.this.bar\n=\nfunction\n(\n)\n{\n}\n", e => e.type == "FunctionExpression", 1.75 + { name: "bar", chain: ["foo", "this"], loc: [[2, 0], [2, 12]] }); 1.76 + 1.77 + // ObjectExpression 1.78 + 1.79 + verify("({foo:function(){}})", e => e.type == "FunctionExpression", 1.80 + { name: "foo", chain: [], loc: [[1, 2], [1, 5]] }); 1.81 + 1.82 + verify("(\n{\nfoo\n:\nfunction\n(\n)\n{\n}\n}\n)", e => e.type == "FunctionExpression", 1.83 + { name: "foo", chain: [], loc: [[3, 0], [3, 3]] }); 1.84 + 1.85 + verify("({foo:{bar:function(){}}})", e => e.type == "FunctionExpression", 1.86 + { name: "bar", chain: ["foo"], loc: [[1, 7], [1, 10]] }); 1.87 + 1.88 + verify("(\n{\nfoo\n:\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n}\n)", e => e.type == "FunctionExpression", 1.89 + { name: "bar", chain: ["foo"], loc: [[6, 0], [6, 3]] }); 1.90 + 1.91 + // AssignmentExpression + ObjectExpression 1.92 + 1.93 + verify("foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.94 + { name: "bar", chain: ["foo"], loc: [[1, 5], [1, 8]] }); 1.95 + 1.96 + verify("\nfoo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.97 + { name: "bar", chain: ["foo"], loc: [[5, 0], [5, 3]] }); 1.98 + 1.99 + verify("foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.100 + { name: "baz", chain: ["foo", "bar"], loc: [[1, 10], [1, 13]] }); 1.101 + 1.102 + verify("\nfoo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.103 + { name: "baz", chain: ["foo", "bar"], loc: [[8, 0], [8, 3]] }); 1.104 + 1.105 + verify("nested.foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.106 + { name: "bar", chain: ["nested", "foo"], loc: [[1, 12], [1, 15]] }); 1.107 + 1.108 + verify("\nnested.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.109 + { name: "bar", chain: ["nested", "foo"], loc: [[5, 0], [5, 3]] }); 1.110 + 1.111 + verify("nested.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.112 + { name: "baz", chain: ["nested", "foo", "bar"], loc: [[1, 17], [1, 20]] }); 1.113 + 1.114 + verify("\nnested.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.115 + { name: "baz", chain: ["nested", "foo", "bar"], loc: [[8, 0], [8, 3]] }); 1.116 + 1.117 + verify("this.foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.118 + { name: "bar", chain: ["this", "foo"], loc: [[1, 10], [1, 13]] }); 1.119 + 1.120 + verify("\nthis.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.121 + { name: "bar", chain: ["this", "foo"], loc: [[5, 0], [5, 3]] }); 1.122 + 1.123 + verify("this.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.124 + { name: "baz", chain: ["this", "foo", "bar"], loc: [[1, 15], [1, 18]] }); 1.125 + 1.126 + verify("\nthis.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.127 + { name: "baz", chain: ["this", "foo", "bar"], loc: [[8, 0], [8, 3]] }); 1.128 + 1.129 + verify("this.nested.foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.130 + { name: "bar", chain: ["this", "nested", "foo"], loc: [[1, 17], [1, 20]] }); 1.131 + 1.132 + verify("\nthis.nested.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.133 + { name: "bar", chain: ["this", "nested", "foo"], loc: [[5, 0], [5, 3]] }); 1.134 + 1.135 + verify("this.nested.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.136 + { name: "baz", chain: ["this", "nested", "foo", "bar"], loc: [[1, 22], [1, 25]] }); 1.137 + 1.138 + verify("\nthis.nested.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.139 + { name: "baz", chain: ["this", "nested", "foo", "bar"], loc: [[8, 0], [8, 3]] }); 1.140 + 1.141 + verify("nested.this.foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.142 + { name: "bar", chain: ["nested", "this", "foo"], loc: [[1, 17], [1, 20]] }); 1.143 + 1.144 + verify("\nnested.this.foo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.145 + { name: "bar", chain: ["nested", "this", "foo"], loc: [[5, 0], [5, 3]] }); 1.146 + 1.147 + verify("nested.this.foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.148 + { name: "baz", chain: ["nested", "this", "foo", "bar"], loc: [[1, 22], [1, 25]] }); 1.149 + 1.150 + verify("\nnested.this.foo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.151 + { name: "baz", chain: ["nested", "this", "foo", "bar"], loc: [[8, 0], [8, 3]] }); 1.152 + 1.153 + // VariableDeclarator + AssignmentExpression + ObjectExpression 1.154 + 1.155 + verify("let foo={bar:function(){}}", e => e.type == "FunctionExpression", 1.156 + { name: "bar", chain: ["foo"], loc: [[1, 9], [1, 12]] }); 1.157 + 1.158 + verify("\nlet\nfoo\n=\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n", e => e.type == "FunctionExpression", 1.159 + { name: "bar", chain: ["foo"], loc: [[6, 0], [6, 3]] }); 1.160 + 1.161 + verify("let foo={bar:{baz:function(){}}}", e => e.type == "FunctionExpression", 1.162 + { name: "baz", chain: ["foo", "bar"], loc: [[1, 14], [1, 17]] }); 1.163 + 1.164 + verify("\nlet\nfoo\n=\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n", e => e.type == "FunctionExpression", 1.165 + { name: "baz", chain: ["foo", "bar"], loc: [[9, 0], [9, 3]] }); 1.166 + 1.167 + // New/CallExpression + AssignmentExpression + ObjectExpression 1.168 + 1.169 + verify("foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.170 + { name: "bar", chain: [], loc: [[1, 5], [1, 8]] }); 1.171 + 1.172 + verify("\nfoo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.173 + { name: "bar", chain: [], loc: [[5, 0], [5, 3]] }); 1.174 + 1.175 + verify("foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.176 + { name: "baz", chain: ["bar"], loc: [[1, 10], [1, 13]] }); 1.177 + 1.178 + verify("\nfoo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.179 + { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] }); 1.180 + 1.181 + verify("nested.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.182 + { name: "bar", chain: [], loc: [[1, 12], [1, 15]] }); 1.183 + 1.184 + verify("\nnested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.185 + { name: "bar", chain: [], loc: [[5, 0], [5, 3]] }); 1.186 + 1.187 + verify("nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.188 + { name: "baz", chain: ["bar"], loc: [[1, 17], [1, 20]] }); 1.189 + 1.190 + verify("\nnested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.191 + { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] }); 1.192 + 1.193 + verify("this.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.194 + { name: "bar", chain: [], loc: [[1, 10], [1, 13]] }); 1.195 + 1.196 + verify("\nthis.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.197 + { name: "bar", chain: [], loc: [[5, 0], [5, 3]] }); 1.198 + 1.199 + verify("this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.200 + { name: "baz", chain: ["bar"], loc: [[1, 15], [1, 18]] }); 1.201 + 1.202 + verify("\nthis.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.203 + { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] }); 1.204 + 1.205 + verify("this.nested.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.206 + { name: "bar", chain: [], loc: [[1, 17], [1, 20]] }); 1.207 + 1.208 + verify("\nthis.nested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.209 + { name: "bar", chain: [], loc: [[5, 0], [5, 3]] }); 1.210 + 1.211 + verify("this.nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.212 + { name: "baz", chain: ["bar"], loc: [[1, 22], [1, 25]] }); 1.213 + 1.214 + verify("\nthis.nested.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.215 + { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] }); 1.216 + 1.217 + verify("nested.this.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.218 + { name: "bar", chain: [], loc: [[1, 17], [1, 20]] }); 1.219 + 1.220 + verify("\nnested.this.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.221 + { name: "bar", chain: [], loc: [[5, 0], [5, 3]] }); 1.222 + 1.223 + verify("nested.this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.224 + { name: "baz", chain: ["bar"], loc: [[1, 22], [1, 25]] }); 1.225 + 1.226 + verify("\nnested.this.foo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.227 + { name: "baz", chain: ["bar"], loc: [[8, 0], [8, 3]] }); 1.228 + 1.229 + // New/CallExpression + VariableDeclarator + AssignmentExpression + ObjectExpression 1.230 + 1.231 + verify("let target=foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.232 + { name: "bar", chain: ["target"], loc: [[1, 16], [1, 19]] }); 1.233 + 1.234 + verify("\nlet\ntarget=\nfoo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.235 + { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] }); 1.236 + 1.237 + verify("let target=foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.238 + { name: "baz", chain: ["target", "bar"], loc: [[1, 21], [1, 24]] }); 1.239 + 1.240 + verify("\nlet\ntarget=\nfoo\n(\n{\nbar\n:\n{\nbaz\n:\nfunction\n(\n)\n{\n}\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.241 + { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] }); 1.242 + 1.243 + verify("let target=nested.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.244 + { name: "bar", chain: ["target"], loc: [[1, 23], [1, 26]] }); 1.245 + 1.246 + verify("\nlet\ntarget=\nnested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.247 + { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] }); 1.248 + 1.249 + verify("let target=nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.250 + { name: "baz", chain: ["target", "bar"], loc: [[1, 28], [1, 31]] }); 1.251 + 1.252 + 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", 1.253 + { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] }); 1.254 + 1.255 + verify("let target=this.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.256 + { name: "bar", chain: ["target"], loc: [[1, 21], [1, 24]] }); 1.257 + 1.258 + verify("\nlet\ntarget=\nthis.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.259 + { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] }); 1.260 + 1.261 + verify("let target=this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.262 + { name: "baz", chain: ["target", "bar"], loc: [[1, 26], [1, 29]] }); 1.263 + 1.264 + 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", 1.265 + { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] }); 1.266 + 1.267 + verify("let target=this.nested.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.268 + { name: "bar", chain: ["target"], loc: [[1, 28], [1, 31]] }); 1.269 + 1.270 + verify("\nlet\ntarget=\nthis.nested.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.271 + { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] }); 1.272 + 1.273 + verify("let target=this.nested.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.274 + { name: "baz", chain: ["target", "bar"], loc: [[1, 33], [1, 36]] }); 1.275 + 1.276 + 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", 1.277 + { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] }); 1.278 + 1.279 + verify("let target=nested.this.foo({bar:function(){}})", e => e.type == "FunctionExpression", 1.280 + { name: "bar", chain: ["target"], loc: [[1, 28], [1, 31]] }); 1.281 + 1.282 + verify("\nlet\ntarget=\nnested.this.foo\n(\n{\nbar\n:\nfunction\n(\n)\n{\n}\n}\n)\n", e => e.type == "FunctionExpression", 1.283 + { name: "bar", chain: ["target"], loc: [[7, 0], [7, 3]] }); 1.284 + 1.285 + verify("let target=nested.this.foo({bar:{baz:function(){}}})", e => e.type == "FunctionExpression", 1.286 + { name: "baz", chain: ["target", "bar"], loc: [[1, 33], [1, 36]] }); 1.287 + 1.288 + 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", 1.289 + { name: "baz", chain: ["target", "bar"], loc: [[10, 0], [10, 3]] }); 1.290 + 1.291 + finish(); 1.292 +}