bolt/src/CST.cc

1046 lines
20 KiB
C++
Raw Normal View History

#include "bolt/CST.hpp"
#include "bolt/CSTVisitor.hpp"
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);
}
}
2024-02-19 14:32:24 +01:00
LineOffsets.push_back(Text.size());
}
2024-02-19 14:32:24 +01:00
size_t TextFile::getLineCount() const {
return LineOffsets.size()-1;
}
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];
}
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();
}
2024-02-19 14:32:24 +01:00
return LineOffsets[Line];
}
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;
}
}
2024-02-19 14:32:24 +01:00
ZEN_UNREACHABLE
}
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 ;
}
2024-02-19 14:32:24 +01:00
ByteString TextFile::getPath() const {
return Path;
}
2024-02-19 14:32:24 +01:00
ByteString TextFile::getText() const {
return Text;
}
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);
}
2024-02-19 14:32:24 +01:00
CurrNode = CurrNode->Parent;
ZEN_ASSERT(CurrNode != nullptr);
}
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);
}
2024-02-19 14:32:24 +01:00
CurrNode = CurrNode->Parent;
ZEN_ASSERT(CurrNode != nullptr);
}
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
std::size_t Node::getStartLine() const {
return getFirstToken()->getStartLine();
}
2024-02-19 14:32:24 +01:00
std::size_t Node::getStartColumn() const {
return getFirstToken()->getStartColumn();
}
2024-02-19 14:32:24 +01:00
std::size_t Node::getEndLine() const {
return getLastToken()->getEndLine();
}
2024-02-19 14:32:24 +01:00
std::size_t Node::getEndColumn() const {
return getLastToken()->getEndColumn();
}
2024-02-19 14:32:24 +01:00
TextRange Node::getRange() const {
return TextRange {
getFirstToken()->getStartLoc(),
getLastToken()->getEndLoc(),
};
}
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;
}
2024-02-19 14:32:24 +01:00
void Node::setParents() {
2024-02-19 14:32:24 +01:00
struct SetParentsVisitor : public CSTVisitor<SetParentsVisitor> {
2024-02-19 14:32:24 +01:00
std::vector<Node*> Parents { nullptr };
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();
}
2024-02-19 14:32:24 +01:00
};
2024-02-19 14:32:24 +01:00
SetParentsVisitor V;
V.visit(this);
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
void Node::unref() {
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) {
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);
2024-02-19 14:32:24 +01:00
delete this;
}
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;
}
2024-02-19 14:32:24 +01:00
Token* ExpressionAnnotation::getLastToken() const {
return Expression->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* TypeAssertAnnotation::getFirstToken() const {
return At;
}
2024-02-19 14:32:24 +01:00
Token* TypeAssertAnnotation::getLastToken() const {
return TE->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* TypeclassConstraintExpression::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* TypeclassConstraintExpression::getLastToken() const {
if (!TEs.empty()) {
return TEs.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* EqualityConstraintExpression::getFirstToken() const {
return Left->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* EqualityConstraintExpression::getLastToken() const {
return Left->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* RecordTypeExpressionField::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordTypeExpressionField::getLastToken() const {
return TE->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* RecordTypeExpression::getFirstToken() const {
return LBrace;
}
2024-02-19 14:32:24 +01:00
Token* RecordTypeExpression::getLastToken() const {
return RBrace;
}
2024-02-19 14:32:24 +01:00
Token* QualifiedTypeExpression::getFirstToken() const {
if (!Constraints.empty()) {
return std::get<0>(Constraints.front())->getFirstToken();
}
2024-02-19 14:32:24 +01:00
return TE->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* QualifiedTypeExpression::getLastToken() const {
return TE->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* ReferenceTypeExpression::getFirstToken() const {
if (!ModulePath.empty()) {
return std::get<0>(ModulePath.front());
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* ReferenceTypeExpression::getLastToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* ArrowTypeExpression::getFirstToken() const {
if (ParamTypes.size()) {
return ParamTypes.front()->getFirstToken();
}
2024-02-19 14:32:24 +01:00
return ReturnType->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* ArrowTypeExpression::getLastToken() const {
return ReturnType->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* AppTypeExpression::getFirstToken() const {
return Op->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* AppTypeExpression::getLastToken() const {
if (Args.size()) {
return Args.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Op->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* VarTypeExpression::getLastToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* VarTypeExpression::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* NestedTypeExpression::getLastToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* NestedTypeExpression::getFirstToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* TupleTypeExpression::getLastToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* TupleTypeExpression::getFirstToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* WrappedOperator::getFirstToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* WrappedOperator::getLastToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* BindPattern::getFirstToken() const {
return Name;
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
Token* BindPattern::getLastToken() const {
return Name;
2024-02-19 14:32:24 +01: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-02-19 14:32:24 +01:00
Token* RecordPatternField::getLastToken() const {
if (Pattern) {
return Pattern->getLastToken();
}
2024-02-19 14:32:24 +01:00
if (Equals) {
return Equals;
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordPattern::getFirstToken() const {
return LBrace;
}
2024-02-19 14:32:24 +01:00
Token* RecordPattern::getLastToken() const {
return RBrace;
}
2024-02-19 14:32:24 +01:00
Token* NamedRecordPattern::getFirstToken() const {
if (!ModulePath.empty()) {
return std::get<0>(ModulePath.back());
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* NamedRecordPattern::getLastToken() const {
return RBrace;
}
2024-02-19 14:32:24 +01:00
Token* NamedTuplePattern::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* NamedTuplePattern::getLastToken() const {
if (Patterns.size()) {
return Patterns.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* TuplePattern::getFirstToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* TuplePattern::getLastToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* NestedPattern::getFirstToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* NestedPattern::getLastToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* ListPattern::getFirstToken() const {
return LBracket;
}
2024-02-19 14:32:24 +01:00
Token* ListPattern::getLastToken() const {
return RBracket;
}
2024-02-19 14:32:24 +01:00
Token* ReferenceExpression::getFirstToken() const {
if (!ModulePath.empty()) {
return std::get<0>(ModulePath.front());
}
switch (Name.getKind()) {
2024-02-19 14:32:24 +01:00
case NodeKind::Identifier:
return Name.asIdentifier();
2024-02-19 14:32:24 +01:00
case NodeKind::IdentifierAlt:
return Name.asIdentifierAlt();
2024-02-19 14:32:24 +01:00
case NodeKind::WrappedOperator:
return Name.asWrappedOperator()->getFirstToken();
2024-02-19 14:32:24 +01:00
default:
ZEN_UNREACHABLE
}
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
Token* ReferenceExpression::getLastToken() const {
switch (Name.getKind()) {
2024-02-19 14:32:24 +01:00
case NodeKind::Identifier:
return Name.asIdentifier();
2024-02-19 14:32:24 +01:00
case NodeKind::IdentifierAlt:
return Name.asIdentifierAlt();
2024-02-19 14:32:24 +01:00
case NodeKind::WrappedOperator:
return Name.asWrappedOperator()->getLastToken();
2024-02-19 14:32:24 +01:00
default:
ZEN_UNREACHABLE
}
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
Token* MatchCase::getFirstToken() const {
return Pattern->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* MatchCase::getLastToken() const {
return Expression->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* MatchExpression::getFirstToken() const {
return MatchKeyword;
}
2024-02-19 14:32:24 +01:00
Token* MatchExpression::getLastToken() const {
if (!Cases.empty()) {
return Cases.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* RecordExpressionField::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordExpressionField::getLastToken() const {
return E->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* RecordExpression::getFirstToken() const {
return LBrace;
}
2024-02-19 14:32:24 +01:00
Token* RecordExpression::getLastToken() const {
return RBrace;
}
2024-02-19 14:32:24 +01:00
Token* MemberExpression::getFirstToken() const {
return E->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* MemberExpression::getLastToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* TupleExpression::getFirstToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* TupleExpression::getLastToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* NestedExpression::getFirstToken() const {
return LParen;
}
2024-02-19 14:32:24 +01:00
Token* NestedExpression::getLastToken() const {
return RParen;
}
2024-02-19 14:32:24 +01:00
Token* LiteralExpression::getFirstToken() const {
return Token;
}
2024-02-19 14:32:24 +01:00
Token* LiteralExpression::getLastToken() const {
return Token;
}
2024-02-19 14:32:24 +01:00
Token* CallExpression::getFirstToken() const {
return Function->getFirstToken();
}
2024-02-19 14:32:24 +01:00
Token* CallExpression::getLastToken() const {
if (Args.size()) {
return Args.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Function->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* InfixExpression::getFirstToken() const {
return Left->getFirstToken();
}
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();
}
2024-02-19 14:32:24 +01:00
Token* ReturnStatement::getFirstToken() const {
return ReturnKeyword;
}
Token* ReturnStatement::getLastToken() const {
if (E) {
return E->getLastToken();
}
2024-02-19 14:32:24 +01:00
return ReturnKeyword;
}
2024-02-19 14:32:24 +01:00
Token* IfStatementPart::getFirstToken() const {
return Keyword;
}
2024-02-19 14:32:24 +01:00
Token* IfStatementPart::getLastToken() const {
if (Elements.size()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
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();
}
2024-02-19 14:32:24 +01:00
Token* Parameter::getLastToken() const {
if (TypeAssert) {
return TypeAssert->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Pattern->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* LetBlockBody::getFirstToken() const {
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* LetBlockBody::getLastToken() const {
if (Elements.size()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* LetExprBody::getFirstToken() const {
return Equals;
}
2024-02-19 14:32:24 +01:00
Token* LetExprBody::getLastToken() const {
return Expression->getLastToken();
}
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;
}
2024-02-19 14:32:24 +01:00
if (ForeignKeyword) {
return ForeignKeyword;
}
2024-02-19 14:32:24 +01:00
return LetKeyword;
}
Token* SuffixFunctionDeclaration::getLastToken() const {
2024-02-19 14:32:24 +01:00
if (Body) {
return Body->getLastToken();
}
2024-02-19 14:32:24 +01:00
if (TypeAssert) {
return TypeAssert->getLastToken();
}
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();
}
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();
if (TypeAssert) {
return TypeAssert->getLastToken();
}
if (Body) {
return Body->getLastToken();
}
2024-02-19 14:32:24 +01:00
}
2024-02-19 14:32:24 +01:00
Token* RecordDeclarationField::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordDeclarationField::getLastToken() const {
return TypeExpression->getLastToken();
}
2024-02-19 14:32:24 +01:00
Token* RecordDeclaration::getFirstToken() const {
if (PubKeyword) {
return PubKeyword;
}
2024-02-19 14:32:24 +01:00
return StructKeyword;
}
2024-02-19 14:32:24 +01:00
Token* RecordDeclaration::getLastToken() const {
if (Fields.size()) {
return Fields.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* VariantDeclaration::getFirstToken() const {
if (PubKeyword) {
return PubKeyword;
}
2024-02-19 14:32:24 +01:00
return EnumKeyword;
}
2024-02-19 14:32:24 +01:00
Token* VariantDeclaration::getLastToken() const {
if (Members.size()) {
return Members.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* TupleVariantDeclarationMember::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* TupleVariantDeclarationMember::getLastToken() const {
if (Elements.size()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordVariantDeclarationMember::getFirstToken() const {
return Name;
}
2024-02-19 14:32:24 +01:00
Token* RecordVariantDeclarationMember::getLastToken() const {
if (Fields.size()) {
return Fields.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* InstanceDeclaration::getFirstToken() const {
return InstanceKeyword;
}
2024-02-19 14:32:24 +01:00
Token* InstanceDeclaration::getLastToken() const {
if (!Elements.empty()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* ClassDeclaration::getFirstToken() const {
if (PubKeyword != nullptr) {
return PubKeyword;
}
2024-02-19 14:32:24 +01:00
return ClassKeyword;
}
2024-02-19 14:32:24 +01:00
Token* ClassDeclaration::getLastToken() const {
if (!Elements.empty()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return BlockStart;
}
2024-02-19 14:32:24 +01:00
Token* SourceFile::getFirstToken() const {
if (Elements.size()) {
return Elements.front()->getFirstToken();
}
2024-02-19 14:32:24 +01:00
return nullptr;
}
2024-02-19 14:32:24 +01:00
Token* SourceFile::getLastToken() const {
if (Elements.size()) {
return Elements.back()->getLastToken();
}
2024-02-19 14:32:24 +01:00
return nullptr;
}
2024-02-19 14:32:24 +01:00
std::string VBar::getText() const {
return "|";
}
2024-02-19 14:32:24 +01:00
std::string Equals::getText() const {
return "=";
}
2024-02-19 14:32:24 +01:00
std::string Colon::getText() const {
return ":";
}
2024-02-19 14:32:24 +01:00
std::string Comma::getText() const {
return ",";
}
2024-02-19 14:32:24 +01:00
std::string RArrow::getText() const {
return "->";
}
2024-02-19 14:32:24 +01:00
std::string RArrowAlt::getText() const {
return "=>";
}
2024-02-19 14:32:24 +01:00
std::string Dot::getText() const {
return ".";
}
2024-02-19 14:32:24 +01:00
std::string LParen::getText() const {
return "(";
}
2024-02-19 14:32:24 +01:00
std::string RParen::getText() const {
return ")";
}
2024-02-19 14:32:24 +01:00
std::string LBracket::getText() const {
return "[";
}
2024-02-19 14:32:24 +01:00
std::string RBracket::getText() const {
return "]";
}
2024-02-19 14:32:24 +01:00
std::string LBrace::getText() const {
return "{";
}
2024-02-19 14:32:24 +01:00
std::string RBrace::getText() const {
return "}";
}
2024-02-19 14:32:24 +01:00
std::string LetKeyword::getText() const {
return "let";
}
2024-02-19 14:32:24 +01:00
std::string ForeignKeyword::getText() const {
return "foreign";
}
2024-02-19 14:32:24 +01:00
std::string MutKeyword::getText() const {
return "mut";
}
2024-02-19 14:32:24 +01:00
std::string PubKeyword::getText() const {
return "pub";
}
2024-02-19 14:32:24 +01:00
std::string TypeKeyword::getText() const {
return "type";
}
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";
}
2024-02-19 14:32:24 +01:00
std::string MatchKeyword::getText() const {
return "match";
}
2024-02-19 14:32:24 +01:00
std::string ModKeyword::getText() const {
return "mod";
}
2024-02-19 14:32:24 +01:00
std::string StructKeyword::getText() const {
return "struct";
}
2024-02-19 14:32:24 +01:00
std::string EnumKeyword::getText() const {
return "enum";
}
2024-02-19 14:32:24 +01:00
std::string Invalid::getText() const {
return "";
}
2024-02-19 14:32:24 +01:00
std::string EndOfFile::getText() const {
return "";
}
2024-02-19 14:32:24 +01:00
std::string BlockStart::getText() const {
return ".";
}
2024-02-19 14:32:24 +01:00
std::string BlockEnd::getText() const {
return "";
}
2024-02-19 14:32:24 +01:00
std::string LineFoldEnd::getText() const {
return "";
}
2024-02-19 14:32:24 +01:00
std::string CustomOperator::getText() const {
return Text;
}
2024-02-19 14:32:24 +01:00
std::string Assignment::getText() const {
return Text + "=";
}
2024-02-19 14:32:24 +01:00
std::string Identifier::getText() const {
return Text;
}
2024-02-19 14:32:24 +01:00
std::string IdentifierAlt::getText() const {
return Text;
}
2024-02-19 14:32:24 +01:00
std::string StringLiteral::getText() const {
return "\"" + Text + "\"";
}
2024-02-19 14:32:24 +01:00
std::string IntegerLiteral::getText() const {
return std::to_string(V);
}
2024-02-19 14:32:24 +01:00
std::string DotDot::getText() const {
return "..";
}
2024-02-19 14:32:24 +01:00
std::string Tilde::getText() const {
return "~";
}
2024-02-19 14:32:24 +01:00
std::string At::getText() const {
return "@";
}
2024-02-19 14:32:24 +01:00
std::string ClassKeyword::getText() const {
return "class";
}
2024-02-19 14:32:24 +01:00
std::string InstanceKeyword::getText() const {
return "instance";
}
2023-05-21 17:36:44 +02: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:
return static_cast<const Identifier*>(N)->getCanonicalText();
2024-02-19 14:32:24 +01:00
case NodeKind::IdentifierAlt:
return static_cast<const IdentifierAlt*>(N)->getCanonicalText();
2024-02-19 14:32:24 +01:00
case NodeKind::CustomOperator:
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:
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
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) {
ModuleNames.push_back(Name->getCanonicalText());
}
return SymbolPath { ModuleNames, Name.getCanonicalText() };
2024-02-19 14:32:24 +01:00
}
bool TypedNode::classof(Node* N) {
return Expression::classof(N)
|| TypeExpression::classof(N)
|| FunctionDeclaration::classof(N)
|| VariableDeclaration::classof(N);
}
}