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
|
struct ParseError: Error, CustomStringConvertible {
let description: String
}
struct DiagnosticError: Error {
let diagnostic: Diagnostic
}
public struct Diagnostic {
public let message: String
var textRange: TextRange?
public func location(_ sourceText: String) -> (line: Int, column: Int)? {
guard let textRange else { return nil }
let position = textRange.lowerBound
let linesBeforePos = sourceText[..<position].split(separator: "\n", omittingEmptySubsequences: false)
let line = linesBeforePos.count
let column = linesBeforePos.last?.count ?? 0
return (line, column)
}
}
extension Diagnostic {
static func invalidRedeclaration(of identifier: String, textRange: TextRange) -> Diagnostic {
return Diagnostic(
message: "Invalid redeclaration of '\(identifier)'",
textRange: textRange
)
}
static func expectedIdentifier(textRange: TextRange) -> Diagnostic {
return Diagnostic(message: "Expected identifier", textRange: textRange)
}
static func cannotFindType(of identifier: String, textRange: TextRange?) -> Diagnostic {
return Diagnostic(message: "Cannot find type '\(identifier)' in scope", textRange: textRange)
}
static func cannotFindInterface(of identifier: String, textRange: TextRange?) -> Diagnostic {
return Diagnostic(message: "Cannot find interface '\(identifier)' in scope", textRange: textRange)
}
static func expectedResourceType(_ type: WITType, textRange: TextRange?) -> Diagnostic {
return Diagnostic(message: "Non-resource type \(type)", textRange: textRange)
}
static func noSuchPackage(_ packageName: PackageNameSyntax, textRange: TextRange?) -> Diagnostic {
return Diagnostic(message: "No such package '\(packageName)'", textRange: textRange)
}
static func inconsistentPackageName(
_ packageName: PackageNameSyntax,
existingName: PackageNameSyntax,
textRange: TextRange?
) -> Diagnostic {
return Diagnostic(
message: "package identifier `\(packageName)` does not match previous package name of `\(existingName)`",
textRange: textRange
)
}
static func noPackageHeader() -> Diagnostic {
return Diagnostic(message: "no `package` header was found in any WIT file for this package", textRange: nil)
}
}
|