forked from OSchip/llvm-project
[arcmt] Integrate GC __weak into property attributes even when we don't have
the implementation. llvm-svn: 145224
This commit is contained in:
parent
a0d652e71b
commit
eca1f36a54
|
@ -261,9 +261,12 @@ static void checkAllAtProps(MigrationContext &MigrateCtx,
|
|||
|
||||
SmallVector<std::pair<AttributedTypeLoc, ObjCPropertyDecl *>, 4> ATLs;
|
||||
bool hasWeak = false, hasStrong = false;
|
||||
ObjCPropertyDecl::PropertyAttributeKind
|
||||
Attrs = ObjCPropertyDecl::OBJC_PR_noattr;
|
||||
for (IndivPropsTy::iterator
|
||||
PI = IndProps.begin(), PE = IndProps.end(); PI != PE; ++PI) {
|
||||
ObjCPropertyDecl *PD = *PI;
|
||||
Attrs = PD->getPropertyAttributesAsWritten();
|
||||
TypeSourceInfo *TInfo = PD->getTypeSourceInfo();
|
||||
if (!TInfo)
|
||||
return;
|
||||
|
@ -300,9 +303,10 @@ static void checkAllAtProps(MigrationContext &MigrateCtx,
|
|||
else
|
||||
toAttr = "unsafe_unretained";
|
||||
}
|
||||
if (!MigrateCtx.rewritePropertyAttribute("assign", toAttr, AtLoc)) {
|
||||
return;
|
||||
}
|
||||
if (Attrs & ObjCPropertyDecl::OBJC_PR_assign)
|
||||
MigrateCtx.rewritePropertyAttribute("assign", toAttr, AtLoc);
|
||||
else
|
||||
MigrateCtx.addPropertyAttribute(toAttr, AtLoc);
|
||||
}
|
||||
|
||||
for (unsigned i = 0, e = ATLs.size(); i != e; ++i) {
|
||||
|
|
|
@ -277,7 +277,7 @@ private:
|
|||
}
|
||||
|
||||
bool removeAttribute(StringRef fromAttr, SourceLocation atLoc) const {
|
||||
return rewriteAttribute(fromAttr, StringRef(), atLoc);
|
||||
return MigrateCtx.removePropertyAttribute(fromAttr, atLoc);
|
||||
}
|
||||
|
||||
bool rewriteAttribute(StringRef fromAttr, StringRef toAttr,
|
||||
|
@ -286,51 +286,7 @@ private:
|
|||
}
|
||||
|
||||
bool addAttribute(StringRef attr, SourceLocation atLoc) const {
|
||||
if (atLoc.isMacroID())
|
||||
return false;
|
||||
|
||||
SourceManager &SM = Pass.Ctx.getSourceManager();
|
||||
|
||||
// Break down the source location.
|
||||
std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(atLoc);
|
||||
|
||||
// Try to load the file buffer.
|
||||
bool invalidTemp = false;
|
||||
StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
|
||||
if (invalidTemp)
|
||||
return false;
|
||||
|
||||
const char *tokenBegin = file.data() + locInfo.second;
|
||||
|
||||
// Lex from the start of the given location.
|
||||
Lexer lexer(SM.getLocForStartOfFile(locInfo.first),
|
||||
Pass.Ctx.getLangOptions(),
|
||||
file.begin(), tokenBegin, file.end());
|
||||
Token tok;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.isNot(tok::at)) return false;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.isNot(tok::raw_identifier)) return false;
|
||||
if (StringRef(tok.getRawIdentifierData(), tok.getLength())
|
||||
!= "property")
|
||||
return false;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
|
||||
if (tok.isNot(tok::l_paren)) {
|
||||
Pass.TA.insert(tok.getLocation(), std::string("(") + attr.str() + ") ");
|
||||
return true;
|
||||
}
|
||||
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.is(tok::r_paren)) {
|
||||
Pass.TA.insert(tok.getLocation(), attr);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tok.isNot(tok::raw_identifier)) return false;
|
||||
|
||||
Pass.TA.insert(tok.getLocation(), std::string(attr) + ", ");
|
||||
return true;
|
||||
return MigrateCtx.addPropertyAttribute(attr, atLoc);
|
||||
}
|
||||
|
||||
class PlusOneAssign : public RecursiveASTVisitor<PlusOneAssign> {
|
||||
|
|
|
@ -446,6 +446,55 @@ bool MigrationContext::rewritePropertyAttribute(StringRef fromAttr,
|
|||
return false;
|
||||
}
|
||||
|
||||
bool MigrationContext::addPropertyAttribute(StringRef attr,
|
||||
SourceLocation atLoc) {
|
||||
if (atLoc.isMacroID())
|
||||
return false;
|
||||
|
||||
SourceManager &SM = Pass.Ctx.getSourceManager();
|
||||
|
||||
// Break down the source location.
|
||||
std::pair<FileID, unsigned> locInfo = SM.getDecomposedLoc(atLoc);
|
||||
|
||||
// Try to load the file buffer.
|
||||
bool invalidTemp = false;
|
||||
StringRef file = SM.getBufferData(locInfo.first, &invalidTemp);
|
||||
if (invalidTemp)
|
||||
return false;
|
||||
|
||||
const char *tokenBegin = file.data() + locInfo.second;
|
||||
|
||||
// Lex from the start of the given location.
|
||||
Lexer lexer(SM.getLocForStartOfFile(locInfo.first),
|
||||
Pass.Ctx.getLangOptions(),
|
||||
file.begin(), tokenBegin, file.end());
|
||||
Token tok;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.isNot(tok::at)) return false;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.isNot(tok::raw_identifier)) return false;
|
||||
if (StringRef(tok.getRawIdentifierData(), tok.getLength())
|
||||
!= "property")
|
||||
return false;
|
||||
lexer.LexFromRawLexer(tok);
|
||||
|
||||
if (tok.isNot(tok::l_paren)) {
|
||||
Pass.TA.insert(tok.getLocation(), std::string("(") + attr.str() + ") ");
|
||||
return true;
|
||||
}
|
||||
|
||||
lexer.LexFromRawLexer(tok);
|
||||
if (tok.is(tok::r_paren)) {
|
||||
Pass.TA.insert(tok.getLocation(), attr);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (tok.isNot(tok::raw_identifier)) return false;
|
||||
|
||||
Pass.TA.insert(tok.getLocation(), std::string(attr) + ", ");
|
||||
return true;
|
||||
}
|
||||
|
||||
void MigrationContext::traverse(TranslationUnitDecl *TU) {
|
||||
for (traverser_iterator
|
||||
I = traversers_begin(), E = traversers_end(); I != E; ++I)
|
||||
|
|
|
@ -113,8 +113,12 @@ public:
|
|||
}
|
||||
|
||||
bool isGCOwnedNonObjC(QualType T);
|
||||
bool removePropertyAttribute(StringRef fromAttr, SourceLocation atLoc) {
|
||||
return rewritePropertyAttribute(fromAttr, StringRef(), atLoc);
|
||||
}
|
||||
bool rewritePropertyAttribute(StringRef fromAttr, StringRef toAttr,
|
||||
SourceLocation atLoc);
|
||||
bool addPropertyAttribute(StringRef attr, SourceLocation atLoc);
|
||||
|
||||
void traverse(TranslationUnitDecl *TU);
|
||||
|
||||
|
|
|
@ -71,3 +71,9 @@ __attribute__((objc_arc_weak_reference_unavailable))
|
|||
id x = NSMakeCollectable(cft);
|
||||
}
|
||||
@end
|
||||
|
||||
@interface I5 {
|
||||
__weak id prop;
|
||||
}
|
||||
@property (readonly) __weak id prop;
|
||||
@end
|
||||
|
|
|
@ -66,3 +66,9 @@ __attribute__((objc_arc_weak_reference_unavailable))
|
|||
id x = CFBridgingRelease(cft);
|
||||
}
|
||||
@end
|
||||
|
||||
@interface I5 {
|
||||
__unsafe_unretained id prop;
|
||||
}
|
||||
@property (unsafe_unretained, readonly) id prop;
|
||||
@end
|
||||
|
|
Loading…
Reference in New Issue