Rename accessor kinds from IsGetter -> IsGet, etc.

Introduce some metaprogramming of accessors and generally prepare
for storing less-structured accessor lists.

NFC except for a change to the serialization format.
This commit is contained in:
John McCall
2018-06-14 15:40:16 -04:00
parent aea6f069bb
commit 9022b5152f
38 changed files with 748 additions and 607 deletions

View File

@@ -473,9 +473,11 @@ static const Decl *getDeclForContext(const DeclContext *DC) {
namespace {
struct Accessors {
StorageKind Kind;
FuncDecl *Get = nullptr, *Set = nullptr, *MaterializeForSet = nullptr;
FuncDecl *Address = nullptr, *MutableAddress = nullptr;
FuncDecl *WillSet = nullptr, *DidSet = nullptr;
SmallVector<AccessorDecl *, 8> Decls;
void add(AccessorDecl *accessor) {
if (accessor) Decls.push_back(accessor);
}
};
} // end anonymous namespace
@@ -506,8 +508,8 @@ static Accessors getAccessors(const AbstractStorageDecl *storage) {
case AbstractStorageDecl::Addressed:
case AbstractStorageDecl::AddressedWithTrivialAccessors:
case AbstractStorageDecl::ComputedWithMutableAddress:
accessors.Address = storage->getAddressor();
accessors.MutableAddress = storage->getMutableAddressor();
accessors.add(storage->getAddressor());
accessors.add(storage->getMutableAddressor());
if (storageKind == AbstractStorageDecl::Addressed)
return accessors;
goto getset;
@@ -515,16 +517,16 @@ static Accessors getAccessors(const AbstractStorageDecl *storage) {
case AbstractStorageDecl::StoredWithObservers:
case AbstractStorageDecl::InheritedWithObservers:
case AbstractStorageDecl::AddressedWithObservers:
accessors.WillSet = storage->getWillSetFunc();
accessors.DidSet = storage->getDidSetFunc();
accessors.add(storage->getWillSetFunc());
accessors.add(storage->getDidSetFunc());
goto getset;
case AbstractStorageDecl::StoredWithTrivialAccessors:
case AbstractStorageDecl::Computed:
getset:
accessors.Get = storage->getGetter();
accessors.Set = storage->getSetter();
accessors.MaterializeForSet = storage->getMaterializeForSetFunc();
accessors.add(storage->getGetter());
accessors.add(storage->getSetter());
accessors.add(storage->getMaterializeForSetFunc());
return accessors;
}
llvm_unreachable("bad storage kind");
@@ -1820,16 +1822,9 @@ void Serializer::writeDefaultWitnessTable(const ProtocolDecl *proto,
static serialization::AccessorKind getStableAccessorKind(swift::AccessorKind K){
switch (K) {
#define CASE(NAME) \
case swift::AccessorKind::Is##NAME: return serialization::NAME;
CASE(Getter)
CASE(Setter)
CASE(WillSet)
CASE(DidSet)
CASE(MaterializeForSet)
CASE(Addressor)
CASE(MutableAddressor)
#undef CASE
#define ACCESSOR(ID) \
case swift::AccessorKind::ID: return serialization::ID;
#include "swift/AST/AccessorKinds.def"
}
llvm_unreachable("Unhandled AccessorKind in switch.");
@@ -3117,9 +3112,11 @@ void Serializer::writeDecl(const Decl *D) {
getRawStableAccessLevel(var->getSetterFormalAccess());
Type ty = var->getInterfaceType();
SmallVector<TypeID, 2> dependencies;
SmallVector<TypeID, 2> accessorsAndDependencies;
for (auto accessor : accessors.Decls)
accessorsAndDependencies.push_back(addDeclRef(accessor));
for (Type dependency : collectDependenciesFromType(ty->getCanonicalType()))
dependencies.push_back(addTypeRef(dependency));
accessorsAndDependencies.push_back(addTypeRef(dependency));
unsigned abbrCode = DeclTypeAbbrCodes[VarLayout::Code];
VarLayout::emitRecord(Out, ScratchRecord, abbrCode,
@@ -3133,17 +3130,11 @@ void Serializer::writeDecl(const Decl *D) {
var->isGetterMutating(),
var->isSetterMutating(),
(unsigned) accessors.Kind,
accessors.Decls.size(),
addTypeRef(ty),
addDeclRef(accessors.Get),
addDeclRef(accessors.Set),
addDeclRef(accessors.MaterializeForSet),
addDeclRef(accessors.Address),
addDeclRef(accessors.MutableAddress),
addDeclRef(accessors.WillSet),
addDeclRef(accessors.DidSet),
addDeclRef(var->getOverriddenDecl()),
rawAccessLevel, rawSetterAccessLevel,
dependencies);
accessorsAndDependencies);
break;
}
@@ -3336,15 +3327,19 @@ void Serializer::writeDecl(const Decl *D) {
auto contextID = addDeclContextRef(subscript->getDeclContext());
Accessors accessors = getAccessors(subscript);
SmallVector<IdentifierID, 4> nameComponentsAndDependencies;
for (auto argName : subscript->getFullName().getArgumentNames())
nameComponentsAndDependencies.push_back(addDeclBaseNameRef(argName));
for (auto accessor : accessors.Decls)
nameComponentsAndDependencies.push_back(addDeclRef(accessor));
Type ty = subscript->getInterfaceType();
for (Type dependency : collectDependenciesFromType(ty->getCanonicalType()))
nameComponentsAndDependencies.push_back(addTypeRef(dependency));
Accessors accessors = getAccessors(subscript);
uint8_t rawAccessLevel =
getRawStableAccessLevel(subscript->getFormalAccess());
uint8_t rawSetterAccessLevel = rawAccessLevel;
@@ -3360,16 +3355,10 @@ void Serializer::writeDecl(const Decl *D) {
subscript->isGetterMutating(),
subscript->isSetterMutating(),
(unsigned) accessors.Kind,
accessors.Decls.size(),
addGenericEnvironmentRef(
subscript->getGenericEnvironment()),
addTypeRef(ty),
addDeclRef(accessors.Get),
addDeclRef(accessors.Set),
addDeclRef(accessors.MaterializeForSet),
addDeclRef(accessors.Address),
addDeclRef(accessors.MutableAddress),
addDeclRef(accessors.WillSet),
addDeclRef(accessors.DidSet),
addDeclRef(subscript->getOverriddenDecl()),
rawAccessLevel,
rawSetterAccessLevel,