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; }
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; }