since the getObjCGetterSelector/Setter methods from VarDecl/SubscriptDecl down

to AbstractStorageDecl, NFC.


Swift SVN r13836
This commit is contained in:
Chris Lattner
2014-02-12 19:16:40 +00:00
parent b67624567b
commit c23185d9ba
5 changed files with 96 additions and 134 deletions

View File

@@ -2606,7 +2606,15 @@ public:
/// Return true if this storage needs to be accessed with getters and /// Return true if this storage needs to be accessed with getters and
/// setters for Objective-C. /// setters for Objective-C.
bool usesObjCGetterAndSetter() const; bool usesObjCGetterAndSetter() const;
/// Given that this is an Objective-C property or subscript declaration,
/// produce its getter selector in the given buffer (as UTF-8).
StringRef getObjCGetterSelector(SmallVectorImpl<char> &buffer) const;
/// Given that this is an Objective-C property or subscript declaration,
/// produce its setter selector in the given buffer (as UTF-8).
StringRef getObjCSetterSelector(SmallVectorImpl<char> &buffer) const;
AbstractStorageDecl *getOverriddenDecl() const { AbstractStorageDecl *getOverriddenDecl() const {
return OverriddenDecl.getPointer(); return OverriddenDecl.getPointer();
} }
@@ -2664,14 +2672,6 @@ public:
/// Determine whether this declaration is an anonymous closure parameter. /// Determine whether this declaration is an anonymous closure parameter.
bool isAnonClosureParam() const; bool isAnonClosureParam() const;
/// Given that this is an Objective-C property declaration, produce
/// its getter selector in the given buffer (as UTF-8).
StringRef getObjCGetterSelector(SmallVectorImpl<char> &buffer) const;
/// Given that this is an Objective-C property declaration, produce
/// its setter selector in the given buffer (as UTF-8).
StringRef getObjCSetterSelector(SmallVectorImpl<char> &buffer) const;
/// Is this a type ('static') variable? /// Is this a type ('static') variable?
bool isStatic() const { return VarDeclBits.Static; } bool isStatic() const { return VarDeclBits.Static; }
void setStatic(bool IsStatic) { VarDeclBits.Static = IsStatic; } void setStatic(bool IsStatic) { VarDeclBits.Static = IsStatic; }
@@ -2772,14 +2772,6 @@ public:
/// implies. /// implies.
ObjCSubscriptKind getObjCSubscriptKind() const; ObjCSubscriptKind getObjCSubscriptKind() const;
/// Given that this is an Objective-C subscript declaration, produce
/// its getter selector.
StringRef getObjCGetterSelector() const;
/// Given that this is an Objective-C subscript declaration, produce
/// its setter selector.
StringRef getObjCSetterSelector() const;
SubscriptDecl *getOverriddenDecl() const { SubscriptDecl *getOverriddenDecl() const {
return cast_or_null<SubscriptDecl>( return cast_or_null<SubscriptDecl>(
AbstractStorageDecl::getOverriddenDecl()); AbstractStorageDecl::getOverriddenDecl());

View File

@@ -1144,6 +1144,78 @@ void AbstractStorageDecl::setObservingAccessors(FuncDecl *Get,
Set->makeAccessor(this, AccessorKind::IsSetter); Set->makeAccessor(this, AccessorKind::IsSetter);
} }
StringRef AbstractStorageDecl::
getObjCGetterSelector(SmallVectorImpl<char> &buffer) const {
// If we override a property, use its getter selector.
if (auto overridden = getOverriddenDecl())
return overridden->getObjCGetterSelector(buffer);
llvm::raw_svector_ostream out(buffer);
// If there is an Objective-C @property declaration, use its getter
// name.
if (auto objc = dyn_cast_or_null<clang::ObjCPropertyDecl>(getClangDecl())) {
auto selector = objc->getGetterName();
if (!selector.isNull()) {
selector.print(out);
return out.str();
}
}
// Subscripts use a specific selector.
if (auto *SD = dyn_cast<SubscriptDecl>(this)) {
switch (SD->getObjCSubscriptKind()) {
case ObjCSubscriptKind::None:
llvm_unreachable("Not an Objective-C subscript");
case ObjCSubscriptKind::Indexed: return "objectAtIndexedSubscript:";
case ObjCSubscriptKind::Keyed: return "objectForKeyedSubscript:";
}
}
// The getter selector is the property name itself.
// FIXME: 'is' prefix for boolean properties?
out << getName().str();
return out.str();
}
StringRef AbstractStorageDecl::getObjCSetterSelector(SmallVectorImpl<char> &buffer) const {
// If we override a property, use its setter selector.
if (auto overridden = getOverriddenDecl())
return overridden->getObjCSetterSelector(buffer);
llvm::raw_svector_ostream out(buffer);
// If there is an Objective-C @property declaration, use its setter
// name.
if (auto objc = dyn_cast_or_null<clang::ObjCPropertyDecl>(getClangDecl())) {
auto selector = objc->getSetterName();
if (!selector.isNull()) {
selector.print(out);
return out.str();
}
}
// Subscripts use a specific selector.
if (auto *SD = dyn_cast<SubscriptDecl>(this)) {
switch (SD->getObjCSubscriptKind()) {
case ObjCSubscriptKind::None:
llvm_unreachable("Not an Objective-C subscript");
case ObjCSubscriptKind::Indexed: return "setObject:atIndexedSubscript:";
case ObjCSubscriptKind::Keyed: return "setObject:forKeyedSubscript:";
}
}
// The setter selector for, e.g., 'fooBar' is 'setFooBar:', with the
// property name capitalized and preceded by 'set'.
StringRef name = getName().str();
assert(name.size() >= 1 && "empty var name?!");
out << "set" << char(toupper(name[0])) << name.slice(1, name.size()) << ':';
return out.str();
}
/// \brief Returns whether the var is settable in the specified context: this /// \brief Returns whether the var is settable in the specified context: this
@@ -1314,32 +1386,6 @@ ObjCSubscriptKind SubscriptDecl::getObjCSubscriptKind() const {
return ObjCSubscriptKind::None; return ObjCSubscriptKind::None;
} }
StringRef SubscriptDecl::getObjCGetterSelector() const {
switch (getObjCSubscriptKind()) {
case ObjCSubscriptKind::None:
llvm_unreachable("Not an Objective-C subscript");
case ObjCSubscriptKind::Indexed:
return "objectAtIndexedSubscript:";
case ObjCSubscriptKind::Keyed:
return "objectForKeyedSubscript:";
}
}
StringRef SubscriptDecl::getObjCSetterSelector() const {
switch (getObjCSubscriptKind()) {
case ObjCSubscriptKind::None:
llvm_unreachable("Not an Objective-C subscript");
case ObjCSubscriptKind::Indexed:
return "setObject:atIndexedSubscript:";
case ObjCSubscriptKind::Keyed:
return "setObject:forKeyedSubscript:";
}
}
SourceRange SubscriptDecl::getSourceRange() const { SourceRange SubscriptDecl::getSourceRange() const {
if (getBracesRange().isValid()) if (getBracesRange().isValid())
return { getSubscriptLoc(), getBracesRange().End }; return { getSubscriptLoc(), getBracesRange().End };
@@ -1708,69 +1754,13 @@ DynamicSelfType *FuncDecl::getDynamicSelfInterface() const {
return DynamicSelfType::get(extType, getASTContext()); return DynamicSelfType::get(extType, getASTContext());
} }
StringRef VarDecl::getObjCGetterSelector(SmallVectorImpl<char> &buffer) const {
// If we override a property, use its getter selector.
if (auto overridden = getOverriddenDecl())
return overridden->getObjCGetterSelector(buffer);
llvm::raw_svector_ostream out(buffer);
// If there is an Objective-C @property declaration, use its getter
// name.
if (auto objcProperty = dyn_cast_or_null<clang::ObjCPropertyDecl>(
getClangDecl())) {
auto selector = objcProperty->getGetterName();
if (!selector.isNull()) {
selector.print(out);
return out.str();
}
}
// The getter selector is the property name itself.
// FIXME: 'is' prefix for boolean properties?
out << getName().str();
return out.str();
}
StringRef VarDecl::getObjCSetterSelector(SmallVectorImpl<char> &buffer) const {
// If we override a property, use its setter selector.
if (auto overridden = getOverriddenDecl())
return overridden->getObjCSetterSelector(buffer);
llvm::raw_svector_ostream out(buffer);
// If there is an Objective-C @property declaration, use its setter
// name.
if (auto objcProperty = dyn_cast_or_null<clang::ObjCPropertyDecl>(
getClangDecl())) {
auto selector = objcProperty->getSetterName();
if (!selector.isNull()) {
selector.print(out);
return out.str();
}
}
// The setter selector for, e.g., 'fooBar' is 'setFooBar:', with the
// property name capitalized and preceded by 'set'.
StringRef name = getName().str();
assert(name.size() >= 1 && "empty var name?!");
out << "set" << char(toupper(name[0])) << name.slice(1, name.size()) << ':';
return out.str();
}
/// Produce the selector for this "Objective-C method" in the given buffer. /// Produce the selector for this "Objective-C method" in the given buffer.
StringRef FuncDecl::getObjCSelector(SmallVectorImpl<char> &buffer) const { StringRef FuncDecl::getObjCSelector(SmallVectorImpl<char> &buffer) const {
// For a getter or setter, go through the variable or subscript decl. // For a getter or setter, go through the variable or subscript decl.
if (isGetterOrSetter()) { if (isGetterOrSetter()) {
if (auto var = dyn_cast<VarDecl>(getAccessorStorageDecl())) { auto asd = cast<AbstractStorageDecl>(getAccessorStorageDecl());
return isGetter()? var->getObjCGetterSelector(buffer) return isGetter() ? asd->getObjCGetterSelector(buffer)
: var->getObjCSetterSelector(buffer); : asd->getObjCSetterSelector(buffer);
}
auto subscript = cast<SubscriptDecl>(getAccessorStorageDecl());
return isGetter()? subscript->getObjCGetterSelector()
: subscript->getObjCSetterSelector();
} }
assert(buffer.empty()); assert(buffer.empty());

View File

@@ -311,20 +311,12 @@ namespace {
} }
} }
Selector(VarDecl *property, ForGetter_t) { Selector(AbstractStorageDecl *asd, ForGetter_t) {
property->getObjCGetterSelector(Text); asd->getObjCGetterSelector(Text);
} }
Selector(VarDecl *property, ForSetter_t) { Selector(AbstractStorageDecl *asd, ForSetter_t) {
property->getObjCSetterSelector(Text); asd->getObjCSetterSelector(Text);
}
Selector(SubscriptDecl *subscript, ForGetter_t) {
Text = subscript->getObjCGetterSelector();
}
Selector(SubscriptDecl *subscript, ForSetter_t) {
Text = subscript->getObjCSetterSelector();
} }
Selector(SILDeclRef ref) { Selector(SILDeclRef ref) {
@@ -345,10 +337,7 @@ namespace {
break; break;
case SILDeclRef::Kind::Getter: case SILDeclRef::Kind::Getter:
if (auto var = dyn_cast<VarDecl>(ref.getDecl())) cast<AbstractStorageDecl>(ref.getDecl())->getObjCGetterSelector(Text);
var->getObjCGetterSelector(Text);
else
Text = cast<SubscriptDecl>(ref.getDecl())->getObjCGetterSelector();
break; break;
case SILDeclRef::Kind::Initializer: case SILDeclRef::Kind::Initializer:
@@ -364,10 +353,7 @@ namespace {
break; break;
case SILDeclRef::Kind::Setter: case SILDeclRef::Kind::Setter:
if (auto var = dyn_cast<VarDecl>(ref.getDecl())) cast<AbstractStorageDecl>(ref.getDecl())->getObjCSetterSelector(Text);
var->getObjCSetterSelector(Text);
else
Text = cast<SubscriptDecl>(ref.getDecl())->getObjCSetterSelector();
break; break;
} }
} }

View File

@@ -2054,13 +2054,10 @@ void IRGenSILFunction::visitDynamicMethodBranchInst(DynamicMethodBranchInst *i){
llvm::SmallString<64> selectorBuffer; llvm::SmallString<64> selectorBuffer;
if (auto fnDecl = dyn_cast<FuncDecl>(i->getMember().getDecl())) if (auto fnDecl = dyn_cast<FuncDecl>(i->getMember().getDecl()))
selector = fnDecl->getObjCSelector(selectorBuffer); selector = fnDecl->getObjCSelector(selectorBuffer);
else if (auto var = dyn_cast<VarDecl>(i->getMember().getDecl())) else if (auto var = dyn_cast<AbstractStorageDecl>(i->getMember().getDecl()))
selector = var->getObjCGetterSelector(selectorBuffer); selector = var->getObjCGetterSelector(selectorBuffer);
else if (auto subscript = dyn_cast<SubscriptDecl>(i->getMember().getDecl())) { else
selector = subscript->getObjCGetterSelector();
} else {
llvm_unreachable("Unhandled dynamic method branch query"); llvm_unreachable("Unhandled dynamic method branch query");
}
llvm::Value *object = getLoweredExplosion(i->getOperand()).claimNext(); llvm::Value *object = getLoweredExplosion(i->getOperand()).claimNext();
if (object->getType() != IGM.ObjCPtrTy) if (object->getType() != IGM.ObjCPtrTy)

View File

@@ -154,17 +154,14 @@ getDynamicResultSignature(ValueDecl *decl,
buffer += '-'; buffer += '-';
} }
selector = buffer.str(); selector = buffer.str();
} else if (auto var = dyn_cast<VarDecl>(decl)) { } else if (auto asd = dyn_cast<AbstractStorageDecl>(decl)) {
// Handle properties. Only the getter matters. // Handle properties and subscripts. Only the getter matters.
selector = var->getObjCGetterSelector(buffer); selector = asd->getObjCGetterSelector(buffer);
type = decl->getType(); type = asd->getType();
} else if (auto ctor = dyn_cast<ConstructorDecl>(decl)) { } else if (auto ctor = dyn_cast<ConstructorDecl>(decl)) {
// Handle constructors. // Handle constructors.
selector = ctor->getObjCSelector(buffer); selector = ctor->getObjCSelector(buffer);
type = decl->getType()->castTo<AnyFunctionType>()->getResult(); type = decl->getType()->castTo<AnyFunctionType>()->getResult();
} else if (auto subscript = dyn_cast<SubscriptDecl>(decl)) {
selector = subscript->getObjCGetterSelector();
type = subscript->getType();
} else { } else {
llvm_unreachable("Dynamic lookup found a non-[objc] result"); llvm_unreachable("Dynamic lookup found a non-[objc] result");
} }