mirror of
https://github.com/apple/sourcekit-lsp.git
synced 2026-03-02 18:23:24 +01:00
This adds a sourcekitd plugin that drives the code completion requests. It also includes a `CompletionScoring` module that’s used to rank code completion results based on their contextual match, allowing us to show more relevant code completion results at the top.
70 lines
3.2 KiB
Swift
70 lines
3.2 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2024 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
extension CompletionItem {
|
|
struct PriorityBucket: RawRepresentable, Comparable {
|
|
var rawValue: Int
|
|
|
|
init(rawValue: Int) {
|
|
self.rawValue = rawValue
|
|
}
|
|
|
|
static let userPrioritized: PriorityBucket = .init(rawValue: 1)
|
|
static let highlyLikely: PriorityBucket = .init(rawValue: 5)
|
|
static let likely: PriorityBucket = .init(rawValue: 10)
|
|
static let regular: PriorityBucket = .init(rawValue: 50)
|
|
static let wordsInFile: PriorityBucket = .init(rawValue: 90)
|
|
static let infrequentlyUsed: PriorityBucket = .init(rawValue: 100)
|
|
static let unknown: PriorityBucket = .init(rawValue: .max)
|
|
|
|
// Swift Semantic Entries
|
|
static let unresolvedMember_EnumElement: PriorityBucket = .highlyLikely + -4
|
|
static let unresolvedMember_Var: PriorityBucket = .highlyLikely + -3
|
|
static let unresolvedMember_Func: PriorityBucket = .highlyLikely + -2
|
|
static let unresolvedMember_Constructor: PriorityBucket = .highlyLikely + -1
|
|
static let unresolvedMember_Other: PriorityBucket = .regular + 0
|
|
static let constructor: PriorityBucket = .highlyLikely + 0
|
|
static let invalidTypeMatch: PriorityBucket = .infrequentlyUsed + 0
|
|
static let otherModule_TypeMatch: PriorityBucket = .likely + 0
|
|
static let otherModule_TypeMismatch: PriorityBucket = .regular + 0
|
|
static let thisModule_TypeMatch: PriorityBucket = .likely + -1
|
|
static let thisModule_TypeMismatch: PriorityBucket = .regular + -1
|
|
static let noContext_TypeMatch: PriorityBucket = .likely + 0
|
|
static let noContext_TypeMismatch: PriorityBucket = .regular + 0
|
|
static let superClass_TypeMatch: PriorityBucket = .likely + -3
|
|
static let superClass_TypeMismatch: PriorityBucket = .likely + 0
|
|
static let thisClass_TypeMatch: PriorityBucket = .likely + -4
|
|
static let thisClass_TypeMismatch: PriorityBucket = .likely + -1
|
|
static let local_TypeMatch: PriorityBucket = .highlyLikely + 0
|
|
static let local_TypeMismatch: PriorityBucket = .likely + -2
|
|
static let otherClass_TypeMatch: PriorityBucket = .highlyLikely + 0
|
|
static let otherClass_TypeMismatch: PriorityBucket = .likely + 0
|
|
static let exprSpecific: PriorityBucket = .highlyLikely + 0
|
|
|
|
var scoreCoefficient: Double {
|
|
let clipped = max(min(self.rawValue, 100), 0)
|
|
let v = Double(100 - clipped) / 100.0
|
|
return 1.0 + v * v * v
|
|
}
|
|
|
|
static func + (lhs: PriorityBucket, rhs: Int) -> PriorityBucket {
|
|
return PriorityBucket(rawValue: lhs.rawValue + rhs)
|
|
}
|
|
static func - (lhs: PriorityBucket, rhs: Int) -> PriorityBucket {
|
|
return PriorityBucket(rawValue: lhs.rawValue - rhs)
|
|
}
|
|
static func < (lhs: PriorityBucket, rhs: PriorityBucket) -> Bool {
|
|
return lhs.rawValue < rhs.rawValue
|
|
}
|
|
}
|
|
}
|