Files
swift-mirror/lib/Sema/DerivedConformances.h
Joe Groff 8e6b353542 Derive conformances of Equatable and Hashable for simple enums.
If an enum has no cases with payloads, make it implicitly Equatable and Hashable, and derive default implementations of '==' and 'hashValue'. Insert the derived '==' into module context wrapped in a new DerivedFileUnit kind, and arrange for it to be codegenned with the deriving EnumDecl by adding a 'DerivedOperatorDecls' array to NominalTypeDecls that gets visited at SILGen time.

Swift SVN r14471
2014-02-27 20:28:38 +00:00

88 lines
3.2 KiB
C++

//===--- DerivedConformances.h - Derived protocol conformance ---*- 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 defines entry points to synthesize compiler-derived conformances
// to certain known protocols.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SEMA_DERIVEDCONFORMANCES_H
#define SWIFT_SEMA_DERIVEDCONFORMANCES_H
namespace swift {
class Decl;
class NominalTypeDecl;
class TypeChecker;
class ValueDecl;
namespace DerivedConformance {
/// Derive a RawRepresentable requirement for an enum, if it has a valid
/// raw type and raw values for all of its cases.
///
/// \returns the derived member, which will also be added to the type.
ValueDecl *deriveRawRepresentable(TypeChecker &tc,
NominalTypeDecl *type,
ValueDecl *requirement);
/// Derive an Equatable requirement for a type.
///
/// Currently this is only implemented for simple enums. Obvious generalizations
/// would be to enums with all-Equatable payloads and to structs with all-
/// Equatable stored properties.
///
/// \returns the derived member, which will also be added to the type.
ValueDecl *deriveEquatable(TypeChecker &tc,
NominalTypeDecl *type,
ValueDecl *requirement);
/// Derive a Hashable requirement for a type.
///
/// Currently this is only implemented for simple enums. Obvious generalizations
/// would be to enums with all-Hashable payloads and to structs with all-
/// Hashable stored properties.
///
/// \returns the derived member, which will also be added to the type.
ValueDecl *deriveHashable(TypeChecker &tc,
NominalTypeDecl *type,
ValueDecl *requirement);
/// Insert a declaration as a member of a nominal type. The declaration is
/// added to the end of the members list.
void _insertMemberDecl(NominalTypeDecl *scope, Decl *member);
/// Insert an operator declaration associated with a nominal type. The
/// declaration is added at global scope
void _insertOperatorDecl(NominalTypeDecl *scope, Decl *member);
/// Insert a declaration as a member of a nominal type. The declaration is
/// added to the end of the members list and returned.
template<typename SomeDecl>
inline SomeDecl *insertMemberDecl(NominalTypeDecl *scope, SomeDecl *member) {
::swift::DerivedConformance::_insertMemberDecl(scope, member);
return member;
}
/// Insert a declaration as a member of a nominal type. The declaration is
/// added at file scope as close as possible to the
template<typename SomeDecl>
inline SomeDecl *insertOperatorDecl(NominalTypeDecl *scope, SomeDecl *member) {
::swift::DerivedConformance::_insertOperatorDecl(scope, member);
return member;
}
}
}
#endif