blob: 67961c08917e9356217c79ee5cdf1b80594a85d4 [file] [log] [blame]
//===- TypeOrExtensionDecl.h - Swift Language Declaration ASTs -*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines the TypeOrExtensionDecl struct, separately to Decl.h so
// that this can be included in files that Decl.h includes.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_TYPE_OR_EXTENSION_DECL_H
#define SWIFT_TYPE_OR_EXTENSION_DECL_H
#include "swift/AST/TypeAlignments.h"
#include "llvm/ADT/PointerUnion.h"
namespace swift {
/// Describes either a nominal type declaration or an extension
/// declaration.
struct TypeOrExtensionDecl {
// (The definitions are in Decl.cpp.)
llvm::PointerUnion<NominalTypeDecl *, ExtensionDecl *> Decl;
TypeOrExtensionDecl() = default;
TypeOrExtensionDecl(NominalTypeDecl *D);
TypeOrExtensionDecl(ExtensionDecl *D);
/// Return the contained *Decl as the Decl superclass.
class Decl *getAsDecl() const;
/// Return the contained *Decl as the DeclContext superclass.
DeclContext *getAsDeclContext() const;
/// Return the contained NominalTypeDecl or that of the extended type
/// in the ExtensionDecl.
NominalTypeDecl *getBaseNominal() const;
/// Is the contained pointer null?
bool isNull() const;
explicit operator bool() const { return !isNull(); }
bool operator==(TypeOrExtensionDecl rhs) { return Decl == rhs.Decl; }
bool operator!=(TypeOrExtensionDecl rhs) { return Decl != rhs.Decl; }
bool operator<(TypeOrExtensionDecl rhs) { return Decl < rhs.Decl; }
};
} // end namespace swift
#endif