mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
On platforms that are not explicitly mentioned in the #os() guard, this new '*'
availability check generates a version comparison against the minimum deployment target.
This construct, based on feedback from API review, is designed to ease porting
to new platforms. Because new platforms typically branch from
existing platforms, the wildcard allows an API availability check to do the "right"
thing (executing the guarded branch accessing newer APIs) on the new platform without
requiring a modification to every availability guard in the program.
So, if the programmer writes:
if #os(OSX >= 10.10, *) {
. . .
}
and then ports the code to iOS, the body will execute.
We still do compile-time availability checking with '*', so the compiler will
emit errors for references to potentially unavailable symbols in the body when compiled
for iOS.
We require a '*' clause on all #os() guards to force developers to
"future proof" their availability checks against the introduction of new a platform.
Swift SVN r26988
67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
//===--- AvailabilitySpec.cpp - Swift Availability Query ASTs ---*- C++ -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 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 availability specification AST classes.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "swift/AST/ASTContext.h"
|
|
#include "swift/AST/AvailabilitySpec.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
|
|
using namespace swift;
|
|
|
|
SourceRange AvailabilitySpec::getSourceRange() const {
|
|
switch (getKind()) {
|
|
case AvailabilitySpecKind::VersionConstraint:
|
|
return cast<VersionConstraintAvailabilitySpec>(this)->getSourceRange();
|
|
|
|
case AvailabilitySpecKind::OtherPlatform:
|
|
return cast<OtherPlatformAvailabilitySpec>(this)->getSourceRange();
|
|
}
|
|
llvm_unreachable("bad AvailabilitySpecKind");
|
|
}
|
|
|
|
// Only allow allocation of AvailabilitySpecs using the
|
|
// allocator in ASTContext.
|
|
void *AvailabilitySpec::operator new(size_t Bytes, ASTContext &C,
|
|
unsigned Alignment) {
|
|
return C.Allocate(Bytes, Alignment);
|
|
}
|
|
|
|
StringRef VersionConstraintAvailabilitySpec::getComparisonAsString() const {
|
|
switch (getComparison()) {
|
|
case VersionComparison::GreaterThanEqual:
|
|
return ">=";
|
|
}
|
|
llvm_unreachable("bad VersionComparison");
|
|
}
|
|
|
|
SourceRange VersionConstraintAvailabilitySpec::getSourceRange() const {
|
|
return SourceRange(PlatformLoc, VersionSrcRange.End);
|
|
}
|
|
|
|
void VersionConstraintAvailabilitySpec::print(raw_ostream &OS,
|
|
unsigned Indent) const {
|
|
OS.indent(Indent) << '(' << "version_constraint_availability_spec"
|
|
<< " platform='" << platformString(getPlatform()) << "'"
|
|
<< " comparison='" << getComparisonAsString() << "'"
|
|
<< " version='" << getVersion() << "'"
|
|
<< ')';
|
|
}
|
|
|
|
void OtherPlatformAvailabilitySpec::print(raw_ostream &OS, unsigned Indent) const {
|
|
OS.indent(Indent) << '(' << "version_constraint_availability_spec"
|
|
<< " "
|
|
<< ')';
|
|
}
|