blob: d1bddb6010da1a8b278cc13d53110974a60c7b1f [file] [log] [blame]
//===--- SILProperty.h - Defines the SILProperty class ----------*- 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 SILProperty class, which is used to capture the
// metadata about a property definition necessary for it to be resiliently
// included in KeyPaths across modules.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SIL_SILPROPERTY_H
#define SWIFT_SIL_SILPROPERTY_H
#include "swift/AST/GenericSignature.h"
#include "swift/SIL/SILAllocated.h"
#include "swift/SIL/SILInstruction.h"
#include "llvm/ADT/ilist_node.h"
#include "llvm/ADT/ilist.h"
namespace swift {
class SILPrintContext;
/// A descriptor for a public property or subscript that can be resiliently
/// referenced from key paths in external modules.
class SILProperty : public llvm::ilist_node<SILProperty>,
public SILAllocated<SILProperty>
{
private:
/// True if serialized.
bool Serialized;
/// The declaration the descriptor represents.
AbstractStorageDecl *Decl;
/// The key path component that represents its implementation.
Optional<KeyPathPatternComponent> Component;
SILProperty(bool Serialized,
AbstractStorageDecl *Decl,
Optional<KeyPathPatternComponent> Component)
: Serialized(Serialized), Decl(Decl), Component(Component)
{}
public:
static SILProperty *create(SILModule &M,
bool Serialized,
AbstractStorageDecl *Decl,
Optional<KeyPathPatternComponent> Component);
bool isSerialized() const { return Serialized; }
AbstractStorageDecl *getDecl() const { return Decl; }
bool isTrivial() const {
return !Component.hasValue();
}
const Optional<KeyPathPatternComponent> &getComponent() const {
return Component;
}
void print(SILPrintContext &Ctx) const;
void dump() const;
void verify(const SILModule &M) const;
};
} // end namespace swift
namespace llvm {
//===----------------------------------------------------------------------===//
// ilist_traits for SILProperty
//===----------------------------------------------------------------------===//
template <>
struct ilist_traits<::swift::SILProperty>
: public ilist_node_traits<::swift::SILProperty> {
using SILProperty = ::swift::SILProperty;
public:
static void deleteNode(SILProperty *VT) { VT->~SILProperty(); }
private:
void createNode(const SILProperty &);
};
} // namespace llvm
#endif