Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

776 lines
12 KiB
C++

// Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
#pragma once
#include <iterator>
#include <memory>
#include <vector>
namespace hilti {
class Node;
class Operator;
class ASTRoot;
class Attribute;
class AttributeSet;
class Ctor;
class Declaration;
class Expression;
class Function;
class QualifiedType;
class Statement;
class UnqualifiedType;
namespace ctor {
class Address;
class Bool;
class Bitfield;
class Bytes;
class Coerced;
class Default;
class Enum;
class Error;
class Exception;
class Interval;
class Library;
class List;
class Map;
class Network;
class Null;
class Optional;
class Port;
class Real;
class RegExp;
class Result;
class Set;
class SignedInteger;
class Stream;
class String;
class StrongReference;
class Struct;
class Time;
class Tuple;
class Union;
class UnsignedInteger;
class ValueReference;
class Vector;
class WeakReference;
class Element;
class Field;
namespace bitfield {
class BitRange;
}
namespace map {
class Element;
}
namespace struct_ {
class Field;
}
} // namespace ctor
namespace declaration {
class Constant;
class Expression;
class Field;
class Function;
class GlobalVariable;
class ImportedModule;
class LocalVariable;
class Module;
class Parameter;
class Property;
class Type;
} // namespace declaration
namespace expression {
class Assign;
class BuiltInFunction;
class Coerced;
class Ctor;
class Grouping;
class Keyword;
class ListComprehension;
class LogicalAnd;
class LogicalNot;
class LogicalOr;
class Member;
class Move;
class Name;
class ConditionTest;
class PendingCoerced;
class ResolvedOperator;
class Ternary;
class TypeInfo;
class TypeWrapped;
class Type_;
class UnresolvedOperator;
class Void;
} // namespace expression
namespace operator_::generic {
class CastedCoercion;
}
namespace operator_::function {
class Call;
}
namespace operator_::struct_ {
class MemberCall;
}
namespace operator_ {
namespace address {
class Equal;
class Unequal;
class Family;
} // namespace address
namespace bitfield {
class Member;
class HasMember;
} // namespace bitfield
namespace bool_ {
class Equal;
class Unequal;
class BitAnd;
class BitOr;
class BitXor;
} // namespace bool_
namespace bytes {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
class Lower;
class LowerEqual;
class Greater;
class GreaterEqual;
class Difference;
class Sum;
class SumAssign;
} // namespace iterator
class Size;
class Equal;
class Unequal;
class Greater;
class GreaterEqual;
class In;
class Lower;
class LowerEqual;
class Sum;
class SumAssignBytes;
class SumAssignStreamView;
class SumAssignUInt8;
class Find;
class LowerCase;
class UpperCase;
class At;
class Split;
class Split1;
class StartsWith;
class EndsWith;
class Strip;
class SubIterators;
class SubIterator;
class SubOffsets;
class Join;
class ToIntAscii;
class ToUIntAscii;
class ToIntBinary;
class ToUIntBinary;
class ToRealAscii;
class ToTimeAscii;
class ToTimeBinary;
class Decode;
class Match;
} // namespace bytes
namespace enum_ {
class Equal;
class Unequal;
class CastToSignedInteger;
class CastToUnsignedInteger;
class CtorSigned;
class CtorUnsigned;
class HasLabel;
} // namespace enum_
namespace error {
class Ctor;
class Equal;
class Unequal;
class Description;
} // namespace error
namespace exception {
class Ctor;
class Description;
} // namespace exception
namespace generic {
class Pack;
class Unpack;
class Begin;
class End;
class New;
} // namespace generic
namespace interval {
class Equal;
class Unequal;
class Sum;
class Difference;
class Greater;
class GreaterEqual;
class Lower;
class LowerEqual;
class MultipleUnsignedInteger;
class MultipleReal;
class CtorSignedIntegerNs;
class CtorSignedIntegerSecs;
class CtorUnsignedIntegerNs;
class CtorUnsignedIntegerSecs;
class CtorRealSecs;
class Seconds;
class Nanoseconds;
} // namespace interval
namespace list {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
} // namespace iterator
class Size;
class Equal;
class Unequal;
} // namespace list
namespace map {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
} // namespace iterator
class Size;
class Equal;
class Unequal;
class In;
class Delete;
class IndexConst;
class IndexNonConst;
class IndexAssign;
class Get;
class GetOptional;
class Clear;
} // namespace map
namespace network {
class Equal;
class Unequal;
class In;
class Family;
class Prefix;
class Length;
} // namespace network
namespace optional {
class Deref;
}
namespace port {
class Equal;
class Unequal;
class Ctor;
class Protocol;
} // namespace port
namespace real {
class SignNeg;
class Difference;
class DifferenceAssign;
class Division;
class DivisionAssign;
class Equal;
class Greater;
class GreaterEqual;
class Lower;
class LowerEqual;
class Modulo;
class Multiple;
class MultipleAssign;
class Power;
class Sum;
class SumAssign;
class Unequal;
class CastToUnsignedInteger;
class CastToSignedInteger;
class CastToTime;
class CastToInterval;
} // namespace real
namespace strong_reference {
class Deref;
class Equal;
class Unequal;
} // namespace strong_reference
namespace weak_reference {
class Deref;
class Equal;
class Unequal;
} // namespace weak_reference
namespace value_reference {
class Deref;
class Equal;
class Unequal;
} // namespace value_reference
namespace regexp {
class Match;
class Find;
class MatchGroups;
class TokenMatcher;
} // namespace regexp
namespace regexp_match_state {
class AdvanceBytes;
class AdvanceView;
} // namespace regexp_match_state
namespace result {
class Deref;
class Error;
} // namespace result
namespace set {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
} // namespace iterator
class Size;
class Equal;
class Unequal;
class In;
class Add;
class Delete;
class Clear;
} // namespace set
namespace signed_integer {
class DecrPostfix;
class DecrPrefix;
class IncrPostfix;
class IncrPrefix;
class SignNeg;
class Difference;
class DifferenceAssign;
class Division;
class DivisionAssign;
class Equal;
class Greater;
class GreaterEqual;
class Lower;
class LowerEqual;
class Modulo;
class Multiple;
class MultipleAssign;
class Power;
class Sum;
class SumAssign;
class Unequal;
class CastToSigned;
class CastToUnsigned;
class CastToReal;
class CastToEnum;
class CastToInterval;
class CastToBool;
class CtorSigned8;
class CtorSigned16;
class CtorSigned32;
class CtorSigned64;
class CtorUnsigned8;
class CtorUnsigned16;
class CtorUnsigned32;
class CtorUnsigned64;
} // namespace signed_integer
namespace stream {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
class Lower;
class LowerEqual;
class Greater;
class GreaterEqual;
class Difference;
class Sum;
class SumAssign;
class Offset;
class IsFrozen;
} // namespace iterator
namespace view {
class Size;
class InBytes;
class InView;
class EqualView;
class EqualBytes;
class UnequalView;
class UnequalBytes;
class Offset;
class AdvanceBy;
class AdvanceToNextData;
class Limit;
class AdvanceTo;
class Find;
class At;
class StartsWith;
class SubIterators;
class SubIterator;
class SubOffsets;
} // namespace view
class Ctor;
class Size;
class Unequal;
class SumAssignView;
class SumAssignBytes;
class Freeze;
class Unfreeze;
class IsFrozen;
class At;
class Trim;
class Statistics;
} // namespace stream
namespace string {
class Equal;
class Unequal;
class Size;
class Sum;
class SumAssign;
class Modulo;
class Encode;
class Split;
class Split1;
class StartsWith;
class EndsWith;
class LowerCase;
class UpperCase;
} // namespace string
namespace struct_ {
class Unset;
class MemberNonConst;
class MemberConst;
class TryMember;
class HasMember;
} // namespace struct_
namespace time {
class Equal;
class Unequal;
class SumInterval;
class DifferenceTime;
class DifferenceInterval;
class Greater;
class GreaterEqual;
class Lower;
class LowerEqual;
class CtorSignedIntegerNs;
class CtorSignedIntegerSecs;
class CtorUnsignedIntegerNs;
class CtorUnsignedIntegerSecs;
class CtorRealSecs;
class Seconds;
class Nanoseconds;
} // namespace time
namespace tuple {
class Equal;
class Unequal;
class Index;
class Member;
class CustomAssign;
} // namespace tuple
namespace union_ {
class Equal;
class Unequal;
class MemberConst;
class MemberNonConst;
class HasMember;
} // namespace union_
namespace unsigned_integer {
class DecrPostfix;
class DecrPrefix;
class IncrPostfix;
class IncrPrefix;
class SignNeg;
class Difference;
class DifferenceAssign;
class Division;
class DivisionAssign;
class Equal;
class Greater;
class GreaterEqual;
class Lower;
class LowerEqual;
class Modulo;
class Multiple;
class MultipleAssign;
class Power;
class Sum;
class SumAssign;
class Unequal;
class Negate;
class BitAnd;
class BitOr;
class BitXor;
class ShiftLeft;
class ShiftRight;
class CastToUnsigned;
class CastToSigned;
class CastToReal;
class CastToEnum;
class CastToInterval;
class CastToTime;
class CastToBool;
class CtorSigned8;
class CtorSigned16;
class CtorSigned32;
class CtorSigned64;
class CtorUnsigned8;
class CtorUnsigned16;
class CtorUnsigned32;
class CtorUnsigned64;
} // namespace unsigned_integer
namespace vector {
namespace iterator {
class Deref;
class IncrPostfix;
class IncrPrefix;
class Equal;
class Unequal;
} // namespace iterator
class Size;
class Equal;
class Unequal;
class IndexConst;
class IndexNonConst;
class Sum;
class SumAssign;
class Assign;
class PushBack;
class PopBack;
class Front;
class Back;
class Reserve;
class Resize;
class At;
class SubRange;
class SubEnd;
} // namespace vector
} // namespace operator_
namespace statement {
class Assert;
class Block;
class Break;
class Comment;
class Continue;
class Declaration;
class Expression;
class For;
class If;
class Return;
class SetLocation;
class Switch;
class Throw;
class Try;
class While;
class Yield;
class Case;
class Catch;
namespace switch_ {
class Case;
}
namespace try_ {
class Catch;
}
} // namespace statement
namespace type {
class Address;
class Any;
class Auto;
class Bitfield;
class Bool;
class Bytes;
class DocOnly;
class Enum;
class Error;
class Exception;
class Function;
class Interval;
class Library;
class List;
class Map;
class Member;
class Network;
class Null;
class Name;
class OperandList;
class Optional;
class Port;
class Real;
class RegExp;
class Result;
class Set;
class SignedInteger;
class Stream;
class String;
class StrongReference;
class Struct;
class Time;
class Tuple;
class Type_;
class Union;
class Unknown;
class UnsignedInteger;
class ValueReference;
class Vector;
class Void;
class WeakReference;
namespace bitfield {
class BitRange;
}
namespace bytes {
class Iterator;
}
namespace stream {
class Iterator;
class View;
} // namespace stream
namespace list {
class Iterator;
}
namespace map {
class Iterator;
}
namespace set {
class Iterator;
}
namespace vector {
class Iterator;
}
namespace function {
using Parameter = declaration::Parameter;
} // namespace function
namespace tuple {
class Element;
}
namespace enum_ {
class Label;
}
namespace operand_list {
class Operand;
}
} // namespace type
template<typename T>
using NodeVector = std::vector<T*>;
using Attributes = NodeVector<Attribute>;
using Declarations = NodeVector<Declaration>;
using Expressions = NodeVector<Expression>;
using Statements = NodeVector<Statement>;
using QualifiedTypes = NodeVector<QualifiedType>;
using UnqualifiedTypes = NodeVector<UnqualifiedType>;
class Builder;
using BuilderPtr = std::shared_ptr<Builder>;
class ASTContext;
/**
* Container storing a set of nodes. This is just our standard vector with an
* additional constructor.
*/
class Nodes : public NodeVector<Node> {
public:
using NodeVector<Node>::NodeVector;
/** Constructor accepting a vector of pointers to a derived class. */
template<typename T>
Nodes(NodeVector<T> m) {
reserve(m.size());
for ( auto it = std::make_move_iterator(m.begin()); it != std::make_move_iterator(m.end()); ++it )
emplace_back(*it);
}
Nodes() = default;
Nodes(const Nodes&) = default;
Nodes(Nodes&&) = default;
};
} // namespace hilti