[Syntax] Unify RawSyntax and RawTokenSyntax using union and TrailingObjects

It better matches with SwiftSyntax model.

Using TrailingObjects reduces the number of heap allocation which
gains 18% performance improvement.
This commit is contained in:
Rintaro Ishizaki
2018-01-15 21:13:36 +09:00
parent 4c172037e8
commit 0780c529c4
28 changed files with 557 additions and 627 deletions

View File

@@ -18,7 +18,7 @@
#ifndef SWIFT_SYNTAX_TOKENSYNTAX_H
#define SWIFT_SYNTAX_TOKENSYNTAX_H
#include "swift/Syntax/RawTokenSyntax.h"
#include "swift/Syntax/RawSyntax.h"
#include "swift/Syntax/References.h"
#include "swift/Syntax/Syntax.h"
#include "swift/Syntax/TokenKinds.h"
@@ -36,58 +36,48 @@ public:
TokenSyntax(const RC<SyntaxData> Root, const SyntaxData *Data)
: Syntax(Root, Data) {}
RC<RawTokenSyntax> getRawToken() const {
return cast<RawTokenSyntax>(getRaw());
}
static TokenSyntax missingToken(const tok Kind, OwnedString Text) {
return make<TokenSyntax>(RawTokenSyntax::missingToken(Kind, Text));
return make<TokenSyntax>(RawSyntax::missing(Kind, Text));
}
const Trivia &getLeadingTrivia() const {
return getRawToken()->LeadingTrivia;
Trivia getLeadingTrivia() const {
return Trivia { getRaw()->getLeadingTrivia().vec() };
}
const Trivia &getTrailingTrivia() const {
return getRawToken()->TrailingTrivia;
Trivia getTrailingTrivia() const {
return Trivia { getRaw()->getTrailingTrivia().vec() };
}
TokenSyntax withLeadingTrivia(const Trivia &Trivia) const {
auto NewRaw = getRawToken()->withLeadingTrivia(Trivia);
auto NewRaw = getRaw()->withLeadingTrivia(Trivia.Pieces);
return Data->replaceSelf<TokenSyntax>(NewRaw);
}
TokenSyntax withTrailingTrivia(const Trivia &Trivia) const {
auto NewRaw = getRawToken()->withTrailingTrivia(Trivia);
auto NewRaw = getRaw()->withTrailingTrivia(Trivia.Pieces);
return Data->replaceSelf<TokenSyntax>(NewRaw);
}
bool isKeyword() const {
return getRawToken()->isKeyword();
}
/* TODO: If we really need them.
bool isKeyword() const;
bool isPunctuation() const;
bool isOperator() const;
bool isLiteral() const;
*/
bool isMissing() const {
return getRawToken()->isMissing();
}
bool isPunctuation() const {
return getRawToken()->isPunctuation();
}
bool isOperator() const {
return getRawToken()->isOperator();
}
bool isLiteral() const {
return getRawToken()->isLiteral();
return getRaw()->isMissing();
}
tok getTokenKind() const {
return getRawToken()->getTokenKind();
return getRaw()->getTokenKind();
}
StringRef getText() const {
return getRawToken()->getText();
return getRaw()->getTokenText();
}
static bool classof(const Syntax *S) {