llvm::Optional<Syntax> SyntaxParsingCache::lookUpFrom(const Syntax &Node, size_t NodeStart, size_t Position, SyntaxKind Kind) { if (nodeCanBeReused(Node, NodeStart, Position, Kind)) { return Node; } // Compute the child's position on the fly size_t ChildStart = NodeStart; for (size_t I = 0, E = Node.getNumChildren(); I < E; ++I) { llvm::Optional<Syntax> Child = Node.getChild(I); if (!Child.hasValue() || Child->isMissing()) { continue; } auto ChildEnd = ChildStart + Child->getTextLength(); if (ChildStart <= Position && Position < ChildEnd) { return lookUpFrom(Child.getValue(), ChildStart, Position, Kind); } // The next child starts where the previous child ended ChildStart = ChildEnd; } return llvm::None; }