2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
#include "bolt/CST.hpp"
|
2023-05-20 23:48:26 +02:00
|
|
|
#include "bolt/CSTVisitor.hpp"
|
2022-08-19 19:52:57 +02:00
|
|
|
|
|
|
|
namespace bolt {
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
TextFile::TextFile(ByteString Path, ByteString Text):
|
|
|
|
Path(Path), Text(Text) {
|
|
|
|
LineOffsets.push_back(0);
|
|
|
|
for (size_t I = 0; I < Text.size(); I++) {
|
|
|
|
auto Chr = Text[I];
|
|
|
|
if (Chr == '\n') {
|
|
|
|
LineOffsets.push_back(I+1);
|
2023-05-24 19:38:04 +02:00
|
|
|
}
|
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
LineOffsets.push_back(Text.size());
|
2023-05-24 19:38:04 +02:00
|
|
|
}
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getLineCount() const {
|
|
|
|
return LineOffsets.size()-1;
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getStartOffsetOfLine(size_t Line) const {
|
|
|
|
ZEN_ASSERT(Line-1 < LineOffsets.size());
|
|
|
|
return LineOffsets[Line-1];
|
|
|
|
}
|
2023-05-31 15:05:47 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getEndOffsetOfLine(size_t Line) const {
|
|
|
|
ZEN_ASSERT(Line <= LineOffsets.size());
|
|
|
|
if (Line == LineOffsets.size()) {
|
|
|
|
return Text.size();
|
2023-05-24 19:38:04 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return LineOffsets[Line];
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getLine(size_t Offset) const {
|
|
|
|
ZEN_ASSERT(Offset < Text.size());
|
|
|
|
for (size_t I = 0; I < LineOffsets.size(); ++I) {
|
|
|
|
if (LineOffsets[I] > Offset) {
|
|
|
|
return I;
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
ZEN_UNREACHABLE
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
size_t TextFile::getColumn(size_t Offset) const {
|
|
|
|
auto Line = getLine(Offset);
|
|
|
|
auto StartOffset = getStartOffsetOfLine(Line);
|
|
|
|
return Offset - StartOffset + 1 ;
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
ByteString TextFile::getPath() const {
|
|
|
|
return Path;
|
|
|
|
}
|
2023-05-24 19:38:04 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
ByteString TextFile::getText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
2023-04-12 11:15:36 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
const SourceFile* Node::getSourceFile() const {
|
|
|
|
const Node* CurrNode = this;
|
|
|
|
for (;;) {
|
|
|
|
if (CurrNode->Kind == NodeKind::SourceFile) {
|
|
|
|
return static_cast<const SourceFile*>(CurrNode);
|
2023-05-24 14:11:59 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
CurrNode = CurrNode->Parent;
|
|
|
|
ZEN_ASSERT(CurrNode != nullptr);
|
2023-05-24 14:11:59 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
|
|
|
SourceFile* Node::getSourceFile() {
|
|
|
|
Node* CurrNode = this;
|
|
|
|
for (;;) {
|
|
|
|
if (CurrNode->Kind == NodeKind::SourceFile) {
|
|
|
|
return static_cast<SourceFile*>(CurrNode);
|
2023-05-24 14:11:59 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
CurrNode = CurrNode->Parent;
|
|
|
|
ZEN_ASSERT(CurrNode != nullptr);
|
2023-05-24 14:11:59 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2023-05-24 14:11:59 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::size_t Node::getStartLine() const {
|
|
|
|
return getFirstToken()->getStartLine();
|
|
|
|
}
|
2023-05-24 14:11:59 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::size_t Node::getStartColumn() const {
|
|
|
|
return getFirstToken()->getStartColumn();
|
|
|
|
}
|
2023-05-24 14:11:59 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::size_t Node::getEndLine() const {
|
|
|
|
return getLastToken()->getEndLine();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::size_t Node::getEndColumn() const {
|
|
|
|
return getLastToken()->getEndColumn();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
TextRange Node::getRange() const {
|
|
|
|
return TextRange {
|
|
|
|
getFirstToken()->getStartLoc(),
|
|
|
|
getLastToken()->getEndLoc(),
|
|
|
|
};
|
|
|
|
}
|
2022-08-26 22:10:18 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Scope* Node::getScope() {
|
|
|
|
return Parent->getScope();
|
|
|
|
}
|
2022-08-24 20:57:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
TextLoc Token::getEndLoc() const {
|
|
|
|
auto Loc = StartLoc;
|
|
|
|
Loc.advance(getText());
|
|
|
|
return Loc;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
void Node::setParents() {
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
struct SetParentsVisitor : public CSTVisitor<SetParentsVisitor> {
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::vector<Node*> Parents { nullptr };
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
void visit(Node* N) {
|
|
|
|
N->Parent = Parents.back();
|
|
|
|
Parents.push_back(N);
|
|
|
|
visitEachChild(N);
|
|
|
|
Parents.pop_back();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
};
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
SetParentsVisitor V;
|
|
|
|
V.visit(this);
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
void Node::unref() {
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
--RefCount;
|
2022-08-21 16:25:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
if (RefCount == 0) {
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
// You may be wondering why we aren't unreffing the children in the
|
|
|
|
// destructor. This is due to a behaviour in Clang where a top-level
|
|
|
|
// destructor ~Node() wont get access to the fields in derived classes
|
|
|
|
// because they may already have been destroyed.
|
|
|
|
struct UnrefVisitor : public CSTVisitor<UnrefVisitor> {
|
|
|
|
void visit(Node* N) {
|
|
|
|
N->unref();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
UnrefVisitor V;
|
|
|
|
V.visitEachChild(this);
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
delete this;
|
2022-08-19 19:52:57 +02:00
|
|
|
}
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Identifier::isTypeVar() const {
|
|
|
|
for (auto C: Text) {
|
|
|
|
if (!((C >= 97 && C <= 122) || C == '_')) {
|
|
|
|
return false;
|
2022-08-25 23:04:09 +02:00
|
|
|
}
|
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return true;
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ExpressionAnnotation::getFirstToken() const {
|
|
|
|
return At;
|
|
|
|
}
|
2023-06-08 14:52:22 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ExpressionAnnotation::getLastToken() const {
|
|
|
|
return Expression->getLastToken();
|
|
|
|
}
|
2023-06-08 14:52:22 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeAssertAnnotation::getFirstToken() const {
|
|
|
|
return At;
|
|
|
|
}
|
2023-06-08 14:52:22 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeAssertAnnotation::getLastToken() const {
|
|
|
|
return TE->getLastToken();
|
|
|
|
}
|
2023-06-08 14:52:22 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeclassConstraintExpression::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeclassConstraintExpression::getLastToken() const {
|
|
|
|
if (!TEs.empty()) {
|
|
|
|
return TEs.back()->getLastToken();
|
2022-08-19 19:52:57 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* EqualityConstraintExpression::getFirstToken() const {
|
|
|
|
return Left->getFirstToken();
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* EqualityConstraintExpression::getLastToken() const {
|
|
|
|
return Left->getLastToken();
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordTypeExpressionField::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2024-01-21 08:51:50 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordTypeExpressionField::getLastToken() const {
|
|
|
|
return TE->getLastToken();
|
|
|
|
}
|
2024-01-21 08:51:50 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordTypeExpression::getFirstToken() const {
|
|
|
|
return LBrace;
|
|
|
|
}
|
2024-01-21 08:51:50 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordTypeExpression::getLastToken() const {
|
|
|
|
return RBrace;
|
|
|
|
}
|
2024-01-21 08:51:50 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* QualifiedTypeExpression::getFirstToken() const {
|
|
|
|
if (!Constraints.empty()) {
|
|
|
|
return std::get<0>(Constraints.front())->getFirstToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return TE->getFirstToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* QualifiedTypeExpression::getLastToken() const {
|
|
|
|
return TE->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ReferenceTypeExpression::getFirstToken() const {
|
|
|
|
if (!ModulePath.empty()) {
|
|
|
|
return std::get<0>(ModulePath.front());
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ReferenceTypeExpression::getLastToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ArrowTypeExpression::getFirstToken() const {
|
|
|
|
if (ParamTypes.size()) {
|
|
|
|
return ParamTypes.front()->getFirstToken();
|
2022-08-25 19:04:25 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return ReturnType->getFirstToken();
|
|
|
|
}
|
2022-08-25 19:04:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ArrowTypeExpression::getLastToken() const {
|
|
|
|
return ReturnType->getLastToken();
|
|
|
|
}
|
2022-08-25 19:04:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* AppTypeExpression::getFirstToken() const {
|
|
|
|
return Op->getFirstToken();
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* AppTypeExpression::getLastToken() const {
|
|
|
|
if (Args.size()) {
|
|
|
|
return Args.back()->getLastToken();
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Op->getLastToken();
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* VarTypeExpression::getLastToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* VarTypeExpression::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedTypeExpression::getLastToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2023-05-23 22:36:01 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedTypeExpression::getFirstToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2023-05-23 22:36:01 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleTypeExpression::getLastToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2023-05-23 22:36:01 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleTypeExpression::getFirstToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2023-05-23 22:36:01 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* WrappedOperator::getFirstToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2024-02-04 17:44:58 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* WrappedOperator::getLastToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2024-02-04 17:44:58 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* BindPattern::getFirstToken() const {
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name;
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* BindPattern::getLastToken() const {
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name;
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LiteralPattern::getFirstToken() const {
|
|
|
|
return Literal;
|
|
|
|
}
|
2023-05-21 17:36:44 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LiteralPattern::getLastToken() const {
|
|
|
|
return Literal;
|
|
|
|
}
|
2023-05-21 17:36:44 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordPatternField::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2024-01-21 05:40:35 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordPatternField::getLastToken() const {
|
|
|
|
if (Pattern) {
|
|
|
|
return Pattern->getLastToken();
|
2024-01-21 05:40:35 +01:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
if (Equals) {
|
|
|
|
return Equals;
|
2024-01-22 01:11:06 +01:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2024-01-22 01:11:06 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordPattern::getFirstToken() const {
|
|
|
|
return LBrace;
|
|
|
|
}
|
2024-01-22 01:11:06 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordPattern::getLastToken() const {
|
|
|
|
return RBrace;
|
|
|
|
}
|
2024-01-21 05:40:35 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NamedRecordPattern::getFirstToken() const {
|
|
|
|
if (!ModulePath.empty()) {
|
|
|
|
return std::get<0>(ModulePath.back());
|
2024-01-21 05:40:35 +01:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2024-01-21 05:40:35 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NamedRecordPattern::getLastToken() const {
|
|
|
|
return RBrace;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NamedTuplePattern::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NamedTuplePattern::getLastToken() const {
|
|
|
|
if (Patterns.size()) {
|
|
|
|
return Patterns.back()->getLastToken();
|
2023-05-31 12:38:29 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2023-05-31 12:38:29 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TuplePattern::getFirstToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2023-05-31 12:38:29 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TuplePattern::getLastToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedPattern::getFirstToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedPattern::getLastToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2023-05-31 12:38:29 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ListPattern::getFirstToken() const {
|
|
|
|
return LBracket;
|
|
|
|
}
|
2023-05-31 12:38:29 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ListPattern::getLastToken() const {
|
|
|
|
return RBracket;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ReferenceExpression::getFirstToken() const {
|
|
|
|
if (!ModulePath.empty()) {
|
|
|
|
return std::get<0>(ModulePath.front());
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-03-09 12:51:35 +01:00
|
|
|
switch (Name.getKind()) {
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::Identifier:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asIdentifier();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::IdentifierAlt:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asIdentifierAlt();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::WrappedOperator:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asWrappedOperator()->getFirstToken();
|
2024-02-19 14:32:24 +01:00
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
2023-05-21 11:30:25 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2023-05-21 11:30:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ReferenceExpression::getLastToken() const {
|
2024-03-09 12:51:35 +01:00
|
|
|
switch (Name.getKind()) {
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::Identifier:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asIdentifier();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::IdentifierAlt:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asIdentifierAlt();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::WrappedOperator:
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.asWrappedOperator()->getLastToken();
|
2024-02-19 14:32:24 +01:00
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
2023-05-21 11:30:25 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2023-05-21 11:30:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MatchCase::getFirstToken() const {
|
|
|
|
return Pattern->getFirstToken();
|
|
|
|
}
|
2023-05-21 11:30:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MatchCase::getLastToken() const {
|
|
|
|
return Expression->getLastToken();
|
|
|
|
}
|
2023-05-21 11:30:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MatchExpression::getFirstToken() const {
|
|
|
|
return MatchKeyword;
|
|
|
|
}
|
2023-05-29 20:37:23 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MatchExpression::getLastToken() const {
|
|
|
|
if (!Cases.empty()) {
|
|
|
|
return Cases.back()->getLastToken();
|
2023-05-29 20:37:23 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2023-05-29 20:37:23 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordExpressionField::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-29 20:37:23 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordExpressionField::getLastToken() const {
|
|
|
|
return E->getLastToken();
|
|
|
|
}
|
2023-05-29 20:37:23 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordExpression::getFirstToken() const {
|
|
|
|
return LBrace;
|
|
|
|
}
|
2023-05-22 11:54:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordExpression::getLastToken() const {
|
|
|
|
return RBrace;
|
|
|
|
}
|
2023-05-22 11:54:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MemberExpression::getFirstToken() const {
|
|
|
|
return E->getFirstToken();
|
|
|
|
}
|
2023-05-22 17:06:31 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* MemberExpression::getLastToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-22 17:06:31 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleExpression::getFirstToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2022-08-26 22:10:18 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleExpression::getLastToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2022-08-26 22:10:18 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedExpression::getFirstToken() const {
|
|
|
|
return LParen;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* NestedExpression::getLastToken() const {
|
|
|
|
return RParen;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LiteralExpression::getFirstToken() const {
|
|
|
|
return Token;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LiteralExpression::getLastToken() const {
|
|
|
|
return Token;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* CallExpression::getFirstToken() const {
|
|
|
|
return Function->getFirstToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* CallExpression::getLastToken() const {
|
|
|
|
if (Args.size()) {
|
|
|
|
return Args.back()->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Function->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* InfixExpression::getFirstToken() const {
|
|
|
|
return Left->getFirstToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* InfixExpression::getLastToken() const {
|
|
|
|
return Right->getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* PrefixExpression::getFirstToken() const {
|
|
|
|
return Operator;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* PrefixExpression::getLastToken() const {
|
|
|
|
return Argument->getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* ExpressionStatement::getFirstToken() const {
|
|
|
|
return Expression->getFirstToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* ExpressionStatement::getLastToken() const {
|
|
|
|
return Expression->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ReturnStatement::getFirstToken() const {
|
|
|
|
return ReturnKeyword;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* ReturnStatement::getLastToken() const {
|
2024-06-21 00:18:44 +02:00
|
|
|
if (E) {
|
|
|
|
return E->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return ReturnKeyword;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* IfStatementPart::getFirstToken() const {
|
|
|
|
return Keyword;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* IfStatementPart::getLastToken() const {
|
|
|
|
if (Elements.size()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* IfStatement::getFirstToken() const {
|
|
|
|
ZEN_ASSERT(Parts.size());
|
|
|
|
return Parts.front()->getFirstToken();
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* IfStatement::getLastToken() const {
|
|
|
|
ZEN_ASSERT(Parts.size());
|
|
|
|
return Parts.back()->getLastToken();
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeAssert::getFirstToken() const {
|
|
|
|
return Colon;
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TypeAssert::getLastToken() const {
|
|
|
|
return TypeExpression->getLastToken();
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* Parameter::getFirstToken() const {
|
|
|
|
return Pattern->getFirstToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* Parameter::getLastToken() const {
|
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Pattern->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LetBlockBody::getFirstToken() const {
|
|
|
|
return BlockStart;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LetBlockBody::getLastToken() const {
|
|
|
|
if (Elements.size()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LetExprBody::getFirstToken() const {
|
|
|
|
return Equals;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* LetExprBody::getLastToken() const {
|
|
|
|
return Expression->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-03-09 12:51:35 +01:00
|
|
|
Token* PrefixFunctionDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
|
|
|
}
|
|
|
|
if (ForeignKeyword) {
|
|
|
|
return ForeignKeyword;
|
|
|
|
}
|
|
|
|
return LetKeyword;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* PrefixFunctionDeclaration::getLastToken() const {
|
|
|
|
if (Body) {
|
|
|
|
return Body->getLastToken();
|
|
|
|
}
|
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
|
|
|
}
|
|
|
|
return Param->getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* InfixFunctionDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
|
|
|
}
|
|
|
|
if (ForeignKeyword) {
|
|
|
|
return ForeignKeyword;
|
|
|
|
}
|
|
|
|
return LetKeyword;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* InfixFunctionDeclaration::getLastToken() const {
|
|
|
|
if (Body) {
|
|
|
|
return Body->getLastToken();
|
|
|
|
}
|
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
|
|
|
}
|
|
|
|
return Right->getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* SuffixFunctionDeclaration::getFirstToken() const {
|
2024-02-19 14:32:24 +01:00
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
if (ForeignKeyword) {
|
|
|
|
return ForeignKeyword;
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return LetKeyword;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-03-09 12:51:35 +01:00
|
|
|
Token* SuffixFunctionDeclaration::getLastToken() const {
|
2024-02-19 14:32:24 +01:00
|
|
|
if (Body) {
|
|
|
|
return Body->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* NamedFunctionDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
|
|
|
}
|
|
|
|
if (ForeignKeyword) {
|
|
|
|
return ForeignKeyword;
|
|
|
|
}
|
|
|
|
return LetKeyword;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* NamedFunctionDeclaration::getLastToken() const {
|
|
|
|
if (Body) {
|
|
|
|
return Body->getLastToken();
|
|
|
|
}
|
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
|
|
|
}
|
|
|
|
if (!Params.empty()) {
|
2024-02-19 14:32:24 +01:00
|
|
|
return Params.back()->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-03-09 12:51:35 +01:00
|
|
|
return Name.getLastToken();
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* VariableDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
|
|
|
}
|
|
|
|
if (ForeignKeyword) {
|
|
|
|
return ForeignKeyword;
|
|
|
|
}
|
|
|
|
return LetKeyword;
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* VariableDeclaration::getLastToken() const {
|
2024-02-19 14:32:24 +01:00
|
|
|
return Pattern->getLastToken();
|
2024-03-09 12:51:35 +01:00
|
|
|
if (TypeAssert) {
|
|
|
|
return TypeAssert->getLastToken();
|
|
|
|
}
|
|
|
|
if (Body) {
|
|
|
|
return Body->getLastToken();
|
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordDeclarationField::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordDeclarationField::getLastToken() const {
|
|
|
|
return TypeExpression->getLastToken();
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return StructKeyword;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordDeclaration::getLastToken() const {
|
|
|
|
if (Fields.size()) {
|
|
|
|
return Fields.back()->getLastToken();
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* VariantDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword) {
|
|
|
|
return PubKeyword;
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return EnumKeyword;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* VariantDeclaration::getLastToken() const {
|
|
|
|
if (Members.size()) {
|
|
|
|
return Members.back()->getLastToken();
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleVariantDeclarationMember::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* TupleVariantDeclarationMember::getLastToken() const {
|
|
|
|
if (Elements.size()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2023-05-28 19:07:52 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return Name;
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordVariantDeclarationMember::getFirstToken() const {
|
|
|
|
return Name;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* RecordVariantDeclarationMember::getLastToken() const {
|
|
|
|
if (Fields.size()) {
|
|
|
|
return Fields.back()->getLastToken();
|
2023-05-20 23:48:26 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* InstanceDeclaration::getFirstToken() const {
|
|
|
|
return InstanceKeyword;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* InstanceDeclaration::getLastToken() const {
|
|
|
|
if (!Elements.empty()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2023-05-20 23:48:26 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ClassDeclaration::getFirstToken() const {
|
|
|
|
if (PubKeyword != nullptr) {
|
|
|
|
return PubKeyword;
|
2023-05-20 23:48:26 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return ClassKeyword;
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* ClassDeclaration::getLastToken() const {
|
|
|
|
if (!Elements.empty()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return BlockStart;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* SourceFile::getFirstToken() const {
|
|
|
|
if (Elements.size()) {
|
|
|
|
return Elements.front()->getFirstToken();
|
2022-08-24 12:36:43 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return nullptr;
|
|
|
|
}
|
2022-08-24 12:36:43 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
Token* SourceFile::getLastToken() const {
|
|
|
|
if (Elements.size()) {
|
|
|
|
return Elements.back()->getLastToken();
|
2024-01-21 08:51:50 +01:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
return nullptr;
|
|
|
|
}
|
2024-01-21 08:51:50 +01:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string VBar::getText() const {
|
|
|
|
return "|";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Equals::getText() const {
|
|
|
|
return "=";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Colon::getText() const {
|
|
|
|
return ":";
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Comma::getText() const {
|
|
|
|
return ",";
|
|
|
|
}
|
2022-08-25 19:04:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string RArrow::getText() const {
|
|
|
|
return "->";
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string RArrowAlt::getText() const {
|
|
|
|
return "=>";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Dot::getText() const {
|
|
|
|
return ".";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string LParen::getText() const {
|
|
|
|
return "(";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string RParen::getText() const {
|
|
|
|
return ")";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string LBracket::getText() const {
|
|
|
|
return "[";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string RBracket::getText() const {
|
|
|
|
return "]";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string LBrace::getText() const {
|
|
|
|
return "{";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string RBrace::getText() const {
|
|
|
|
return "}";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string LetKeyword::getText() const {
|
|
|
|
return "let";
|
|
|
|
}
|
2023-05-30 21:34:40 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ForeignKeyword::getText() const {
|
|
|
|
return "foreign";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string MutKeyword::getText() const {
|
|
|
|
return "mut";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string PubKeyword::getText() const {
|
|
|
|
return "pub";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string TypeKeyword::getText() const {
|
|
|
|
return "type";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ReturnKeyword::getText() const {
|
|
|
|
return "return";
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string IfKeyword::getText() const {
|
|
|
|
return "if";
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ElseKeyword::getText() const {
|
|
|
|
return "else";
|
|
|
|
}
|
2022-08-25 23:04:09 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ElifKeyword::getText() const {
|
|
|
|
return "elif";
|
|
|
|
}
|
2023-05-21 11:30:25 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string MatchKeyword::getText() const {
|
|
|
|
return "match";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ModKeyword::getText() const {
|
|
|
|
return "mod";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string StructKeyword::getText() const {
|
|
|
|
return "struct";
|
|
|
|
}
|
2023-05-28 19:07:52 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string EnumKeyword::getText() const {
|
|
|
|
return "enum";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Invalid::getText() const {
|
|
|
|
return "";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string EndOfFile::getText() const {
|
|
|
|
return "";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string BlockStart::getText() const {
|
|
|
|
return ".";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string BlockEnd::getText() const {
|
|
|
|
return "";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string LineFoldEnd::getText() const {
|
|
|
|
return "";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string CustomOperator::getText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Assignment::getText() const {
|
|
|
|
return Text + "=";
|
|
|
|
}
|
2023-05-21 00:25:01 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Identifier::getText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string IdentifierAlt::getText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string StringLiteral::getText() const {
|
|
|
|
return "\"" + Text + "\"";
|
|
|
|
}
|
2022-08-19 19:52:57 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string IntegerLiteral::getText() const {
|
|
|
|
return std::to_string(V);
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string DotDot::getText() const {
|
|
|
|
return "..";
|
|
|
|
}
|
2023-06-08 14:52:22 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string Tilde::getText() const {
|
|
|
|
return "~";
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string At::getText() const {
|
|
|
|
return "@";
|
|
|
|
}
|
2023-05-20 23:48:26 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string ClassKeyword::getText() const {
|
|
|
|
return "class";
|
|
|
|
}
|
2023-05-21 14:50:28 +02:00
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
std::string InstanceKeyword::getText() const {
|
|
|
|
return "instance";
|
|
|
|
}
|
2023-05-21 17:36:44 +02:00
|
|
|
|
2024-03-09 12:51:35 +01:00
|
|
|
ByteString Identifier::getCanonicalText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteString IdentifierAlt::getCanonicalText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteString CustomOperator::getCanonicalText() const {
|
|
|
|
return Text;
|
|
|
|
}
|
|
|
|
|
|
|
|
ByteString Symbol::getCanonicalText() const {
|
2024-02-19 14:32:24 +01:00
|
|
|
switch (N->getKind()) {
|
|
|
|
case NodeKind::Identifier:
|
2024-03-09 12:51:35 +01:00
|
|
|
return static_cast<const Identifier*>(N)->getCanonicalText();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::IdentifierAlt:
|
2024-03-09 12:51:35 +01:00
|
|
|
return static_cast<const IdentifierAlt*>(N)->getCanonicalText();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::CustomOperator:
|
2024-03-09 12:51:35 +01:00
|
|
|
return static_cast<const CustomOperator*>(N)->getCanonicalText();
|
2024-02-19 14:32:24 +01:00
|
|
|
case NodeKind::VBar:
|
|
|
|
return static_cast<const VBar*>(N)->getText();
|
|
|
|
case NodeKind::WrappedOperator:
|
2024-03-09 12:51:35 +01:00
|
|
|
return static_cast<const WrappedOperator*>(N)->getCanonicalText();
|
2024-02-19 14:32:24 +01:00
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
2023-05-21 17:36:44 +02:00
|
|
|
}
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2023-05-21 17:36:44 +02:00
|
|
|
|
2024-03-09 12:51:35 +01:00
|
|
|
Token* Symbol::getFirstToken() const {
|
|
|
|
switch (N->getKind()) {
|
|
|
|
case NodeKind::Identifier:
|
|
|
|
return static_cast<Identifier*>(N);
|
|
|
|
case NodeKind::IdentifierAlt:
|
|
|
|
return static_cast<IdentifierAlt*>(N);
|
|
|
|
case NodeKind::WrappedOperator:
|
|
|
|
return static_cast<WrappedOperator*>(N)->getFirstToken();
|
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* Symbol::getLastToken() const {
|
|
|
|
switch (N->getKind()) {
|
|
|
|
case NodeKind::Identifier:
|
|
|
|
return static_cast<Identifier*>(N);
|
|
|
|
case NodeKind::IdentifierAlt:
|
|
|
|
return static_cast<IdentifierAlt*>(N);
|
|
|
|
case NodeKind::WrappedOperator:
|
|
|
|
return static_cast<WrappedOperator*>(N)->getLastToken();
|
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ByteString Operator::getCanonicalText() const {
|
|
|
|
switch (N->getKind()) {
|
|
|
|
case NodeKind::CustomOperator:
|
|
|
|
return static_cast<const CustomOperator*>(N)->getCanonicalText();
|
|
|
|
case NodeKind::VBar:
|
|
|
|
return static_cast<const VBar*>(N)->getText();
|
|
|
|
default:
|
|
|
|
ZEN_UNREACHABLE
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* Operator::getFirstToken() const {
|
|
|
|
return static_cast<Token*>(N);
|
|
|
|
}
|
|
|
|
|
|
|
|
Token* Operator::getLastToken() const {
|
|
|
|
return static_cast<Token*>(N);
|
|
|
|
}
|
|
|
|
|
2024-02-19 14:32:24 +01:00
|
|
|
LiteralValue StringLiteral::getValue() {
|
|
|
|
return Text;
|
|
|
|
}
|
|
|
|
|
|
|
|
LiteralValue IntegerLiteral::getValue() {
|
|
|
|
return V;
|
|
|
|
}
|
|
|
|
|
|
|
|
SymbolPath ReferenceExpression::getSymbolPath() const {
|
|
|
|
std::vector<ByteString> ModuleNames;
|
|
|
|
for (auto [Name, Dot]: ModulePath) {
|
2024-03-09 12:51:35 +01:00
|
|
|
ModuleNames.push_back(Name->getCanonicalText());
|
2022-08-26 22:10:18 +02:00
|
|
|
}
|
2024-03-09 12:51:35 +01:00
|
|
|
return SymbolPath { ModuleNames, Name.getCanonicalText() };
|
2024-02-19 14:32:24 +01:00
|
|
|
}
|
2022-08-26 22:10:18 +02:00
|
|
|
|
2024-06-21 00:18:44 +02:00
|
|
|
bool TypedNode::classof(Node* N) {
|
|
|
|
return Expression::classof(N)
|
|
|
|
|| TypeExpression::classof(N)
|
|
|
|
|| FunctionDeclaration::classof(N)
|
|
|
|
|| VariableDeclaration::classof(N);
|
|
|
|
}
|
|
|
|
|
2022-08-19 19:52:57 +02:00
|
|
|
}
|
|
|
|
|