Make JetStream 2
[WebKit-https.git] / PerformanceTests / JetStream2 / WSL / StatementCloner.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 StatementCloner extends Rewriter {
28     visitFuncDef(node)
29     {
30         let typeParameters = node.typeParameters.map(typeParameter => typeParameter.visit(this));
31         let result = new FuncDef(
32             node.origin, node.name,
33             node.returnType.visit(this),
34             typeParameters,
35             node.parameters.map(parameter => parameter.visit(this)),
36             node.body.visit(this),
37             node.isCast, node.shaderType);
38         result.isRestricted = node.isRestricted;
39         return result;
40     }
41     
42     visitNativeFunc(node)
43     {
44         let result = new NativeFunc(
45             node.origin, node.name,
46             node.returnType.visit(this),
47             node.typeParameters.map(typeParameter => typeParameter.visit(this)),
48             node.parameters.map(parameter => parameter.visit(this)),
49             node.isCast, node.shaderType);
50         result.isRestricted = node.isRestricted;
51         return result;
52     }
53     
54     visitNativeType(node)
55     {
56         return new NativeType(
57             node.origin, node.name, node.typeParameters.map(typeParameter => typeParameter.visit(this)));
58     }
59     
60     visitTypeDef(node)
61     {
62         return new TypeDef(
63             node.origin, node.name,
64             node.typeParameters.map(typeParameter => typeParameter.visit(this)),
65             node.type.visit(this));
66     }
67     
68     visitStructType(node)
69     {
70         let result = new StructType(
71             node.origin, node.name,
72             node.typeParameters.map(typeParameter => typeParameter.visit(this)));
73         for (let field of node.fields)
74             result.add(field.visit(this));
75         return result;
76     }
77     
78     visitConstexprTypeParameter(node)
79     {
80         return new ConstexprTypeParameter(node.origin, node.name, node.type.visit(this));
81     }
82     
83     visitProtocolDecl(node)
84     {
85         let result = new ProtocolDecl(node.origin, node.name);
86         for (let protocol of node.extends)
87             result.addExtends(protocol.visit(this));
88         for (let signature of node.signatures)
89             result.add(signature.visit(this));
90         return result;
91     }
92
93     visitTypeVariable(node)
94     {
95         return new TypeVariable(node.origin, node.name, Node.visit(node.protocol, this));
96     }
97     
98     visitProtocolRef(node)
99     {
100         return new ProtocolRef(node.origin, node.name);
101     }
102     
103     visitBoolLiteral(node)
104     {
105         return new BoolLiteral(node.origin, node.value);
106     }
107     
108     visitTypeOrVariableRef(node)
109     {
110         return new TypeOrVariableRef(node.origin, node.name);
111     }
112     
113     visitEnumType(node)
114     {
115         let result = new EnumType(node.origin, node.name, node.baseType.visit(this));
116         for (let member of node.members)
117             result.add(member);
118         return result;
119     }
120 }
121