mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Emacs assumes .h files are C files by default which is why the tag "-*- C++ -*-" is needed. .cpp files do not have this problem.
113 lines
3.7 KiB
C++
113 lines
3.7 KiB
C++
//===--- PlatformKind.cpp - Swift Language Platform Kinds -----------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2016 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file implements the platform kinds for API availability.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/AST/PlatformKind.h"
|
|
#include "swift/Basic/LangOptions.h"
|
|
#include "llvm/ADT/StringSwitch.h"
|
|
#include "llvm/Support/ErrorHandling.h"
|
|
|
|
using namespace swift;
|
|
|
|
StringRef swift::platformString(PlatformKind platform) {
|
|
switch (platform) {
|
|
case PlatformKind::none:
|
|
return "*";
|
|
#define AVAILABILITY_PLATFORM(X, PrettyName) \
|
|
case PlatformKind::X: \
|
|
return #X;
|
|
#include "swift/AST/PlatformKinds.def"
|
|
}
|
|
llvm_unreachable("bad PlatformKind");
|
|
}
|
|
|
|
StringRef swift::prettyPlatformString(PlatformKind platform) {
|
|
switch (platform) {
|
|
case PlatformKind::none:
|
|
return "*";
|
|
#define AVAILABILITY_PLATFORM(X, PrettyName) \
|
|
case PlatformKind::X: \
|
|
return PrettyName;
|
|
#include "swift/AST/PlatformKinds.def"
|
|
}
|
|
llvm_unreachable("bad PlatformKind");
|
|
}
|
|
|
|
Optional<PlatformKind> swift::platformFromString(StringRef Name) {
|
|
if (Name == "*")
|
|
return PlatformKind::none;
|
|
return llvm::StringSwitch<Optional<PlatformKind>>(Name)
|
|
#define AVAILABILITY_PLATFORM(X, PrettyName) .Case(#X, PlatformKind::X)
|
|
#include "swift/AST/PlatformKinds.def"
|
|
.Default(Optional<PlatformKind>());
|
|
}
|
|
|
|
bool swift::isPlatformActive(PlatformKind Platform, LangOptions &LangOpts) {
|
|
if (Platform == PlatformKind::none)
|
|
return true;
|
|
|
|
if (Platform == PlatformKind::OSXApplicationExtension ||
|
|
Platform == PlatformKind::iOSApplicationExtension)
|
|
if (!LangOpts.EnableAppExtensionRestrictions)
|
|
return false;
|
|
|
|
// FIXME: This is an awful way to get the current OS.
|
|
switch (Platform) {
|
|
case PlatformKind::OSX:
|
|
case PlatformKind::OSXApplicationExtension:
|
|
return LangOpts.Target.isMacOSX();
|
|
case PlatformKind::iOS:
|
|
case PlatformKind::iOSApplicationExtension:
|
|
return LangOpts.Target.isiOS() && !LangOpts.Target.isTvOS();
|
|
case PlatformKind::tvOS:
|
|
case PlatformKind::tvOSApplicationExtension:
|
|
return LangOpts.Target.isTvOS();
|
|
case PlatformKind::watchOS:
|
|
case PlatformKind::watchOSApplicationExtension:
|
|
return LangOpts.Target.isWatchOS();
|
|
case PlatformKind::none:
|
|
llvm_unreachable("handled above");
|
|
}
|
|
llvm_unreachable("bad PlatformKind");
|
|
}
|
|
|
|
PlatformKind swift::targetPlatform(LangOptions &LangOpts) {
|
|
if (LangOpts.Target.isMacOSX()) {
|
|
return (LangOpts.EnableAppExtensionRestrictions
|
|
? PlatformKind::OSXApplicationExtension
|
|
: PlatformKind::OSX);
|
|
}
|
|
|
|
if (LangOpts.Target.isTvOS()) {
|
|
return (LangOpts.EnableAppExtensionRestrictions
|
|
? PlatformKind::tvOSApplicationExtension
|
|
: PlatformKind::tvOS);
|
|
}
|
|
|
|
if (LangOpts.Target.isWatchOS()) {
|
|
return (LangOpts.EnableAppExtensionRestrictions
|
|
? PlatformKind::watchOSApplicationExtension
|
|
: PlatformKind::watchOS);
|
|
}
|
|
|
|
if (LangOpts.Target.isiOS()) {
|
|
return (LangOpts.EnableAppExtensionRestrictions
|
|
? PlatformKind::iOSApplicationExtension
|
|
: PlatformKind::iOS);
|
|
}
|
|
|
|
return PlatformKind::none;
|
|
}
|