mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
* spelling: accessor Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: accommodates Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: argument Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: associated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: availability Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: available Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: belongs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: bookkeeping Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: building Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clazz Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: clonable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: closure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: concatenated Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conformance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: context Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: conversion Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: correspondence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declarations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: declared Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: defining Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: delayed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: dependency Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: deployed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: descendants Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnose Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: diagnostic Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: equitable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: evaluation Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: exclusivity Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existence Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: existential Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: explicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: expressed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: for Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: foreign Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: function Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: identifier Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: implicit Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: indices Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: information Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: instance Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interchangeable Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: interface Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: introduced Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: invalid Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: kind-in Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: least Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: library Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: location Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: namespace Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: necessary Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: nonexistent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: not Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: number Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: obtains Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: occurs Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: opaque Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: overridden Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: parameter Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: precede Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: preceding Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: property Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: protocol Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: qualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recognized Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: recursively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: references Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: relaxing Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: represented Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: request Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: requirements Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: retrieve Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: returned Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfied Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: satisfy Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: siblings Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: simplified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: something Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: source Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specializations Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: specially Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: statement Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: stripped Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: structure Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: substitution Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: the Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transform Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transformed Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transitively Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: transparent Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: typecheck Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unknown Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unlabeled Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: unqualified Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: whether Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: with Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> * spelling: scanner Signed-off-by: Josh Soref <jsoref@users.noreply.github.com> Co-authored-by: Josh Soref <jsoref@users.noreply.github.com>
126 lines
4.1 KiB
Swift
126 lines
4.1 KiB
Swift
//===--- DiagnosticEngine.swift -------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2022 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 ASTBridging
|
|
|
|
import Basic
|
|
|
|
public typealias DiagID = BridgedDiagID
|
|
|
|
extension BridgedDiagnosticArgument {
|
|
init(stringRef val: BridgedStringRef) {
|
|
self.init(kind: .stringRef, value: .init(stringRefValue: val))
|
|
}
|
|
init(int val: Int) {
|
|
self.init(kind: .int, value: .init(intValue: val))
|
|
}
|
|
}
|
|
|
|
public protocol DiagnosticArgument {
|
|
func _withBridgedDiagnosticArgument(_ fn: (BridgedDiagnosticArgument) -> Void)
|
|
}
|
|
extension String: DiagnosticArgument {
|
|
public func _withBridgedDiagnosticArgument(_ fn: (BridgedDiagnosticArgument) -> Void) {
|
|
withBridgedStringRef { fn(BridgedDiagnosticArgument(stringRef: $0)) }
|
|
}
|
|
}
|
|
extension Int: DiagnosticArgument {
|
|
public func _withBridgedDiagnosticArgument(_ fn: (BridgedDiagnosticArgument) -> Void) {
|
|
fn(BridgedDiagnosticArgument(int: self))
|
|
}
|
|
}
|
|
|
|
public struct DiagnosticFixIt {
|
|
public let start: SourceLoc
|
|
public let byteLength: Int
|
|
public let text: String
|
|
|
|
public init(start: SourceLoc, byteLength: Int, replacement text: String) {
|
|
self.start = start
|
|
self.byteLength = byteLength
|
|
self.text = text
|
|
}
|
|
|
|
func withBridgedDiagnosticFixIt(_ fn: (BridgedDiagnosticFixIt) -> Void) {
|
|
text.withBridgedStringRef { bridgedTextRef in
|
|
let bridgedDiagnosticFixIt = BridgedDiagnosticFixIt(
|
|
start: start.bridged,
|
|
byteLength: byteLength,
|
|
text: bridgedTextRef)
|
|
fn(bridgedDiagnosticFixIt)
|
|
}
|
|
}
|
|
}
|
|
|
|
public struct DiagnosticEngine {
|
|
private let bridged: BridgedDiagnosticEngine
|
|
|
|
public init(bridged: BridgedDiagnosticEngine) {
|
|
self.bridged = bridged
|
|
}
|
|
|
|
public func diagnose(_ position: SourceLoc?,
|
|
_ id: DiagID,
|
|
_ args: [DiagnosticArgument],
|
|
highlight: CharSourceRange? = nil,
|
|
fixIts: [DiagnosticFixIt] = []) {
|
|
|
|
let bridgedSourceLoc: BridgedSourceLoc = position.bridged
|
|
let bridgedHighlightRange: BridgedCharSourceRange = highlight.bridged
|
|
var bridgedArgs: [BridgedDiagnosticArgument] = []
|
|
var bridgedFixIts: [BridgedDiagnosticFixIt] = []
|
|
|
|
// Build a higher-order function to wrap every 'withBridgedXXX { ... }'
|
|
// calls, so we don't escape anything from the closure. 'bridgedArgs' and
|
|
// 'bridgedFixIts' are temporary storage to store bridged values. So they
|
|
// should not be used after the closure is executed.
|
|
|
|
var closure: () -> Void = {
|
|
bridgedArgs.withBridgedArrayRef { bridgedArgsRef in
|
|
bridgedFixIts.withBridgedArrayRef { bridgedFixItsRef in
|
|
DiagnosticEngine_diagnose(bridged, bridgedSourceLoc,
|
|
id, bridgedArgsRef,
|
|
bridgedHighlightRange, bridgedFixItsRef)
|
|
}
|
|
}
|
|
}
|
|
// 'reversed()' because the closure should be wrapped in that order.
|
|
for arg in args.reversed() {
|
|
closure = { [closure, arg] in
|
|
arg._withBridgedDiagnosticArgument { bridgedArg in
|
|
bridgedArgs.append(bridgedArg)
|
|
closure()
|
|
}
|
|
}
|
|
}
|
|
// 'reversed()' because the closure should be wrapped in that order.
|
|
for fixIt in fixIts.reversed() {
|
|
closure = { [closure, fixIt] in
|
|
fixIt.withBridgedDiagnosticFixIt { bridgedFixIt in
|
|
bridgedFixIts.append(bridgedFixIt)
|
|
closure()
|
|
}
|
|
}
|
|
}
|
|
|
|
closure()
|
|
}
|
|
|
|
public func diagnose(_ position: SourceLoc?,
|
|
_ id: DiagID,
|
|
_ args: DiagnosticArgument...,
|
|
highlight: CharSourceRange? = nil,
|
|
fixIts: DiagnosticFixIt...) {
|
|
diagnose(position, id, args, highlight: highlight, fixIts: fixIts)
|
|
}
|
|
}
|