mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
[libSyntax] Add a reference counted version of OwnedString
We cannot use unowned strings for token texts of incrementally parsed syntax trees since the source buffer to which reused nodes refer will have been freed for reused nodes. Always copying the token text whenever OwnedString is passed is too expensive. A reference counted copy of the string allows us to keep the token's string alive across incremental parses while eliminating unnecessary copies.
This commit is contained in:
@@ -233,7 +233,8 @@ SyntaxFactory::makeBlank${node.syntax_kind}(SyntaxArena *Arena) {
|
||||
SyntaxFactory::make${token.name}Keyword(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeToken(tok::${token.kind}, "${token.text}",
|
||||
return makeToken(tok::${token.kind},
|
||||
OwnedString::makeUnowned("${token.text}"),
|
||||
LeadingTrivia, TrailingTrivia,
|
||||
SourcePresence::Present, Arena);
|
||||
}
|
||||
@@ -242,7 +243,8 @@ SyntaxFactory::makeBlank${node.syntax_kind}(SyntaxArena *Arena) {
|
||||
SyntaxFactory::make${token.name}Token(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeToken(tok::${token.kind}, "${token.text}",
|
||||
return makeToken(tok::${token.kind},
|
||||
OwnedString::makeUnowned("${token.text}"),
|
||||
LeadingTrivia, TrailingTrivia,
|
||||
SourcePresence::Present, Arena);
|
||||
}
|
||||
@@ -303,30 +305,35 @@ TypeSyntax SyntaxFactory::makeTypeIdentifier(OwnedString TypeName,
|
||||
TypeSyntax SyntaxFactory::makeAnyTypeIdentifier(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeTypeIdentifier("Any", LeadingTrivia, TrailingTrivia, Arena);
|
||||
return makeTypeIdentifier(OwnedString::makeUnowned("Any"), LeadingTrivia,
|
||||
TrailingTrivia, Arena);
|
||||
}
|
||||
|
||||
TypeSyntax SyntaxFactory::makeSelfTypeIdentifier(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeTypeIdentifier("Self", LeadingTrivia, TrailingTrivia, Arena);
|
||||
return makeTypeIdentifier(OwnedString::makeUnowned("Self"),
|
||||
LeadingTrivia, TrailingTrivia, Arena);
|
||||
}
|
||||
|
||||
TokenSyntax SyntaxFactory::makeTypeToken(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeIdentifier("Type", LeadingTrivia, TrailingTrivia, Arena);
|
||||
return makeIdentifier(OwnedString::makeUnowned("Type"),
|
||||
LeadingTrivia, TrailingTrivia, Arena);
|
||||
}
|
||||
|
||||
TokenSyntax SyntaxFactory::makeProtocolToken(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeIdentifier("Protocol", LeadingTrivia, TrailingTrivia, Arena);
|
||||
return makeIdentifier(OwnedString::makeUnowned("Protocol"),
|
||||
LeadingTrivia, TrailingTrivia, Arena);
|
||||
}
|
||||
|
||||
TokenSyntax SyntaxFactory::makeEqualityOperator(const Trivia &LeadingTrivia,
|
||||
const Trivia &TrailingTrivia,
|
||||
SyntaxArena *Arena) {
|
||||
return makeToken(tok::oper_binary_spaced, "==", LeadingTrivia, TrailingTrivia,
|
||||
SourcePresence::Present, Arena);
|
||||
return makeToken(tok::oper_binary_spaced, OwnedString::makeUnowned("=="),
|
||||
LeadingTrivia, TrailingTrivia, SourcePresence::Present,
|
||||
Arena);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user