mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-20 15:14:45 +00:00
[NFC] Refactoring PropertyAttributeKind for ObjCPropertyDecl and ObjCDeclSpec.
This is a code clean up of the PropertyAttributeKind and ObjCPropertyAttributeKind enums in ObjCPropertyDecl and ObjCDeclSpec that are exactly identical. This non-functional change consolidates these enums into one. The changes are to many files across clang (and comments in LLVM) so that everything refers to the new consolidated enum in DeclObjCCommon.h. 2nd Landing Attempt... Differential Revision: https://reviews.llvm.org/D77233
This commit is contained in:
parent
b53fd70b9e
commit
9721fbf85b
@ -15,6 +15,7 @@
|
||||
|
||||
#include "clang/AST/Decl.h"
|
||||
#include "clang/AST/DeclBase.h"
|
||||
#include "clang/AST/DeclObjCCommon.h"
|
||||
#include "clang/AST/ExternalASTSource.h"
|
||||
#include "clang/AST/Redeclarable.h"
|
||||
#include "clang/AST/SelectorLocationsKind.h"
|
||||
@ -742,34 +743,6 @@ class ObjCPropertyDecl : public NamedDecl {
|
||||
void anchor() override;
|
||||
|
||||
public:
|
||||
enum PropertyAttributeKind {
|
||||
OBJC_PR_noattr = 0x00,
|
||||
OBJC_PR_readonly = 0x01,
|
||||
OBJC_PR_getter = 0x02,
|
||||
OBJC_PR_assign = 0x04,
|
||||
OBJC_PR_readwrite = 0x08,
|
||||
OBJC_PR_retain = 0x10,
|
||||
OBJC_PR_copy = 0x20,
|
||||
OBJC_PR_nonatomic = 0x40,
|
||||
OBJC_PR_setter = 0x80,
|
||||
OBJC_PR_atomic = 0x100,
|
||||
OBJC_PR_weak = 0x200,
|
||||
OBJC_PR_strong = 0x400,
|
||||
OBJC_PR_unsafe_unretained = 0x800,
|
||||
/// Indicates that the nullability of the type was spelled with a
|
||||
/// property attribute rather than a type qualifier.
|
||||
OBJC_PR_nullability = 0x1000,
|
||||
OBJC_PR_null_resettable = 0x2000,
|
||||
OBJC_PR_class = 0x4000,
|
||||
OBJC_PR_direct = 0x8000
|
||||
// Adding a property should change NumPropertyAttrsBits
|
||||
};
|
||||
|
||||
enum {
|
||||
/// Number of bits fitting all the property attributes.
|
||||
NumPropertyAttrsBits = 16
|
||||
};
|
||||
|
||||
enum SetterKind { Assign, Retain, Copy, Weak };
|
||||
enum PropertyControl { None, Required, Optional };
|
||||
|
||||
@ -782,8 +755,8 @@ private:
|
||||
|
||||
QualType DeclType;
|
||||
TypeSourceInfo *DeclTypeSourceInfo;
|
||||
unsigned PropertyAttributes : NumPropertyAttrsBits;
|
||||
unsigned PropertyAttributesAsWritten : NumPropertyAttrsBits;
|
||||
unsigned PropertyAttributes : NumObjCPropertyAttrsBits;
|
||||
unsigned PropertyAttributesAsWritten : NumObjCPropertyAttrsBits;
|
||||
|
||||
// \@required/\@optional
|
||||
unsigned PropertyImplementation : 2;
|
||||
@ -810,15 +783,14 @@ private:
|
||||
ObjCIvarDecl *PropertyIvarDecl = nullptr;
|
||||
|
||||
ObjCPropertyDecl(DeclContext *DC, SourceLocation L, IdentifierInfo *Id,
|
||||
SourceLocation AtLocation, SourceLocation LParenLocation,
|
||||
QualType T, TypeSourceInfo *TSI,
|
||||
PropertyControl propControl)
|
||||
: NamedDecl(ObjCProperty, DC, L, Id), AtLoc(AtLocation),
|
||||
LParenLoc(LParenLocation), DeclType(T), DeclTypeSourceInfo(TSI),
|
||||
PropertyAttributes(OBJC_PR_noattr),
|
||||
PropertyAttributesAsWritten(OBJC_PR_noattr),
|
||||
PropertyImplementation(propControl), GetterName(Selector()),
|
||||
SetterName(Selector()) {}
|
||||
SourceLocation AtLocation, SourceLocation LParenLocation,
|
||||
QualType T, TypeSourceInfo *TSI, PropertyControl propControl)
|
||||
: NamedDecl(ObjCProperty, DC, L, Id), AtLoc(AtLocation),
|
||||
LParenLoc(LParenLocation), DeclType(T), DeclTypeSourceInfo(TSI),
|
||||
PropertyAttributes(ObjCPropertyAttribute::kind_noattr),
|
||||
PropertyAttributesAsWritten(ObjCPropertyAttribute::kind_noattr),
|
||||
PropertyImplementation(propControl), GetterName(Selector()),
|
||||
SetterName(Selector()) {}
|
||||
|
||||
public:
|
||||
static ObjCPropertyDecl *Create(ASTContext &C, DeclContext *DC,
|
||||
@ -850,11 +822,11 @@ public:
|
||||
/// type.
|
||||
QualType getUsageType(QualType objectType) const;
|
||||
|
||||
PropertyAttributeKind getPropertyAttributes() const {
|
||||
return PropertyAttributeKind(PropertyAttributes);
|
||||
ObjCPropertyAttribute::Kind getPropertyAttributes() const {
|
||||
return ObjCPropertyAttribute::Kind(PropertyAttributes);
|
||||
}
|
||||
|
||||
void setPropertyAttributes(PropertyAttributeKind PRVal) {
|
||||
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal) {
|
||||
PropertyAttributes |= PRVal;
|
||||
}
|
||||
|
||||
@ -862,11 +834,11 @@ public:
|
||||
PropertyAttributes = PRVal;
|
||||
}
|
||||
|
||||
PropertyAttributeKind getPropertyAttributesAsWritten() const {
|
||||
return PropertyAttributeKind(PropertyAttributesAsWritten);
|
||||
ObjCPropertyAttribute::Kind getPropertyAttributesAsWritten() const {
|
||||
return ObjCPropertyAttribute::Kind(PropertyAttributesAsWritten);
|
||||
}
|
||||
|
||||
void setPropertyAttributesAsWritten(PropertyAttributeKind PRVal) {
|
||||
void setPropertyAttributesAsWritten(ObjCPropertyAttribute::Kind PRVal) {
|
||||
PropertyAttributesAsWritten = PRVal;
|
||||
}
|
||||
|
||||
@ -874,23 +846,28 @@ public:
|
||||
|
||||
/// isReadOnly - Return true iff the property has a setter.
|
||||
bool isReadOnly() const {
|
||||
return (PropertyAttributes & OBJC_PR_readonly);
|
||||
return (PropertyAttributes & ObjCPropertyAttribute::kind_readonly);
|
||||
}
|
||||
|
||||
/// isAtomic - Return true if the property is atomic.
|
||||
bool isAtomic() const {
|
||||
return (PropertyAttributes & OBJC_PR_atomic);
|
||||
return (PropertyAttributes & ObjCPropertyAttribute::kind_atomic);
|
||||
}
|
||||
|
||||
/// isRetaining - Return true if the property retains its value.
|
||||
bool isRetaining() const {
|
||||
return (PropertyAttributes &
|
||||
(OBJC_PR_retain | OBJC_PR_strong | OBJC_PR_copy));
|
||||
return (PropertyAttributes & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_strong |
|
||||
ObjCPropertyAttribute::kind_copy));
|
||||
}
|
||||
|
||||
bool isInstanceProperty() const { return !isClassProperty(); }
|
||||
bool isClassProperty() const { return PropertyAttributes & OBJC_PR_class; }
|
||||
bool isDirectProperty() const { return PropertyAttributes & OBJC_PR_direct; }
|
||||
bool isClassProperty() const {
|
||||
return PropertyAttributes & ObjCPropertyAttribute::kind_class;
|
||||
}
|
||||
bool isDirectProperty() const {
|
||||
return PropertyAttributes & ObjCPropertyAttribute::kind_direct;
|
||||
}
|
||||
|
||||
ObjCPropertyQueryKind getQueryKind() const {
|
||||
return isClassProperty() ? ObjCPropertyQueryKind::OBJC_PR_query_class :
|
||||
@ -906,13 +883,13 @@ public:
|
||||
/// the property setter. This is only valid if the property has been
|
||||
/// defined to have a setter.
|
||||
SetterKind getSetterKind() const {
|
||||
if (PropertyAttributes & OBJC_PR_strong)
|
||||
if (PropertyAttributes & ObjCPropertyAttribute::kind_strong)
|
||||
return getType()->isBlockPointerType() ? Copy : Retain;
|
||||
if (PropertyAttributes & OBJC_PR_retain)
|
||||
if (PropertyAttributes & ObjCPropertyAttribute::kind_retain)
|
||||
return Retain;
|
||||
if (PropertyAttributes & OBJC_PR_copy)
|
||||
if (PropertyAttributes & ObjCPropertyAttribute::kind_copy)
|
||||
return Copy;
|
||||
if (PropertyAttributes & OBJC_PR_weak)
|
||||
if (PropertyAttributes & ObjCPropertyAttribute::kind_weak)
|
||||
return Weak;
|
||||
return Assign;
|
||||
}
|
||||
|
55
clang/include/clang/AST/DeclObjCCommon.h
Normal file
55
clang/include/clang/AST/DeclObjCCommon.h
Normal file
@ -0,0 +1,55 @@
|
||||
//===- DeclObjCCommon.h - Classes for representing declarations -*- C++ -*-===//
|
||||
//
|
||||
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||||
// See https://llvm.org/LICENSE.txt for license information.
|
||||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
//
|
||||
// This file contains common ObjC enums and classes used in AST and
|
||||
// Sema.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#ifndef LLVM_CLANG_AST_DECLOBJC_COMMON_H
|
||||
#define LLVM_CLANG_AST_DECLOBJC_COMMON_H
|
||||
|
||||
namespace clang {
|
||||
|
||||
/// ObjCPropertyAttribute::Kind - list of property attributes.
|
||||
/// Keep this list in sync with LLVM's Dwarf.h ApplePropertyAttributes.s
|
||||
namespace ObjCPropertyAttribute {
|
||||
enum Kind {
|
||||
kind_noattr = 0x00,
|
||||
kind_readonly = 0x01,
|
||||
kind_getter = 0x02,
|
||||
kind_assign = 0x04,
|
||||
kind_readwrite = 0x08,
|
||||
kind_retain = 0x10,
|
||||
kind_copy = 0x20,
|
||||
kind_nonatomic = 0x40,
|
||||
kind_setter = 0x80,
|
||||
kind_atomic = 0x100,
|
||||
kind_weak = 0x200,
|
||||
kind_strong = 0x400,
|
||||
kind_unsafe_unretained = 0x800,
|
||||
/// Indicates that the nullability of the type was spelled with a
|
||||
/// property attribute rather than a type qualifier.
|
||||
kind_nullability = 0x1000,
|
||||
kind_null_resettable = 0x2000,
|
||||
kind_class = 0x4000,
|
||||
kind_direct = 0x8000,
|
||||
// Adding a property should change NumObjCPropertyAttrsBits
|
||||
// Also, don't forget to update the Clang C API at CXObjCPropertyAttrKind and
|
||||
// clang_Cursor_getObjCPropertyAttributes.
|
||||
};
|
||||
} // namespace ObjCPropertyAttribute::Kind
|
||||
|
||||
enum {
|
||||
/// Number of bits fitting all the property attributes.
|
||||
NumObjCPropertyAttrsBits = 16
|
||||
};
|
||||
|
||||
} // namespace clang
|
||||
|
||||
#endif // LLVM_CLANG_AST_DECLOBJC_COMMON_H
|
@ -23,6 +23,7 @@
|
||||
#define LLVM_CLANG_SEMA_DECLSPEC_H
|
||||
|
||||
#include "clang/AST/DeclCXX.h"
|
||||
#include "clang/AST/DeclObjCCommon.h"
|
||||
#include "clang/AST/NestedNameSpecifier.h"
|
||||
#include "clang/Basic/ExceptionSpecificationType.h"
|
||||
#include "clang/Basic/Lambda.h"
|
||||
@ -841,31 +842,10 @@ public:
|
||||
DQ_CSNullability = 0x40
|
||||
};
|
||||
|
||||
/// PropertyAttributeKind - list of property attributes.
|
||||
/// Keep this list in sync with LLVM's Dwarf.h ApplePropertyAttributes.
|
||||
enum ObjCPropertyAttributeKind {
|
||||
DQ_PR_noattr = 0x0,
|
||||
DQ_PR_readonly = 0x01,
|
||||
DQ_PR_getter = 0x02,
|
||||
DQ_PR_assign = 0x04,
|
||||
DQ_PR_readwrite = 0x08,
|
||||
DQ_PR_retain = 0x10,
|
||||
DQ_PR_copy = 0x20,
|
||||
DQ_PR_nonatomic = 0x40,
|
||||
DQ_PR_setter = 0x80,
|
||||
DQ_PR_atomic = 0x100,
|
||||
DQ_PR_weak = 0x200,
|
||||
DQ_PR_strong = 0x400,
|
||||
DQ_PR_unsafe_unretained = 0x800,
|
||||
DQ_PR_nullability = 0x1000,
|
||||
DQ_PR_null_resettable = 0x2000,
|
||||
DQ_PR_class = 0x4000,
|
||||
DQ_PR_direct = 0x8000,
|
||||
};
|
||||
|
||||
ObjCDeclSpec()
|
||||
: objcDeclQualifier(DQ_None), PropertyAttributes(DQ_PR_noattr),
|
||||
Nullability(0), GetterName(nullptr), SetterName(nullptr) { }
|
||||
: objcDeclQualifier(DQ_None),
|
||||
PropertyAttributes(ObjCPropertyAttribute::kind_noattr), Nullability(0),
|
||||
GetterName(nullptr), SetterName(nullptr) {}
|
||||
|
||||
ObjCDeclQualifier getObjCDeclQualifier() const {
|
||||
return (ObjCDeclQualifier)objcDeclQualifier;
|
||||
@ -877,32 +857,35 @@ public:
|
||||
objcDeclQualifier = (ObjCDeclQualifier) (objcDeclQualifier & ~DQVal);
|
||||
}
|
||||
|
||||
ObjCPropertyAttributeKind getPropertyAttributes() const {
|
||||
return ObjCPropertyAttributeKind(PropertyAttributes);
|
||||
ObjCPropertyAttribute::Kind getPropertyAttributes() const {
|
||||
return ObjCPropertyAttribute::Kind(PropertyAttributes);
|
||||
}
|
||||
void setPropertyAttributes(ObjCPropertyAttributeKind PRVal) {
|
||||
void setPropertyAttributes(ObjCPropertyAttribute::Kind PRVal) {
|
||||
PropertyAttributes =
|
||||
(ObjCPropertyAttributeKind)(PropertyAttributes | PRVal);
|
||||
(ObjCPropertyAttribute::Kind)(PropertyAttributes | PRVal);
|
||||
}
|
||||
|
||||
NullabilityKind getNullability() const {
|
||||
assert(((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & DQ_PR_nullability)) &&
|
||||
"Objective-C declspec doesn't have nullability");
|
||||
assert(
|
||||
((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)) &&
|
||||
"Objective-C declspec doesn't have nullability");
|
||||
return static_cast<NullabilityKind>(Nullability);
|
||||
}
|
||||
|
||||
SourceLocation getNullabilityLoc() const {
|
||||
assert(((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & DQ_PR_nullability)) &&
|
||||
"Objective-C declspec doesn't have nullability");
|
||||
assert(
|
||||
((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)) &&
|
||||
"Objective-C declspec doesn't have nullability");
|
||||
return NullabilityLoc;
|
||||
}
|
||||
|
||||
void setNullability(SourceLocation loc, NullabilityKind kind) {
|
||||
assert(((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & DQ_PR_nullability)) &&
|
||||
"Set the nullability declspec or property attribute first");
|
||||
assert(
|
||||
((getObjCDeclQualifier() & DQ_CSNullability) ||
|
||||
(getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)) &&
|
||||
"Set the nullability declspec or property attribute first");
|
||||
Nullability = static_cast<unsigned>(kind);
|
||||
NullabilityLoc = loc;
|
||||
}
|
||||
@ -929,8 +912,8 @@ private:
|
||||
// (space saving is negligible).
|
||||
unsigned objcDeclQualifier : 7;
|
||||
|
||||
// NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttributeKind
|
||||
unsigned PropertyAttributes : 16;
|
||||
// NOTE: VC++ treats enums as signed, avoid using ObjCPropertyAttribute::Kind
|
||||
unsigned PropertyAttributes : NumObjCPropertyAttrsBits;
|
||||
|
||||
unsigned Nullability : 2;
|
||||
|
||||
|
@ -231,8 +231,7 @@ static void checkAllAtProps(MigrationContext &MigrateCtx,
|
||||
|
||||
SmallVector<std::pair<AttributedTypeLoc, ObjCPropertyDecl *>, 4> ATLs;
|
||||
bool hasWeak = false, hasStrong = false;
|
||||
ObjCPropertyDecl::PropertyAttributeKind
|
||||
Attrs = ObjCPropertyDecl::OBJC_PR_noattr;
|
||||
ObjCPropertyAttribute::Kind Attrs = ObjCPropertyAttribute::kind_noattr;
|
||||
for (IndivPropsTy::iterator
|
||||
PI = IndProps.begin(), PE = IndProps.end(); PI != PE; ++PI) {
|
||||
ObjCPropertyDecl *PD = *PI;
|
||||
@ -274,7 +273,7 @@ static void checkAllAtProps(MigrationContext &MigrateCtx,
|
||||
else
|
||||
toAttr = "unsafe_unretained";
|
||||
}
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_assign)
|
||||
MigrateCtx.rewritePropertyAttribute("assign", toAttr, AtLoc);
|
||||
else
|
||||
MigrateCtx.addPropertyAttribute(toAttr, AtLoc);
|
||||
@ -302,8 +301,8 @@ static void checkAllProps(MigrationContext &MigrateCtx,
|
||||
for (unsigned i = 0, e = AllProps.size(); i != e; ++i) {
|
||||
ObjCPropertyDecl *PD = AllProps[i];
|
||||
if (PD->getPropertyAttributesAsWritten() &
|
||||
(ObjCPropertyDecl::OBJC_PR_assign |
|
||||
ObjCPropertyDecl::OBJC_PR_readonly)) {
|
||||
(ObjCPropertyAttribute::kind_assign |
|
||||
ObjCPropertyAttribute::kind_readonly)) {
|
||||
SourceLocation AtLoc = PD->getAtLoc();
|
||||
if (AtLoc.isInvalid())
|
||||
continue;
|
||||
|
@ -168,22 +168,22 @@ private:
|
||||
}
|
||||
|
||||
void rewriteProperty(PropsTy &props, SourceLocation atLoc) {
|
||||
ObjCPropertyDecl::PropertyAttributeKind propAttrs = getPropertyAttrs(props);
|
||||
ObjCPropertyAttribute::Kind propAttrs = getPropertyAttrs(props);
|
||||
|
||||
if (propAttrs & (ObjCPropertyDecl::OBJC_PR_copy |
|
||||
ObjCPropertyDecl::OBJC_PR_unsafe_unretained |
|
||||
ObjCPropertyDecl::OBJC_PR_strong |
|
||||
ObjCPropertyDecl::OBJC_PR_weak))
|
||||
if (propAttrs &
|
||||
(ObjCPropertyAttribute::kind_copy |
|
||||
ObjCPropertyAttribute::kind_unsafe_unretained |
|
||||
ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak))
|
||||
return;
|
||||
|
||||
if (propAttrs & ObjCPropertyDecl::OBJC_PR_retain) {
|
||||
if (propAttrs & ObjCPropertyAttribute::kind_retain) {
|
||||
// strong is the default.
|
||||
return doPropAction(PropAction_RetainReplacedWithStrong, props, atLoc);
|
||||
}
|
||||
|
||||
bool HasIvarAssignedAPlusOneObject = hasIvarAssignedAPlusOneObject(props);
|
||||
|
||||
if (propAttrs & ObjCPropertyDecl::OBJC_PR_assign) {
|
||||
if (propAttrs & ObjCPropertyAttribute::kind_assign) {
|
||||
if (HasIvarAssignedAPlusOneObject)
|
||||
return doPropAction(PropAction_AssignRemoved, props, atLoc);
|
||||
return doPropAction(PropAction_AssignRewritten, props, atLoc);
|
||||
@ -354,11 +354,10 @@ private:
|
||||
return ty;
|
||||
}
|
||||
|
||||
ObjCPropertyDecl::PropertyAttributeKind
|
||||
getPropertyAttrs(PropsTy &props) const {
|
||||
ObjCPropertyAttribute::Kind getPropertyAttrs(PropsTy &props) const {
|
||||
assert(!props.empty());
|
||||
ObjCPropertyDecl::PropertyAttributeKind
|
||||
attrs = props[0].PropD->getPropertyAttributesAsWritten();
|
||||
ObjCPropertyAttribute::Kind attrs =
|
||||
props[0].PropD->getPropertyAttributesAsWritten();
|
||||
|
||||
#ifndef NDEBUG
|
||||
for (PropsTy::iterator I = props.begin(), E = props.end(); I != E; ++I)
|
||||
|
@ -118,13 +118,11 @@ public:
|
||||
ObjCPropertyDecl *PD = PID->getPropertyDecl();
|
||||
ObjCMethodDecl *setterM = PD->getSetterMethodDecl();
|
||||
if (!(setterM && setterM->isDefined())) {
|
||||
ObjCPropertyDecl::PropertyAttributeKind AttrKind =
|
||||
PD->getPropertyAttributes();
|
||||
if (AttrKind &
|
||||
(ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_copy |
|
||||
ObjCPropertyDecl::OBJC_PR_strong))
|
||||
SynthesizedProperties[PD] = PID;
|
||||
ObjCPropertyAttribute::Kind AttrKind = PD->getPropertyAttributes();
|
||||
if (AttrKind & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_copy |
|
||||
ObjCPropertyAttribute::kind_strong))
|
||||
SynthesizedProperties[PD] = PID;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6770,11 +6770,11 @@ ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
|
||||
|
||||
if (PD->isReadOnly()) {
|
||||
S += ",R";
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy)
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_copy)
|
||||
S += ",C";
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain)
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_retain)
|
||||
S += ",&";
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak)
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak)
|
||||
S += ",W";
|
||||
} else {
|
||||
switch (PD->getSetterKind()) {
|
||||
@ -6790,15 +6790,15 @@ ASTContext::getObjCEncodingForPropertyDecl(const ObjCPropertyDecl *PD,
|
||||
if (Dynamic)
|
||||
S += ",D";
|
||||
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_nonatomic)
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_nonatomic)
|
||||
S += ",N";
|
||||
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_getter) {
|
||||
S += ",G";
|
||||
S += PD->getGetterName().getAsString();
|
||||
}
|
||||
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
|
||||
if (PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_setter) {
|
||||
S += ",S";
|
||||
S += PD->getSetterName().getAsString();
|
||||
}
|
||||
|
@ -146,7 +146,8 @@ bool ObjCContainerDecl::HasUserDeclaredSetterMethod(
|
||||
// auto-synthesized).
|
||||
for (const auto *P : Cat->properties())
|
||||
if (P->getIdentifier() == Property->getIdentifier()) {
|
||||
if (P->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_readwrite)
|
||||
if (P->getPropertyAttributes() &
|
||||
ObjCPropertyAttribute::kind_readwrite)
|
||||
return true;
|
||||
break;
|
||||
}
|
||||
|
@ -1428,85 +1428,83 @@ void DeclPrinter::VisitObjCPropertyDecl(ObjCPropertyDecl *PDecl) {
|
||||
QualType T = PDecl->getType();
|
||||
|
||||
Out << "@property";
|
||||
if (PDecl->getPropertyAttributes() != ObjCPropertyDecl::OBJC_PR_noattr) {
|
||||
if (PDecl->getPropertyAttributes() != ObjCPropertyAttribute::kind_noattr) {
|
||||
bool first = true;
|
||||
Out << "(";
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_class) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_class) {
|
||||
Out << (first ? "" : ", ") << "class";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_direct) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_direct) {
|
||||
Out << (first ? "" : ", ") << "direct";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_nonatomic) {
|
||||
ObjCPropertyAttribute::kind_nonatomic) {
|
||||
Out << (first ? "" : ", ") << "nonatomic";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_atomic) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic) {
|
||||
Out << (first ? "" : ", ") << "atomic";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_assign) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_assign) {
|
||||
Out << (first ? "" : ", ") << "assign";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_retain) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_retain) {
|
||||
Out << (first ? "" : ", ") << "retain";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_strong) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_strong) {
|
||||
Out << (first ? "" : ", ") << "strong";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_copy) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_copy) {
|
||||
Out << (first ? "" : ", ") << "copy";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak) {
|
||||
Out << (first ? "" : ", ") << "weak";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes()
|
||||
& ObjCPropertyDecl::OBJC_PR_unsafe_unretained) {
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyAttribute::kind_unsafe_unretained) {
|
||||
Out << (first ? "" : ", ") << "unsafe_unretained";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_readwrite) {
|
||||
ObjCPropertyAttribute::kind_readwrite) {
|
||||
Out << (first ? "" : ", ") << "readwrite";
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_readonly) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_readonly) {
|
||||
Out << (first ? "" : ", ") << "readonly";
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_getter) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_getter) {
|
||||
Out << (first ? "" : ", ") << "getter = ";
|
||||
PDecl->getGetterName().print(Out);
|
||||
first = false;
|
||||
}
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter) {
|
||||
if (PDecl->getPropertyAttributes() & ObjCPropertyAttribute::kind_setter) {
|
||||
Out << (first ? "" : ", ") << "setter = ";
|
||||
PDecl->getSetterName().print(Out);
|
||||
first = false;
|
||||
}
|
||||
|
||||
if (PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_nullability) {
|
||||
ObjCPropertyAttribute::kind_nullability) {
|
||||
if (auto nullability = AttributedType::stripOuterNullability(T)) {
|
||||
if (*nullability == NullabilityKind::Unspecified &&
|
||||
(PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyDecl::OBJC_PR_null_resettable)) {
|
||||
ObjCPropertyAttribute::kind_null_resettable)) {
|
||||
Out << (first ? "" : ", ") << "null_resettable";
|
||||
} else {
|
||||
Out << (first ? "" : ", ")
|
||||
|
@ -999,31 +999,32 @@ void JSONNodeDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
|
||||
case ObjCPropertyDecl::Optional: JOS.attribute("control", "optional"); break;
|
||||
}
|
||||
|
||||
ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
|
||||
if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
|
||||
ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
|
||||
if (Attrs != ObjCPropertyAttribute::kind_noattr) {
|
||||
if (Attrs & ObjCPropertyAttribute::kind_getter)
|
||||
JOS.attribute("getter", createBareDeclRef(D->getGetterMethodDecl()));
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_setter)
|
||||
JOS.attribute("setter", createBareDeclRef(D->getSetterMethodDecl()));
|
||||
attributeOnlyIfTrue("readonly", Attrs & ObjCPropertyDecl::OBJC_PR_readonly);
|
||||
attributeOnlyIfTrue("assign", Attrs & ObjCPropertyDecl::OBJC_PR_assign);
|
||||
attributeOnlyIfTrue("readonly",
|
||||
Attrs & ObjCPropertyAttribute::kind_readonly);
|
||||
attributeOnlyIfTrue("assign", Attrs & ObjCPropertyAttribute::kind_assign);
|
||||
attributeOnlyIfTrue("readwrite",
|
||||
Attrs & ObjCPropertyDecl::OBJC_PR_readwrite);
|
||||
attributeOnlyIfTrue("retain", Attrs & ObjCPropertyDecl::OBJC_PR_retain);
|
||||
attributeOnlyIfTrue("copy", Attrs & ObjCPropertyDecl::OBJC_PR_copy);
|
||||
Attrs & ObjCPropertyAttribute::kind_readwrite);
|
||||
attributeOnlyIfTrue("retain", Attrs & ObjCPropertyAttribute::kind_retain);
|
||||
attributeOnlyIfTrue("copy", Attrs & ObjCPropertyAttribute::kind_copy);
|
||||
attributeOnlyIfTrue("nonatomic",
|
||||
Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic);
|
||||
attributeOnlyIfTrue("atomic", Attrs & ObjCPropertyDecl::OBJC_PR_atomic);
|
||||
attributeOnlyIfTrue("weak", Attrs & ObjCPropertyDecl::OBJC_PR_weak);
|
||||
attributeOnlyIfTrue("strong", Attrs & ObjCPropertyDecl::OBJC_PR_strong);
|
||||
Attrs & ObjCPropertyAttribute::kind_nonatomic);
|
||||
attributeOnlyIfTrue("atomic", Attrs & ObjCPropertyAttribute::kind_atomic);
|
||||
attributeOnlyIfTrue("weak", Attrs & ObjCPropertyAttribute::kind_weak);
|
||||
attributeOnlyIfTrue("strong", Attrs & ObjCPropertyAttribute::kind_strong);
|
||||
attributeOnlyIfTrue("unsafe_unretained",
|
||||
Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained);
|
||||
attributeOnlyIfTrue("class", Attrs & ObjCPropertyDecl::OBJC_PR_class);
|
||||
attributeOnlyIfTrue("direct", Attrs & ObjCPropertyDecl::OBJC_PR_direct);
|
||||
Attrs & ObjCPropertyAttribute::kind_unsafe_unretained);
|
||||
attributeOnlyIfTrue("class", Attrs & ObjCPropertyAttribute::kind_class);
|
||||
attributeOnlyIfTrue("direct", Attrs & ObjCPropertyAttribute::kind_direct);
|
||||
attributeOnlyIfTrue("nullability",
|
||||
Attrs & ObjCPropertyDecl::OBJC_PR_nullability);
|
||||
Attrs & ObjCPropertyAttribute::kind_nullability);
|
||||
attributeOnlyIfTrue("null_resettable",
|
||||
Attrs & ObjCPropertyDecl::OBJC_PR_null_resettable);
|
||||
Attrs & ObjCPropertyAttribute::kind_null_resettable);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1958,35 +1958,35 @@ void TextNodeDumper::VisitObjCPropertyDecl(const ObjCPropertyDecl *D) {
|
||||
else if (D->getPropertyImplementation() == ObjCPropertyDecl::Optional)
|
||||
OS << " optional";
|
||||
|
||||
ObjCPropertyDecl::PropertyAttributeKind Attrs = D->getPropertyAttributes();
|
||||
if (Attrs != ObjCPropertyDecl::OBJC_PR_noattr) {
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_readonly)
|
||||
ObjCPropertyAttribute::Kind Attrs = D->getPropertyAttributes();
|
||||
if (Attrs != ObjCPropertyAttribute::kind_noattr) {
|
||||
if (Attrs & ObjCPropertyAttribute::kind_readonly)
|
||||
OS << " readonly";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_assign)
|
||||
OS << " assign";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_readwrite)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_readwrite)
|
||||
OS << " readwrite";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_retain)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_retain)
|
||||
OS << " retain";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_copy)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_copy)
|
||||
OS << " copy";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_nonatomic)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_nonatomic)
|
||||
OS << " nonatomic";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_atomic)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_atomic)
|
||||
OS << " atomic";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_weak)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_weak)
|
||||
OS << " weak";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_strong)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_strong)
|
||||
OS << " strong";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_unsafe_unretained)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_unsafe_unretained)
|
||||
OS << " unsafe_unretained";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_class)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_class)
|
||||
OS << " class";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_direct)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_direct)
|
||||
OS << " direct";
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_getter)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_getter)
|
||||
dumpDeclRef(D->getGetterMethodDecl(), "getter");
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_setter)
|
||||
if (Attrs & ObjCPropertyAttribute::kind_setter)
|
||||
dumpDeclRef(D->getSetterMethodDecl(), "setter");
|
||||
}
|
||||
}
|
||||
|
@ -762,7 +762,7 @@ static Stmt *createObjCPropertyGetter(ASTContext &Ctx,
|
||||
return nullptr;
|
||||
|
||||
// Ignore weak variables, which have special behavior.
|
||||
if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak)
|
||||
if (Prop->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak)
|
||||
return nullptr;
|
||||
|
||||
// Look to see if Sema has synthesized a body for us. This happens in
|
||||
|
@ -3505,7 +3505,7 @@ CodeGenFunction::GenerateObjCAtomicSetterCopyHelperFunction(
|
||||
if (!Ty->isRecordType())
|
||||
return nullptr;
|
||||
const ObjCPropertyDecl *PD = PID->getPropertyDecl();
|
||||
if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic)))
|
||||
if ((!(PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic)))
|
||||
return nullptr;
|
||||
llvm::Constant *HelperFn = nullptr;
|
||||
if (hasTrivialSetExpr(PID))
|
||||
@ -3589,7 +3589,7 @@ CodeGenFunction::GenerateObjCAtomicGetterCopyHelperFunction(
|
||||
QualType Ty = PD->getType();
|
||||
if (!Ty->isRecordType())
|
||||
return nullptr;
|
||||
if ((!(PD->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_atomic)))
|
||||
if ((!(PD->getPropertyAttributes() & ObjCPropertyAttribute::kind_atomic)))
|
||||
return nullptr;
|
||||
llvm::Constant *HelperFn = nullptr;
|
||||
if (hasTrivialGetExpr(PID))
|
||||
|
@ -255,11 +255,11 @@ protected:
|
||||
isDynamic=true) {
|
||||
int attrs = property->getPropertyAttributes();
|
||||
// For read-only properties, clear the copy and retain flags
|
||||
if (attrs & ObjCPropertyDecl::OBJC_PR_readonly) {
|
||||
attrs &= ~ObjCPropertyDecl::OBJC_PR_copy;
|
||||
attrs &= ~ObjCPropertyDecl::OBJC_PR_retain;
|
||||
attrs &= ~ObjCPropertyDecl::OBJC_PR_weak;
|
||||
attrs &= ~ObjCPropertyDecl::OBJC_PR_strong;
|
||||
if (attrs & ObjCPropertyAttribute::kind_readonly) {
|
||||
attrs &= ~ObjCPropertyAttribute::kind_copy;
|
||||
attrs &= ~ObjCPropertyAttribute::kind_retain;
|
||||
attrs &= ~ObjCPropertyAttribute::kind_weak;
|
||||
attrs &= ~ObjCPropertyAttribute::kind_strong;
|
||||
}
|
||||
// The first flags field has the same attribute values as clang uses internally
|
||||
Fields.addInt(Int8Ty, attrs & 0xff);
|
||||
|
@ -941,9 +941,10 @@ void RewriteModernObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
|
||||
unsigned Attributes = PD->getPropertyAttributes();
|
||||
if (mustSynthesizeSetterGetterMethod(IMD, PD, true /*getter*/)) {
|
||||
bool GenGetProperty = !(Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic) &&
|
||||
(Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_copy));
|
||||
bool GenGetProperty =
|
||||
!(Attributes & ObjCPropertyAttribute::kind_nonatomic) &&
|
||||
(Attributes & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_copy));
|
||||
std::string Getr;
|
||||
if (GenGetProperty && !objcGetPropertyDefined) {
|
||||
objcGetPropertyDefined = true;
|
||||
@ -1002,8 +1003,8 @@ void RewriteModernObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
|
||||
// Generate the 'setter' function.
|
||||
std::string Setr;
|
||||
bool GenSetProperty = Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_copy);
|
||||
bool GenSetProperty = Attributes & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_copy);
|
||||
if (GenSetProperty && !objcSetPropertyDefined) {
|
||||
objcSetPropertyDefined = true;
|
||||
// FIXME. Is this attribute correct in all cases?
|
||||
@ -1022,11 +1023,11 @@ void RewriteModernObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
Setr += ", (id)";
|
||||
Setr += PD->getName();
|
||||
Setr += ", ";
|
||||
if (Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic)
|
||||
if (Attributes & ObjCPropertyAttribute::kind_nonatomic)
|
||||
Setr += "0, ";
|
||||
else
|
||||
Setr += "1, ";
|
||||
if (Attributes & ObjCPropertyDecl::OBJC_PR_copy)
|
||||
if (Attributes & ObjCPropertyAttribute::kind_copy)
|
||||
Setr += "1)";
|
||||
else
|
||||
Setr += "0)";
|
||||
|
@ -789,9 +789,10 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
|
||||
unsigned Attributes = PD->getPropertyAttributes();
|
||||
if (PID->getGetterMethodDecl() && !PID->getGetterMethodDecl()->isDefined()) {
|
||||
bool GenGetProperty = !(Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic) &&
|
||||
(Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_copy));
|
||||
bool GenGetProperty =
|
||||
!(Attributes & ObjCPropertyAttribute::kind_nonatomic) &&
|
||||
(Attributes & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_copy));
|
||||
std::string Getr;
|
||||
if (GenGetProperty && !objcGetPropertyDefined) {
|
||||
objcGetPropertyDefined = true;
|
||||
@ -850,8 +851,8 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
|
||||
// Generate the 'setter' function.
|
||||
std::string Setr;
|
||||
bool GenSetProperty = Attributes & (ObjCPropertyDecl::OBJC_PR_retain |
|
||||
ObjCPropertyDecl::OBJC_PR_copy);
|
||||
bool GenSetProperty = Attributes & (ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_copy);
|
||||
if (GenSetProperty && !objcSetPropertyDefined) {
|
||||
objcSetPropertyDefined = true;
|
||||
// FIXME. Is this attribute correct in all cases?
|
||||
@ -870,11 +871,11 @@ void RewriteObjC::RewritePropertyImplDecl(ObjCPropertyImplDecl *PID,
|
||||
Setr += ", (id)";
|
||||
Setr += PD->getName();
|
||||
Setr += ", ";
|
||||
if (Attributes & ObjCPropertyDecl::OBJC_PR_nonatomic)
|
||||
if (Attributes & ObjCPropertyAttribute::kind_nonatomic)
|
||||
Setr += "0, ";
|
||||
else
|
||||
Setr += "1, ";
|
||||
if (Attributes & ObjCPropertyDecl::OBJC_PR_copy)
|
||||
if (Attributes & ObjCPropertyAttribute::kind_copy)
|
||||
Setr += "1)";
|
||||
else
|
||||
Setr += "0)";
|
||||
|
@ -740,7 +740,8 @@ void Parser::ParseObjCInterfaceDeclList(tok::ObjCKeywordKind contextKey,
|
||||
|
||||
// Map a nullability property attribute to a context-sensitive keyword
|
||||
// attribute.
|
||||
if (OCDS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability)
|
||||
if (OCDS.getPropertyAttributes() &
|
||||
ObjCPropertyAttribute::kind_nullability)
|
||||
addContextSensitiveTypeNullability(*this, FD.D, OCDS.getNullability(),
|
||||
OCDS.getNullabilityLoc(),
|
||||
addedToDeclSpec);
|
||||
@ -860,25 +861,25 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
|
||||
SourceLocation AttrName = ConsumeToken(); // consume last attribute name
|
||||
|
||||
if (II->isStr("readonly"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readonly);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_readonly);
|
||||
else if (II->isStr("assign"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_assign);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_assign);
|
||||
else if (II->isStr("unsafe_unretained"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_unsafe_unretained);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_unsafe_unretained);
|
||||
else if (II->isStr("readwrite"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_readwrite);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_readwrite);
|
||||
else if (II->isStr("retain"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_retain);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_retain);
|
||||
else if (II->isStr("strong"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_strong);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_strong);
|
||||
else if (II->isStr("copy"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_copy);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_copy);
|
||||
else if (II->isStr("nonatomic"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nonatomic);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_nonatomic);
|
||||
else if (II->isStr("atomic"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_atomic);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_atomic);
|
||||
else if (II->isStr("weak"))
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_weak);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_weak);
|
||||
else if (II->isStr("getter") || II->isStr("setter")) {
|
||||
bool IsSetter = II->getNameStart()[0] == 's';
|
||||
|
||||
@ -910,7 +911,7 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
|
||||
}
|
||||
|
||||
if (IsSetter) {
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_setter);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_setter);
|
||||
DS.setSetterName(SelIdent, SelLoc);
|
||||
|
||||
if (ExpectAndConsume(tok::colon,
|
||||
@ -919,44 +920,44 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_getter);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_getter);
|
||||
DS.setGetterName(SelIdent, SelLoc);
|
||||
}
|
||||
} else if (II->isStr("nonnull")) {
|
||||
if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability)
|
||||
if (DS.getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)
|
||||
diagnoseRedundantPropertyNullability(*this, DS,
|
||||
NullabilityKind::NonNull,
|
||||
Tok.getLocation());
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nullability);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_nullability);
|
||||
DS.setNullability(Tok.getLocation(), NullabilityKind::NonNull);
|
||||
} else if (II->isStr("nullable")) {
|
||||
if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability)
|
||||
if (DS.getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)
|
||||
diagnoseRedundantPropertyNullability(*this, DS,
|
||||
NullabilityKind::Nullable,
|
||||
Tok.getLocation());
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nullability);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_nullability);
|
||||
DS.setNullability(Tok.getLocation(), NullabilityKind::Nullable);
|
||||
} else if (II->isStr("null_unspecified")) {
|
||||
if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability)
|
||||
if (DS.getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)
|
||||
diagnoseRedundantPropertyNullability(*this, DS,
|
||||
NullabilityKind::Unspecified,
|
||||
Tok.getLocation());
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nullability);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_nullability);
|
||||
DS.setNullability(Tok.getLocation(), NullabilityKind::Unspecified);
|
||||
} else if (II->isStr("null_resettable")) {
|
||||
if (DS.getPropertyAttributes() & ObjCDeclSpec::DQ_PR_nullability)
|
||||
if (DS.getPropertyAttributes() & ObjCPropertyAttribute::kind_nullability)
|
||||
diagnoseRedundantPropertyNullability(*this, DS,
|
||||
NullabilityKind::Unspecified,
|
||||
Tok.getLocation());
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_nullability);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_nullability);
|
||||
DS.setNullability(Tok.getLocation(), NullabilityKind::Unspecified);
|
||||
|
||||
// Also set the null_resettable bit.
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_null_resettable);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_null_resettable);
|
||||
} else if (II->isStr("class")) {
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_class);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_class);
|
||||
} else if (II->isStr("direct")) {
|
||||
DS.setPropertyAttributes(ObjCDeclSpec::DQ_PR_direct);
|
||||
DS.setPropertyAttributes(ObjCPropertyAttribute::kind_direct);
|
||||
} else {
|
||||
Diag(AttrName, diag::err_objc_expected_property_attr) << II;
|
||||
SkipUntil(tok::r_paren, StopAtSemi);
|
||||
|
@ -13917,12 +13917,12 @@ void Sema::checkUnsafeExprAssigns(SourceLocation Loc,
|
||||
return;
|
||||
|
||||
unsigned Attributes = PD->getPropertyAttributes();
|
||||
if (Attributes & ObjCPropertyDecl::OBJC_PR_assign) {
|
||||
if (Attributes & ObjCPropertyAttribute::kind_assign) {
|
||||
// when 'assign' attribute was not explicitly specified
|
||||
// by user, ignore it and rely on property type itself
|
||||
// for lifetime info.
|
||||
unsigned AsWrittenAttr = PD->getPropertyAttributesAsWritten();
|
||||
if (!(AsWrittenAttr & ObjCPropertyDecl::OBJC_PR_assign) &&
|
||||
if (!(AsWrittenAttr & ObjCPropertyAttribute::kind_assign) &&
|
||||
LHSType->isObjCRetainableType())
|
||||
return;
|
||||
|
||||
@ -13934,8 +13934,7 @@ void Sema::checkUnsafeExprAssigns(SourceLocation Loc,
|
||||
}
|
||||
RHS = cast->getSubExpr();
|
||||
}
|
||||
}
|
||||
else if (Attributes & ObjCPropertyDecl::OBJC_PR_weak) {
|
||||
} else if (Attributes & ObjCPropertyAttribute::kind_weak) {
|
||||
if (checkUnsafeAssignObject(*this, Loc, Qualifiers::OCL_Weak, RHS, true))
|
||||
return;
|
||||
}
|
||||
|
@ -6513,22 +6513,24 @@ static bool ObjCPropertyFlagConflicts(unsigned Attributes, unsigned NewFlag) {
|
||||
Attributes |= NewFlag;
|
||||
|
||||
// Check for collisions with "readonly".
|
||||
if ((Attributes & ObjCDeclSpec::DQ_PR_readonly) &&
|
||||
(Attributes & ObjCDeclSpec::DQ_PR_readwrite))
|
||||
if ((Attributes & ObjCPropertyAttribute::kind_readonly) &&
|
||||
(Attributes & ObjCPropertyAttribute::kind_readwrite))
|
||||
return true;
|
||||
|
||||
// Check for more than one of { assign, copy, retain, strong, weak }.
|
||||
unsigned AssignCopyRetMask =
|
||||
Attributes &
|
||||
(ObjCDeclSpec::DQ_PR_assign | ObjCDeclSpec::DQ_PR_unsafe_unretained |
|
||||
ObjCDeclSpec::DQ_PR_copy | ObjCDeclSpec::DQ_PR_retain |
|
||||
ObjCDeclSpec::DQ_PR_strong | ObjCDeclSpec::DQ_PR_weak);
|
||||
if (AssignCopyRetMask && AssignCopyRetMask != ObjCDeclSpec::DQ_PR_assign &&
|
||||
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_unsafe_unretained &&
|
||||
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_copy &&
|
||||
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_retain &&
|
||||
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_strong &&
|
||||
AssignCopyRetMask != ObjCDeclSpec::DQ_PR_weak)
|
||||
(ObjCPropertyAttribute::kind_assign |
|
||||
ObjCPropertyAttribute::kind_unsafe_unretained |
|
||||
ObjCPropertyAttribute::kind_copy | ObjCPropertyAttribute::kind_retain |
|
||||
ObjCPropertyAttribute::kind_strong | ObjCPropertyAttribute::kind_weak);
|
||||
if (AssignCopyRetMask &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_assign &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_unsafe_unretained &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_copy &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_retain &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_strong &&
|
||||
AssignCopyRetMask != ObjCPropertyAttribute::kind_weak)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
@ -6544,32 +6546,41 @@ void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
|
||||
CodeCompleter->getCodeCompletionTUInfo(),
|
||||
CodeCompletionContext::CCC_Other);
|
||||
Results.EnterNewScope();
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readonly))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_readonly))
|
||||
Results.AddResult(CodeCompletionResult("readonly"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_assign))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_assign))
|
||||
Results.AddResult(CodeCompletionResult("assign"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCDeclSpec::DQ_PR_unsafe_unretained))
|
||||
ObjCPropertyAttribute::kind_unsafe_unretained))
|
||||
Results.AddResult(CodeCompletionResult("unsafe_unretained"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_readwrite))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_readwrite))
|
||||
Results.AddResult(CodeCompletionResult("readwrite"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_retain))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_retain))
|
||||
Results.AddResult(CodeCompletionResult("retain"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_strong))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_strong))
|
||||
Results.AddResult(CodeCompletionResult("strong"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_copy))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCPropertyAttribute::kind_copy))
|
||||
Results.AddResult(CodeCompletionResult("copy"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nonatomic))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_nonatomic))
|
||||
Results.AddResult(CodeCompletionResult("nonatomic"));
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_atomic))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_atomic))
|
||||
Results.AddResult(CodeCompletionResult("atomic"));
|
||||
|
||||
// Only suggest "weak" if we're compiling for ARC-with-weak-references or GC.
|
||||
if (getLangOpts().ObjCWeak || getLangOpts().getGC() != LangOptions::NonGC)
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_weak))
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_weak))
|
||||
Results.AddResult(CodeCompletionResult("weak"));
|
||||
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_setter)) {
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_setter)) {
|
||||
CodeCompletionBuilder Setter(Results.getAllocator(),
|
||||
Results.getCodeCompletionTUInfo());
|
||||
Setter.AddTypedTextChunk("setter");
|
||||
@ -6577,7 +6588,8 @@ void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
|
||||
Setter.AddPlaceholderChunk("method");
|
||||
Results.AddResult(CodeCompletionResult(Setter.TakeString()));
|
||||
}
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_getter)) {
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_getter)) {
|
||||
CodeCompletionBuilder Getter(Results.getAllocator(),
|
||||
Results.getCodeCompletionTUInfo());
|
||||
Getter.AddTypedTextChunk("getter");
|
||||
@ -6585,7 +6597,8 @@ void Sema::CodeCompleteObjCPropertyFlags(Scope *S, ObjCDeclSpec &ODS) {
|
||||
Getter.AddPlaceholderChunk("method");
|
||||
Results.AddResult(CodeCompletionResult(Getter.TakeString()));
|
||||
}
|
||||
if (!ObjCPropertyFlagConflicts(Attributes, ObjCDeclSpec::DQ_PR_nullability)) {
|
||||
if (!ObjCPropertyFlagConflicts(Attributes,
|
||||
ObjCPropertyAttribute::kind_nullability)) {
|
||||
Results.AddResult(CodeCompletionResult("nonnull"));
|
||||
Results.AddResult(CodeCompletionResult("nullable"));
|
||||
Results.AddResult(CodeCompletionResult("null_unspecified"));
|
||||
|
@ -1953,7 +1953,8 @@ HandleExprPropertyRefExpr(const ObjCObjectPointerType *OPT,
|
||||
if (const ObjCPropertyDecl *PDecl = Setter->findPropertyDecl()) {
|
||||
// Do not warn if user is using property-dot syntax to make call to
|
||||
// user named setter.
|
||||
if (!(PDecl->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_setter))
|
||||
if (!(PDecl->getPropertyAttributes() &
|
||||
ObjCPropertyAttribute::kind_setter))
|
||||
Diag(MemberLoc,
|
||||
diag::warn_property_access_suggest)
|
||||
<< MemberName << QualType(OPT, 0) << PDecl->getName()
|
||||
@ -3258,7 +3259,7 @@ ExprResult Sema::BuildInstanceMessage(Expr *Receiver,
|
||||
if (!isImplicit && Method) {
|
||||
if (const ObjCPropertyDecl *Prop = Method->findPropertyDecl()) {
|
||||
bool IsWeak =
|
||||
Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak;
|
||||
Prop->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak;
|
||||
if (!IsWeak && Sel.isUnarySelector())
|
||||
IsWeak = ReturnType.getObjCLifetime() & Qualifiers::OCL_Weak;
|
||||
if (IsWeak && !isUnevaluatedContext() &&
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -580,7 +580,7 @@ bool ObjCPropertyOpBuilder::isWeakProperty() const {
|
||||
QualType T;
|
||||
if (RefExpr->isExplicitProperty()) {
|
||||
const ObjCPropertyDecl *Prop = RefExpr->getExplicitProperty();
|
||||
if (Prop->getPropertyAttributes() & ObjCPropertyDecl::OBJC_PR_weak)
|
||||
if (Prop->getPropertyAttributes() & ObjCPropertyAttribute::kind_weak)
|
||||
return true;
|
||||
|
||||
T = Prop->getType();
|
||||
|
@ -1280,10 +1280,9 @@ void ASTDeclReader::VisitObjCPropertyDecl(ObjCPropertyDecl *D) {
|
||||
QualType T = Record.readType();
|
||||
TypeSourceInfo *TSI = readTypeSourceInfo();
|
||||
D->setType(T, TSI);
|
||||
D->setPropertyAttributes(
|
||||
(ObjCPropertyDecl::PropertyAttributeKind)Record.readInt());
|
||||
D->setPropertyAttributes((ObjCPropertyAttribute::Kind)Record.readInt());
|
||||
D->setPropertyAttributesAsWritten(
|
||||
(ObjCPropertyDecl::PropertyAttributeKind)Record.readInt());
|
||||
(ObjCPropertyAttribute::Kind)Record.readInt());
|
||||
D->setPropertyImplementation(
|
||||
(ObjCPropertyDecl::PropertyControl)Record.readInt());
|
||||
DeclarationName GetterName = Record.readDeclarationName();
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "CursorVisitor.h"
|
||||
#include "clang-c/FatalErrorHandler.h"
|
||||
#include "clang/AST/Attr.h"
|
||||
#include "clang/AST/DeclObjCCommon.h"
|
||||
#include "clang/AST/Mangle.h"
|
||||
#include "clang/AST/OpenMPClause.h"
|
||||
#include "clang/AST/StmtVisitor.h"
|
||||
@ -8146,11 +8147,10 @@ unsigned clang_Cursor_getObjCPropertyAttributes(CXCursor C, unsigned reserved) {
|
||||
|
||||
unsigned Result = CXObjCPropertyAttr_noattr;
|
||||
const ObjCPropertyDecl *PD = dyn_cast<ObjCPropertyDecl>(getCursorDecl(C));
|
||||
ObjCPropertyDecl::PropertyAttributeKind Attr =
|
||||
PD->getPropertyAttributesAsWritten();
|
||||
ObjCPropertyAttribute::Kind Attr = PD->getPropertyAttributesAsWritten();
|
||||
|
||||
#define SET_CXOBJCPROP_ATTR(A) \
|
||||
if (Attr & ObjCPropertyDecl::OBJC_PR_##A) \
|
||||
if (Attr & ObjCPropertyAttribute::kind_##A) \
|
||||
Result |= CXObjCPropertyAttr_##A
|
||||
SET_CXOBJCPROP_ATTR(readonly);
|
||||
SET_CXOBJCPROP_ATTR(getter);
|
||||
|
@ -7590,7 +7590,7 @@ bool TypeSystemClang::AddObjCClassProperty(
|
||||
setter_sel = clang_ast.Selectors.getSelector(1, &setter_ident);
|
||||
}
|
||||
property_decl->setSetterName(setter_sel);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_setter);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_setter);
|
||||
|
||||
if (property_getter_name != nullptr) {
|
||||
clang::IdentifierInfo *getter_ident =
|
||||
@ -7601,33 +7601,34 @@ bool TypeSystemClang::AddObjCClassProperty(
|
||||
getter_sel = clang_ast.Selectors.getSelector(0, &getter_ident);
|
||||
}
|
||||
property_decl->setGetterName(getter_sel);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_getter);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_getter);
|
||||
|
||||
if (ivar_decl)
|
||||
property_decl->setPropertyIvarDecl(ivar_decl);
|
||||
|
||||
if (property_attributes & DW_APPLE_PROPERTY_readonly)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readonly);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_readonly);
|
||||
if (property_attributes & DW_APPLE_PROPERTY_readwrite)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_readwrite);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_readwrite);
|
||||
if (property_attributes & DW_APPLE_PROPERTY_assign)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_assign);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_assign);
|
||||
if (property_attributes & DW_APPLE_PROPERTY_retain)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_retain);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_retain);
|
||||
if (property_attributes & DW_APPLE_PROPERTY_copy)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_copy);
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_copy);
|
||||
if (property_attributes & DW_APPLE_PROPERTY_nonatomic)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nonatomic);
|
||||
if (property_attributes & ObjCPropertyDecl::OBJC_PR_nullability)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_nullability);
|
||||
if (property_attributes & ObjCPropertyDecl::OBJC_PR_null_resettable)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_nonatomic);
|
||||
if (property_attributes & ObjCPropertyAttribute::kind_nullability)
|
||||
property_decl->setPropertyAttributes(
|
||||
ObjCPropertyDecl::OBJC_PR_null_resettable);
|
||||
if (property_attributes & ObjCPropertyDecl::OBJC_PR_class)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_class);
|
||||
ObjCPropertyAttribute::kind_nullability);
|
||||
if (property_attributes & ObjCPropertyAttribute::kind_null_resettable)
|
||||
property_decl->setPropertyAttributes(
|
||||
ObjCPropertyAttribute::kind_null_resettable);
|
||||
if (property_attributes & ObjCPropertyAttribute::kind_class)
|
||||
property_decl->setPropertyAttributes(ObjCPropertyAttribute::kind_class);
|
||||
|
||||
const bool isInstance =
|
||||
(property_attributes & ObjCPropertyDecl::OBJC_PR_class) == 0;
|
||||
(property_attributes & ObjCPropertyAttribute::kind_class) == 0;
|
||||
|
||||
clang::ObjCMethodDecl *getter = nullptr;
|
||||
if (!getter_sel.isNull())
|
||||
|
@ -898,7 +898,8 @@ HANDLE_DW_CFA_PRED(0x2d, AARCH64_negate_ra_state, SELECT_AARCH64)
|
||||
HANDLE_DW_CFA_PRED(0x2e, GNU_args_size, SELECT_X86)
|
||||
|
||||
// Apple Objective-C Property Attributes.
|
||||
// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
|
||||
// Keep this list in sync with clang's DeclObjCCommon.h
|
||||
// ObjCPropertyAttribute::Kind!
|
||||
HANDLE_DW_APPLE_PROPERTY(0x01, readonly)
|
||||
HANDLE_DW_APPLE_PROPERTY(0x02, getter)
|
||||
HANDLE_DW_APPLE_PROPERTY(0x04, assign)
|
||||
|
@ -357,7 +357,8 @@ enum Constants {
|
||||
};
|
||||
|
||||
/// Constants for the DW_APPLE_PROPERTY_attributes attribute.
|
||||
/// Keep this list in sync with clang's DeclSpec.h ObjCPropertyAttributeKind!
|
||||
/// Keep this list in sync with clang's DeclObjCCommon.h
|
||||
/// ObjCPropertyAttribute::Kind!
|
||||
enum ApplePropertyAttributes {
|
||||
#define HANDLE_DW_APPLE_PROPERTY(ID, NAME) DW_APPLE_PROPERTY_##NAME = ID,
|
||||
#include "llvm/BinaryFormat/Dwarf.def"
|
||||
|
Loading…
x
Reference in New Issue
Block a user