1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// NOTE: Types in this file should be self-contained and should not depend on any non-stdlib types.
@_spi(PluginMessage)
public enum HostToPluginMessage: Codable {
/// Send capability of the host, and get capability of the plugin.
case getCapability(
capability: PluginMessage.HostCapability?
)
/// Expand a '@freestanding' macro.
case expandFreestandingMacro(
macro: PluginMessage.MacroReference,
macroRole: PluginMessage.MacroRole? = nil,
discriminator: String,
syntax: PluginMessage.Syntax,
lexicalContext: [PluginMessage.Syntax]? = nil
)
/// Expand an '@attached' macro.
case expandAttachedMacro(
macro: PluginMessage.MacroReference,
macroRole: PluginMessage.MacroRole,
discriminator: String,
attributeSyntax: PluginMessage.Syntax,
declSyntax: PluginMessage.Syntax,
parentDeclSyntax: PluginMessage.Syntax?,
extendedTypeSyntax: PluginMessage.Syntax?,
conformanceListSyntax: PluginMessage.Syntax?,
lexicalContext: [PluginMessage.Syntax]? = nil
)
/// Optionally implemented message to load a dynamic link library.
/// 'moduleName' can be used as a hint indicating that the library
/// provides the specified module.
case loadPluginLibrary(
libraryPath: String,
moduleName: String
)
}
@_spi(PluginMessage)
public enum PluginToHostMessage: Codable {
case getCapabilityResult(
capability: PluginMessage.PluginCapability
)
/// Unified response for freestanding/attached macro expansion.
case expandMacroResult(
expandedSource: String?,
diagnostics: [PluginMessage.Diagnostic]
)
// @available(*, deprecated: "use expandMacroResult() instead")
case expandFreestandingMacroResult(
expandedSource: String?,
diagnostics: [PluginMessage.Diagnostic]
)
// @available(*, deprecated: "use expandMacroResult() instead")
case expandAttachedMacroResult(
expandedSources: [String]?,
diagnostics: [PluginMessage.Diagnostic]
)
case loadPluginLibraryResult(
loaded: Bool,
diagnostics: [PluginMessage.Diagnostic]
)
}
@_spi(PluginMessage)
public enum PluginMessage {
public static var PROTOCOL_VERSION_NUMBER: Int { 7 } // Pass extension protocol list
public struct HostCapability: Codable {
var protocolVersion: Int
public init(protocolVersion: Int) {
self.protocolVersion = protocolVersion
}
}
public struct PluginCapability: Codable {
public var protocolVersion: Int
/// Optional features this plugin provides.
/// * 'load-plugin-library': 'loadPluginLibrary' message is implemented.
public var features: [String]?
public init(protocolVersion: Int, features: [String]? = nil) {
self.protocolVersion = protocolVersion
self.features = features
}
}
public struct MacroReference: Codable, Sendable {
public var moduleName: String
public var typeName: String
// The name of 'macro' declaration the client is using.
public var name: String
public init(moduleName: String, typeName: String, name: String) {
self.moduleName = moduleName
self.typeName = typeName
self.name = name
}
}
public enum MacroRole: String, Codable, Sendable {
case expression
case declaration
case accessor
case memberAttribute
case member
case peer
case conformance
case codeItem
case `extension`
@_spi(ExperimentalLanguageFeature) case preamble
@_spi(ExperimentalLanguageFeature) case body
}
public struct SourceLocation: Codable {
/// A file ID consisting of the module name and file name (without full path),
/// as would be generated by the macro expansion `#fileID`.
public var fileID: String
/// A full path name as would be generated by the macro expansion `#filePath`,
/// e.g., `/home/taylor/alison.swift`.
public var fileName: String
/// UTF-8 offset of the location in the file.
public var offset: Int
public var line: Int
public var column: Int
public init(fileID: String, fileName: String, offset: Int, line: Int, column: Int) {
self.fileID = fileID
self.fileName = fileName
self.offset = offset
self.line = line
self.column = column
}
}
public struct Diagnostic: Codable {
public enum Severity: String, Codable {
case error
case warning
case note
case remark
}
public struct Position: Codable {
public var fileName: String
/// UTF-8 offset in the file.
public var offset: Int
public init(fileName: String, offset: Int) {
self.fileName = fileName
self.offset = offset
}
public static var invalid: Self {
.init(fileName: "", offset: 0)
}
}
public struct PositionRange: Codable {
public var fileName: String
/// UTF-8 offset of the start of the range in the file.
public var startOffset: Int
/// UTF-8 offset of the end of the range in the file.
public var endOffset: Int
public init(fileName: String, startOffset: Int, endOffset: Int) {
self.fileName = fileName
self.startOffset = startOffset
self.endOffset = endOffset
}
public static var invalid: Self {
.init(fileName: "", startOffset: 0, endOffset: 0)
}
}
public struct Note: Codable {
public var position: Position
public var message: String
public init(position: Position, message: String) {
self.position = position
self.message = message
}
}
public struct FixIt: Codable {
public struct Change: Codable {
public var range: PositionRange
public var newText: String
internal init(range: PositionRange, newText: String) {
self.range = range
self.newText = newText
}
}
public var message: String
public var changes: [Change]
internal init(message: String, changes: [Change]) {
self.message = message
self.changes = changes
}
}
public var message: String
public var severity: Severity
public var position: Position
public var highlights: [PositionRange]
public var notes: [Note]
public var fixIts: [FixIt]
internal init(
message: String,
severity: Severity,
position: Position,
highlights: [PositionRange],
notes: [Note],
fixIts: [FixIt]
) {
self.message = message
self.severity = severity
self.position = position
self.highlights = highlights
self.notes = notes
self.fixIts = fixIts
}
}
public struct Syntax: Codable {
public enum Kind: String, Codable {
case declaration
case statement
case expression
case type
case pattern
case attribute
}
public var kind: Kind
public var source: String
public var location: SourceLocation
public init(kind: Kind, source: String, location: SourceLocation) {
self.kind = kind
self.source = source
self.location = location
}
}
}
|