in Sources/SwiftSyntax/SyntaxClassifier.swift [297:345]
mutating func next() -> SyntaxClassifiedRange? {
while true {
switch state {
case .atLeadingTrivia(let index):
let classifiedRangeOpt = token.raw.withUnsafeLeadingTriviaPiece(
at: index, relativeOffset: relativeOffset
) { (trivia: UnsafeTriviaPiece?) -> SyntaxClassifiedRange? in
guard let trivia = trivia else { return nil }
return trivia.classify(offset: offset)
}
guard let classifiedRange = classifiedRangeOpt else {
// Move on to token text.
state = .atTokenText
break
}
state = .atLeadingTrivia(index+1)
offset = classifiedRange.endOffset
guard classifiedRange.kind != .none else { break }
return classifiedRange
case .atTokenText:
let classifiedRange = token.raw.withUnsafeTokenText(
relativeOffset: relativeOffset
) { (tokText: UnsafeTokenText?) -> SyntaxClassifiedRange in
return tokText!.classify(offset: offset, contextualClassification: token.classification)
}
// Move on to trailing trivia.
state = .atTrailingTrivia(0)
offset = classifiedRange.endOffset
guard classifiedRange.kind != .none else { break }
return classifiedRange
case .atTrailingTrivia(let index):
let classifiedRangeOpt = token.raw.withUnsafeTrailingTriviaPiece(
at: index, relativeOffset: relativeOffset
) { (trivia: UnsafeTriviaPiece?) -> SyntaxClassifiedRange? in
guard let trivia = trivia else { return nil }
return trivia.classify(offset: offset)
}
guard let classifiedRange = classifiedRangeOpt else {
return nil // Finish iteration.
}
state = .atTrailingTrivia(index+1)
offset = classifiedRange.endOffset
guard classifiedRange.kind != .none else { break }
return classifiedRange
}
}
}