func tokenize()

in src/swift/SwiftAPIViewCore/Sources/SwiftSyntax+Extensions/SyntaxProtocol+Extensions.swift [233:290]


    func tokenize(token: TokenSyntax, apiview a: CodeModel, parent: DeclarationModel?) {
        let tokenKind = token.tokenKind
        let tokenText = token.withoutTrivia().description
        var options = ReviewTokenOptions()
        options.applySpacing(tokenKind.spacing)

        if tokenKind.isKeyword {
            a.keyword(tokenText, options: options)
            return
        } else if tokenKind.isPunctuation {
            a.punctuation(tokenText, options: options)
            return
        }
        if case let SwiftSyntax.TokenKind.identifier(val) = tokenKind {
            let nameInParent = self.childNameInParent
            // used in @availabililty annotations
            if nameInParent == "platform" {
                a.text(tokenText)
                a.currentLine.tokens.last?.hasSuffixSpace = true
            } else {
                a.typeReference(name: val, options: options)
            }
        } else if case let SwiftSyntax.TokenKind.spacedBinaryOperator(val) = tokenKind {
            // in APIView, * is never used for multiplication
            if val == "*" {
                options.applySpacing(.Neither)
                a.punctuation(val, options: options)
            } else {
                options.applySpacing(.Both)
                a.punctuation(val, options: options)
            }
        } else if case let SwiftSyntax.TokenKind.unspacedBinaryOperator(val) = tokenKind {
            options.applySpacing(.Neither)
            a.punctuation(val, options: options)
        } else if case let SwiftSyntax.TokenKind.prefixOperator(val) = tokenKind {
            options.applySpacing(.Leading)
            a.punctuation(val, options: options)
        } else if case let SwiftSyntax.TokenKind.postfixOperator(val) = tokenKind {
            options.applySpacing(.Trailing)
            a.punctuation(val, options: options)
        } else if case let SwiftSyntax.TokenKind.floatingLiteral(val) = tokenKind {
            a.literal(val)
        } else if case let SwiftSyntax.TokenKind.regexLiteral(val) = tokenKind {
            a.literal(val)
        } else if case let SwiftSyntax.TokenKind.stringLiteral(val) = tokenKind {
            a.literal(val)
        } else if case let SwiftSyntax.TokenKind.integerLiteral(val) = tokenKind {
            a.literal(val)
        } else if case let SwiftSyntax.TokenKind.contextualKeyword(val) = tokenKind {
            options.applySpacing(tokenKind.spacing)
            a.keyword(val, options: options)
        } else if case let SwiftSyntax.TokenKind.stringSegment(val) = tokenKind {
            a.text(val)
        } else {
            SharedLogger.warn("No implementation for token kind: \(tokenKind)")
            a.text(tokenText)
        }
    }