Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / ARES-6 / Babylon / babylon-blob.js
1 /*
2  * Copyright (C) 2012-2014 by various contributors (see AUTHORS)
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a copy
5  * of this software and associated documentation files (the "Software"), to deal
6  * in the Software without restriction, including without limitation the rights
7  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8  * copies of the Software, and to permit persons to whom the Software is
9  * furnished to do so, subject to the following conditions:
10  * 
11  * The above copyright notice and this permission notice shall be included in
12  * all copies or substantial portions of the Software.
13  * 
14  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20  * THE SOFTWARE.
21 */
22
23 import { reservedWords } from "../util/identifier";
24 import { getOptions } from "../options";
25 import Tokenizer from "../tokenizer";
26
27 export const plugins = {};
28
29 export default class Parser extends Tokenizer {
30   constructor(options, input) {
31     options = getOptions(options);
32     super(options, input);
33
34     this.options = options;
35     this.inModule = this.options.sourceType === "module";
36     this.input = input;
37     this.plugins = this.loadPlugins(this.options.plugins);
38     this.filename = options.sourceFilename;
39
40     // If enabled, skip leading hashbang line.
41     if (this.state.pos === 0 && this.input[0] === "#" && this.input[1] === "!") {
42       this.skipLineComment(2);
43     }
44   }
45
46   isReservedWord(word) {
47     if (word === "await") {
48       return this.inModule;
49     } else {
50       return reservedWords[6](word);
51     }
52   }
53
54   hasPlugin(name) {
55     return !!this.plugins[name];
56   }
57
58   extend(name, f) {
59     this[name] = f(this[name]);
60   }
61
62   loadPlugins(pluginList) {
63     const pluginMap = {};
64
65     if (pluginList.indexOf("flow") >= 0) {
66       // ensure flow plugin loads last
67       pluginList = pluginList.filter((plugin) => plugin !== "flow");
68       pluginList.push("flow");
69     }
70
71     if (pluginList.indexOf("estree") >= 0) {
72       // ensure estree plugin loads first
73       pluginList = pluginList.filter((plugin) => plugin !== "estree");
74       pluginList.unshift("estree");
75     }
76
77     for (const name of pluginList) {
78       if (!pluginMap[name]) {
79         pluginMap[name] = true;
80
81         const plugin = plugins[name];
82         if (plugin) plugin(this);
83       }
84     }
85
86     return pluginMap;
87   }
88
89   parse() {
90     const file = this.startNode();
91     const program = this.startNode();
92     this.nextToken();
93     return this.parseTopLevel(file, program);
94   }
95 }