TEST(RawSyntaxTests, accumulateAbsolutePosition2) { auto Token = RawSyntax::make(tok::identifier, OwnedString("aaa"), SourcePresence::Present, {TriviaPiece::blockComment("/* \n\r\r\n */")}, { }); AbsolutePosition Pos; Token->accumulateAbsolutePosition(Pos); ASSERT_EQ(4u, Pos.getLine()); ASSERT_EQ(7u, Pos.getColumn()); ASSERT_EQ(13u, Pos.getOffset()); }
bool RawSyntax::accumulateAbsolutePosition( AbsolutePosition &Pos, const RawSyntax *UpToTargetNode) const { auto Found = this == UpToTargetNode; for (auto LE : Layout) { switch (LE->Kind) { case SyntaxKind::Token: { auto Tok = llvm::cast<TokenSyntax>(LE); for (auto Leader : Tok->LeadingTrivia) { Leader.accumulateAbsolutePosition(Pos); } if (Found) { return true; } Pos.addText(Tok->getText()); for (auto Trailer : Tok->TrailingTrivia) { Trailer.accumulateAbsolutePosition(Pos); } break; } default: if (Found) return true; LE->accumulateAbsolutePosition(Pos, UpToTargetNode); break; } } return false; }
TEST(RawSyntaxTests, accumulateAbsolutePosition1) { auto Token = RawSyntax::make(tok::identifier, OwnedString("aaa"), SourcePresence::Present, { TriviaPiece::newlines(2), TriviaPiece::carriageReturns(2), TriviaPiece::carriageReturnLineFeeds(2) }, { }); AbsolutePosition Pos; Token->accumulateAbsolutePosition(Pos); ASSERT_EQ(7u, Pos.getLine()); ASSERT_EQ(4u, Pos.getColumn()); ASSERT_EQ(11u, Pos.getOffset()); }
void TriviaPiece::accumulateAbsolutePosition(AbsolutePosition &Pos) const { switch (Kind) { case TriviaKind::LineComment: case TriviaKind::BlockComment: case TriviaKind::DocBlockComment: case TriviaKind::DocLineComment: Pos.addText(Text.str()); break; case TriviaKind::Newline: Pos.addNewlines(Count); break; case TriviaKind::Space: case TriviaKind::Backtick: case TriviaKind::Tab: case TriviaKind::VerticalTab: case TriviaKind::Formfeed: Pos.addColumns(Count); break; } }
llvm::Optional<AbsolutePosition> RawSyntax::accumulateAbsolutePosition(AbsolutePosition &Pos) const { llvm::Optional<AbsolutePosition> Ret; if (isToken()) { if (isMissing()) return None; for (auto &Leader : getLeadingTrivia()) Leader.accumulateAbsolutePosition(Pos); Ret = Pos; Pos.addText(getTokenText()); for (auto &Trailer : getTrailingTrivia()) Trailer.accumulateAbsolutePosition(Pos); } else { for (auto &Child : getLayout()) { if (!Child) continue; auto Result = Child->accumulateAbsolutePosition(Pos); if (!Ret && Result) Ret = Result; } } return Ret; }