mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
This implementation required a compromise between parser performance and AST structuring. On the one hand, Parse must be fast in order to keep things in the IDE zippy, on the other we must hit the disk to properly resolve 'canImport' conditions and inject members of the active clause into the AST. Additionally, a Parse-only pass may not provide platform-specific information to the compiler invocation and so may mistakenly activate or de-activate branches in the if-configuration decl. The compromise is to perform condition evaluation only when continuing on to semantic analysis. This keeps the parser quick and avoids the unpacking that parse does for active conditions while still retaining the ability to see through to an active condition when we know we're moving on to semantic analysis anyways.
113 lines
2.2 KiB
Swift
113 lines
2.2 KiB
Swift
// RUN: %target-typecheck-verify-swift -parse-as-library
|
|
// RUN: %target-typecheck-verify-swift -D WITH_PERFORM -primary-file %s %S/Inputs/can_import_nonprimary_file.swift
|
|
|
|
public struct LibraryDependentBool : ExpressibleByBooleanLiteral {
|
|
#if canImport(Swift)
|
|
var _description: String
|
|
#endif
|
|
|
|
public let magicConstant: Int = {
|
|
#if canImport(Swift)
|
|
return 42
|
|
#else
|
|
return "" // Type error
|
|
#endif
|
|
}()
|
|
|
|
#if canImport(AppKit) || (canImport(UIKit) && (arch(i386) || arch(arm)))
|
|
// On OS X and 32-bit iOS, Objective-C's BOOL type is a "signed char".
|
|
var _value: Int8
|
|
|
|
init(_ value: Int8) {
|
|
self._value = value
|
|
#if canImport(Swift)
|
|
self._description = "\(value)"
|
|
#endif
|
|
}
|
|
|
|
public init(_ value: Bool) {
|
|
#if canImport(Swift)
|
|
self._description = value ? "YES" : "NO"
|
|
#endif
|
|
self._value = value ? 1 : 0
|
|
}
|
|
|
|
#else
|
|
// Everywhere else it is C/C++'s "Bool"
|
|
var _value: Bool
|
|
|
|
public init(_ value: Bool) {
|
|
#if canImport(Swift)
|
|
self._description = value ? "YES" : "NO"
|
|
#endif
|
|
self._value = value
|
|
}
|
|
#endif
|
|
|
|
/// The value of `self`, expressed as a `Bool`.
|
|
public var boolValue: Bool {
|
|
#if canImport(AppKit) || (canImport(UIKit) && (arch(i386) || arch(arm)))
|
|
return _value != 0
|
|
#else
|
|
return _value
|
|
#endif
|
|
}
|
|
|
|
/// Create an instance initialized to `value`.
|
|
public init(booleanLiteral value: Bool) {
|
|
self.init(value)
|
|
}
|
|
|
|
func withBoolValue(_ f : (Bool) -> ()) {
|
|
return f(self.boolValue)
|
|
}
|
|
}
|
|
|
|
#if canImport(Swift)
|
|
func topLevelFunction() {
|
|
LibraryDependentBool(true).withBoolValue { b in
|
|
let value: String
|
|
#if canImport(Swiftz)
|
|
#if canImport(ReactiveCocoa)
|
|
#if canImport(Darwin)
|
|
value = NSObject() // Type error
|
|
#endif
|
|
#endif
|
|
#else
|
|
value = ""
|
|
#endif
|
|
print(value)
|
|
}
|
|
}
|
|
#else
|
|
enum LibraryDependentBool {} // This should not happen
|
|
#endif
|
|
|
|
#if WITH_PERFORM
|
|
func performPerOS() -> Int {
|
|
let value: Int
|
|
#if canImport(Argo)
|
|
value = "" // Type error
|
|
#else
|
|
value = 42
|
|
#endif
|
|
return performFoo(withX: value, andY: value)
|
|
}
|
|
#endif
|
|
|
|
let osName: String = {
|
|
#if os(iOS)
|
|
return "iOS"
|
|
#elseif os(watchOS)
|
|
return "watchOS"
|
|
#elseif os(tvOS)
|
|
return "tvOS"
|
|
#elseif os(OSX)
|
|
return "OS X"
|
|
#elseif os(Linux)
|
|
return "Linux"
|
|
#else
|
|
return "Unknown"
|
|
#endif
|
|
}()
|