UDocumentation UE5.7 10.02.2026 (Source)
API documentation for Unreal Engine 5.7
VstNode.h
Go to the documentation of this file.
1// Copyright Epic Games, Inc. All Rights Reserved.
2
3#pragma once
4
20
21#define UE_API VERSECOMPILER_API
22
23namespace Verse
24{
25namespace Vst
26{
27struct Node;
28}
29} // namespace Verse
30
31namespace uLang
32{
33class CAstNode;
34class CExpressionBase;
36
43} // namespace uLang
44
45namespace Verse
46{
47class FTile;
48
53
55
57
58// uLang Types
59template<typename T>
61
62template<typename T>
64
65template<typename T>
67
73
75{
76 return SLocus(0, 0, 0, 0);
77}
78
79namespace Vst
80{
81 class CAtom;
82 struct Clause;
83 struct Snippet;
84 struct Identifier;
85
92
94 {
98 };
99
100#define VISIT_VSTNODE(NodeName, RequiredChildren, SupportsManyChildren, Precedence, ChildDeletionBehavior, IsCAtom) NodeName,
101 enum class NodeType : uint8_t
102 {
104 };
105#undef VISIT_VSTNODE
106
107#define VISIT_VSTNODE(NodeName, RequiredChildren, Precedence, SupportsManyChildren, ChildDeletionBehavior, IsCAtom) {#NodeName, RequiredChildren, Precedence, ESupportsManyChildren::SupportsManyChildren, EChildDeletionBehavior::ChildDeletionBehavior, IsCAtom},
118#undef VISIT_VSTNODE
119
120 static constexpr uint8_t NumNodeTypes = static_cast<uint8_t>(ULANG_COUNTOF(NodeInfos));
121
122 static const uint8_t TagNone = 255;
123
125 {
126 return NodeInfos[static_cast<uint8_t>(TypeOfNode)].FormalName;
127 }
128
130 {
131 return NodeInfos[static_cast<uint8_t>(TypeOfNode)].RequiredChildren;
132 }
133
135 {
136 return NodeInfos[static_cast<uint8_t>(TypeOfNode)].Precedence;
137 }
138
140 {
141 return NodeInfos[static_cast<uint8_t>(TypeOfNode)].SupportsManyChildren;
142 }
143
145 {
146 return NodeInfos[static_cast<uint8_t>(TypeOfNode)].ChildDeletionBehavior;
147 }
148
149 struct Node : public CSharedMix
150 {
152
154 : _Children()
155 , _Parent(nullptr)
156 , _Aux()
157 , _PreComments()
158 , _PostComments()
161 , _Tag(0)
163 , _MappedAstNode(nullptr)
164 , _Tile(nullptr)
165 {}
166
168 {
169 _Type = in_type;
171 in_type == NodeType::Project
172 || in_type == NodeType::Package
173 || in_type == NodeType::Module
174 || in_type == NodeType::Snippet,
175 "Invalid use of locus-free Node constructor for node type that requires a locus");
176 }
177
179 {
180 _Type = in_type;
181 _Whence = whence;
182 ULANG_ASSERTF(_Whence.IsValid(), "Node created with invalid locus");
183 }
184
185 UE_API virtual ~Node();
186
187 static SLocus CombineLocii(const NodeArray& Nodes)
188 {
189 if (Nodes.IsFilled())
190 {
191 SLocus Whence = Nodes[0]->Whence();
192 for (int32_t Index = 1; Index < Nodes.Num(); ++Index)
193 {
194 Whence |= Nodes[Index]->Whence();
195 }
196 return Whence;
197 }
198 return SLocus();
199 }
200
202 //TSRef<const Node> AsShared() const { return CSharedMix::SharedThis(this); }
203
204 template<typename TNodeType>
205 TNodeType& As() { ULANG_ASSERTF(IsA<TNodeType>(), "Vst Node is type `%s` not of expected type `%s` so cannot cast!", NodeInfos[GetElementTypeInt()].FormalName, NodeInfos[static_cast<int32_t>(TNodeType::StaticType)].FormalName); return *static_cast<TNodeType*>(this); }
206
207 template<typename TNodeType>
208 const TNodeType& As() const { ULANG_ASSERTF(IsA<TNodeType>(), "Vst Node is type `%s` not of expected type `%s` so cannot cast!", NodeInfos[GetElementTypeInt()].FormalName, NodeInfos[static_cast<int32_t>(TNodeType::StaticType)].FormalName); return *static_cast<const TNodeType*>(this); }
209
210 template <typename TNodeType>
211 TNodeType* AsNullable() { return IsA<TNodeType>()? static_cast<TNodeType*>(this) : nullptr; }
212
213 template <typename TNodeType>
214 const TNodeType* AsNullable() const { return IsA<TNodeType>() ? static_cast<const TNodeType*>(this) : nullptr; }
215
216 template<typename TNodeType>
217 bool IsA() const { return GetElementType() == TNodeType::StaticType; }
218
219 int GetChildCount() const { return _Children.Num(); }
220 NodeType GetElementType() const { return _Type; }
221 int32_t GetElementTypeInt() const { return static_cast<int32_t>(GetElementType()); }
222 template<typename OpType>
223 OpType GetTag() const { return static_cast<OpType>(_Tag); }
224 template<typename OpType=uint8_t>
225 void SetTag(OpType in_op) { _Tag = static_cast<uint8_t>(in_op); }
226
227 UE_API bool HasAttributes() const;
228 UE_API const Identifier* GetAttributeIdentifier(const CUTF8StringView& AttributeName) const;
229 UE_API bool IsAttributePresent(const CUTF8StringView& AttributeName) const;
230
232
233 template<typename TNodeType>
235 {
236 const Node* Result = TryGetFirstAttributeOfType(TNodeType::StaticType);
237
238 if(Result != nullptr)
239 {
240 return &Result->As<TNodeType>();
241 }
242
243 return nullptr;
244 }
245
251 const TSPtr<Clause>& GetAux() const { return _Aux; }
252 UE_API void SetAux(const TSRef<Clause>& Aux);
253 void RemoveAux() { _Aux.Reset(); }
254
261 const NodeArray& GetPrefixComments() const { return _PreComments; }
262 const NodeArray& GetPostfixComments() const { return _PostComments; }
265
268 const SLocus& Whence() const { return _Whence; }
269 UE_API const CUTF8String& GetSnippetPath() const;
270 UE_API const Snippet* FindSnippetByFilePath(const CUTF8StringView& FilePath) const;
273 template<class VisitPolicy, typename ReturnType = void >
274 static void VisitWith(const TSRef<Vst::Node>& node, VisitPolicy& visit_policy);
275
277 const ChType* GetElementName() const { return (const ChType*)NodeInfos[GetElementTypeInt()].FormalName; }
287
289 {
290 return _NumNewLinesBefore;
291 }
292
294 {
296 }
297
299 {
300 return _NumNewLinesAfter;
301 }
302
304 {
306 }
307
309 {
310 if (bNewLineAfter)
311 {
312 // Don't touch the node if it already has new lines after it; we preserve the information.
313 if (NumNewLinesAfter() > 0)
314 {
315 return;
316 }
317 else
318 {
320 }
321 }
322 else
323 {
325 }
326 }
327
328 bool HasNewLineAfter() const
329 {
330 return _NumNewLinesAfter > 0;
331 }
332
333 bool HasNewLinesBefore() const
334 {
335 return _NumNewLinesBefore > 0;
336 }
337
338 bool IsEmpty() const { return _Children.IsEmpty(); }
339 const NodeArray& GetChildren() const { return _Children; }
342 {
343 for (const TSRef<Node>& Child : _Children)
344 {
345 Child->_Parent = nullptr;
346 }
347 return Move(_Children);
348 }
350 {
351 return GetChildCount() > 0
352 ? GetChildren()[GetChildCount() - 1]
353 : TSPtr<Node>(nullptr);
354 }
355 Node* AccessParent() { return _Parent; }
357 TSRef<Node> GetSharedSelf() const { return SharedThis(const_cast<Node*>(this)); }
358 const Node* GetParent() const { return _Parent; }
360 bool HasParent() const
361 {
362 return this->GetParent() != nullptr;
363 }
364 template<class Type>
365 const Type* GetParentOfType() const
366 {
367 for (const Node* CurNode = this; CurNode; CurNode = CurNode->_Parent)
368 {
369 if (CurNode->GetElementType() == Type::StaticType)
370 {
371 return static_cast<const Type*>(CurNode);
372 }
373 }
374
375 return nullptr;
376 }
377
378 bool IsElementType(NodeType InType) const { return InType == _Type; }
379
380 UE_API const CAtom* AsAtomNullable() const;
381
382 bool IsChildElementType(int32_t idx, NodeType InType) const { return _Children.Num() > idx && _Children[idx]->IsElementType(InType); }
383
384 bool IsError() const { return GetElementType() == NodeType::ParseError; }
385
387 {
388#ifdef _DEBUG
389 const Node* OrphanedNode = FindOrphanedNode(*this);
390 ULANG_ASSERTF(!OrphanedNode, "An orphaned node was encountered!");
391#endif
392 }
393
394 bool Contains(const Node& Target, const bool bRecursive = true) const
395 {
397 {
398 static bool Contains(const TSRef<Node>& Root, const Node& RecursiveTarget)
399 {
400 bool bRecursiveContains = false;
401 for (const TSPtr<Node> Child : Root->AccessChildren())
402 {
403 if (Child.Get() == &RecursiveTarget)
404 {
405 bRecursiveContains = true;
406 }
407 else if (Child.IsValid())
408 {
409 bRecursiveContains = Contains(Child.AsRef(), RecursiveTarget);
410 }
411
413 {
414 break;
415 }
416 }
417
418 return bRecursiveContains;
419 }
420 };
421
422 bool bContains = false;
423 for (const TSRef<Node>& Child : _Children)
424 {
425 if (Child.Get() == &Target)
426 {
427 bContains = true;
428 }
429 else if (bRecursive)
430 {
431 bContains = FVstContains_Visitor::Contains(Child, Target);
432 }
433
434 if (bContains)
435 {
436 break;
437 }
438 }
439
440 return bContains;
441 }
442
444 {
445 if (!this->HasParent())
446 {
447 return uLang::IndexNone;
448 }
449 const Node* Parent = this->GetParent();
450 const int32_t NumChildren = Parent->GetChildCount();
451 if (NumChildren == 1)
452 {
453 return uLang::IndexNone;
454 }
455 const NodeArray& Children = Parent->GetChildren();
456 for (int32_t Index = 0; Index < NumChildren; ++Index)
457 {
458 const TSRef<Node>& CurNode = Children[Index];
459 if (CurNode == this)
460 {
461 return Index - 1;
462 }
463 }
464 return uLang::IndexNone;
465 }
466
468 {
470 child->_Parent = this;
473 return _Children.Last();
474 }
475
477 {
479 child->_Parent = this;
482 return _Children.Last();
483 }
484
486 {
488 child->_Parent = this;
489 _Children.Insert(child, idx);
491 return _Children[idx];
492 }
493
495 {
497 Child->_Parent = this;
500 }
501
503 {
504 const auto ChildAtIdx = _Children[idx];
505 if (Replacement.IsValid())
506 {
507 Replacement->_Parent = this;
508 _Children[idx] = Replacement.AsRef();
509 }
510 else
511 {
512 _Children.RemoveAt(idx);
513 }
514 ChildAtIdx->_Parent = nullptr;
515 return ChildAtIdx;
516 }
517
519 {
520 NumToAppend = NumToAppend == -1 ? Children.Num() : NumToAppend;
522 for(int32_t i=0; i<NumToAppend; i+=1)
523 {
524 const auto& Expr = Children[i];
525 AppendChild(Expr);
526 }
527 }
528
530 {
531 NumToAppend = NumToAppend == -1 ? Children.Num() : NumToAppend;
533 for (int32_t i = 0; i < NumToAppend; i += 1)
534 {
535 const auto& Expr = Children[i];
536 AppendChild(Expr);
537 }
538 }
539
540 // Prepend the given nodes to this node's child list in reverse order
541 // i.e. the last node in the given list will end up as the first child of this node.
543 {
544 NumToAppend = NumToAppend == -1 ? Children.Num() : NumToAppend;
546 for (int32_t i = 0; i < NumToAppend; i += 1)
547 {
548 const auto& Expr = Children[i];
549 AppendChildAt(Expr, 0);
550 }
551 }
552
554
555 // Supply an index if you have one
557
558 void Empty()
559 {
560 for (const auto& Child : _Children)
561 {
562 if (ULANG_ENSUREF(Child->_Parent == this, "Child does not belong to me!"))
563 {
564 Child->_Parent = nullptr;
565 }
566 }
567
569 }
570
571 const Snippet* FindSnippet() const
572 {
574 }
575
577 {
578 Node* root = this;
579 while (root->_Parent != nullptr && root->_Parent->GetElementType() != NodeType::Snippet)
580 {
581 root = root->AccessParent();
582 }
583
584 return root;
585 }
586
587 static void TransferChildren(const TSRef<Node>& From, const TSRef<Node>& To, int32_t First, int32_t Last)
588 {
589 ULANG_ASSERTF(Last <= From->GetChildCount() - 1, "Not enough elements in source array");
590
591 To->AccessChildren().Reserve(To->GetChildCount() + Last - First + 1);
592
593 for (int32_t i = First; i <= Last; i += 1)
594 {
595 const auto & CurChild = From->GetChildren()[i]; //-V758
596 CurChild->_Parent = nullptr;
597 To->AppendChild(CurChild);
598 }
599
600 From->AccessChildren().RemoveAt(First, Last - First + 1);
601 }
602
603 static void TransferChildren(const TSRef<Node>& From, const TSRef<Node>& To)
604 {
605 TransferChildren(From, To, 0, From->GetChildCount() - 1);
606 }
607
608 static void TransferPrefixComments(const TSRef<Node>& From, const TSRef<Node>& To)
609 {
610 NodeArray& ToPrefixComments = To->AccessPrefixComments();
611 NodeArray& FromPrefixComments = From->AccessPrefixComments();
614 {
615 FromPrefixComment->_Parent = nullptr;
616 To->AppendPrefixComment(FromPrefixComment);
617 }
618 FromPrefixComments.Empty();
619 }
620
621 static void TransferPostfixComments(const TSRef<Node>& From, const TSRef<Node>& To)
622 {
623 NodeArray& ToPostfixComments = To->AccessPostfixComments();
624 NodeArray& FromPostfixComments = From->AccessPostfixComments();
627 {
628 FromPostfixComment->_Parent = nullptr;
629 To->AppendPostfixComment(FromPostfixComment);
630 }
631 FromPostfixComments.Empty();
632 }
633
637
639
641 {
642 _Tile = Tile;
643 }
644
646 {
647 return _Tile;
648 }
649
651 void CloneNodeFields(Node* DestOther) const;
652
653 protected:
654
655 friend class uLang::CAstNode;
656
665 static const Node* FindOrphanedNode(const Node& InNode)
666 {
667 struct SChildParent
668 {
669 const Node* _Child;
670 const Node* _Parent;
671 };
673 // NOTE: (YiLiangSiew) Arbitrary stack size chosen here to try avoiding re-allocation during traversal.
674 Stack.Reserve(256);
675 for (const TSRef<Node>& CurChild : InNode.GetChildren())
676 {
677 Stack.Add({CurChild.Get(), &InNode});
678 }
679 while (!Stack.IsEmpty())
680 {
681 const SChildParent& CurPair = Stack.Pop();
682 if (CurPair._Child->GetParent() != CurPair._Parent)
683 {
684 return CurPair._Child;
685 }
686 for (const TSRef<Node>& CurChild : CurPair._Child->GetChildren())
687 {
688 Stack.Add({CurChild, CurPair._Child});
689 }
690 }
691 return nullptr;
692 };
693
699 {
700 if (ULANG_ENSUREF(Child->GetParent()==nullptr, "Child already has a parent!"))
701 {
702 }
703 else
704 {
705 Child->AccessParent()->AccessChildren().Remove(Child);
706 Child->_Parent = nullptr;
707 }
708 }
709
711 {
713
714 child->_Parent = this;
716
718 }
719
721 {
723
724 child->_Parent = this;
726
728 }
729
735
736 // list of comment nodes that appear before or after this node
739
747
751
758 }; // Node
759
761
762 struct Clause : public Node
763 {
764 static const Vst::NodeType StaticType = NodeType::Clause;
765 enum class EForm : int8_t
766 {
767 Synthetic, // The clause doesn't occur in source, but is instead used as a way to group multiple subexpressions.
768 NoSemicolonOrNewline, // The clause does not contains a semicolon or a newline: x or {x} or {x,y} but not {x;}
769 HasSemicolonOrNewline, // The clause does contain a semicolon or a newline: {x;} or {x;y,z} or \n\tx
770
777 };
778
779 enum class EPunctuation : int8_t
780 {
781 Unknown,
782 Braces,
783 Colon,
785 };
786
787 Clause(const SLocus& Whence, const EForm Form, const EPunctuation Punctuation) : Node(StaticType, Whence), _Form(Form), _Punctuation(Punctuation) {}
788
789 Clause(const SLocus& Whence, const EForm Form) : Node(StaticType, Whence), _Form(Form), _Punctuation(EPunctuation::Unknown) {}
790
791 Clause(uint8_t ClauseType, const SLocus& Whence, EForm Form) : Node(StaticType, Whence), _Form(Form), _Punctuation(EPunctuation::Unknown)
792 {
794 }
795
796 Clause(const TSRef<Node>& Child, const SLocus& Whence, EForm Form) : Clause(0, Whence, Form)
797 {
799 }
800
801 Clause(const NodeArray& Children, const SLocus& Whence, EForm Form) : Clause(0, Whence, Form)
802 {
803 AppendChildren(Children);
804 }
805
806 Clause(const uLang::TSRefArray<Node>& Children, const SLocus& Whence, EForm Form) : Clause(0, Whence, Form)
807 {
808 AppendChildren(Children);
809 }
810
811 Clause(const NodeArray& Children, int32_t NumToAdd, const SLocus& Whence, EForm Form) : Clause(0, Whence, Form)
812 {
813 AppendChildren(Children, NumToAdd);
814 }
815
816 Clause(const uLang::TSRefArray<Node>& Children, int32_t NumToAdd, const SLocus& Whence, EForm Form) : Clause(0, Whence, Form)
817 {
818 AppendChildren(Children, NumToAdd);
819 }
820
821 EForm GetForm() const { return _Form; }
822 void SetForm(const EForm InForm)
823 {
824 this->_Form = InForm;
825 }
826
828 {
829 return _Punctuation;
830 }
832 {
833 this->_Punctuation = InPunctuation;
834 }
835
836 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
837
838 private:
839 EForm _Form;
840
842 EPunctuation _Punctuation;
843 };
844
845 VERSECOMPILER_API const TSRef<Node> MakeStub(const SLocus& Whence);
846
851 class CAtom : public Node
852 {
853 public:
854
855 // Public Data Members
856
858
859 // Methods
860
862
863 const string& GetStringValue() const { return _OriginalCode; }
864 const CUTF8String& GetSourceText() const { return _OriginalCode; }
865 const char* GetSourceCStr() const { return _OriginalCode.AsCString(); }
866 };
867
868 struct Comment : public CAtom
869 {
870 enum class EType : uint8_t { block, line, ind, frag };
871
872 static const Vst::NodeType StaticType = NodeType::Comment;
873
875
876 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
877
879 };
880
881 const char* CommentTypeToString(Comment::EType Type);
882
883 // A collection of sub trees that are stored in the same source, e.g. a text file or UProperty
884 struct Snippet : public Node
885 {
886 static const Vst::NodeType StaticType = NodeType::Snippet;
888 Snippet(const CUTF8StringView& Path) : Node(StaticType), _Path(Path) {}
889 Snippet(const CUTF8StringView& Path, const TSRef<Vst::Node>& FirstChild) : Node(StaticType, FirstChild->Whence()), _Path(Path) { AppendChild(FirstChild); }
890 Snippet(const TSRef<Vst::Node>& FirstChild) : Node(StaticType, FirstChild->Whence()) { AppendChild(FirstChild); }
891
892 bool HasErrors() const
893 {
894 bool bHasErrors = false;
895 for (const TSRef<Node>& Node : _Children)
896 {
897 if (Node->IsError())
898 {
899 bHasErrors = true;
900 break;
901 }
902 }
903 return bHasErrors;
904 }
905
906 Clause::EForm GetForm() const { return _Form; }
907 void SetForm(Clause::EForm Form) { _Form = Form; }
908
909 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
910 void CloneNodeFields(Snippet* DestNode) const;
911
912 // A place to remember what source version this snippet represents.
914
915 // Where this snippet came from - usually this is the fully qualified path of the associated text file
917
918 private:
920 };
921
922 // A collection of snippets
923 struct Module : public Node
924 {
925 static const Vst::NodeType StaticType = NodeType::Module;
927
928 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
929 void CloneNodeFields(Module* DestNode) const;
930
931 // The name of this module
933
934 // File path of vmodule file if exists, or directory path with trailing slash
936 };
937
938 // A collection of Module nodes
939 struct Package : public Node
940 {
941 static const Vst::NodeType StaticType = NodeType::Package;
942
944 {} //-V730
945
946 // The name of this package
948
949 // Directory path where the source files are located
951
952 // File path of vpackage file if exists, empty otherwise
954
955 // Verse path of the root module of this package
957
958 // Names of packages this package is dependent on
960
961 // Destination directory for VNI generated C++ code (fully qualified)
963
964 // The role this package plays in the project.
966
967 // Origin/visibility of Verse code in this package
969
970 // The language version targetted by the Verse code in this package.
972
979 uint32_t _UploadedAtFNVersion = VerseFN::UploadedAtFNVersion::Latest;
980
981 // If true, module macros in this package's source and digest will be treated as implicit
983
984 // Whether to allow the use of experimental definitions in this package.
986
987 // Whether Scene Graph is enabled or not. Impacts the asset digest generated.
988 bool _bEnableSceneGraph = false;
989
992
993 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
994 void CloneNodeFields(Package* DestNode) const;
995 };
996
997 // A collection of Package nodes
998 // Packages (children) are sorted in dependency order (i.e. dependents always follow their dependencies)
999 struct Project : public Node
1000 {
1001 static const Vst::NodeType StaticType = NodeType::Project;
1003
1004 // The name of this project
1006
1007 // File path of vproject file if exists, empty otherwise
1009
1012
1022 {
1023 // NOTE: (YiLiangSiew) This assumes that packages are not stored recursively in the project,
1024 // or that projects do not have other projects as their descendents.
1025 NodeArray& Children = this->AccessChildren();
1026 const int32_t NumChildren = Children.Num();
1027 if (NumChildren == 0)
1028 {
1029 return false;
1030 }
1032 for (int32_t Index = NumChildren - 1; Index >= 0; --Index)
1033 {
1034 TSRef<Node> CurChild = Children[Index];
1035 if (!CurChild->IsA<Package>())
1036 {
1037 continue;
1038 }
1039 if (CurChild->As<Package>()._Name == PackageName)
1040 {
1041 Children.RemoveAt(Index);
1043 }
1044 }
1045 return NumPackagesRemoved > 0;
1046 }
1047
1049 {
1050 for (const TSRef<Node>& CurChild : this->_Children)
1051 {
1052 if (CurChild->IsA<Package>())
1053 {
1055 for (const TSRef<Node>& CurPkgChild : CurPackage.GetChildren())
1056 {
1057 if (CurPkgChild->IsA<Module>())
1058 {
1060 for (const TSRef<Node>& CurModuleChild : CurModule.GetChildren())
1061 {
1062 if (CurModuleChild->IsA<Snippet>())
1063 {
1066 {
1067 if (OutOldSnippet != nullptr)
1068 {
1070 }
1072 return true;
1073 }
1074 }
1075 }
1076 }
1077 else if (CurPkgChild->IsA<Snippet>())
1078 {
1081 {
1082 if (OutOldSnippet != nullptr)
1083 {
1085 }
1087 return true;
1088 }
1089 }
1090 }
1091 }
1092 }
1093 return false;
1094 }
1095
1096 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1097 void CloneNodeFields(Project* DestNode) const;
1098 };
1099
1130 struct Definition : public Node
1131 {
1132 static const Vst::NodeType StaticType = NodeType::Definition;
1133
1135 {
1136 _Children.Reserve(2);
1139 }
1140
1141 // cloning
1143 {
1144 }
1145
1146 const TSRef<Vst::Node>& GetOperandLeft() const { return _Children[0]; }
1147 const TSRef<Vst::Node>& GetOperandRight() const { return _Children[1]; }
1148
1149 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1150 };
1151
1170 struct Assignment : public Node
1171 {
1172 static const Vst::NodeType StaticType = NodeType::Assignment;
1174
1176 {
1177 _Children.Reserve(2);
1179
1180 rhs->SetTag(static_cast<uint8_t>(InOp));
1182 }
1183
1184 // cloning
1186 {
1187 }
1188
1189 const TSRef<Vst::Node>& GetOperandLeft() const { return _Children[0]; }
1190 const TSRef<Vst::Node>& GetOperandRight() const { return _Children[1]; }
1191
1192 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1193 };
1194
1196 {
1197 switch(Op)
1198 {
1199 case Assignment::EOp::assign: return "assign";
1200 case Assignment::EOp::addAssign: return "addAssign";
1201 case Assignment::EOp::subAssign: return "subAssign";
1202 case Assignment::EOp::mulAssign: return "mulAssign";
1203 case Assignment::EOp::divAssign: return "divAssign";
1204 default: ULANG_UNREACHABLE();
1205 };
1206 }
1207
1208 // Conditional flow control with failure context in test condition.
1209 //
1210 // Children are Clause block nodes in the following order:
1211 // - if_identifier ]
1212 // - condition |- Repeating
1213 // - [then_body] ]
1214 // - [else_body] -- Optional last node
1215 //
1216 // If Identifier blocks - must be present and is simply an empty Clause meant to
1217 // hold information about comments surrounding the 'if' identifier in the
1218 // original source code
1219 // Condition blocks - must be present (they cannot be omitted - there must be at
1220 // least 1) and they must have 1 or more expressions where 1 or more of the
1221 // expressions can fail. Any local variables within it's top scope are made
1222 // available to any immediately following then block.
1223 // Then blocks - are optional (they can be omitted) and when present must follow a
1224 // conditional block and may have zero (can be empty) or more expressions.
1225 // Else block - is optional (it can be omitted) and when present must follow a
1226 // conditional or then block (it cannot be the only block), must be the last
1227 // block and it may have zero (can be empty) or more expressions.
1228 //
1229 // Chained `else if` are automatically flattened into a single FlowIf node with
1230 // multiple condition/[then] block pairs followed by an optional else block.
1231 //
1232 // An `if` may be used as an expression with a result if all the control flow paths
1233 // have a common result - i.e. it will have a result if every condition is paired
1234 // with a then block and there is an ending else block and all the then blocks and
1235 // else block have a most common result type.
1236 struct FlowIf : public Node
1237 {
1238 static const Vst::NodeType StaticType = NodeType::FlowIf;
1239
1240 // Tags for different kinds of clause block children.
1242
1244
1249
1250 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1251 };
1252
1253 struct BinaryOpLogicalOr : public Node
1254 {
1255 static const Vst::NodeType StaticType = NodeType::BinaryOpLogicalOr;
1258 {
1259 _Children.Reserve(2);
1260 AppendChild(Lhs);
1261 AppendChild(Rhs);
1262 }
1263
1264 // cloning
1267 {
1268 }
1269
1271
1272 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1273 };
1274
1275 struct BinaryOpLogicalAnd : public Node
1276 {
1277 static const Vst::NodeType StaticType = NodeType::BinaryOpLogicalAnd;
1280 {
1281 _Children.Reserve(2);
1282 AppendChild(Lhs);
1283 AppendChild(Rhs);
1284 }
1285
1286 // cloning
1289 {
1290 }
1291
1293
1294 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1295 };
1296
1297 struct PrefixOpLogicalNot : public Node
1298 {
1299 static const Vst::NodeType StaticType = NodeType::PrefixOpLogicalNot;
1302 {
1304 }
1305
1306 // cloning
1309 {
1310 }
1311
1312 const TSRef<Vst::Node>& GetInnerNode() const { return _Children[0]; }
1313
1314 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1315 };
1316
1317 struct BinaryOpCompare : public Node
1318 {
1319 static const Vst::NodeType StaticType = NodeType::BinaryOpCompare;
1320
1321 enum class op : uint8_t { lt, lteq, gt, gteq, eq, noteq };
1322
1325 {
1326 _Children.Reserve(2);
1329 rhs->SetTag(static_cast<uint8_t>(in_op));
1330 }
1331
1332 // cloning
1335 {
1336 }
1337
1340 op GetOp() const { return _Children[1]->GetTag<op>(); }
1341
1342 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1343 };
1344
1346 {
1347 switch(Op)
1348 {
1349 case BinaryOpCompare::op::lt: return "lt";
1350 case BinaryOpCompare::op::lteq: return "lteq";
1351 case BinaryOpCompare::op::gt: return "gt";
1352 case BinaryOpCompare::op::gteq: return "gteq";
1353 case BinaryOpCompare::op::eq: return "eq";
1354 case BinaryOpCompare::op::noteq: return "noteq";
1355 default: ULANG_UNREACHABLE();
1356 };
1357 }
1358
1372
1373 struct Where : Node
1374 {
1375 static const NodeType StaticType = NodeType::Where;
1376
1378
1381 {
1382 _Children.Reserve(1 + RhsArray.Num());
1384 for (const TSRef<Node>& Rhs : RhsArray)
1385 {
1387 }
1388 }
1389
1392 {
1393 _Children.Reserve(1 + RhsArray.Num());
1395 for (const TSRef<Node>& Rhs : RhsArray)
1396 {
1398 }
1399 }
1400
1401 // cloning
1404 {
1405 }
1406
1408 {
1409 return _Children[0];
1410 }
1411
1413 {
1414 SetChildAt(0, Move(Lhs));
1415 }
1416
1418 {
1419 return {_Children.begin() + 1, _Children.end()};
1420 }
1421
1422 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1423 };
1424
1426 {
1427 static const NodeType StaticType = NodeType::Mutation;
1428
1429 enum class EKeyword : uint8_t
1430 {
1431 Var,
1432 Set,
1433 Live
1434 };
1435
1438 , _Keyword(Keyword)
1439 , _bLive(bLive)
1440 {
1441 _Children.Reserve(1);
1443 }
1444
1445 // cloning
1448 , _Keyword(Keyword)
1449 , _bLive(bLive)
1450 {
1451 }
1452
1454 {
1455 return _Children[0];
1456 }
1457
1459
1461
1462 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1463 };
1464
1465 struct TypeSpec : public Node
1466 {
1467 static const Vst::NodeType StaticType = NodeType::TypeSpec;
1468
1469 // comments that go after the ':' of the typespec
1471
1472 TypeSpec(const SLocus& Whence, const TSRef<Node>& Lhs, const TSRef<Node>& Rhs)
1475 {
1476 _Children.Reserve(2);
1479 }
1480
1481 TypeSpec(const SLocus& Whence, const TSRef<Node>& Rhs)
1484 {
1485 _Children.Reserve(1);
1487 }
1488
1489 // cloning
1493 {
1494
1495 }
1496
1497 bool HasLhs() const { return _Children.Num() == 2; }
1498 TSRef<Vst::Node> GetLhs() const { ULANG_ASSERTF(HasLhs(), "Lhs assumes we have at least two children."); return _Children[0]; }
1499 TSRef<Vst::Node> TakeLhs() { ULANG_ASSERTF(HasLhs(), "Lhs assumes we have at least two children."); return TakeChildAt(0, MakeStub(Whence())); }
1501 TSRef<Vst::Node> TakeRhs() { return TakeChildAt(_Children.Num()-1, MakeStub(Whence())); }
1502
1504 {
1505 NewComment->SetParentInternal(GetSharedSelf());
1507 }
1508
1514
1515 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1516 void CloneNodeFields(TypeSpec* DestNode) const;
1517 };
1518
1519 struct Identifier : public CAtom
1520 {
1521 static const Vst::NodeType StaticType = NodeType::Identifier;
1522
1525
1528
1529 Identifier(const CUTF8StringView& InName, const SLocus& Whence, const bool bCanBeQualified)
1530 : CAtom(InName, StaticType, Whence)
1533 , _bCanBeQualified(bCanBeQualified) {}
1534 Identifier(const CUTF8StringView& InName, const SLocus& Whence)
1535 : CAtom(InName, StaticType, Whence)
1538 , _bCanBeQualified(true) {}
1539
1540 void SetCanBeQualified(const bool bCanBeQualified) { _bCanBeQualified = bCanBeQualified; }
1541 bool CanBeQualified() const { return _bCanBeQualified; }
1542 bool IsQualified() const { return _Children.Num() > 0; }
1543 const TSRef<Node>& GetQualification() const { return _Children[0]; }
1544
1553
1554 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1555 void CloneNodeFields(Identifier* DestNode) const;
1556
1557 private:
1558 bool _bCanBeQualified;
1559 };
1560
1561 struct Operator : public CAtom
1562 {
1563 static const Vst::NodeType StaticType = NodeType::Operator;
1564
1568 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1569 };
1570
1571 struct BinaryOp : public Node
1572 {
1573 enum class op : uint8_t { Operator, Operand };
1574
1582
1584 {
1585 in_child->SetTag(static_cast<uint8_t>(in_op));
1587 }
1588
1589 protected:
1598 };
1599
1600 struct BinaryOpAddSub : public BinaryOp
1601 {
1602 static const Vst::NodeType StaticType = NodeType::BinaryOpAddSub;
1603
1609
1612
1613 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1614 };
1615
1636
1637 struct BinaryOpRange : public Node
1638 {
1639 static const Vst::NodeType StaticType = NodeType::BinaryOpRange;
1640 BinaryOpRange(const SLocus& Whence, const TSRef<Node>& Lhs, const TSRef<Node>& Rhs)
1642 {
1643 _Children.Reserve(2);
1644 AppendChild(Lhs);
1645 AppendChild(Rhs);
1646 }
1647
1648 // cloning
1651 {
1652 }
1653
1655
1656 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1657 };
1658
1659 struct BinaryOpArrow : public Node
1660 {
1661 static const Vst::NodeType StaticType = NodeType::BinaryOpArrow;
1662 BinaryOpArrow(const SLocus& Whence, const TSRef<Node>& Lhs, const TSRef<Node>& Rhs)
1664 {
1665 _Children.Reserve(2);
1666 AppendChild(Lhs);
1667 AppendChild(Rhs);
1668 }
1669
1670 // cloning
1674
1675 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1676 };
1677
1678 struct PrePostCall : public Node
1679 {
1680 static const Vst::NodeType StaticType = NodeType::PrePostCall;
1681
1683
1685 {
1686 AppendChild(FirstChild);
1687 }
1688
1690 {
1691 }
1692
1693 bool IsSimpleCall() const
1694 {
1695 return (GetChildCount() == 2)
1696 && (GetChildren()[0]->GetTag<Op>() == Expression)
1697 && ((GetChildren()[1]->GetTag<Op>() == SureCall) || (GetChildren()[1]->GetTag<Op>() == FailCall));
1698 }
1699
1700 bool IsPostHat() const
1701 {
1702 return (GetChildCount() == 2)
1703 && (GetChildren()[0]->GetTag<Op>() == Expression)
1704 && (GetChildren()[1]->GetTag<Op>() == Pointer);
1705 }
1706
1709
1712
1714 void PrependCallArgs(bool bCanFail, const TSRef<Clause>& Args);
1715
1717 void AppendQMark(const SLocus& Whence);
1718
1720 void AppendHat(const SLocus& Whence);
1721
1723 void AppendCallArgs(bool bCanFail, const TSRef<Clause>& Args);
1724
1726 void AppendDotIdent(const SLocus& Whence, const TSRef<Identifier>& Ident);
1727
1730
1731 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1732 };
1733
1734 struct IntLiteral : public CAtom
1735 {
1736 static const Vst::NodeType StaticType = NodeType::IntLiteral;
1737
1739
1740 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1741 };
1742
1743 struct FloatLiteral : public CAtom
1744 {
1745 static const Vst::NodeType StaticType = NodeType::FloatLiteral;
1746
1747 enum class EFormat
1748 {
1750 F16,
1751 F32,
1752 F64
1753 };
1754
1756
1761
1762 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1763 };
1764
1765 struct CharLiteral : public CAtom
1766 {
1767 static const Vst::NodeType StaticType = NodeType::CharLiteral;
1768
1769 enum class EFormat
1770 {
1771 UTF8CodeUnit, // char8
1772 UnicodeCodePoint // char32
1773 };
1774
1776
1781
1782 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1783 };
1784
1785 struct StringLiteral : public CAtom
1786 {
1787 static const Vst::NodeType StaticType = NodeType::StringLiteral;
1788
1792
1793 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1794 };
1795
1796 struct PathLiteral : public CAtom
1797 {
1798 static const Vst::NodeType StaticType = NodeType::PathLiteral;
1799
1801
1802 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1803 };
1804
1805 struct Interpolant : public CAtom
1806 {
1807 static const Vst::NodeType StaticType = NodeType::Interpolant;
1808
1812
1813 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1814 };
1815
1817 {
1818 static const Vst::NodeType StaticType = NodeType::InterpolatedString;
1819
1823
1824 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1825 };
1826
1827 struct Lambda : public Node
1828 {
1829 static const Vst::NodeType StaticType = NodeType::Lambda;
1830
1831 Lambda(const SLocus& Whence, const TSRef<Node>& Domain, const TSRef<Node>& Range)
1833 {
1834 _Children.Reserve(2);
1835 AppendChild(Domain);
1836 AppendChild(Range);
1837 }
1838
1839 // cloning
1842 {
1843 }
1844
1845 const TSRef<Node>& GetDomain() const { return _Children[0]; }
1846 const TSRef<Clause>& GetRange() const { return _Children[1].As<Clause>(); }
1847
1848 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1849 };
1850
1851 struct Control : public Node
1852 {
1853 static const Vst::NodeType StaticType = NodeType::Control;
1854
1855 enum class EKeyword : uint8_t
1856 {
1857 Return,
1858 Break,
1859 Yield,
1860 Continue
1861 };
1862
1866
1872
1873 const TSRef<Vst::Node>& GetReturnExpression() const { return _Children[0]; }
1874
1875 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1876
1878 };
1879
1881
1882 struct Macro : public Node
1883 {
1884 static const Vst::NodeType StaticType = NodeType::Macro;
1885
1895
1896 // cloning
1900
1901 const TSRef<Vst::Node>& GetName() const { return GetChildren()[0]; }
1907
1908 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1909 };
1910
1911 struct Parens : public Node
1912 {
1913 static const Vst::NodeType StaticType = NodeType::Parens;
1914
1916 : Node(StaticType, Whence), _Form(Form)
1917 {
1919 for (const auto& Child : InChildren)
1920 {
1922 }
1923 }
1924
1926 : Node(StaticType, Whence), _Form(Form)
1927 {
1929 for (const auto& Child : InChildren)
1930 {
1932 }
1933 }
1934
1935 Clause::EForm GetForm() const { return _Form; }
1936
1937 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1938
1939 private:
1940 Clause::EForm _Form;
1941 };
1942
1943 struct Commas : Node
1944 {
1945 static const Vst::NodeType StaticType = NodeType::Commas;
1946
1952
1953 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1954 };
1955
1956 struct Placeholder : public CAtom
1957 {
1958 static const Vst::NodeType StaticType = NodeType::Placeholder;
1959
1962
1963 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1964 };
1965
1966 struct ParseError : public Node
1967 {
1968 public:
1969 static const Vst::NodeType StaticType = NodeType::ParseError;
1970
1971 ParseError(const char* Error, const SLocus& Whence)
1973 , _Error(Error)
1974 {
1975 }
1976
1977 const char* GetError() const { return _Error; }
1978
1980
1981 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
1982
1983 private:
1984 const char* _Error;
1985
1986 };
1987
1988 struct Escape : public Node
1989 {
1990 static const Vst::NodeType StaticType = NodeType::Escape;
1991
1994 {
1996 }
1997
1998 // cloning
2001 {
2002 }
2003
2004 VERSECOMPILER_API TSRef<Node> CloneNode() const override;
2005 };
2006
2034 template <class VisitPolicy, typename ReturnType>
2036 {
2037 const Vst::NodeType node_type = node->GetElementType();
2038 switch (node_type)
2039 {
2040#define VISIT_VSTNODE(NodeName, RequiredChildren, SupportsManyChildren, Precedence, ChildDeletionBehavior, IsCAtom) \
2041 case Vst::NodeType::NodeName: \
2042 return visit_policy.visit(node->As<Vst::NodeName>()); \
2043 break;
2045#undef VISIT_VSTNODE
2046 default:
2047 return ReturnType();
2048 break;
2049 }
2050 }
2051
2052 // Verify all Vst::Node::StaticType are valid
2053#define VISIT_VSTNODE(NodeName, RequiredChildren, SupportsManyChildren, Precedence, ChildDeletionBehavior, IsCAtom) static_assert(NodeName::StaticType == NodeType::NodeName, #NodeName "::StaticType must be Vst::NodeType::" #NodeName);
2055#undef VISIT_VSTNODE
2056
2057} // namespace Vst
2058
2060{
2063
2066 // @sree @nicka This should be a UID into a Map of Snippets, or something. Anything but a ptr.
2067};
2068
2070{
2071 Default = 0,
2072 NewlinesAfterDefinitions = 1 << 0,
2073 NewlinesAfterAttributes = 1 << 1,
2076};
2078
2091
2093{
2094 CUTF8StringBuilder Source; VstAsCodeSourceAppend(VstNode, Source); return Source.MoveToString();
2095}
2096
2101
2106
2113
2116
2127
2128} // namespace Verse
2129
2130#undef UE_API
RAD_F64 F64
Definition egttypes.h:521
UE_FORCEINLINE_HINT TSharedRef< CastToType, Mode > StaticCastSharedRef(TSharedRef< CastFromType, Mode > const &InSharedRef)
Definition SharedPointer.h:127
#define ULANG_ENUM_BIT_FLAGS(Enum,...)
Definition EnumUtils.h:6
return true
Definition ExternalRpcRegistry.cpp:601
@ Num
Definition MetalRHIPrivate.h:234
#define VERSE_ENUM_VSTNODES(DECL_NODE)
Definition NodeDecls.inl:4
#define UE_API
Definition SColorGradingComponentViewer.h:12
#define ULANG_ENSUREF(expr, format,...)
Definition Common.h:292
#define ULANG_FORCEINLINE
Definition Common.h:188
#define ULANG_UNREACHABLE()
Definition Common.h:243
#define ULANG_ASSERTF(expr, format,...)
Definition Common.h:290
#define ULANG_COUNTOF(x)
Definition Common.h:226
void Move(T &A, typename TMoveSupportTraits< T >::Copy B)
Definition UnrealTemplate.h:24
#define VISIT_VSTNODE(NodeName, RequiredChildren, SupportsManyChildren, Precedence, ChildDeletionBehavior, IsCAtom)
Definition VstNode.h:100
Definition VstNode.h:852
const CUTF8String & GetSourceText() const
Definition VstNode.h:864
const string & GetStringValue() const
Definition VstNode.h:863
CUTF8String _OriginalCode
Definition VstNode.h:857
CAtom(const uLang::CUTF8StringView &CodeStr, NodeType InType, const SLocus &Whence)
Definition VstNode.h:861
const char * GetSourceCStr() const
Definition VstNode.h:865
Definition Expression.h:297
Definition SharedPointer.h:28
static TSPtrG< ObjectType, false, CHeapRawAllocator > SharedThis(ObjectType *This)
Definition SharedPointer.h:41
Definition UTF8StringView.h:15
Definition Array.h:51
ULANG_FORCEINLINE int32_t Emplace(ArgsType &&... Args)
Definition Array.h:1527
ULANG_FORCEINLINE ElementType & Last(int32_t IndexFromTheEnd=0)
Definition Array.h:537
void Empty(int32_t Slack=0)
Definition Array.h:1322
ULANG_FORCEINLINE void RemoveAt(int32_t Index)
Definition Array.h:1188
ULANG_FORCEINLINE ElementType * begin()
Definition Array.h:1948
ULANG_FORCEINLINE void Push(ElementType &&Item)
Definition Array.h:489
void Reset(int32_t NewSize=0)
Definition Array.h:1303
ULANG_FORCEINLINE bool IsEmpty() const
Definition Array.h:430
ULANG_FORCEINLINE bool IsFilled() const
Definition Array.h:441
int32_t Insert(std::initializer_list< ElementType > InitList, const int32_t InIndex)
Definition Array.h:986
ULANG_FORCEINLINE ElementType * end()
Definition Array.h:1950
ULANG_FORCEINLINE ElementType Pop(bool bAllowShrinking=true)
Definition Array.h:476
ULANG_FORCEINLINE void Reserve(int32_t Number)
Definition Array.h:1753
ULANG_FORCEINLINE int32_t Add(ElementType &&Item)
Definition Array.h:1587
ULANG_FORCEINLINE int32_t Num() const
Definition Array.h:402
Definition SharedPointerArray.h:21
Definition SharedPointer.h:77
ULANG_FORCEINLINE const char * AsCString() const
Definition UTF8String.h:50
Definition VerseScope.h:13
Type
Definition VerseScope.h:15
@ PublicUser
Definition VerseScope.h:18
Definition tLang.cpp:1785
ULANG_FORCEINLINE EChildDeletionBehavior GetChildDeletionBehavior(const NodeType TypeOfNode)
Definition VstNode.h:144
ESupportsManyChildren
Definition VstNode.h:94
NodeType
Definition VstNode.h:102
ULANG_FORCEINLINE ESupportsManyChildren GetSupportsManyChildren(const NodeType TypeOfNode)
Definition VstNode.h:139
const char * BinaryCompareOpAsCString(BinaryOpCompare::op Op)
Definition VstNode.h:1345
ULANG_FORCEINLINE int32_t GetNumRequiredChildren(const NodeType TypeOfNode)
Definition VstNode.h:129
ULANG_FORCEINLINE int32_t GetOperatorPrecedence(const NodeType TypeOfNode)
Definition VstNode.h:134
EChildDeletionBehavior
Definition VstNode.h:87
BinaryOpCompare::op BinaryCompareOpFlip(BinaryOpCompare::op Op)
Definition VstNode.h:1359
const char * AssignmentOpAsCString(Assignment::EOp Op)
Definition VstNode.h:1195
ULANG_FORCEINLINE const char * GetNodeTypeName(const NodeType TypeOfNode)
Definition VstNode.h:124
constexpr struct Verse::Vst::NodeInfo NodeInfos[]
Definition Archive.h:36
EPrettyPrintBehaviour
Definition VstNode.h:2070
uLang::STextRange SLocus
Definition VstNode.h:70
uLang::UTF8Char ChType
Definition VstNode.h:56
void VstAsCodeSourceAppend(const TSRef< Vst::Node > &VstNode, uLang::CUTF8StringBuilder &Source)
Definition tLang.cpp:1626
int32_t GetSignedDistanceBetweenPositionAndLocus(const SLocus &A, const SPosition &B, const uLang::SIndexedSourceText &SourceText)
Definition tLang.cpp:2783
TSPtr< Vst::Node > GetNodeFromPath(const TSRef< Vst::Snippet > &VstSnippet, const SPathToNode &PathData, bool bReturnParent)
Definition tLang.cpp:1737
ULANG_FORCEINLINE SLocus NullWhence()
Definition VstNode.h:74
bool GeneratePathToNode(const TSRef< Vst::Node > &Node, const TSRef< Vst::Snippet > &VstSnippet, SPathToNode &PathToNode)
Definition tLang.cpp:1727
uLang::CUTF8StringView CUTF8StringView
Definition VstNode.h:51
uLang::SIndexedSourceText SIndexedSourceText
Definition VstNode.h:54
ULANG_FORCEINLINE CUTF8String PrettyPrintVst(const TSRef< Vst::Node > &VstNode)
Definition VstNode.h:2092
ULANG_FORCEINLINE CUTF8String PrettyPrintClause(const TSRef< Vst::Clause > &VstClause, int32_t InitialIndent, CUTF8String const &Separator)
Definition VstNode.h:2107
uLang::STextPosition SPosition
Definition VstNode.h:71
Definition VVMEngineEnvironment.h:23
TUTF8StringBuilder< CHeapRawAllocator > CUTF8StringBuilder
A string allocated on the heap.
Definition UTF8StringBuilder.h:194
EVerseScope
Definition VerseScope.h:14
EResult
Generic error codes.
Definition Common.h:352
@ IndexNone
Definition Common.h:381
uLang::TUTF8String< CHeapRawAllocator > CUTF8String
A string allocated on the heap.
Definition UTF8String.h:269
uint8_t UTF8Char
UTF-8 octet.
Definition Unicode.h:20
EPackageRole
Definition PackageRole.h:15
U16 Index
Definition radfft.cpp:71
Definition VstNode.h:2060
int32_t PostCommentIndex
Definition VstNode.h:2065
LArray< int32_t > AuxPath
Definition VstNode.h:2062
LArray< int32_t > Path
Definition VstNode.h:2061
int32_t PreCommentIndex
Definition VstNode.h:2064
Definition VstNode.h:1171
Assignment(const SLocus &Whence)
Definition VstNode.h:1185
static const Vst::NodeType StaticType
Definition VstNode.h:1172
const TSRef< Vst::Node > & GetOperandLeft() const
Definition VstNode.h:1189
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2721
Assignment(const SLocus &Whence, const TSRef< Vst::Node > &lhs, EOp InOp, const TSRef< Vst::Node > &rhs)
Definition VstNode.h:1175
const TSRef< Vst::Node > & GetOperandRight() const
Definition VstNode.h:1190
EOp
Definition VstNode.h:1173
Definition VstNode.h:1601
static const Vst::NodeType StaticType
Definition VstNode.h:1602
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2295
BinaryOpAddSub(const SLocus &Whence)
Definition VstNode.h:1604
VERSECOMPILER_API void AppendAddOperation(const SLocus &AddWhence, const TSRef< Node > &RhsOperand)
Definition tLang.cpp:2285
VERSECOMPILER_API void AppendSubOperation(const SLocus &SubWhence, const TSRef< Node > &RhsOperand)
Definition tLang.cpp:2290
BinaryOpAddSub(const SLocus &Whence, const TSRef< Node > &LhsOperand)
Definition VstNode.h:1605
Definition VstNode.h:1660
static const Vst::NodeType StaticType
Definition VstNode.h:1661
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2689
BinaryOpArrow(const SLocus &Whence, const TSRef< Node > &Lhs, const TSRef< Node > &Rhs)
Definition VstNode.h:1662
BinaryOpArrow(const SLocus &Whence)
Definition VstNode.h:1671
Definition VstNode.h:1318
op GetOp() const
Definition VstNode.h:1340
op
Definition VstNode.h:1321
TSRef< Vst::Node > GetOperandLeft() const
Definition VstNode.h:1338
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2656
BinaryOpCompare(const SLocus &Whence)
Definition VstNode.h:1333
static const Vst::NodeType StaticType
Definition VstNode.h:1319
TSRef< Vst::Node > GetOperandRight() const
Definition VstNode.h:1339
BinaryOpCompare(const SLocus &Whence, const TSRef< Vst::Node > &lhs, op in_op, const TSRef< Vst::Node > &rhs)
Definition VstNode.h:1323
Definition VstNode.h:1276
static const Vst::NodeType StaticType
Definition VstNode.h:1277
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2665
BinaryOpLogicalAnd(const SLocus &Whence)
Definition VstNode.h:1287
BinaryOpLogicalAnd(const SLocus &Whence, const TSRef< Node > &Lhs, const TSRef< Node > &Rhs)
Definition VstNode.h:1278
void AppendChild(const TSRef< Vst::Node > &Rhs)
Definition VstNode.h:1292
Definition VstNode.h:1254
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2673
BinaryOpLogicalOr(const SLocus &Whence)
Definition VstNode.h:1265
static const Vst::NodeType StaticType
Definition VstNode.h:1255
BinaryOpLogicalOr(const SLocus &Whence, const TSRef< Vst::Node > &Lhs, const TSRef< Vst::Node > &Rhs)
Definition VstNode.h:1256
void AppendChild(const TSRef< Vst::Node > &Rhs)
Definition VstNode.h:1270
Definition VstNode.h:1617
BinaryOpMulDivInfix(const SLocus &Whence)
Definition VstNode.h:1620
static const Vst::NodeType StaticType
Definition VstNode.h:1618
VERSECOMPILER_API void AppendDivOperation(const SLocus &DivWhence, const TSRef< Node > &RhsOperand)
Definition tLang.cpp:2308
VERSECOMPILER_API void AppendMulOperation(const SLocus &MulWhence, const TSRef< Node > &RhsOperand)
Definition tLang.cpp:2303
BinaryOpMulDivInfix(const SLocus &Whence, const TSRef< Node > &LhsOperand)
Definition VstNode.h:1621
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2313
void AppendInfixOperation(const TSRef< Identifier > &OpIdentifier, const TSRef< Node > &RhsOperand)
Definition VstNode.h:1626
Definition VstNode.h:1638
void AppendChild(const TSRef< Vst::Node > &Rhs)
Definition VstNode.h:1654
BinaryOpRange(const SLocus &Whence, const TSRef< Node > &Lhs, const TSRef< Node > &Rhs)
Definition VstNode.h:1640
static const Vst::NodeType StaticType
Definition VstNode.h:1639
BinaryOpRange(const SLocus &Whence)
Definition VstNode.h:1649
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2681
Definition VstNode.h:1572
op
Definition VstNode.h:1573
BinaryOp(const SLocus &Whence, Vst::NodeType NodeType)
Definition VstNode.h:1575
void AppendOperation_Internal(const TSRef< Node > &InOperator, const TSRef< Node > &Operand)
Definition VstNode.h:1590
BinaryOp(const SLocus &Whence, const TSRef< Node > &LhsOperand, Vst::NodeType NodeType)
Definition VstNode.h:1576
void AppendChild(op in_op, const TSRef< Node > in_child)
Definition VstNode.h:1583
Definition VstNode.h:1766
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2574
EFormat
Definition VstNode.h:1770
CharLiteral(const CUTF8StringView &InSourceText, EFormat Format, const SLocus &Whence)
Definition VstNode.h:1777
static const Vst::NodeType StaticType
Definition VstNode.h:1767
EFormat _Format
Definition VstNode.h:1775
Definition VstNode.h:763
Clause(const TSRef< Node > &Child, const SLocus &Whence, EForm Form)
Definition VstNode.h:796
EForm
Definition VstNode.h:766
Clause(const uLang::TSRefArray< Node > &Children, const SLocus &Whence, EForm Form)
Definition VstNode.h:806
Clause(const SLocus &Whence, const EForm Form)
Definition VstNode.h:789
Clause(const NodeArray &Children, int32_t NumToAdd, const SLocus &Whence, EForm Form)
Definition VstNode.h:811
Clause(const SLocus &Whence, const EForm Form, const EPunctuation Punctuation)
Definition VstNode.h:787
EPunctuation
Definition VstNode.h:780
void SetPunctuation(const EPunctuation InPunctuation)
Definition VstNode.h:831
void SetForm(const EForm InForm)
Definition VstNode.h:822
static const Vst::NodeType StaticType
Definition VstNode.h:764
Clause(const NodeArray &Children, const SLocus &Whence, EForm Form)
Definition VstNode.h:801
Clause(const uLang::TSRefArray< Node > &Children, int32_t NumToAdd, const SLocus &Whence, EForm Form)
Definition VstNode.h:816
EPunctuation GetPunctuation() const
Definition VstNode.h:827
EForm GetForm() const
Definition VstNode.h:821
Clause(uint8_t ClauseType, const SLocus &Whence, EForm Form)
Definition VstNode.h:791
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2439
Definition VstNode.h:1944
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2745
Commas(SLocus Whence, const uLang::TSRefArray< Node > &InChildren={})
Definition VstNode.h:1947
static const Vst::NodeType StaticType
Definition VstNode.h:1945
Definition VstNode.h:869
static const Vst::NodeType StaticType
Definition VstNode.h:872
EType
Definition VstNode.h:870
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2729
EType _Type
Definition VstNode.h:878
Comment(EType Type, const CUTF8StringView &InText, const SLocus &Whence)
Definition VstNode.h:874
Definition VstNode.h:1852
static const Vst::NodeType StaticType
Definition VstNode.h:1853
const TSRef< Vst::Node > & GetReturnExpression() const
Definition VstNode.h:1873
Control(const SLocus &Whence, Control::EKeyword Keyword)
Definition VstNode.h:1863
Control(const TSRef< Node > &Child, const SLocus &Whence, EKeyword Keyword)
Definition VstNode.h:1867
EKeyword _Keyword
Definition VstNode.h:1877
EKeyword
Definition VstNode.h:1856
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2614
Definition VstNode.h:1131
const TSRef< Vst::Node > & GetOperandRight() const
Definition VstNode.h:1147
Definition(const SLocus &Whence, const TSRef< Vst::Node > &Lhs, const TSRef< Vst::Node > &Rhs)
Definition VstNode.h:1134
const TSRef< Vst::Node > & GetOperandLeft() const
Definition VstNode.h:1146
Definition(const SLocus &Whence)
Definition VstNode.h:1142
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2697
static const Vst::NodeType StaticType
Definition VstNode.h:1132
Definition VstNode.h:1989
Escape(const SLocus &Whence, const TSRef< Node > &Child)
Definition VstNode.h:1992
static const Vst::NodeType StaticType
Definition VstNode.h:1990
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2582
Escape(const SLocus &Whence)
Definition VstNode.h:1999
Definition VstNode.h:1744
static const Vst::NodeType StaticType
Definition VstNode.h:1745
FloatLiteral(const CUTF8StringView &InSourceText, EFormat Format, const SLocus &Whence)
Definition VstNode.h:1757
EFormat
Definition VstNode.h:1748
EFormat _Format
Definition VstNode.h:1755
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2549
Definition VstNode.h:1237
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2565
void AddCondition(const TSRef< Node > &Child)
Definition VstNode.h:1246
FlowIf(const SLocus &Whence)
Definition VstNode.h:1243
void AddElseBody(const TSRef< Node > &Child)
Definition VstNode.h:1248
ClauseTag
Definition VstNode.h:1241
static const Vst::NodeType StaticType
Definition VstNode.h:1238
void AddIfIdentifier(const TSRef< Node > &Child)
Definition VstNode.h:1245
void AddBody(const TSRef< Node > &Child)
Definition VstNode.h:1247
Definition VstNode.h:1520
bool AddQualifier(const uLang::CUTF8StringView &InQualifier)
Definition tLang.cpp:2386
Identifier(const CUTF8StringView &InName, const SLocus &Whence)
Definition VstNode.h:1534
void CloneNodeFields(Identifier *DestNode) const
Definition tLang.cpp:2420
bool IsQualified() const
Definition VstNode.h:1542
NodeArray _QualifierPreComments
Comments that are to be prefixed to the qualifiers of this identifier.
Definition VstNode.h:1527
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2412
const TSRef< Node > & GetQualification() const
Definition VstNode.h:1543
bool CanBeQualified() const
Definition VstNode.h:1541
static const Vst::NodeType StaticType
Definition VstNode.h:1521
NodeArray _QualifierPostComments
Comments that are to be suffixed to the qualifiers of this identifier.
Definition VstNode.h:1524
Identifier(const CUTF8StringView &InName, const SLocus &Whence, const bool bCanBeQualified)
Definition VstNode.h:1529
void SetCanBeQualified(const bool bCanBeQualified)
Definition VstNode.h:1540
Definition VstNode.h:1735
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2541
IntLiteral(const CUTF8StringView &InSourceText, const SLocus &Whence)
Definition VstNode.h:1738
static const Vst::NodeType StaticType
Definition VstNode.h:1736
Definition VstNode.h:1806
static const Vst::NodeType StaticType
Definition VstNode.h:1807
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2606
Interpolant(const SLocus &Whence, const CUTF8StringView &SyntaxSource)
Definition VstNode.h:1809
Definition VstNode.h:1817
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2598
static const Vst::NodeType StaticType
Definition VstNode.h:1818
InterpolatedString(const SLocus &Whence, const CUTF8StringView &SyntaxSource)
Definition VstNode.h:1820
Definition VstNode.h:1828
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2705
static const Vst::NodeType StaticType
Definition VstNode.h:1829
const TSRef< Clause > & GetRange() const
Definition VstNode.h:1846
Lambda(const SLocus &Whence)
Definition VstNode.h:1840
Lambda(const SLocus &Whence, const TSRef< Node > &Domain, const TSRef< Node > &Range)
Definition VstNode.h:1831
const TSRef< Node > & GetDomain() const
Definition VstNode.h:1845
Definition VstNode.h:1883
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2557
static const Vst::NodeType StaticType
Definition VstNode.h:1884
Macro(SLocus Whence)
Definition VstNode.h:1897
Macro(SLocus Whence, const TSRef< Vst::Node > &MacroName, const uLang::TArray< TSRef< Vst::Clause > > &InChildren)
Definition VstNode.h:1886
const TSRef< Vst::Clause > & GetClause(int32_t ClauseIndex) const
Definition VstNode.h:1902
const TSRef< Vst::Node > & GetName() const
Definition VstNode.h:1901
TSRef< Clause > TakeClause(int32_t ClauseIndex, const TSPtr< Node > Replacement=TSPtr< Clause >())
Definition VstNode.h:1903
Definition VstNode.h:924
static const Vst::NodeType StaticType
Definition VstNode.h:925
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2494
Module(const CUTF8StringView &Name)
Definition VstNode.h:926
void CloneNodeFields(Module *DestNode) const
Definition tLang.cpp:2502
CUTF8String _FilePath
Definition VstNode.h:935
CUTF8String _Name
Definition VstNode.h:932
Definition VstNode.h:1426
TSRef< Node > Child() const
Definition VstNode.h:1453
EKeyword
Definition VstNode.h:1430
bool _bLive
Definition VstNode.h:1460
static const NodeType StaticType
Definition VstNode.h:1427
Mutation(const SLocus &Whence, EKeyword Keyword, bool bLive)
Definition VstNode.h:1446
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2648
Mutation(const SLocus &Whence, const TSRef< Node > &Child, EKeyword Keyword, bool bLive)
Definition VstNode.h:1436
EKeyword _Keyword
Definition VstNode.h:1458
Definition VstNode.h:109
const char * FormalName
Definition VstNode.h:110
EChildDeletionBehavior ChildDeletionBehavior
Definition VstNode.h:114
ESupportsManyChildren SupportsManyChildren
Definition VstNode.h:113
int32_t RequiredChildren
Definition VstNode.h:111
int32_t Precedence
Definition VstNode.h:112
bool bIsCAtom
Definition VstNode.h:115
Definition VstNode.h:150
static void TransferChildren(const TSRef< Node > &From, const TSRef< Node > &To)
Definition VstNode.h:603
NodeArray & AccessPrefixComments()
Definition VstNode.h:263
bool HasNewLineAfter() const
Definition VstNode.h:328
NodeType GetElementType() const
Definition VstNode.h:220
const NodeArray & GetChildren() const
Definition VstNode.h:339
static void TransferPrefixComments(const TSRef< Node > &From, const TSRef< Node > &To)
Definition VstNode.h:608
ESupportsManyChildren IsManyChildrenSupported() const
Definition VstNode.h:283
UE_API void PrependAux(const TSRef< Node > &AuxChild)
Definition tLang.cpp:1975
const Node * GetParent() const
Definition VstNode.h:358
Node * AccessParent()
Definition VstNode.h:355
bool IsEmpty() const
Definition VstNode.h:338
const TSRef< Node > & AppendChild(const TSRef< Node > &child)
Definition VstNode.h:467
int32_t GetElementTypeInt() const
Definition VstNode.h:221
UE_API void EnsureAuxAllocated()
Definition tLang.cpp:1966
Node * _Parent
Definition VstNode.h:732
void Empty()
Definition VstNode.h:558
NodeArray _PostComments
Definition VstNode.h:738
TSRef< Node > TakeChildAt(int32_t idx, const TSPtr< Node > Replacement=TSPtr< Node >())
Definition VstNode.h:502
UE_API const Node * FindChildByPosition(const SPosition &TextPosition) const
Definition tLang.cpp:2103
void CombineWhenceWith(const SLocus &Whence)
Definition VstNode.h:267
UE_API const Snippet * FindSnippetByFilePath(const CUTF8StringView &FilePath) const
Definition tLang.cpp:2074
UE_API void AppendPrefixComments(const NodeArray &CommentNodes)
Definition tLang.cpp:2026
UE_API void AppendAuxAt(const TSRef< Node > &AuxChild, int32_t Idx)
Definition tLang.cpp:1999
virtual UE_API ~Node()
Definition tLang.cpp:1786
void SetNumNewLinesAfter(const int32_t Num)
Definition VstNode.h:303
int32_t GetPrecedence() const
Definition VstNode.h:278
const TSPtr< Clause > & GetAux() const
Definition VstNode.h:251
OpType GetTag() const
Definition VstNode.h:223
UE_API bool RemoveFromParent(int32_t idx=uLang::IndexNone)
Definition tLang.cpp:1818
UE_API void AppendPrefixComment(const TSRef< Node > &CommentNode)
Definition tLang.cpp:2014
TNodeType & As()
Definition VstNode.h:205
NodeArray _PreComments
Definition VstNode.h:737
const TSRef< Node > & AppendChild(const TSRef< Node > &&child)
Definition VstNode.h:476
TNodeType * AsNullable()
Definition VstNode.h:211
void SetNewLineAfter(const bool bNewLineAfter)
Definition VstNode.h:308
static void TransferPostfixComments(const TSRef< Node > &From, const TSRef< Node > &To)
Definition VstNode.h:621
bool IsChildElementType(int32_t idx, NodeType InType) const
Definition VstNode.h:382
int32_t NumNewLinesBefore() const
Definition VstNode.h:288
virtual VERSECOMPILER_API TSRef< Node > CloneNode() const
Definition tLang.cpp:2165
bool HasNewLinesBefore() const
Definition VstNode.h:333
bool IsA() const
Definition VstNode.h:217
void AppendChildInternal(TSRef< Node > &&child)
Definition VstNode.h:720
UE_API void AppendAux(const TSRef< Node > &AuxChild)
Definition tLang.cpp:1987
UE_API bool HasAttributes() const
Definition tLang.cpp:1907
TSPtr< Node > GetRightmostChild() const
Definition VstNode.h:349
UE_API void AppendPostfixComments(const NodeArray &CommentNodes)
Definition tLang.cpp:2048
const TNodeType & As() const
Definition VstNode.h:208
void AppendChildInternal(const TSRef< Node > &child)
Definition VstNode.h:710
uint8_t _Tag
Definition VstNode.h:753
const TNodeType * AsNullable() const
Definition VstNode.h:214
const NodeArray & GetPrefixComments() const
Definition VstNode.h:261
UE_API void SetAux(const TSRef< Clause > &Aux)
Definition tLang.cpp:2005
static UE_API void RemoveMapping(uLang::CAstNode *AstNode)
Definition tLang.cpp:1893
TSRef< Node > AsShared()
Definition VstNode.h:201
const SLocus & Whence() const
Definition VstNode.h:268
UE_API void ReplaceSelfWith(const TSRef< Node > &replacement)
Definition tLang.cpp:1799
TSRef< Node > GetSharedSelf() const
Definition VstNode.h:357
UE_API const CAtom * AsAtomNullable() const
Definition tLang.cpp:2160
int GetChildCount() const
Definition VstNode.h:219
const Snippet * FindSnippet() const
Definition VstNode.h:571
static void TransferChildren(const TSRef< Node > &From, const TSRef< Node > &To, int32_t First, int32_t Last)
Definition VstNode.h:587
UE_API const Identifier * GetAttributeIdentifier(const CUTF8StringView &AttributeName) const
Definition tLang.cpp:1912
UE_API bool IsAttributePresent(const CUTF8StringView &AttributeName) const
Definition tLang.cpp:1938
Node()
Definition VstNode.h:153
void SetTile(FTile *Tile)
Definition VstNode.h:640
int32_t NumNewLinesAfter() const
Definition VstNode.h:298
NodeArray TakeChildren()
Definition VstNode.h:341
void SetParentInternal(TSRef< Node > InParent)
Definition VstNode.h:359
void AppendChildren(const uLang::TArray< TSRef< Node > > &Children, int32_t NumToAppend=-1)
Definition VstNode.h:518
TSPtr< Clause > _Aux
Definition VstNode.h:734
void RemoveAux()
Definition VstNode.h:253
const ChType * GetElementName() const
Definition VstNode.h:277
const Type * GetParentOfType() const
Definition VstNode.h:365
static SLocus CombineLocii(const NodeArray &Nodes)
Definition VstNode.h:187
FTile * GetTile()
Definition VstNode.h:645
const uLang::CAstNode * GetMappedAstNode() const
Definition VstNode.h:634
int32_t NumRequiredChildren() const
Definition VstNode.h:279
UE_API void AppendPostfixComment(const TSRef< Node > &CommentNode)
Definition tLang.cpp:2036
static void VisitWith(const TSRef< Vst::Node > &node, VisitPolicy &visit_policy)
Definition VstNode.h:2035
const uLang::CAstNode * _MappedAstNode
Definition VstNode.h:756
bool Contains(const Node &Target, const bool bRecursive=true) const
Definition VstNode.h:394
const NodeInfo & GetElementInfo() const
Definition VstNode.h:276
TSRef< Node > GetSharedSelf()
Definition VstNode.h:356
UE_API const CUTF8String & GetSnippetPath() const
Definition tLang.cpp:2058
void SetChildAt(int32_t Index, TSRef< Node > Child)
Definition VstNode.h:494
UE_API void AddMapping(uLang::CAstNode *AstNode) const
Definition tLang.cpp:1869
NodeArray & AccessPostfixComments()
Definition VstNode.h:264
void AppendChildren(const uLang::TSRefArray< Node > &Children, int32_t NumToAppend=-1)
Definition VstNode.h:529
void PrependChildren(const uLang::TArray< TSRef< Node > > &Children, int32_t NumToAppend=-1)
Definition VstNode.h:542
void CloneNodeFields(Node *DestOther) const
Definition tLang.cpp:2173
UE_API const TSRef< Node > FindChildClosestToPosition(const SPosition &TextPosition, const SIndexedSourceText &SourceText) const
Definition tLang.cpp:2125
LArray< TSRef< Node > > NodeArray
Definition VstNode.h:151
SLocus _Whence
Definition VstNode.h:746
void DebugOrphanCheck()
Definition VstNode.h:386
NodeArray & AccessChildren()
Definition VstNode.h:340
bool HasParent() const
Definition VstNode.h:360
void SetWhence(const SLocus &Whence)
Definition VstNode.h:266
const TNodeType * TryGetFirstAttributeOfType() const
Definition VstNode.h:234
void SetNumNewLinesBefore(const int32_t Num)
Definition VstNode.h:293
NodeType _Type
Definition VstNode.h:755
Node(NodeType in_type, const SLocus &whence)
Definition VstNode.h:178
NodeArray _Children
Definition VstNode.h:730
int32_t _NumNewLinesBefore
The number of trailing newlines that should follow this node.
Definition VstNode.h:749
Node(NodeType in_type)
Definition VstNode.h:167
const NodeArray & GetPostfixComments() const
Definition VstNode.h:262
FTile * _Tile
Definition VstNode.h:757
Node * FindRoot()
Definition VstNode.h:576
bool IsError() const
Definition VstNode.h:384
void SetTag(OpType in_op)
Definition VstNode.h:225
int32_t FindPreviousSibling()
Definition VstNode.h:443
bool IsElementType(NodeType InType) const
Definition VstNode.h:378
void DropParent(const TSRef< Node > &Child)
Definition VstNode.h:698
const TSRef< Node > & AppendChildAt(const TSRef< Node > &child, int32_t idx)
Definition VstNode.h:485
int32_t _NumNewLinesAfter
Definition VstNode.h:750
static const Node * FindOrphanedNode(const Node &InNode)
Definition VstNode.h:665
Definition VstNode.h:1562
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2509
static const Vst::NodeType StaticType
Definition VstNode.h:1563
Operator(const CUTF8StringView &InSourceText, const SLocus &Whence)
Definition VstNode.h:1565
Definition VstNode.h:940
CUTF8String _DirPath
Definition VstNode.h:950
CUTF8String _FilePath
Definition VstNode.h:953
uint32_t _UploadedAtFNVersion
Definition VstNode.h:979
static const Vst::NodeType StaticType
Definition VstNode.h:941
bool _bTreatModulesAsImplicit
Definition VstNode.h:982
CUTF8String _VersePath
Definition VstNode.h:956
void CloneNodeFields(Package *DestNode) const
Definition tLang.cpp:2447
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2277
static VERSECOMPILER_API uLang::TOptional< TSRef< Module > > FindModule(const Node &ModuleContainer, const CUTF8StringView &ModuleName)
Definition tLang.cpp:2254
uLang::EPackageRole _Role
Definition VstNode.h:965
LArray< CUTF8String > _DependencyPackages
Definition VstNode.h:959
VERSECOMPILER_API TSRef< Module > FindOrAddModule(const CUTF8StringView &ModuleName, const CUTF8StringView &ParentModuleName=CUTF8StringView())
Definition tLang.cpp:2233
Package(const CUTF8StringView &Name)
Definition VstNode.h:943
EVerseScope _VerseScope
Definition VstNode.h:968
uLang::TOptional< CUTF8String > _VniDestDir
Definition VstNode.h:962
CUTF8String _Name
Definition VstNode.h:947
bool _bEnableSceneGraph
Definition VstNode.h:988
uLang::TOptional< uint32_t > _VerseVersion
Definition VstNode.h:971
bool _bAllowExperimental
Definition VstNode.h:985
Definition VstNode.h:1912
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2737
Clause::EForm GetForm() const
Definition VstNode.h:1935
static const Vst::NodeType StaticType
Definition VstNode.h:1913
Parens(SLocus Whence, Clause::EForm Form, const NodeArray &InChildren={})
Definition VstNode.h:1915
Parens(SLocus Whence, Clause::EForm Form, const uLang::TSRefArray< Node > &InChildren)
Definition VstNode.h:1925
Definition VstNode.h:1967
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2486
ParseError(const char *Error, const SLocus &Whence)
Definition VstNode.h:1971
static const Vst::NodeType StaticType
Definition VstNode.h:1969
const char * GetError() const
Definition VstNode.h:1977
void AddChild(const TSRef< Vst::Node > &InnerError)
Definition VstNode.h:1979
Definition VstNode.h:1797
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2517
static const Vst::NodeType StaticType
Definition VstNode.h:1798
PathLiteral(const CUTF8StringView &InPath, const SLocus &Whence)
Definition VstNode.h:1800
Definition VstNode.h:1957
Placeholder(const uLang::CUTF8StringView &CodeStr, const SLocus &Whence)
Definition VstNode.h:1961
static const Vst::NodeType StaticType
Definition VstNode.h:1958
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2478
Placeholder(const SLocus &Whence)
Definition VstNode.h:1960
Definition VstNode.h:1679
VERSECOMPILER_API void AppendDotIdent(const SLocus &Whence, const TSRef< Identifier > &Ident)
Definition tLang.cpp:2357
VERSECOMPILER_API void AppendQMark(const SLocus &Whence)
Definition tLang.cpp:2341
VERSECOMPILER_API TSRef< Clause > PrependQMark(const SLocus &Whence)
Definition tLang.cpp:2321
VERSECOMPILER_API TSPtr< Clause > TakeLastArgs()
Definition tLang.cpp:2363
VERSECOMPILER_API void PrependCallArgs(bool bCanFail, const TSRef< Clause > &Args)
Definition tLang.cpp:2335
static const Vst::NodeType StaticType
Definition VstNode.h:1680
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2378
Op
Definition VstNode.h:1682
@ Pointer
Definition VstNode.h:1682
@ DotIdentifier
Definition VstNode.h:1682
@ Expression
Definition VstNode.h:1682
@ FailCall
Definition VstNode.h:1682
@ SureCall
Definition VstNode.h:1682
@ Option
Definition VstNode.h:1682
bool IsPostHat() const
Definition VstNode.h:1700
VERSECOMPILER_API void AppendCallArgs(bool bCanFail, const TSRef< Clause > &Args)
Definition tLang.cpp:2351
PrePostCall(const SLocus &Whence)
Definition VstNode.h:1689
VERSECOMPILER_API void AppendHat(const SLocus &Whence)
Definition tLang.cpp:2346
PrePostCall(const TSRef< Node > &FirstChild, const SLocus &Whence)
Definition VstNode.h:1684
bool IsSimpleCall() const
Definition VstNode.h:1693
VERSECOMPILER_API TSRef< Clause > PrependHat(const SLocus &Whence)
Definition tLang.cpp:2328
Definition VstNode.h:1298
const TSRef< Vst::Node > & GetInnerNode() const
Definition VstNode.h:1312
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2640
PrefixOpLogicalNot(const SLocus &Whence, const TSRef< Node > &Rhs)
Definition VstNode.h:1300
static const Vst::NodeType StaticType
Definition VstNode.h:1299
PrefixOpLogicalNot(const SLocus &Whence)
Definition VstNode.h:1307
Definition VstNode.h:1000
bool RemovePackagesWithName(const CUTF8StringView &PackageName)
Definition VstNode.h:1021
bool ReplaceSnippet(const CUTF8StringView &PathOfOldSnippetToReplace, TSRef< Snippet > NewSnippet, TSPtr< Snippet > *OutOldSnippet=nullptr)
Definition VstNode.h:1048
static VERSECOMPILER_API uLang::TOptional< TSRef< Module > > FindModule(const Node &ModuleContainer, const CUTF8StringView &ModuleName)
static const Vst::NodeType StaticType
Definition VstNode.h:1001
CUTF8String _Name
Definition VstNode.h:1005
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2464
CUTF8String _FilePath
Definition VstNode.h:1008
VERSECOMPILER_API const TSRef< Module > & FindOrAddModule(const CUTF8StringView &ModuleName, const CUTF8StringView &FilePath, const CUTF8StringView &ParentModuleName=CUTF8StringView())
void CloneNodeFields(Project *DestNode) const
Definition tLang.cpp:2472
Project(const CUTF8StringView &Name)
Definition VstNode.h:1002
Definition VstNode.h:885
Snippet()
Definition VstNode.h:887
CUTF8String _Path
Definition VstNode.h:916
void SetForm(Clause::EForm Form)
Definition VstNode.h:907
Snippet(const CUTF8StringView &Path)
Definition VstNode.h:888
uint64_t _SnippetVersion
Definition VstNode.h:913
Snippet(const CUTF8StringView &Path, const TSRef< Vst::Node > &FirstChild)
Definition VstNode.h:889
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2525
void CloneNodeFields(Snippet *DestNode) const
Definition tLang.cpp:2533
static const Vst::NodeType StaticType
Definition VstNode.h:886
Snippet(const TSRef< Vst::Node > &FirstChild)
Definition VstNode.h:890
Clause::EForm GetForm() const
Definition VstNode.h:906
bool HasErrors() const
Definition VstNode.h:892
Definition VstNode.h:1786
StringLiteral(const SLocus &Whence, const CUTF8StringView &SyntaxSource)
Definition VstNode.h:1789
static const Vst::NodeType StaticType
Definition VstNode.h:1787
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2590
Definition VstNode.h:1466
TSRef< Vst::Node > TakeRhs()
Definition VstNode.h:1501
static const Vst::NodeType StaticType
Definition VstNode.h:1467
TypeSpec(const SLocus &Whence, const TSRef< Node > &Rhs)
Definition VstNode.h:1481
bool HasLhs() const
Definition VstNode.h:1497
TSRef< Vst::Node > GetLhs() const
Definition VstNode.h:1498
TSRef< Vst::Node > TakeLhs()
Definition VstNode.h:1499
TSRef< Vst::Node > GetRhs() const
Definition VstNode.h:1500
TypeSpec(const SLocus &Whence, const TSRef< Node > &Lhs, const TSRef< Node > &Rhs)
Definition VstNode.h:1472
void CloneNodeFields(TypeSpec *DestNode) const
Definition tLang.cpp:2630
void AppendTypeSpecComment(TSRef< Node > &&NewComment)
Definition VstNode.h:1509
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2622
TypeSpec(const SLocus &Whence)
Definition VstNode.h:1490
void AppendTypeSpecComment(const TSRef< Node > &NewComment)
Definition VstNode.h:1503
NodeArray _TypeSpecComments
Definition VstNode.h:1470
Definition VstNode.h:1374
Where(const SLocus &Whence, const TSRef< Node > &Lhs, const uLang::TSRefArray< Node > &RhsArray)
Definition VstNode.h:1390
Where(const SLocus &Whence, const TSRef< Node > &Lhs, const uLang::TArray< TSRef< Node > > &RhsArray)
Definition VstNode.h:1379
void SetLhs(TSRef< Node > Lhs)
Definition VstNode.h:1412
static const NodeType StaticType
Definition VstNode.h:1375
TSRef< Node > GetLhs() const
Definition VstNode.h:1407
Where(const SLocus &Whence)
Definition VstNode.h:1402
RhsView GetRhs() const
Definition VstNode.h:1417
VERSECOMPILER_API TSRef< Node > CloneNode() const override
Definition tLang.cpp:2713
This is used as a helper struct for storing the result of a signed distance check.
Definition VstNode.h:39
int32_t Distance
Definition VstNode.h:41
TSRef< Verse::Vst::Node > Node
Definition VstNode.h:40
Definition IndexedSourceText.h:13
Definition TextRange.h:20
Definition TextRange.h:58
ULANG_FORCEINLINE bool IsValid() const
Definition TextRange.h:96
Definition Optional.h:23
Definition RangeView.h:9