Files
swift-mirror/include/swift/Syntax/TokenSyntax.h
Alex Hoppen 56a923475f [libSyntax] Reference count SyntaxData
Instead of having a heap-allocated RefCountedBox to store a SyntaxData's
parent, reference-count SyntaxData itself. This has a couple of
advantages:
 - When passing SyntaxData around, only a pointer needs to be passed
   instead of the entire struct contents. This is faster.
 - We can later introduce a SyntaxDataRef, which behaves similar to
   SyntaxData, but delegates the responsibility that the parent stays
   alive to the user. While sacrificing guaranteed memory safety, this
   means that SyntaxData can then be stack-allocated without any
   ref-counting overhead.
2021-03-03 08:48:24 +01:00

105 lines
2.9 KiB
C++

//===----------- TokenSyntax.h - Swift Token Interface ----------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file contains the interface for a `TokenSyntax`, which is a token
// that includes full-fidelity leading and trailing trivia.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SYNTAX_TOKENSYNTAX_H
#define SWIFT_SYNTAX_TOKENSYNTAX_H
#include "swift/Syntax/RawSyntax.h"
#include "swift/Syntax/References.h"
#include "swift/Syntax/Syntax.h"
#include "swift/Syntax/TokenKinds.h"
#include "swift/Syntax/Trivia.h"
namespace swift {
namespace syntax {
class TokenSyntax final : public Syntax {
protected:
void validate() const {
assert(getRaw()->isToken());
}
public:
TokenSyntax(const RC<const SyntaxData> &Data) : Syntax(Data) {}
static TokenSyntax missingToken(const tok Kind, StringRef Text,
const RC<SyntaxArena> &Arena) {
return makeRoot<TokenSyntax>(RawSyntax::missing(Kind, Text, Arena));
}
StringRef getLeadingTrivia() const { return getRaw()->getLeadingTrivia(); }
Trivia getLeadingTriviaPieces() const { return getRaw()->getLeadingTriviaPieces(); }
StringRef getTrailingTrivia() const { return getRaw()->getTrailingTrivia(); }
Trivia getTrailingTriviaPieces() const {
return getRaw()->getTrailingTriviaPieces();
}
TokenSyntax withLeadingTrivia(StringRef Trivia) const {
auto NewRaw = getRaw()->withLeadingTrivia(Trivia);
return TokenSyntax(getData()->replacingSelf(NewRaw));
}
TokenSyntax withTrailingTrivia(StringRef Trivia) const {
auto NewRaw = getRaw()->withTrailingTrivia(Trivia);
return TokenSyntax(getData()->replacingSelf(NewRaw));
}
/* TODO: If we really need them.
bool isKeyword() const;
bool isPunctuation() const;
bool isOperator() const;
bool isLiteral() const;
*/
bool isMissing() const {
return getRaw()->isMissing();
}
tok getTokenKind() const {
return getRaw()->getTokenKind();
}
StringRef getText() const {
return getRaw()->getTokenText();
}
StringRef getIdentifierText() const {
StringRef text = getText();
if (text.front() == '`') {
assert(text.back() == '`');
return text.slice(1, text.size() - 1);
}
return text;
}
static bool kindof(SyntaxKind Kind) {
return isTokenKind(Kind);
}
static bool classof(const Syntax *S) {
return kindof(S->getKind());
}
};
} // end namespace syntax
} // end namespace swift
#endif // SWIFT_SYNTAX_TOKENSYNTAX_H