Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / NameFinder.js
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25 "use strict";
26
27 class NameFinder extends Visitor {
28     constructor()
29     {
30         super();
31         this._set = new Set();
32         this._worklist = [];
33     }
34     
35     get set() { return this._set; }
36     get worklist() { return this._worklist; }
37     
38     add(name)
39     {
40         if (this._set.has(name))
41             return;
42         this._set.add(name);
43         this._worklist.push(name);
44     }
45     
46     visitProtocolRef(node)
47     {
48         this.add(node.name);
49         super.visitProtocolRef(node);
50     }
51     
52     visitTypeRef(node)
53     {
54         this.add(node.name);
55         super.visitTypeRef(node);
56     }
57     
58     visitVariableRef(node)
59     {
60         this.add(node.name);
61         super.visitVariableRef(node);
62     }
63     
64     visitTypeOrVariableRef(node)
65     {
66         this.add(node.name);
67     }
68
69     _handlePropertyAccess(node)
70     {
71         this.add(node.getFuncName);
72         this.add(node.setFuncName);
73         this.add(node.andFuncName);
74     }
75     
76     visitDotExpression(node)
77     {
78         this._handlePropertyAccess(node);
79         super.visitDotExpression(node);
80     }
81     
82     visitIndexExpression(node)
83     {
84         this._handlePropertyAccess(node);
85         super.visitIndexExpression(node);
86     }
87     
88     visitCallExpression(node)
89     {
90         this.add(node.name);
91         super.visitCallExpression(node);
92     }
93 }
94