mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
clangd uses a completely different semantic token legend than SourceKit-LSP (it doesn’t even adhere to the ordering of the pre-defined token types) but we were passing index offsets from clangd through assuming that clangd uses the same legend, which was incorrect. When retrieving semantic tokens from clangd, translate the semantic tokens from clangd’s legend to SourceKit-LSP’s legend. rdar://129895062
50 lines
1.9 KiB
Swift
50 lines
1.9 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2021 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See https://swift.org/LICENSE.txt for license information
|
|
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import LSPLogging
|
|
import LanguageServerProtocol
|
|
import SourceKitD
|
|
|
|
/// A ranged token in the document used for syntax highlighting.
|
|
public struct SyntaxHighlightingToken: Hashable, Sendable {
|
|
/// The range of the token in the document. Must be on a single line.
|
|
public var range: Range<Position> {
|
|
didSet {
|
|
assert(range.lowerBound.line == range.upperBound.line)
|
|
}
|
|
}
|
|
/// The token type.
|
|
public var kind: SemanticTokenTypes
|
|
/// Additional metadata about the token.
|
|
public var modifiers: SemanticTokenModifiers
|
|
|
|
/// The (inclusive) start position of the token.
|
|
public var start: Position { range.lowerBound }
|
|
/// The (exclusive) end position of the token.
|
|
public var end: Position { range.upperBound }
|
|
/// The length of the token in UTF-16 code units.
|
|
public var utf16length: Int { end.utf16index - start.utf16index }
|
|
|
|
public init(range: Range<Position>, kind: SemanticTokenTypes, modifiers: SemanticTokenModifiers = []) {
|
|
assert(range.lowerBound.line == range.upperBound.line)
|
|
|
|
self.range = range
|
|
self.kind = kind
|
|
self.modifiers = modifiers
|
|
}
|
|
|
|
public init(start: Position, utf16length: Int, kind: SemanticTokenTypes, modifiers: SemanticTokenModifiers = []) {
|
|
let range = start..<Position(line: start.line, utf16index: start.utf16index + utf16length)
|
|
self.init(range: range, kind: kind, modifiers: modifiers)
|
|
}
|
|
}
|