Files
swift-mirror/SwiftCompilerSources/Sources/Basic/SourceLoc.swift
Rintaro Ishizaki d292a95296 [SwiftCompiler/Regex] Use bridged DiagnosticEngine for error reporting
This fixes:
 * An issue where the diagnostic messages were leaked
 * Diagnose at correct position inside the regex literal

To do this:
 * Introduce 'Parse' SwiftCompiler module that is a bridging layer
   between '_CompilerRegexParser' and C++ libParse
 * Move libswiftParseRegexLiteral and libswiftLexRegexLiteral to 'Parse'

Also this change makes 'SwiftCompilerSources/Package.swift' be configured
by CMake so it can actually be built with 'swift-build'.

rdar://92187284
2022-04-22 22:53:46 -07:00

74 lines
2.0 KiB
Swift

//===--- SourceLoc.swift - SourceLoc bridiging utilities ------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//
public struct SourceLoc {
/// Points into a source file.
let locationInFile: UnsafePointer<UInt8>
public init?(locationInFile: UnsafePointer<UInt8>?) {
guard let locationInFile = locationInFile else {
return nil
}
self.locationInFile = locationInFile
}
public init?(bridged: BridgedSourceLoc) {
guard let locationInFile = bridged.pointer else {
return nil
}
self.init(locationInFile: locationInFile)
}
public var bridged: BridgedSourceLoc {
.init(pointer: locationInFile)
}
}
extension SourceLoc {
public func advanced(by n: Int) -> SourceLoc {
SourceLoc(locationInFile: locationInFile.advanced(by: n))!
}
}
extension Optional where Wrapped == SourceLoc {
public var bridged: BridgedSourceLoc {
self?.bridged ?? .init(pointer: nil)
}
}
public struct CharSourceRange {
private let start: SourceLoc
private let byteLength: Int
public init(start: SourceLoc, byteLength: Int) {
self.start = start
self.byteLength = byteLength
}
public init?(bridged: BridgedCharSourceRange) {
guard let start = SourceLoc(bridged: bridged.start) else {
return nil
}
self.init(start: start, byteLength: bridged.byteLength)
}
public var bridged: BridgedCharSourceRange {
.init(start: start.bridged, byteLength: byteLength)
}
}
extension Optional where Wrapped == CharSourceRange {
public var bridged: BridgedCharSourceRange {
self?.bridged ?? .init(start: .init(pointer: nil), byteLength: 0)
}
}