1 // Copyright (c) Facebook, Inc. and its affiliates.
3 // This source code is licensed under the MIT license found in the
4 // LICENSE file in the "hack" directory of this source tree.
6 // @generated SignedSource<<3ec7f07f10127e2bf99ed4a47d71fd3b>>
8 // To regenerate this file, run:
9 // hphp/hack/src/oxidized_regen.sh
11 use arena_trait::TrivialDrop;
12 pub use ast_defs::Pos;
13 pub use ast_defs::PositionedByteString;
14 pub use ast_defs::Pstring;
15 pub use local_id::LocalId;
16 use no_pos_hash::NoPosHash;
17 use ocamlrep::FromOcamlRepIn;
18 use ocamlrep::ToOcamlRep;
19 pub use oxidized::aast_defs::OgNullFlavor;
20 pub use oxidized::aast_defs::PropOrMethod;
21 pub use oxidized::aast_defs::ReifyKind;
22 pub use oxidized::aast_defs::Tprim;
23 pub use oxidized::aast_defs::TypedefVisibility;
24 pub use oxidized::aast_defs::Visibility;
25 use serde::Deserialize;
28 #[allow(unused_imports)]
48 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
49 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a LocalId<'a>,
51 impl<'a> TrivialDrop for Lid<'a> {}
52 arena_deserializer::impl_deserialize_in_arena!(Lid<'arena>);
55 pub type Sid<'a> = ast_defs::Id<'a>;
58 pub type ClassName<'a> = Sid<'a>;
60 /// Aast.program represents the top-level definitions in a Hack program.
61 /// ex: Expression annotation type (when typechecking, the inferred type)
62 /// en: Environment (tracking state inside functions and classes)
79 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
83 pub struct Program<'a, Ex, En>(
84 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a [Def<'a, Ex, En>],
86 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Program<'a, Ex, En> {}
87 arena_deserializer::impl_deserialize_in_arena!(Program<'arena, Ex, En>);
104 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
106 #[rust_to_ocaml(and)]
108 pub struct Stmt<'a, Ex, En>(
109 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
110 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub Stmt_<'a, Ex, En>,
112 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Stmt<'a, Ex, En> {}
113 arena_deserializer::impl_deserialize_in_arena!(Stmt<'arena, Ex, En>);
131 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
133 #[rust_to_ocaml(and)]
135 pub enum Stmt_<'a, Ex, En> {
136 /// Marker for a switch statement that falls through.
140 /// Standalone expression.
143 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
144 Expr(&'a Expr<'a, Ex, En>),
145 /// Break inside a loop or switch statement.
149 /// Continue inside a loop or switch statement.
153 /// Throw an exception.
156 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
157 Throw(&'a Expr<'a, Ex, En>),
158 /// Return, with an optional value.
162 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
163 Return(Option<&'a Expr<'a, Ex, En>>),
164 /// Yield break, terminating the current generator. This behaves like
165 /// return; but is more explicit, and ensures the function is treated
169 #[rust_to_ocaml(name = "Yield_break")]
171 /// Concurrent block. All the await expressions are awaited at the
172 /// same time, similar to genva().
174 /// We store the desugared form. In the below example, the list is:
175 /// [('__tmp$1', f()), (__tmp$2, g()), (None, h())]
176 /// and the block assigns the temporary variables back to the locals.
177 /// { $foo = __tmp$1; $bar = __tmp$2; }
180 /// $foo = await f();
181 /// $bar = await g();
184 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
185 #[rust_to_ocaml(inline_tuple)]
188 &'a [(Option<&'a Lid<'a>>, &'a Expr<'a, Ex, En>)],
189 &'a Block<'a, Ex, En>,
194 /// if ($foo) { ... } else { ... }
195 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
196 #[rust_to_ocaml(inline_tuple)]
199 &'a Expr<'a, Ex, En>,
200 &'a Block<'a, Ex, En>,
201 &'a Block<'a, Ex, En>,
209 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
210 #[rust_to_ocaml(inline_tuple)]
211 Do(&'a (&'a Block<'a, Ex, En>, &'a Expr<'a, Ex, En>)),
217 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
218 #[rust_to_ocaml(inline_tuple)]
219 While(&'a (&'a Expr<'a, Ex, En>, &'a Block<'a, Ex, En>)),
220 /// Initialize a value that is automatically disposed of.
222 /// using $foo = bar(); // disposed at the end of the function
223 /// using ($foo = bar(), $baz = quux()) {} // disposed after the block
224 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
225 Using(&'a UsingStmt<'a, Ex, En>),
226 /// For loop. The initializer and increment parts can include
227 /// multiple comma-separated statements. The termination condition is
230 /// for ($i = 0; $i < 100; $i++) { ... }
231 /// for ($x = 0, $y = 0; ; $x++, $y++) { ... }
232 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
233 #[rust_to_ocaml(inline_tuple)]
236 &'a [&'a Expr<'a, Ex, En>],
237 Option<&'a Expr<'a, Ex, En>>,
238 &'a [&'a Expr<'a, Ex, En>],
239 &'a Block<'a, Ex, En>,
242 /// Switch statement.
252 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
253 #[rust_to_ocaml(inline_tuple)]
256 &'a Expr<'a, Ex, En>,
257 &'a [Case<'a, Ex, En>],
258 Option<DefaultCase<'a, Ex, En>>,
263 /// foreach ($items as $item) { ... }
264 /// foreach ($items as $key => value) { ... }
265 /// foreach ($items await as $item) { ... } // AsyncIterator<_>
266 /// foreach ($items await as $key => value) { ... } // AsyncKeyedIterator<_>
267 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
268 #[rust_to_ocaml(inline_tuple)]
271 &'a Expr<'a, Ex, En>,
273 &'a Block<'a, Ex, En>,
276 /// Try statement, with catch blocks and a finally block.
280 /// } catch (SomeException $e) {
285 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
286 #[rust_to_ocaml(inline_tuple)]
289 &'a Block<'a, Ex, En>,
290 &'a [&'a Catch<'a, Ex, En>],
291 &'a Block<'a, Ex, En>,
294 /// No-op, the empty statement.
298 /// if ($foo) {} // the else is Noop here
300 /// Block, a list of statements in curly braces.
303 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
304 Block(&'a Block<'a, Ex, En>),
305 /// The mode tag at the beginning of a file.
306 /// TODO: this really belongs in def.
309 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
310 Markup(&'a Pstring<'a>),
311 /// Used in IFC to track type inference environments. Not user
313 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
314 #[rust_to_ocaml(inline_tuple)]
317 &'a oxidized::aast_defs::EnvAnnot,
318 LocalIdMap<'a, (&'a Pos<'a>, Ex)>,
322 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Stmt_<'a, Ex, En> {}
323 arena_deserializer::impl_deserialize_in_arena!(Stmt_<'arena, Ex, En>);
325 pub use oxidized::aast_defs::EnvAnnot;
342 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
344 #[rust_to_ocaml(and)]
345 #[rust_to_ocaml(prefix = "us_")]
347 pub struct UsingStmt<'a, Ex, En> {
348 pub is_block_scoped: bool,
350 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
351 pub exprs: (&'a Pos<'a>, &'a [&'a Expr<'a, Ex, En>]),
352 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
353 pub block: &'a Block<'a, Ex, En>,
355 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for UsingStmt<'a, Ex, En> {}
356 arena_deserializer::impl_deserialize_in_arena!(UsingStmt<'arena, Ex, En>);
374 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
376 #[rust_to_ocaml(and)]
378 pub enum AsExpr<'a, Ex, En> {
379 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
380 #[rust_to_ocaml(name = "As_v")]
381 AsV(&'a Expr<'a, Ex, En>),
382 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
383 #[rust_to_ocaml(name = "As_kv")]
384 #[rust_to_ocaml(inline_tuple)]
385 AsKv(&'a (&'a Expr<'a, Ex, En>, &'a Expr<'a, Ex, En>)),
386 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
387 #[rust_to_ocaml(name = "Await_as_v")]
388 #[rust_to_ocaml(inline_tuple)]
389 AwaitAsV(&'a (&'a Pos<'a>, &'a Expr<'a, Ex, En>)),
390 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
391 #[rust_to_ocaml(name = "Await_as_kv")]
392 #[rust_to_ocaml(inline_tuple)]
393 AwaitAsKv(&'a (&'a Pos<'a>, &'a Expr<'a, Ex, En>, &'a Expr<'a, Ex, En>)),
395 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for AsExpr<'a, Ex, En> {}
396 arena_deserializer::impl_deserialize_in_arena!(AsExpr<'arena, Ex, En>);
398 #[rust_to_ocaml(and)]
399 pub type Block<'a, Ex, En> = [&'a Stmt<'a, Ex, En>];
416 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
418 #[rust_to_ocaml(and)]
420 pub struct ClassId<'a, Ex, En>(
421 #[serde(deserialize_with = "arena_deserializer::arena")] pub Ex,
422 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
423 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub ClassId_<'a, Ex, En>,
425 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassId<'a, Ex, En> {}
426 arena_deserializer::impl_deserialize_in_arena!(ClassId<'arena, Ex, En>);
428 /// Class ID, used in things like instantiation and static property access.
445 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
447 #[rust_to_ocaml(and)]
449 pub enum ClassId_<'a, Ex, En> {
450 /// The class ID of the parent of the lexically scoped class.
452 /// In a trait, it is the parent class ID of the using class.
454 /// parent::some_meth()
455 /// parent::$prop = 1;
458 /// The class ID of the lexically scoped class.
460 /// In a trait, it is the class ID of the using class.
462 /// self::some_meth()
466 /// The class ID of the late static bound class.
468 /// https://www.php.net/manual/en/language.oop5.late-static-bindings.php
470 /// In a trait, it is the late static bound class ID of the using class.
472 /// static::some_meth()
473 /// static::$prop = 1;
476 /// Dynamic class name.
478 /// TODO: Syntactically this can only be an Lvar/This/Lplaceholder.
479 /// We should use lid rather than expr.
481 /// // Assume $d has type dynamic.
485 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
486 CIexpr(&'a Expr<'a, Ex, En>),
487 /// Explicit class name. This is the common case.
489 /// Foop::some_meth()
492 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
493 CI(&'a ClassName<'a>),
495 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassId_<'a, Ex, En> {}
496 arena_deserializer::impl_deserialize_in_arena!(ClassId_<'arena, Ex, En>);
513 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
515 #[rust_to_ocaml(and)]
517 pub struct Expr<'a, Ex, En>(
518 #[serde(deserialize_with = "arena_deserializer::arena")] pub Ex,
519 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
520 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub Expr_<'a, Ex, En>,
522 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Expr<'a, Ex, En> {}
523 arena_deserializer::impl_deserialize_in_arena!(Expr<'arena, Ex, En>);
540 #[serde(bound(deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>"))]
541 #[rust_to_ocaml(and)]
543 pub enum CollectionTarg<'a, Ex> {
544 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
545 CollectionTV(&'a Targ<'a, Ex>),
546 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
547 #[rust_to_ocaml(inline_tuple)]
548 CollectionTKV(&'a (&'a Targ<'a, Ex>, &'a Targ<'a, Ex>)),
550 impl<'a, Ex: TrivialDrop> TrivialDrop for CollectionTarg<'a, Ex> {}
551 arena_deserializer::impl_deserialize_in_arena!(CollectionTarg<'arena, Ex>);
569 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
571 #[rust_to_ocaml(and)]
573 pub enum FunctionPtrId<'a, Ex, En> {
574 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
575 #[rust_to_ocaml(name = "FP_id")]
577 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
578 #[rust_to_ocaml(name = "FP_class_const")]
579 #[rust_to_ocaml(inline_tuple)]
580 FPClassConst(&'a (&'a ClassId<'a, Ex, En>, &'a Pstring<'a>)),
582 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for FunctionPtrId<'a, Ex, En> {}
583 arena_deserializer::impl_deserialize_in_arena!(FunctionPtrId<'arena, Ex, En>);
585 /// An expression tree literal consists of a hint, splices, and
586 /// expressions. Consider this example:
588 /// Foo`1 + ${$x} + ${bar()}`
604 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
606 #[rust_to_ocaml(and)]
607 #[rust_to_ocaml(prefix = "et_")]
609 pub struct ExpressionTree<'a, Ex, En> {
610 /// The hint before the backtick, so Foo in this example.
611 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
612 pub hint: &'a Hint<'a>,
613 /// The values spliced into expression tree at runtime are assigned
616 /// $0tmp1 = $x; $0tmp2 = bar();
617 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
618 pub splices: &'a [&'a Stmt<'a, Ex, En>],
619 /// The list of global functions and static methods assigned to
623 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
624 pub function_pointers: &'a [&'a Stmt<'a, Ex, En>],
625 /// The expression that gets type checked.
627 /// 1 + $0tmp1 + $0tmp2
628 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
629 pub virtualized_expr: &'a Expr<'a, Ex, En>,
630 /// The expression that's executed at runtime.
632 /// Foo::makeTree($v ==> $v->visitBinOp(...))
633 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
634 pub runtime_expr: &'a Expr<'a, Ex, En>,
635 /// Position of the first $$ in a splice that refers
636 /// to a variable outside the Expression Tree
638 /// $x |> Code`${ $$ }` // Pos of the $$
639 /// Code`${ $x |> foo($$) }` // None
640 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
641 pub dollardollar_pos: Option<&'a Pos<'a>>,
643 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ExpressionTree<'a, Ex, En> {}
644 arena_deserializer::impl_deserialize_in_arena!(ExpressionTree<'arena, Ex, En>);
662 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
664 #[rust_to_ocaml(and)]
666 pub enum Expr_<'a, Ex, En> {
669 /// darray['x' => 0, 'y' => 1]
670 /// darray<string, int>['x' => 0, 'y' => 1]
671 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
672 #[rust_to_ocaml(inline_tuple)]
675 Option<&'a (&'a Targ<'a, Ex>, &'a Targ<'a, Ex>)>,
676 &'a [(&'a Expr<'a, Ex, En>, &'a Expr<'a, Ex, En>)],
681 /// varray['hello', 'world']
682 /// varray<string>['hello', 'world']
683 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
684 #[rust_to_ocaml(inline_tuple)]
685 Varray(&'a (Option<&'a Targ<'a, Ex>>, &'a [&'a Expr<'a, Ex, En>])),
688 /// shape('x' => 1, 'y' => 2)
689 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
690 Shape(&'a [(ast_defs::ShapeFieldName<'a>, &'a Expr<'a, Ex, En>)]),
691 /// Collection literal for indexable structures.
695 /// Set<string> {'foo', 'bar'}
698 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
699 #[rust_to_ocaml(inline_tuple)]
702 oxidized::aast_defs::VcKind,
703 Option<&'a Targ<'a, Ex>>,
704 &'a [&'a Expr<'a, Ex, En>],
707 /// Collection literal for key-value structures.
709 /// dict['x' => 1, 'y' => 2]
710 /// Map<int, string> {}
712 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
713 #[rust_to_ocaml(inline_tuple)]
716 oxidized::aast_defs::KvcKind,
717 Option<&'a (&'a Targ<'a, Ex>, &'a Targ<'a, Ex>)>,
718 &'a [&'a Field<'a, Ex, En>],
725 /// The local variable representing the current class instance.
737 /// The empty expression.
739 /// list(, $y) = vec[1, 2] // Omitted is the first expression inside list()
741 /// An identifier. Used for method names and global constants.
744 /// $x->foo() // id: "foo"
745 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
750 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
752 /// The extra variable in a pipe expression.
755 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
756 Dollardollar(&'a Lid<'a>),
757 /// Clone expression.
760 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
761 Clone(&'a Expr<'a, Ex, En>),
766 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
767 #[rust_to_ocaml(name = "Array_get")]
768 #[rust_to_ocaml(inline_tuple)]
769 ArrayGet(&'a (&'a Expr<'a, Ex, En>, Option<&'a Expr<'a, Ex, En>>)),
770 /// Instance property or method access.
772 /// prop_or_method is:
773 /// - Is_prop for property access
774 /// - Is_method for method call, only possible when the node is
775 /// - the receiver in a Call node.
777 /// $foo->bar // OG_nullthrows, Is_prop: access named property
778 /// ($foo->bar)() // OG_nullthrows, Is_prop: call lambda stored in named property
779 /// $foo?->bar // OG_nullsafe, Is_prop
780 /// ($foo?->bar)() // OG_nullsafe, Is_prop
782 /// $foo->bar() // OG_nullthrows, Is_method: call named method
783 /// $foo->$bar() // OG_nullthrows, Is_method: dynamic call, method name stored in local $bar
784 /// $foo?->bar() // OG_nullsafe, Is_method
785 /// $foo?->$bar() // OG_nullsafe, Is_method
786 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
787 #[rust_to_ocaml(name = "Obj_get")]
788 #[rust_to_ocaml(inline_tuple)]
791 &'a Expr<'a, Ex, En>,
792 &'a Expr<'a, Ex, En>,
793 &'a oxidized::aast_defs::OgNullFlavor,
794 &'a oxidized::aast_defs::PropOrMethod,
797 /// Static property or dynamic method access. The rhs of the :: begins
798 /// with $ or is some non-name expression appearing within braces {}.
800 /// Foo::$bar // Is_prop: access named static property
801 /// Foo::{$bar} // Is_prop
802 /// (Foo::$bar)(); // Is_prop: call lambda stored in static property Foo::$bar
803 /// $classname::$bar // Is_prop
805 /// Foo::$bar(); // Is_method: dynamic call, method name stored in local $bar
806 /// Foo::{$bar}(); // Is_method
807 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
808 #[rust_to_ocaml(name = "Class_get")]
809 #[rust_to_ocaml(inline_tuple)]
812 &'a ClassId<'a, Ex, En>,
813 ClassGetExpr<'a, Ex, En>,
814 &'a oxidized::aast_defs::PropOrMethod,
817 /// Class constant or static method call. As a standalone expression,
818 /// this is a class constant. Inside a Call node, this is a static
819 /// method call. The rhs of the :: does not begin with $ or is a name
820 /// appearing within braces {}.
822 /// This is not ambiguous, because constants are not allowed to
823 /// contain functions.
825 /// Foo::some_const // Const
826 /// Foo::{another_const} // Const: braces are elided
827 /// Foo::class // Const: fully qualified class name of Foo
828 /// Foo::staticMeth() // Call
829 /// $classname::staticMeth() // Call
831 /// This syntax is used for both static and instance methods when
832 /// calling the implementation on the superclass.
834 /// parent::someStaticMeth()
835 /// parent::someInstanceMeth()
836 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
837 #[rust_to_ocaml(name = "Class_const")]
838 #[rust_to_ocaml(inline_tuple)]
839 ClassConst(&'a (&'a ClassId<'a, Ex, En>, &'a Pstring<'a>)),
840 /// Function or method call.
844 /// foo<int>(1, 2, ...$rest)
847 /// foobar(inout $x[0])
849 /// async { return 1; }
851 /// (async () ==> { return 1; })()
852 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
853 #[rust_to_ocaml(inline_tuple)]
856 &'a Expr<'a, Ex, En>,
857 &'a [&'a Targ<'a, Ex>],
858 &'a [(ast_defs::ParamKind<'a>, &'a Expr<'a, Ex, En>)],
859 Option<&'a Expr<'a, Ex, En>>,
862 /// A reference to a function or method.
865 /// FooCls::meth<int>
866 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
867 #[rust_to_ocaml(inline_tuple)]
868 FunctionPointer(&'a (FunctionPtrId<'a, Ex, En>, &'a [&'a Targ<'a, Ex>])),
873 /// 0xBEEF // hexadecimal
874 /// 0b11111111 // binary
875 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
882 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
896 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
897 String(&'a bstr::BStr),
898 /// Interpolated string literal.
900 /// "hello $foo $bar"
905 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
906 String2(&'a [&'a Expr<'a, Ex, En>]),
907 /// Prefixed string literal. Only used for regular expressions.
910 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
911 #[rust_to_ocaml(inline_tuple)]
912 PrefixedString(&'a (&'a str, &'a Expr<'a, Ex, En>)),
913 /// Yield expression. The enclosing function should have an Iterator
916 /// yield $foo // enclosing function returns an Iterator
917 /// yield $foo => $bar // enclosing function returns a KeyedIterator
918 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
919 Yield(&'a Afield<'a, Ex, En>),
920 /// Await expression.
923 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
924 Await(&'a Expr<'a, Ex, En>),
925 /// Readonly expression.
928 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
929 ReadonlyExpr(&'a Expr<'a, Ex, En>),
930 /// Tuple expression.
932 /// tuple("a", 1, $foo)
933 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
934 Tuple(&'a [&'a Expr<'a, Ex, En>]),
935 /// List expression, only used in destructuring. Allows any arbitrary
936 /// lvalue as a subexpression. May also nest.
938 /// list($x, $y) = vec[1, 2];
939 /// list(, $y) = vec[1, 2]; // skipping items
940 /// list(list($x)) = vec[vec[1]]; // nesting
941 /// list($v[0], $x[], $y->foo) = $blah;
942 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
943 List(&'a [&'a Expr<'a, Ex, En>]),
944 /// Cast expression, converting a value to a different type. Only
945 /// primitive types are supported in the hint position.
949 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
950 #[rust_to_ocaml(inline_tuple)]
951 Cast(&'a (&'a Hint<'a>, &'a Expr<'a, Ex, En>)),
958 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
959 #[rust_to_ocaml(inline_tuple)]
960 Unop(&'a (oxidized::ast_defs::Uop, &'a Expr<'a, Ex, En>)),
964 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
965 #[rust_to_ocaml(inline_tuple)]
969 &'a Expr<'a, Ex, En>,
970 &'a Expr<'a, Ex, En>,
973 /// Pipe expression. The lid is the ID of the $$ that is implicitly
974 /// declared by this pipe.
976 /// See also Dollardollar.
978 /// foo() |> bar(1, $$) // equivalent: bar(1, foo())
980 /// $$ is not required on the RHS of pipe expressions, but it's
981 /// pretty pointless to use pipes without $$.
983 /// foo() |> bar(); // equivalent: foo(); bar();
984 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
985 #[rust_to_ocaml(inline_tuple)]
986 Pipe(&'a (&'a Lid<'a>, &'a Expr<'a, Ex, En>, &'a Expr<'a, Ex, En>)),
987 /// Ternary operator, or elvis operator.
989 /// $foo ? $bar : $baz // ternary
990 /// $foo ?: $baz // elvis
991 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
992 #[rust_to_ocaml(inline_tuple)]
995 &'a Expr<'a, Ex, En>,
996 Option<&'a Expr<'a, Ex, En>>,
997 &'a Expr<'a, Ex, En>,
1002 /// $foo is SomeType
1003 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1004 #[rust_to_ocaml(inline_tuple)]
1005 Is(&'a (&'a Expr<'a, Ex, En>, &'a Hint<'a>)),
1010 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1011 #[rust_to_ocaml(inline_tuple)]
1012 As(&'a (&'a Expr<'a, Ex, En>, &'a Hint<'a>, bool)),
1013 /// Upcast operator.
1016 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1017 #[rust_to_ocaml(inline_tuple)]
1018 Upcast(&'a (&'a Expr<'a, Ex, En>, &'a Hint<'a>)),
1022 /// new Foo<int, T>();
1023 /// new Foo('blah', ...$rest);
1024 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1025 #[rust_to_ocaml(inline_tuple)]
1028 &'a ClassId<'a, Ex, En>,
1029 &'a [&'a Targ<'a, Ex>],
1030 &'a [&'a Expr<'a, Ex, En>],
1031 Option<&'a Expr<'a, Ex, En>>,
1035 /// PHP-style lambda. Does not capture variables unless explicitly
1038 /// Mnemonic: 'expanded lambda', since we can desugar Lfun to Efun.
1040 /// function($x) { return $x; }
1041 /// function(int $x): int { return $x; }
1042 /// function($x) use ($y) { return $y; }
1043 /// function($x): int use ($y, $z) { return $x + $y + $z; }
1044 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1045 #[rust_to_ocaml(inline_tuple)]
1046 Efun(&'a (&'a Fun_<'a, Ex, En>, &'a [&'a Lid<'a>])),
1047 /// Hack lambda. Captures variables automatically.
1050 /// (int $x): int ==> $x + $other
1051 /// ($x, $y) ==> { return $x + $y; }
1052 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1053 #[rust_to_ocaml(inline_tuple)]
1054 Lfun(&'a (&'a Fun_<'a, Ex, En>, &'a [&'a Lid<'a>])),
1055 /// XHP expression. May contain interpolated expressions.
1057 /// <foo x="hello" y={$foo}>hello {$bar}</foo>
1058 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1059 #[rust_to_ocaml(inline_tuple)]
1063 &'a [XhpAttribute<'a, Ex, En>],
1064 &'a [&'a Expr<'a, Ex, En>],
1067 /// Include or require expression.
1069 /// require('foo.php')
1070 /// require_once('foo.php')
1071 /// include('foo.php')
1072 /// include_once('foo.php')
1073 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1074 #[rust_to_ocaml(inline_tuple)]
1075 Import(&'a (oxidized::aast_defs::ImportFlavor, &'a Expr<'a, Ex, En>)),
1076 /// Collection literal.
1078 /// TODO: T38184446 this is redundant with ValCollection/KeyValCollection.
1081 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1082 #[rust_to_ocaml(inline_tuple)]
1086 Option<CollectionTarg<'a, Ex>>,
1087 &'a [Afield<'a, Ex, En>],
1090 /// Expression tree literal. Expression trees are not evaluated at
1091 /// runtime, but desugared to an expression representing the code.
1094 /// Foo`(() ==> { while(true) {} })()` // not an infinite loop at runtime
1096 /// Splices are evaluated as normal Hack code. The following two expression trees
1097 /// are equivalent. See also `ET_Splice`.
1099 /// Foo`1 + ${do_stuff()}`
1101 /// $x = do_stuff();
1103 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1104 ExpressionTree(&'a ExpressionTree<'a, Ex, En>),
1105 /// Placeholder local variable.
1108 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1109 Lplaceholder(&'a Pos<'a>),
1110 /// Global function reference.
1113 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1114 #[rust_to_ocaml(name = "Fun_id")]
1116 /// Instance method reference on a specific instance.
1118 /// TODO: This is only created in naming, and ought to happen in
1119 /// lowering or be removed. The emitter just sees a normal Call.
1121 /// inst_meth($f, 'some_meth') // equivalent: $f->some_meth<>
1122 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1123 #[rust_to_ocaml(name = "Method_id")]
1124 #[rust_to_ocaml(inline_tuple)]
1125 MethodId(&'a (&'a Expr<'a, Ex, En>, &'a Pstring<'a>)),
1126 /// Instance method reference that can be called with an instance.
1128 /// meth_caller(FooClass::class, 'some_meth')
1129 /// meth_caller('FooClass', 'some_meth')
1131 /// These examples are equivalent to:
1133 /// (FooClass $f, ...$args) ==> $f->some_meth(...$args)
1134 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1135 #[rust_to_ocaml(name = "Method_caller")]
1136 #[rust_to_ocaml(inline_tuple)]
1137 MethodCaller(&'a (&'a ClassName<'a>, &'a Pstring<'a>)),
1138 /// Static method reference.
1140 /// class_meth('FooClass', 'some_static_meth')
1141 /// // equivalent: FooClass::some_static_meth<>
1142 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1143 #[rust_to_ocaml(name = "Smethod_id")]
1144 #[rust_to_ocaml(inline_tuple)]
1145 SmethodId(&'a (&'a ClassId<'a, Ex, En>, &'a Pstring<'a>)),
1148 /// Pair {$foo, $bar}
1149 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1150 #[rust_to_ocaml(inline_tuple)]
1153 Option<&'a (&'a Targ<'a, Ex>, &'a Targ<'a, Ex>)>,
1154 &'a Expr<'a, Ex, En>,
1155 &'a Expr<'a, Ex, En>,
1158 /// Expression tree splice expression. Only valid inside an
1159 /// expression tree literal (backticks). See also `ExpressionTree`.
1162 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1163 #[rust_to_ocaml(name = "ET_Splice")]
1164 ETSplice(&'a Expr<'a, Ex, En>),
1165 /// Label used for enum classes.
1167 /// enum_name#label_name or #label_name
1168 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1169 #[rust_to_ocaml(inline_tuple)]
1170 EnumClassLabel(&'a (Option<&'a ClassName<'a>>, &'a str)),
1171 /// Annotation used to record failure in subtyping or coercion of an
1172 /// expression and calls to [unsafe_cast] or [enforced_cast].
1174 /// The [hole_source] indicates whether this came from an
1175 /// explicit call to [unsafe_cast] or [enforced_cast] or was
1176 /// generated during typing.
1178 /// Given a call to [unsafe_cast]:
1180 /// function f(int $x): void { /* ... */ }
1182 /// function g(float $x): void {
1183 /// f(unsafe_cast<float,int>($x));
1186 /// After typing, this is represented by the following TAST fragment
1189 /// ( ( (..., function(int $x): void), Id (..., "\f"))
1191 /// , [ ( (..., int)
1193 /// ( ((..., float), Lvar (..., $x))
1203 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1204 #[rust_to_ocaml(inline_tuple)]
1205 Hole(&'a (&'a Expr<'a, Ex, En>, Ex, Ex, HoleSource<'a>)),
1207 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Expr_<'a, Ex, En> {}
1208 arena_deserializer::impl_deserialize_in_arena!(Expr_<'arena, Ex, En>);
1225 #[rust_to_ocaml(and)]
1227 pub enum HoleSource<'a> {
1229 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1230 UnsafeCast(&'a [&'a Hint<'a>]),
1232 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1233 EnforcedCast(&'a [&'a Hint<'a>]),
1235 impl<'a> TrivialDrop for HoleSource<'a> {}
1236 arena_deserializer::impl_deserialize_in_arena!(HoleSource<'arena>);
1254 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1256 #[rust_to_ocaml(and)]
1258 pub enum ClassGetExpr<'a, Ex, En> {
1259 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1260 CGstring(&'a Pstring<'a>),
1261 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1262 CGexpr(&'a Expr<'a, Ex, En>),
1264 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassGetExpr<'a, Ex, En> {}
1265 arena_deserializer::impl_deserialize_in_arena!(ClassGetExpr<'arena, Ex, En>);
1283 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1285 #[rust_to_ocaml(and)]
1287 pub struct Case<'a, Ex, En>(
1288 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Expr<'a, Ex, En>,
1289 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Block<'a, Ex, En>,
1291 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Case<'a, Ex, En> {}
1292 arena_deserializer::impl_deserialize_in_arena!(Case<'arena, Ex, En>);
1310 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1312 #[rust_to_ocaml(and)]
1314 pub struct DefaultCase<'a, Ex, En>(
1315 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
1316 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Block<'a, Ex, En>,
1318 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for DefaultCase<'a, Ex, En> {}
1319 arena_deserializer::impl_deserialize_in_arena!(DefaultCase<'arena, Ex, En>);
1337 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1339 #[rust_to_ocaml(and)]
1341 pub enum GenCase<'a, Ex, En> {
1342 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1343 Case(&'a Case<'a, Ex, En>),
1344 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1345 Default(&'a DefaultCase<'a, Ex, En>),
1347 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for GenCase<'a, Ex, En> {}
1348 arena_deserializer::impl_deserialize_in_arena!(GenCase<'arena, Ex, En>);
1365 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1367 #[rust_to_ocaml(and)]
1369 pub struct Catch<'a, Ex, En>(
1370 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a ClassName<'a>,
1371 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Lid<'a>,
1372 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Block<'a, Ex, En>,
1374 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Catch<'a, Ex, En> {}
1375 arena_deserializer::impl_deserialize_in_arena!(Catch<'arena, Ex, En>);
1392 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1394 #[rust_to_ocaml(and)]
1396 pub struct Field<'a, Ex, En>(
1397 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Expr<'a, Ex, En>,
1398 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Expr<'a, Ex, En>,
1400 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Field<'a, Ex, En> {}
1401 arena_deserializer::impl_deserialize_in_arena!(Field<'arena, Ex, En>);
1419 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1421 #[rust_to_ocaml(and)]
1423 pub enum Afield<'a, Ex, En> {
1424 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1425 AFvalue(&'a Expr<'a, Ex, En>),
1426 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1427 #[rust_to_ocaml(inline_tuple)]
1428 AFkvalue(&'a (&'a Expr<'a, Ex, En>, &'a Expr<'a, Ex, En>)),
1430 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Afield<'a, Ex, En> {}
1431 arena_deserializer::impl_deserialize_in_arena!(Afield<'arena, Ex, En>);
1448 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1450 #[rust_to_ocaml(and)]
1451 #[rust_to_ocaml(prefix = "xs_")]
1453 pub struct XhpSimple<'a, Ex, En> {
1454 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1455 pub name: &'a Pstring<'a>,
1456 #[serde(deserialize_with = "arena_deserializer::arena")]
1458 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1459 pub expr: &'a Expr<'a, Ex, En>,
1461 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for XhpSimple<'a, Ex, En> {}
1462 arena_deserializer::impl_deserialize_in_arena!(XhpSimple<'arena, Ex, En>);
1480 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1482 #[rust_to_ocaml(and)]
1484 pub enum XhpAttribute<'a, Ex, En> {
1485 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1486 #[rust_to_ocaml(name = "Xhp_simple")]
1487 XhpSimple(&'a XhpSimple<'a, Ex, En>),
1488 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1489 #[rust_to_ocaml(name = "Xhp_spread")]
1490 XhpSpread(&'a Expr<'a, Ex, En>),
1492 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for XhpAttribute<'a, Ex, En> {}
1493 arena_deserializer::impl_deserialize_in_arena!(XhpAttribute<'arena, Ex, En>);
1495 pub use oxidized::aast_defs::IsVariadic;
1512 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1514 #[rust_to_ocaml(and)]
1515 #[rust_to_ocaml(prefix = "param_")]
1517 pub struct FunParam<'a, Ex, En> {
1518 #[serde(deserialize_with = "arena_deserializer::arena")]
1520 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1521 pub type_hint: &'a TypeHint<'a, Ex>,
1522 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1523 pub is_variadic: &'a oxidized::aast_defs::IsVariadic,
1524 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1525 pub pos: &'a Pos<'a>,
1526 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1528 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1529 pub expr: Option<&'a Expr<'a, Ex, En>>,
1530 pub readonly: Option<oxidized::ast_defs::ReadonlyKind>,
1531 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1532 pub callconv: ast_defs::ParamKind<'a>,
1533 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1534 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1535 pub visibility: Option<oxidized::aast_defs::Visibility>,
1537 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for FunParam<'a, Ex, En> {}
1538 arena_deserializer::impl_deserialize_in_arena!(FunParam<'arena, Ex, En>);
1555 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1557 #[rust_to_ocaml(and)]
1558 #[rust_to_ocaml(prefix = "f_")]
1560 pub struct Fun_<'a, Ex, En> {
1561 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1562 pub span: &'a Pos<'a>,
1563 pub readonly_this: Option<oxidized::ast_defs::ReadonlyKind>,
1564 #[serde(deserialize_with = "arena_deserializer::arena")]
1566 /// Whether the return value is readonly
1567 pub readonly_ret: Option<oxidized::ast_defs::ReadonlyKind>,
1568 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1569 pub ret: &'a TypeHint<'a, Ex>,
1570 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1572 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1573 pub tparams: &'a [&'a Tparam<'a, Ex, En>],
1574 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1575 pub where_constraints: &'a [&'a WhereConstraintHint<'a>],
1576 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1577 pub params: &'a [&'a FunParam<'a, Ex, En>],
1578 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1579 pub ctxs: Option<&'a Contexts<'a>>,
1580 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1581 pub unsafe_ctxs: Option<&'a Contexts<'a>>,
1582 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1583 pub body: &'a FuncBody<'a, Ex, En>,
1584 pub fun_kind: oxidized::ast_defs::FunKind,
1585 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1586 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1587 /// true if this declaration has no body because it is an
1588 /// external function declaration (e.g. from an HHI file)
1590 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1591 pub doc_comment: Option<&'a DocComment<'a>>,
1593 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Fun_<'a, Ex, En> {}
1594 arena_deserializer::impl_deserialize_in_arena!(Fun_<'arena, Ex, En>);
1596 /// Naming has two phases and the annotation helps to indicate the phase.
1597 /// In the first pass, it will perform naming on everything except for function
1598 /// and method bodies and collect information needed. Then, another round of
1599 /// naming is performed where function bodies are named.
1615 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1617 #[rust_to_ocaml(and)]
1619 pub struct FuncBody<'a, Ex, En> {
1620 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1621 pub fb_ast: &'a Block<'a, Ex, En>,
1623 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for FuncBody<'a, Ex, En> {}
1624 arena_deserializer::impl_deserialize_in_arena!(FuncBody<'arena, Ex, En>);
1626 /// A type annotation is two things:
1627 /// - the localized hint, or if the hint is missing, the inferred type
1628 /// - The typehint associated to this expression if it exists
1643 #[serde(bound(deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>"))]
1644 #[rust_to_ocaml(and)]
1646 pub struct TypeHint<'a, Ex>(
1647 #[serde(deserialize_with = "arena_deserializer::arena")] pub Ex,
1648 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a TypeHint_<'a>,
1650 impl<'a, Ex: TrivialDrop> TrivialDrop for TypeHint<'a, Ex> {}
1651 arena_deserializer::impl_deserialize_in_arena!(TypeHint<'arena, Ex>);
1653 /// Explicit type argument to function, constructor, or collection literal.
1654 /// 'ex = unit in NAST
1655 /// 'ex = Typing_defs.(locl ty) in TAST,
1656 /// and is used to record inferred type arguments, with wildcard hint.
1671 #[serde(bound(deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>"))]
1672 #[rust_to_ocaml(and)]
1674 pub struct Targ<'a, Ex>(
1675 #[serde(deserialize_with = "arena_deserializer::arena")] pub Ex,
1676 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Hint<'a>,
1678 impl<'a, Ex: TrivialDrop> TrivialDrop for Targ<'a, Ex> {}
1679 arena_deserializer::impl_deserialize_in_arena!(Targ<'arena, Ex>);
1681 #[rust_to_ocaml(and)]
1682 pub type TypeHint_<'a> = Option<&'a Hint<'a>>;
1699 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1701 #[rust_to_ocaml(and)]
1702 #[rust_to_ocaml(prefix = "ua_")]
1704 pub struct UserAttribute<'a, Ex, En> {
1705 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1707 /// user attributes are restricted to scalar values
1708 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1709 pub params: &'a [&'a Expr<'a, Ex, En>],
1711 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for UserAttribute<'a, Ex, En> {}
1712 arena_deserializer::impl_deserialize_in_arena!(UserAttribute<'arena, Ex, En>);
1729 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1731 #[rust_to_ocaml(and)]
1732 #[rust_to_ocaml(prefix = "fa_")]
1734 pub struct FileAttribute<'a, Ex, En> {
1735 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1736 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1737 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1738 pub namespace: &'a Nsenv<'a>,
1740 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for FileAttribute<'a, Ex, En> {}
1741 arena_deserializer::impl_deserialize_in_arena!(FileAttribute<'arena, Ex, En>);
1758 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1760 #[rust_to_ocaml(and)]
1761 #[rust_to_ocaml(prefix = "tp_")]
1763 pub struct Tparam<'a, Ex, En> {
1764 pub variance: oxidized::ast_defs::Variance,
1765 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1767 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1768 pub parameters: &'a [&'a Tparam<'a, Ex, En>],
1769 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1770 pub constraints: &'a [(oxidized::ast_defs::ConstraintKind, &'a Hint<'a>)],
1771 pub reified: oxidized::aast_defs::ReifyKind,
1772 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1773 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1775 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Tparam<'a, Ex, En> {}
1776 arena_deserializer::impl_deserialize_in_arena!(Tparam<'arena, Ex, En>);
1778 pub use oxidized::aast_defs::EmitId;
1779 pub use oxidized::aast_defs::RequireKind;
1796 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1798 #[rust_to_ocaml(and)]
1799 #[rust_to_ocaml(prefix = "c_")]
1801 pub struct Class_<'a, Ex, En> {
1802 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1803 pub span: &'a Pos<'a>,
1804 #[serde(deserialize_with = "arena_deserializer::arena")]
1806 #[rust_to_ocaml(attr = "visitors.opaque")]
1807 pub mode: oxidized::file_info::Mode,
1810 pub has_xhp_keyword: bool,
1811 pub kind: oxidized::ast_defs::ClassishKind,
1812 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1813 pub name: &'a ClassName<'a>,
1814 /// The type parameters of a class A<T> (T is the parameter)
1815 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1816 pub tparams: &'a [&'a Tparam<'a, Ex, En>],
1817 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1818 pub extends: &'a [&'a ClassHint<'a>],
1819 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1820 pub uses: &'a [&'a TraitHint<'a>],
1821 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1822 pub xhp_attr_uses: &'a [&'a XhpAttrHint<'a>],
1823 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1824 pub xhp_category: Option<&'a (&'a Pos<'a>, &'a [&'a Pstring<'a>])>,
1825 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1826 pub reqs: &'a [(&'a ClassHint<'a>, &'a oxidized::aast_defs::RequireKind)],
1827 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1828 pub implements: &'a [&'a ClassHint<'a>],
1829 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1830 pub where_constraints: &'a [&'a WhereConstraintHint<'a>],
1831 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1832 pub consts: &'a [&'a ClassConst<'a, Ex, En>],
1833 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1834 pub typeconsts: &'a [&'a ClassTypeconstDef<'a, Ex, En>],
1835 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1836 pub vars: &'a [&'a ClassVar<'a, Ex, En>],
1837 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1838 pub methods: &'a [&'a Method_<'a, Ex, En>],
1839 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1840 pub xhp_children: &'a [(&'a Pos<'a>, XhpChild<'a>)],
1841 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1842 pub xhp_attrs: &'a [&'a XhpAttr<'a, Ex, En>],
1843 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1844 pub namespace: &'a Nsenv<'a>,
1845 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1846 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1847 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1848 pub file_attributes: &'a [&'a FileAttribute<'a, Ex, En>],
1849 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1850 pub docs_url: Option<&'a str>,
1851 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1852 pub enum_: Option<&'a Enum_<'a>>,
1853 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1854 pub doc_comment: Option<&'a DocComment<'a>>,
1855 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1856 pub emit_id: Option<&'a oxidized::aast_defs::EmitId>,
1858 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1859 pub module: Option<Sid<'a>>,
1861 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Class_<'a, Ex, En> {}
1862 arena_deserializer::impl_deserialize_in_arena!(Class_<'arena, Ex, En>);
1864 #[rust_to_ocaml(and)]
1865 pub type ClassHint<'a> = Hint<'a>;
1867 #[rust_to_ocaml(and)]
1868 pub type TraitHint<'a> = Hint<'a>;
1870 #[rust_to_ocaml(and)]
1871 pub type XhpAttrHint<'a> = Hint<'a>;
1873 pub use oxidized::aast_defs::XhpAttrTag;
1890 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1892 #[rust_to_ocaml(and)]
1894 pub struct XhpAttr<'a, Ex, En>(
1895 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a TypeHint<'a, Ex>,
1896 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a ClassVar<'a, Ex, En>,
1897 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1898 pub Option<&'a oxidized::aast_defs::XhpAttrTag>,
1899 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1900 pub Option<&'a (&'a Pos<'a>, &'a [&'a Expr<'a, Ex, En>])>,
1902 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for XhpAttr<'a, Ex, En> {}
1903 arena_deserializer::impl_deserialize_in_arena!(XhpAttr<'arena, Ex, En>);
1921 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1923 #[rust_to_ocaml(and)]
1925 pub enum ClassConstKind<'a, Ex, En> {
1926 /// CCAbstract represents the states
1927 /// abstract const int X;
1928 /// abstract const int Y = 4;
1929 /// The expr option is a default value
1930 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1931 CCAbstract(Option<&'a Expr<'a, Ex, En>>),
1932 /// CCConcrete represents
1933 /// const int Z = 4;
1934 /// The expr is the value of the constant. It is not optional
1935 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1936 CCConcrete(&'a Expr<'a, Ex, En>),
1938 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassConstKind<'a, Ex, En> {}
1939 arena_deserializer::impl_deserialize_in_arena!(ClassConstKind<'arena, Ex, En>);
1956 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
1958 #[rust_to_ocaml(and)]
1959 #[rust_to_ocaml(prefix = "cc_")]
1961 pub struct ClassConst<'a, Ex, En> {
1962 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1963 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
1964 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1965 pub type_: Option<&'a Hint<'a>>,
1966 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1968 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1969 pub kind: ClassConstKind<'a, Ex, En>,
1970 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1971 pub span: &'a Pos<'a>,
1972 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
1973 pub doc_comment: Option<&'a DocComment<'a>>,
1975 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassConst<'a, Ex, En> {}
1976 arena_deserializer::impl_deserialize_in_arena!(ClassConst<'arena, Ex, En>);
1978 /// This represents a type const definition. If a type const is abstract then
1979 /// then the type hint acts as a constraint. Any concrete definition of the
1980 /// type const must satisfy the constraint.
1982 /// If the type const is not abstract then a type must be specified.
1997 #[rust_to_ocaml(and)]
1998 #[rust_to_ocaml(prefix = "c_atc_")]
2000 pub struct ClassAbstractTypeconst<'a> {
2001 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2002 pub as_constraint: Option<&'a Hint<'a>>,
2003 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2004 pub super_constraint: Option<&'a Hint<'a>>,
2005 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2006 pub default: Option<&'a Hint<'a>>,
2008 impl<'a> TrivialDrop for ClassAbstractTypeconst<'a> {}
2009 arena_deserializer::impl_deserialize_in_arena!(ClassAbstractTypeconst<'arena>);
2025 #[rust_to_ocaml(and)]
2027 pub struct ClassConcreteTypeconst<'a> {
2028 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2029 pub c_tc_type: &'a Hint<'a>,
2031 impl<'a> TrivialDrop for ClassConcreteTypeconst<'a> {}
2032 arena_deserializer::impl_deserialize_in_arena!(ClassConcreteTypeconst<'arena>);
2049 #[rust_to_ocaml(and)]
2051 pub enum ClassTypeconst<'a> {
2052 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2053 TCAbstract(&'a ClassAbstractTypeconst<'a>),
2054 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2055 TCConcrete(&'a ClassConcreteTypeconst<'a>),
2057 impl<'a> TrivialDrop for ClassTypeconst<'a> {}
2058 arena_deserializer::impl_deserialize_in_arena!(ClassTypeconst<'arena>);
2075 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2077 #[rust_to_ocaml(and)]
2078 #[rust_to_ocaml(prefix = "c_tconst_")]
2080 pub struct ClassTypeconstDef<'a, Ex, En> {
2081 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2082 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
2083 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2085 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2086 pub kind: ClassTypeconst<'a>,
2087 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2088 pub span: &'a Pos<'a>,
2089 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2090 pub doc_comment: Option<&'a DocComment<'a>>,
2093 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassTypeconstDef<'a, Ex, En> {}
2094 arena_deserializer::impl_deserialize_in_arena!(ClassTypeconstDef<'arena, Ex, En>);
2110 #[rust_to_ocaml(and)]
2111 #[rust_to_ocaml(prefix = "xai_")]
2113 pub struct XhpAttrInfo<'a> {
2114 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2115 pub like: Option<&'a Pos<'a>>,
2116 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2117 pub tag: Option<&'a oxidized::aast_defs::XhpAttrTag>,
2118 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2119 pub enum_values: &'a [ast_defs::XhpEnumValue<'a>],
2121 impl<'a> TrivialDrop for XhpAttrInfo<'a> {}
2122 arena_deserializer::impl_deserialize_in_arena!(XhpAttrInfo<'arena>);
2139 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2141 #[rust_to_ocaml(and)]
2142 #[rust_to_ocaml(prefix = "cv_")]
2144 pub struct ClassVar<'a, Ex, En> {
2146 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2147 pub xhp_attr: Option<&'a XhpAttrInfo<'a>>,
2148 pub abstract_: bool,
2150 pub visibility: oxidized::aast_defs::Visibility,
2151 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2152 pub type_: &'a TypeHint<'a, Ex>,
2153 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2155 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2156 pub expr: Option<&'a Expr<'a, Ex, En>>,
2157 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2158 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
2159 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2160 pub doc_comment: Option<&'a DocComment<'a>>,
2161 pub is_promoted_variadic: bool,
2162 pub is_static: bool,
2163 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2164 pub span: &'a Pos<'a>,
2166 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ClassVar<'a, Ex, En> {}
2167 arena_deserializer::impl_deserialize_in_arena!(ClassVar<'arena, Ex, En>);
2184 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2186 #[rust_to_ocaml(and)]
2187 #[rust_to_ocaml(prefix = "m_")]
2189 pub struct Method_<'a, Ex, En> {
2190 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2191 pub span: &'a Pos<'a>,
2192 #[serde(deserialize_with = "arena_deserializer::arena")]
2195 pub abstract_: bool,
2197 pub readonly_this: bool,
2198 pub visibility: oxidized::aast_defs::Visibility,
2199 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2201 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2202 pub tparams: &'a [&'a Tparam<'a, Ex, En>],
2203 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2204 pub where_constraints: &'a [&'a WhereConstraintHint<'a>],
2205 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2206 pub params: &'a [&'a FunParam<'a, Ex, En>],
2207 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2208 pub ctxs: Option<&'a Contexts<'a>>,
2209 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2210 pub unsafe_ctxs: Option<&'a Contexts<'a>>,
2211 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2212 pub body: &'a FuncBody<'a, Ex, En>,
2213 pub fun_kind: oxidized::ast_defs::FunKind,
2214 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2215 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
2216 pub readonly_ret: Option<oxidized::ast_defs::ReadonlyKind>,
2217 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2218 pub ret: &'a TypeHint<'a, Ex>,
2219 /// true if this declaration has no body because it is an external method
2220 /// declaration (e.g. from an HHI file)
2222 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2223 pub doc_comment: Option<&'a DocComment<'a>>,
2225 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Method_<'a, Ex, En> {}
2226 arena_deserializer::impl_deserialize_in_arena!(Method_<'arena, Ex, En>);
2228 #[rust_to_ocaml(and)]
2229 pub type Nsenv<'a> = namespace_env::Env<'a>;
2246 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2248 #[rust_to_ocaml(and)]
2249 #[rust_to_ocaml(prefix = "t_")]
2251 pub struct Typedef<'a, Ex, En> {
2252 #[serde(deserialize_with = "arena_deserializer::arena")]
2254 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2256 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2257 pub tparams: &'a [&'a Tparam<'a, Ex, En>],
2258 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2259 pub as_constraint: Option<&'a Hint<'a>>,
2260 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2261 pub super_constraint: Option<&'a Hint<'a>>,
2262 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2263 pub kind: &'a Hint<'a>,
2264 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2265 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
2266 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2267 pub file_attributes: &'a [&'a FileAttribute<'a, Ex, En>],
2268 #[rust_to_ocaml(attr = "visitors.opaque")]
2269 pub mode: oxidized::file_info::Mode,
2270 pub vis: oxidized::aast_defs::TypedefVisibility,
2271 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2272 pub namespace: &'a Nsenv<'a>,
2273 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2274 pub span: &'a Pos<'a>,
2275 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2276 pub emit_id: Option<&'a oxidized::aast_defs::EmitId>,
2279 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2280 pub module: Option<Sid<'a>>,
2281 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2282 pub docs_url: Option<&'a str>,
2284 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Typedef<'a, Ex, En> {}
2285 arena_deserializer::impl_deserialize_in_arena!(Typedef<'arena, Ex, En>);
2302 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2304 #[rust_to_ocaml(and)]
2305 #[rust_to_ocaml(prefix = "cst_")]
2307 pub struct Gconst<'a, Ex, En> {
2308 #[serde(deserialize_with = "arena_deserializer::arena")]
2310 #[rust_to_ocaml(attr = "visitors.opaque")]
2311 pub mode: oxidized::file_info::Mode,
2312 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2314 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2315 pub type_: Option<&'a Hint<'a>>,
2316 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2317 pub value: &'a Expr<'a, Ex, En>,
2318 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2319 pub namespace: &'a Nsenv<'a>,
2320 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2321 pub span: &'a Pos<'a>,
2322 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2323 pub emit_id: Option<&'a oxidized::aast_defs::EmitId>,
2325 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Gconst<'a, Ex, En> {}
2326 arena_deserializer::impl_deserialize_in_arena!(Gconst<'arena, Ex, En>);
2343 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2345 #[rust_to_ocaml(and)]
2346 #[rust_to_ocaml(prefix = "fd_")]
2348 pub struct FunDef<'a, Ex, En> {
2349 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2350 pub namespace: &'a Nsenv<'a>,
2351 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2352 pub file_attributes: &'a [&'a FileAttribute<'a, Ex, En>],
2353 #[rust_to_ocaml(attr = "visitors.opaque")]
2354 pub mode: oxidized::file_info::Mode,
2355 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2356 pub fun: &'a Fun_<'a, Ex, En>,
2358 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2359 pub module: Option<Sid<'a>>,
2361 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for FunDef<'a, Ex, En> {}
2362 arena_deserializer::impl_deserialize_in_arena!(FunDef<'arena, Ex, En>);
2379 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2381 #[rust_to_ocaml(and)]
2382 #[rust_to_ocaml(prefix = "md_")]
2384 pub struct ModuleDef<'a, Ex, En> {
2385 #[serde(deserialize_with = "arena_deserializer::arena")]
2387 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2388 pub name: ast_defs::Id<'a>,
2389 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2390 pub user_attributes: &'a [&'a UserAttribute<'a, Ex, En>],
2391 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2392 pub span: &'a Pos<'a>,
2393 #[rust_to_ocaml(attr = "visitors.opaque")]
2394 pub mode: oxidized::file_info::Mode,
2395 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2396 pub doc_comment: Option<&'a DocComment<'a>>,
2397 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2398 pub exports: Option<&'a [MdNameKind<'a>]>,
2399 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2400 pub imports: Option<&'a [MdNameKind<'a>]>,
2402 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for ModuleDef<'a, Ex, En> {}
2403 arena_deserializer::impl_deserialize_in_arena!(ModuleDef<'arena, Ex, En>);
2420 #[rust_to_ocaml(and)]
2422 pub enum MdNameKind<'a> {
2423 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2424 MDNameGlobal(&'a Pos<'a>),
2425 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2426 MDNamePrefix(&'a Sid<'a>),
2427 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2428 MDNameExact(&'a Sid<'a>),
2430 impl<'a> TrivialDrop for MdNameKind<'a> {}
2431 arena_deserializer::impl_deserialize_in_arena!(MdNameKind<'arena>);
2449 deserialize = "Ex: 'de + arena_deserializer::DeserializeInArena<'de>, En: 'de + arena_deserializer::DeserializeInArena<'de>"
2451 #[rust_to_ocaml(and)]
2453 pub enum Def<'a, Ex, En> {
2454 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2455 Fun(&'a FunDef<'a, Ex, En>),
2456 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2457 Class(&'a Class_<'a, Ex, En>),
2458 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2459 Stmt(&'a Stmt<'a, Ex, En>),
2460 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2461 Typedef(&'a Typedef<'a, Ex, En>),
2462 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2463 Constant(&'a Gconst<'a, Ex, En>),
2464 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2465 #[rust_to_ocaml(inline_tuple)]
2466 Namespace(&'a (Sid<'a>, &'a [Def<'a, Ex, En>])),
2467 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2468 NamespaceUse(&'a [(&'a oxidized::aast_defs::NsKind, Sid<'a>, Sid<'a>)]),
2469 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2470 SetNamespaceEnv(&'a Nsenv<'a>),
2471 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2472 FileAttributes(&'a FileAttribute<'a, Ex, En>),
2473 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2474 Module(&'a ModuleDef<'a, Ex, En>),
2475 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2476 SetModule(&'a Sid<'a>),
2478 impl<'a, Ex: TrivialDrop, En: TrivialDrop> TrivialDrop for Def<'a, Ex, En> {}
2479 arena_deserializer::impl_deserialize_in_arena!(Def<'arena, Ex, En>);
2481 pub use oxidized::aast_defs::NsKind;
2483 #[rust_to_ocaml(and)]
2484 pub type DocComment<'a> = ast_defs::Pstring<'a>;
2486 pub use oxidized::aast_defs::ImportFlavor;
2503 #[rust_to_ocaml(and)]
2505 pub enum XhpChild<'a> {
2506 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2507 ChildName(&'a Sid<'a>),
2508 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2509 ChildList(&'a [XhpChild<'a>]),
2510 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2511 #[rust_to_ocaml(inline_tuple)]
2512 ChildUnary(&'a (XhpChild<'a>, oxidized::aast_defs::XhpChildOp)),
2513 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2514 #[rust_to_ocaml(inline_tuple)]
2515 ChildBinary(&'a (XhpChild<'a>, XhpChild<'a>)),
2517 impl<'a> TrivialDrop for XhpChild<'a> {}
2518 arena_deserializer::impl_deserialize_in_arena!(XhpChild<'arena>);
2520 pub use oxidized::aast_defs::XhpChildOp;
2536 #[rust_to_ocaml(and)]
2538 pub struct Hint<'a>(
2539 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
2540 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Hint_<'a>,
2542 impl<'a> TrivialDrop for Hint<'a> {}
2543 arena_deserializer::impl_deserialize_in_arena!(Hint<'arena>);
2545 #[rust_to_ocaml(and)]
2546 pub type VariadicHint<'a> = Option<&'a Hint<'a>>;
2562 #[rust_to_ocaml(and)]
2564 pub struct Contexts<'a>(
2565 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Pos<'a>,
2566 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a [&'a Hint<'a>],
2568 impl<'a> TrivialDrop for Contexts<'a> {}
2569 arena_deserializer::impl_deserialize_in_arena!(Contexts<'arena>);
2585 #[rust_to_ocaml(and)]
2586 #[rust_to_ocaml(prefix = "hfparam_")]
2588 pub struct HfParamInfo<'a> {
2589 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2590 pub kind: ast_defs::ParamKind<'a>,
2591 pub readonlyness: Option<oxidized::ast_defs::ReadonlyKind>,
2593 impl<'a> TrivialDrop for HfParamInfo<'a> {}
2594 arena_deserializer::impl_deserialize_in_arena!(HfParamInfo<'arena>);
2610 #[rust_to_ocaml(and)]
2611 #[rust_to_ocaml(prefix = "hf_")]
2613 pub struct HintFun<'a> {
2614 pub is_readonly: Option<oxidized::ast_defs::ReadonlyKind>,
2615 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2616 pub param_tys: &'a [&'a Hint<'a>],
2617 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2618 pub param_info: &'a [Option<&'a HfParamInfo<'a>>],
2619 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2620 pub variadic_ty: &'a VariadicHint<'a>,
2621 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2622 pub ctxs: Option<&'a Contexts<'a>>,
2623 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2624 pub return_ty: &'a Hint<'a>,
2625 pub is_readonly_return: Option<oxidized::ast_defs::ReadonlyKind>,
2627 impl<'a> TrivialDrop for HintFun<'a> {}
2628 arena_deserializer::impl_deserialize_in_arena!(HintFun<'arena>);
2645 #[rust_to_ocaml(and)]
2647 pub enum Hint_<'a> {
2648 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2649 Hoption(&'a Hint<'a>),
2650 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2651 Hlike(&'a Hint<'a>),
2652 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2653 Hfun(&'a HintFun<'a>),
2654 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2655 Htuple(&'a [&'a Hint<'a>]),
2656 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2657 #[rust_to_ocaml(inline_tuple)]
2658 Happly(&'a (&'a ClassName<'a>, &'a [&'a Hint<'a>])),
2659 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2660 Hshape(&'a NastShapeInfo<'a>),
2661 /// This represents the use of a type const. Type consts are accessed like
2662 /// regular consts in Hack, i.e.
2664 /// [$x | self | static | Class]::TypeConst
2666 /// Class => Happly "Class"
2667 /// self => Happly of the class of definition
2668 /// static => Habstr ("static",
2669 /// Habstr ("this", (Constraint_as, Happly of class of definition)))
2672 /// Type const access can be chained such as
2674 /// Class::TC1::TC2::TC3
2676 /// We resolve the root of the type access chain as a type as follows.
2678 /// This will result in the following representation
2680 /// Haccess (Happly "Class", ["TC1", "TC2", "TC3"])
2681 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2682 #[rust_to_ocaml(inline_tuple)]
2683 Haccess(&'a (&'a Hint<'a>, &'a [Sid<'a>])),
2684 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2685 Hsoft(&'a Hint<'a>),
2686 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2687 #[rust_to_ocaml(inline_tuple)]
2688 Hrefinement(&'a (&'a Hint<'a>, &'a [Refinement<'a>])),
2693 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2694 #[rust_to_ocaml(inline_tuple)]
2695 Habstr(&'a (&'a str, &'a [&'a Hint<'a>])),
2696 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2697 #[rust_to_ocaml(name = "Hvec_or_dict")]
2698 #[rust_to_ocaml(inline_tuple)]
2699 HvecOrDict(&'a (Option<&'a Hint<'a>>, &'a Hint<'a>)),
2700 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2701 Hprim(&'a oxidized::aast_defs::Tprim),
2705 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2706 Hunion(&'a [&'a Hint<'a>]),
2707 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2708 Hintersection(&'a [&'a Hint<'a>]),
2709 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2710 #[rust_to_ocaml(name = "Hfun_context")]
2711 HfunContext(&'a str),
2712 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2715 impl<'a> TrivialDrop for Hint_<'a> {}
2716 arena_deserializer::impl_deserialize_in_arena!(Hint_<'arena>);
2733 #[rust_to_ocaml(and)]
2735 pub enum Refinement<'a> {
2736 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2737 #[rust_to_ocaml(inline_tuple)]
2738 Rctx(&'a (Sid<'a>, CtxRefinement<'a>)),
2739 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2740 #[rust_to_ocaml(inline_tuple)]
2741 Rtype(&'a (Sid<'a>, TypeRefinement<'a>)),
2743 impl<'a> TrivialDrop for Refinement<'a> {}
2744 arena_deserializer::impl_deserialize_in_arena!(Refinement<'arena>);
2761 #[rust_to_ocaml(and)]
2763 pub enum TypeRefinement<'a> {
2764 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2765 TRexact(&'a Hint<'a>),
2766 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2767 TRloose(&'a TypeRefinementBounds<'a>),
2769 impl<'a> TrivialDrop for TypeRefinement<'a> {}
2770 arena_deserializer::impl_deserialize_in_arena!(TypeRefinement<'arena>);
2786 #[rust_to_ocaml(and)]
2787 #[rust_to_ocaml(prefix = "tr_")]
2789 pub struct TypeRefinementBounds<'a> {
2790 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2791 pub lower: &'a [&'a Hint<'a>],
2792 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2793 pub upper: &'a [&'a Hint<'a>],
2795 impl<'a> TrivialDrop for TypeRefinementBounds<'a> {}
2796 arena_deserializer::impl_deserialize_in_arena!(TypeRefinementBounds<'arena>);
2813 #[rust_to_ocaml(and)]
2815 pub enum CtxRefinement<'a> {
2816 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2817 CRexact(&'a Hint<'a>),
2818 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2819 CRloose(&'a CtxRefinementBounds<'a>),
2821 impl<'a> TrivialDrop for CtxRefinement<'a> {}
2822 arena_deserializer::impl_deserialize_in_arena!(CtxRefinement<'arena>);
2838 #[rust_to_ocaml(and)]
2839 #[rust_to_ocaml(prefix = "cr_")]
2841 pub struct CtxRefinementBounds<'a> {
2842 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2843 pub lower: Option<&'a Hint<'a>>,
2844 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2845 pub upper: Option<&'a Hint<'a>>,
2847 impl<'a> TrivialDrop for CtxRefinementBounds<'a> {}
2848 arena_deserializer::impl_deserialize_in_arena!(CtxRefinementBounds<'arena>);
2864 #[rust_to_ocaml(and)]
2865 #[rust_to_ocaml(prefix = "sfi_")]
2867 pub struct ShapeFieldInfo<'a> {
2869 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2870 pub hint: &'a Hint<'a>,
2871 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2872 pub name: ast_defs::ShapeFieldName<'a>,
2874 impl<'a> TrivialDrop for ShapeFieldInfo<'a> {}
2875 arena_deserializer::impl_deserialize_in_arena!(ShapeFieldInfo<'arena>);
2891 #[rust_to_ocaml(and)]
2892 #[rust_to_ocaml(prefix = "nsi_")]
2894 pub struct NastShapeInfo<'a> {
2895 pub allows_unknown_fields: bool,
2896 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2897 pub field_map: &'a [&'a ShapeFieldInfo<'a>],
2899 impl<'a> TrivialDrop for NastShapeInfo<'a> {}
2900 arena_deserializer::impl_deserialize_in_arena!(NastShapeInfo<'arena>);
2902 pub use oxidized::aast_defs::KvcKind;
2903 pub use oxidized::aast_defs::VcKind;
2919 #[rust_to_ocaml(and)]
2920 #[rust_to_ocaml(prefix = "e_")]
2922 pub struct Enum_<'a> {
2923 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2924 pub base: &'a Hint<'a>,
2925 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2926 pub constraint: Option<&'a Hint<'a>>,
2927 #[serde(deserialize_with = "arena_deserializer::arena", borrow)]
2928 pub includes: &'a [&'a Hint<'a>],
2930 impl<'a> TrivialDrop for Enum_<'a> {}
2931 arena_deserializer::impl_deserialize_in_arena!(Enum_<'arena>);
2947 #[rust_to_ocaml(and)]
2948 #[rust_to_ocaml(attr = r#"deriving ((show { with_path = false }), eq, ord,
2953 visit_prefix = "on_";
2955 ["Visitors_runtime.iter"; "Aast_defs_visitors_ancestors.iter"]
2961 visit_prefix = "on_";
2963 ["Visitors_runtime.reduce"; "Aast_defs_visitors_ancestors.reduce"]
2969 visit_prefix = "on_";
2971 ["Visitors_runtime.map"; "Aast_defs_visitors_ancestors.map"]
2975 variety = "mapreduce";
2977 visit_prefix = "on_";
2979 ["Visitors_runtime.mapreduce";
2980 "Aast_defs_visitors_ancestors.mapreduce"]
2986 visit_prefix = "on_";
2988 ["Visitors_runtime.endo"; "Aast_defs_visitors_ancestors.endo"]
2991 pub struct WhereConstraintHint<'a>(
2992 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Hint<'a>,
2993 pub oxidized::ast_defs::ConstraintKind,
2994 #[serde(deserialize_with = "arena_deserializer::arena", borrow)] pub &'a Hint<'a>,
2996 impl<'a> TrivialDrop for WhereConstraintHint<'a> {}
2997 arena_deserializer::impl_deserialize_in_arena!(WhereConstraintHint<'arena>);