1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2012 Jay Freeman (saurik)
5 /* GNU Lesser General Public License, Version 3 {{{ */
7 * Cycript is free software: you can redistribute it and/or modify it under
8 * the terms of the GNU Lesser General Public License as published by the
9 * Free Software Foundation, either version 3 of the License, or (at your
10 * option) any later version.
12 * Cycript is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15 * License for more details.
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with Cycript. If not, see <http://www.gnu.org/licenses/>.
22 #ifndef CYCRIPT_OBJECTIVEC_SYNTAX_HPP
23 #define CYCRIPT_OBJECTIVEC_SYNTAX_HPP
27 struct CYTypeModifier :
28 CYNext<CYTypeModifier>
30 CYTypeModifier(CYTypeModifier *next) :
31 CYNext<CYTypeModifier>(next)
35 virtual CYExpression *Replace(CYContext &context) = 0;
38 struct CYTypeArrayOf :
43 CYTypeArrayOf(size_t size, CYTypeModifier *next = NULL) :
51 virtual CYExpression *Replace(CYContext &context);
54 struct CYTypeConstant :
57 CYTypeConstant(CYTypeModifier *next = NULL) :
64 virtual CYExpression *Replace(CYContext &context);
67 struct CYTypePointerTo :
70 CYTypePointerTo(CYTypeModifier *next = NULL) :
77 virtual CYExpression *Replace(CYContext &context);
80 struct CYTypeVariable :
83 CYExpression *expression_;
85 CYTypeVariable(CYExpression *expression) :
87 expression_(expression)
93 virtual CYExpression *Replace(CYContext &context);
96 struct CYTypedIdentifier :
97 CYNext<CYTypedIdentifier>
99 CYIdentifier *identifier_;
100 CYTypeModifier *type_;
102 CYTypedIdentifier(CYIdentifier *identifier) :
103 identifier_(identifier),
109 struct CYEncodedType :
112 CYTypeModifier *type_;
114 CYEncodedType(CYTypeModifier *type) :
121 virtual CYExpression *Replace(CYContext &context);
122 virtual void Output(CYOutput &out, CYFlags flags) const;
128 CYExpression *value_;
130 CYBox(CYExpression *value) :
137 virtual CYExpression *Replace(CYContext &context);
138 virtual void Output(CYOutput &out, CYFlags flags) const;
141 struct CYSelectorPart :
142 CYNext<CYSelectorPart>,
148 CYSelectorPart(CYWord *name, bool value, CYSelectorPart *next = NULL) :
149 CYNext<CYSelectorPart>(next),
155 CYString *Replace(CYContext &context);
156 virtual void Output(CYOutput &out) const;
162 CYSelectorPart *name_;
164 CYSelector(CYSelectorPart *name) :
171 virtual CYExpression *Replace(CYContext &context);
172 virtual void Output(CYOutput &out, CYFlags flags) const;
181 CYField(CYExpression *type, CYIdentifier *name, CYField *next = NULL) :
182 CYNext<CYField>(next),
188 CYStatement *Replace(CYContext &context) const;
189 void Output(CYOutput &out) const;
192 struct CYMessageParameter :
193 CYNext<CYMessageParameter>
199 CYMessageParameter(CYWord *tag, CYExpression *type, CYIdentifier *name) :
206 CYFunctionParameter *Parameters(CYContext &context) const;
207 CYSelector *Selector(CYContext &context) const;
208 CYSelectorPart *SelectorPart(CYContext &context) const;
209 CYExpression *TypeSignature(CYContext &context) const;
217 CYMessageParameter *parameters_;
220 CYMessage(bool instance, CYExpression *type, CYMessageParameter *parameter, CYStatement *statements) :
223 parameters_(parameter),
228 CYStatement *Replace(CYContext &context, bool replace) const;
229 void Output(CYOutput &out, bool replace) const;
231 CYExpression *TypeSignature(CYContext &context) const;
240 CYProtocol(CYExpression *name, CYProtocol *next = NULL) :
241 CYNext<CYProtocol>(next),
246 CYStatement *Replace(CYContext &context) const;
247 void Output(CYOutput &out) const;
253 virtual CYStatement *Replace(CYContext &context);
254 virtual void Output(CYOutput &out, CYFlags flags) const;
259 CYExpression *super_;
260 CYProtocol *protocols_;
262 CYMessage *messages_;
264 CYClass(CYClassName *name, CYExpression *super, CYProtocol *protocols, CYField *fields, CYMessage *messages) :
267 protocols_(protocols),
276 CYExpression *Replace_(CYContext &context);
277 virtual void Output(CYOutput &out, CYFlags flags) const;
280 struct CYClassExpression :
284 CYClassExpression(CYClassName *name, CYExpression *super, CYProtocol *protocols, CYField *fields, CYMessage *messages) :
285 CYClass(name, super, protocols, fields, messages)
291 virtual CYExpression *Replace(CYContext &context);
292 virtual void Output(CYOutput &out, CYFlags flags) const;
295 struct CYClassStatement :
299 CYClassStatement(CYClassName *name, CYExpression *super, CYProtocol *protocols, CYField *fields, CYMessage *messages) :
300 CYClass(name, super, protocols, fields, messages)
304 virtual CYStatement *Replace(CYContext &context);
305 virtual void Output(CYOutput &out, CYFlags flags) const;
312 CYMessage *messages_;
314 CYCategory(CYClassName *name, CYMessage *messages) :
320 virtual CYStatement *Replace(CYContext &context);
321 virtual void Output(CYOutput &out, CYFlags flags) const;
327 CYArgument *arguments_;
329 CYSend(CYArgument *arguments) :
330 arguments_(arguments)
336 virtual void Output(CYOutput &out, CYFlags flags) const;
339 struct CYSendDirect :
344 CYSendDirect(CYExpression *self, CYArgument *arguments) :
350 virtual CYExpression *Replace(CYContext &context);
351 virtual void Output(CYOutput &out, CYFlags flags) const;
357 CYSendSuper(CYArgument *arguments) :
362 virtual CYExpression *Replace(CYContext &context);
363 virtual void Output(CYOutput &out, CYFlags flags) const;
366 #endif/*CYCRIPT_OBJECTIVEC_SYNTAX_HPP*/