summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorFariborz Jahanian <fjahanian@apple.com>2013-09-27 22:55:54 +0000
committerFariborz Jahanian <fjahanian@apple.com>2013-09-27 22:55:54 +0000
commit5d783df5f7224225fa0f1f0810eaec5d5555acf8 (patch)
tree02c42aa633d9691bf3ff5c83c899f40e096a3872 /clang
parente9d2396c88dfb7f6c27f9196e1ddcc4d9b57c4cb (diff)
downloadbcm5719-llvm-5d783df5f7224225fa0f1f0810eaec5d5555acf8.tar.gz
bcm5719-llvm-5d783df5f7224225fa0f1f0810eaec5d5555acf8.zip
ObjectiveC migrator. Infer property from getters only
if property name is a valid identifier in the underlying language. // rdar://15044184 llvm-svn: 191584
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/ARCMigrate/ObjCMT.cpp12
-rw-r--r--clang/test/ARCMT/objcmt-property.m4
-rw-r--r--clang/test/ARCMT/objcmt-property.m.result4
3 files changed, 19 insertions, 1 deletions
diff --git a/clang/lib/ARCMigrate/ObjCMT.cpp b/clang/lib/ARCMigrate/ObjCMT.cpp
index ca1d189ca33..71ad48f58bd 100644
--- a/clang/lib/ARCMigrate/ObjCMT.cpp
+++ b/clang/lib/ARCMigrate/ObjCMT.cpp
@@ -761,6 +761,16 @@ static bool AttributesMatch(const Decl *Decl1, const Decl *Decl2) {
return true;
}
+static bool IsValidIdentifier(ASTContext &Ctx,
+ const char *Name) {
+ if (!isIdentifierHead(Name[0]))
+ return false;
+ std::string NameString = Name;
+ NameString[0] = toLowercase(NameString[0]);
+ IdentifierInfo *II = &Ctx.Idents.get(NameString);
+ return II->getTokenID() == tok::identifier;
+}
+
bool ObjCMigrateASTConsumer::migrateProperty(ASTContext &Ctx,
ObjCContainerDecl *D,
ObjCMethodDecl *Method) {
@@ -799,7 +809,7 @@ bool ObjCMigrateASTConsumer::migrateProperty(ASTContext &Ctx,
const char *CGetterName = getterNameString.data() + LengthOfPrefix;
// Make sure that first character after "is" or "get" prefix can
// start an identifier.
- if (!isIdentifierHead(CGetterName[0]))
+ if (!IsValidIdentifier(Ctx, CGetterName))
return false;
if (CGetterName[0] && isUppercase(CGetterName[0])) {
getterName = &Ctx.Idents.get(CGetterName);
diff --git a/clang/test/ARCMT/objcmt-property.m b/clang/test/ARCMT/objcmt-property.m
index e8f4acc8e63..3de23526095 100644
--- a/clang/test/ARCMT/objcmt-property.m
+++ b/clang/test/ARCMT/objcmt-property.m
@@ -210,4 +210,8 @@ DEPRECATED
- (NSURL *)init; // No Change
+ (id)alloc; // No Change
+- (BOOL)is1stClass; // Not a valid property
+- (BOOL)isClass; // This is a valid property 'class' is not a keyword in ObjC
+- (BOOL)isDouble; // Not a valid property
+
@end
diff --git a/clang/test/ARCMT/objcmt-property.m.result b/clang/test/ARCMT/objcmt-property.m.result
index 7c674447231..a27e02ac6e5 100644
--- a/clang/test/ARCMT/objcmt-property.m.result
+++ b/clang/test/ARCMT/objcmt-property.m.result
@@ -210,4 +210,8 @@ DEPRECATED
- (NSURL *)init; // No Change
+ (id)alloc; // No Change
+- (BOOL)is1stClass; // Not a valid property
+@property (nonatomic, getter=isClass, readonly) BOOL class; // This is a valid property 'class' is not a keyword in ObjC
+- (BOOL)isDouble; // Not a valid property
+
@end
OpenPOWER on IntegriCloud