1/*
2 * Copyright (C) 2019 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. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#pragma once
27
28#if ENABLE(WEBGPU)
29
30#include "WHLSLFunctionAttribute.h"
31#include "WHLSLSemantic.h"
32#include "WHLSLTypeArgument.h"
33
34namespace WebCore {
35
36namespace WHLSL {
37
38class Program;
39
40namespace AST {
41
42class TypeDefinition;
43class StructureDefinition;
44class EnumerationDefinition;
45class FunctionDefinition;
46class NativeFunctionDeclaration;
47class NativeTypeDeclaration;
48class TypeReference;
49class PointerType;
50class ArrayReferenceType;
51class ArrayType;
52class StructureElement;
53class EnumerationMember;
54class FunctionDeclaration;
55class ReferenceType;
56class ConstantExpression;
57class BuiltInSemantic;
58class ResourceSemantic;
59class SpecializationConstantSemantic;
60class StageInOutSemantic;
61class IntegerLiteral;
62class UnsignedIntegerLiteral;
63class FloatLiteral;
64class NullLiteral;
65class BooleanLiteral;
66class EnumerationMemberLiteral;
67class NumThreadsFunctionAttribute;
68class Block;
69class Statement;
70class Break;
71class Continue;
72class DoWhileLoop;
73class Expression;
74class DotExpression;
75class IndexExpression;
76class PropertyAccessExpression;
77class EffectfulExpressionStatement;
78class Fallthrough;
79class ForLoop;
80class IfStatement;
81class Return;
82class SwitchCase;
83class SwitchStatement;
84class Trap;
85class VariableDeclarationsStatement;
86class WhileLoop;
87class VariableDeclaration;
88class AssignmentExpression;
89class CallExpression;
90class CommaExpression;
91class DereferenceExpression;
92class LogicalExpression;
93class LogicalNotExpression;
94class MakeArrayReferenceExpression;
95class MakePointerExpression;
96class ReadModifyWriteExpression;
97class TernaryExpression;
98class VariableReference;
99class UnnamedType;
100class NamedType;
101
102}
103
104class Visitor {
105public:
106 virtual ~Visitor() = default;
107
108 // FIXME: Add a way to visit a const Program
109
110 virtual void visit(Program&);
111 virtual void visit(AST::UnnamedType&);
112 virtual void visit(AST::NamedType&);
113 virtual void visit(AST::TypeDefinition&);
114 virtual void visit(AST::StructureDefinition&);
115 virtual void visit(AST::EnumerationDefinition&);
116 virtual void visit(AST::FunctionDefinition&);
117 virtual void visit(AST::NativeFunctionDeclaration&);
118 virtual void visit(AST::NativeTypeDeclaration&);
119 virtual void visit(AST::TypeReference&);
120 virtual void visit(AST::PointerType&);
121 virtual void visit(AST::ArrayReferenceType&);
122 virtual void visit(AST::ArrayType&);
123 virtual void visit(AST::StructureElement&);
124 virtual void visit(AST::EnumerationMember&);
125 virtual void visit(AST::FunctionDeclaration&);
126 virtual void visit(AST::TypeArgument&);
127 virtual void visit(AST::ReferenceType&);
128 virtual void visit(AST::Semantic&);
129 virtual void visit(AST::ConstantExpression&);
130 virtual void visit(AST::AttributeBlock&);
131 virtual void visit(AST::BuiltInSemantic&);
132 virtual void visit(AST::ResourceSemantic&);
133 virtual void visit(AST::SpecializationConstantSemantic&);
134 virtual void visit(AST::StageInOutSemantic&);
135 virtual void visit(AST::IntegerLiteral&);
136 virtual void visit(AST::UnsignedIntegerLiteral&);
137 virtual void visit(AST::FloatLiteral&);
138 virtual void visit(AST::NullLiteral&);
139 virtual void visit(AST::BooleanLiteral&);
140 virtual void visit(AST::IntegerLiteralType&);
141 virtual void visit(AST::UnsignedIntegerLiteralType&);
142 virtual void visit(AST::FloatLiteralType&);
143 virtual void visit(AST::NullLiteralType&);
144 virtual void visit(AST::EnumerationMemberLiteral&);
145 virtual void visit(AST::FunctionAttribute&);
146 virtual void visit(AST::NumThreadsFunctionAttribute&);
147 virtual void visit(AST::Block&);
148 virtual void visit(AST::Statement&);
149 virtual void visit(AST::Break&);
150 virtual void visit(AST::Continue&);
151 virtual void visit(AST::DoWhileLoop&);
152 virtual void visit(AST::Expression&);
153 virtual void visit(AST::DotExpression&);
154 virtual void visit(AST::IndexExpression&);
155 virtual void visit(AST::PropertyAccessExpression&);
156 virtual void visit(AST::EffectfulExpressionStatement&);
157 virtual void visit(AST::Fallthrough&);
158 virtual void visit(AST::ForLoop&);
159 virtual void visit(AST::IfStatement&);
160 virtual void visit(AST::Return&);
161 virtual void visit(AST::SwitchCase&);
162 virtual void visit(AST::SwitchStatement&);
163 virtual void visit(AST::Trap&);
164 virtual void visit(AST::VariableDeclarationsStatement&);
165 virtual void visit(AST::WhileLoop&);
166 virtual void visit(AST::VariableDeclaration&);
167 virtual void visit(AST::AssignmentExpression&);
168 virtual void visit(AST::CallExpression&);
169 virtual void visit(AST::CommaExpression&);
170 virtual void visit(AST::DereferenceExpression&);
171 virtual void visit(AST::LogicalExpression&);
172 virtual void visit(AST::LogicalNotExpression&);
173 virtual void visit(AST::MakeArrayReferenceExpression&);
174 virtual void visit(AST::MakePointerExpression&);
175 virtual void visit(AST::ReadModifyWriteExpression&);
176 virtual void visit(AST::TernaryExpression&);
177 virtual void visit(AST::VariableReference&);
178
179 bool error() const { return m_error; }
180
181 template<typename T> void checkErrorAndVisit(T& x)
182 {
183 if (!m_error)
184 visit(x);
185 }
186
187protected:
188 void setError()
189 {
190 ASSERT(!m_error);
191 m_error = true;
192 }
193
194private:
195 bool m_error { false }; // FIXME: Migrate this to be some sort of descriptive string.
196};
197
198} // namespace WHLSL
199
200} // namespace WebCore
201
202#endif // ENABLE(WEBGPU)
203