mutating func next()

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