Files
swift-mirror/lib/Sema/OverloadChoice.cpp
Devin Coughlin 3749a98763 Record the reason a declaration is potentially unavailable.
This commit adds tracking of the reason a declaration reference is potentially
unavailable to the UnavailableToOptionalExpr AST node and to OverloadChoice. We
will use this reason during SILGen to emit the appropriate run-time check and
during typechecking to provide more helpful diagnostics.

To keep OverloadChoice as small as possible, we encode the reason as an index
into a vector of reasons stored in a given instance of ConstraintSystem (this is
the same approach that Fix takes).

This commit adds Sema/OverloadChoice.cpp (for the parts of OverloadChoice that
now rely on ConstraintSystem) and AST/Availability.h (to bring in
availability-related structures without TypeRefinementContext).


Swift SVN r22377
2014-09-30 01:53:59 +00:00

62 lines
2.3 KiB
C++

//===--- OverloadChoice.cpp - A Choice from an Overload Set ----*- 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 provides the \c OverloadChoice class and its related types,
// which is used by the constraint-based type checker to describe the
// selection of a particular overload from a set.
//
//===----------------------------------------------------------------------===//
#include "OverloadChoice.h"
#include "ConstraintSystem.h"
#include "swift/AST/Availability.h"
using namespace swift;
using namespace constraints;
OverloadChoice::OverloadChoice(
Type base, ValueDecl *value, bool isSpecialized, ConstraintSystem &CS,
const Optional<UnavailabilityReason> &reasonUnavailable)
: BaseAndBits(base, isSpecialized ? IsSpecializedBit : 0) {
assert((reinterpret_cast<uintptr_t>(value) & (uintptr_t)0x03) == 0 &&
"Badly aligned decl");
DeclOrKind = reinterpret_cast<uintptr_t>(value);
UnavailableReasonData = compactUnavailableReasonData(CS, reasonUnavailable);
}
uint16_t OverloadChoice::compactUnavailableReasonData(
ConstraintSystem &CS, const Optional<UnavailabilityReason> &reason) {
// A value of 0 indicates no reason (that is, that the overload choice is
// always available).
if (!reason.hasValue()) {
return 0;
}
// If there is a reason, we add it to UnavailabilityReasons and encode the
// index in our compact representation. We could get more fancy here by
// hashing the reason but, for the moment, we take a similar approach to that
// that taken by Fix.
unsigned index = CS.UnavailabilityReasons.size();
CS.UnavailabilityReasons.push_back(reason.getValue());
// Encode the reason as the index into UnavailabilityReasons + 1.
return index + 1;
}
const UnavailabilityReason &
OverloadChoice::getReasonUnavailable(ConstraintSystem &CS) const {
assert(UnavailableReasonData != 0);
unsigned index = UnavailableReasonData - 1;
return CS.UnavailabilityReasons[index];
}