mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
since the getObjCGetterSelector/Setter methods from VarDecl/SubscriptDecl down
to AbstractStorageDecl, NFC. Swift SVN r13836
This commit is contained in:
@@ -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());
|
||||||
|
|||||||
160
lib/AST/Decl.cpp
160
lib/AST/Decl.cpp
@@ -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());
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user