dgoldman updated this revision to Diff 268818. dgoldman added a comment. - Fix broken diff base (due to lint fixes maybe?)
Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D81263/new/ https://reviews.llvm.org/D81263 Files: clang/lib/Sema/SemaCodeComplete.cpp clang/test/CodeCompletion/objc-member-access.m Index: clang/test/CodeCompletion/objc-member-access.m =================================================================== --- /dev/null +++ clang/test/CodeCompletion/objc-member-access.m @@ -0,0 +1,22 @@ +// Note: the run lines follow their respective tests, since line/column +// matter in this test. + +@interface TypeWithPropertiesBackedByIvars { + int _bar; + int _foo; +} +@property(nonatomic) int foo; +@property(nonatomic) int bar; +@end + +int getFoo(id object) { + TypeWithPropertiesBackedByIvars *model = (TypeWithPropertiesBackedByIvars *)object; + int foo = model.; + return foo; +} + +// RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:14:19 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s +// CHECK-CC1-NOT: [#int#]_bar +// CHECK-CC1-NOT: [#int#]_foo +// CHECK-CC1: [#int#]bar +// CHECK-CC1: [#int#]foo Index: clang/lib/Sema/SemaCodeComplete.cpp =================================================================== --- clang/lib/Sema/SemaCodeComplete.cpp +++ clang/lib/Sema/SemaCodeComplete.cpp @@ -5150,7 +5150,7 @@ CodeCompleter->getCodeCompletionTUInfo(), CCContext, &ResultBuilder::IsMember); - auto DoCompletion = [&](Expr *Base, bool IsArrow, + auto DoCompletion = [&](Expr *Base, bool IsArrow, bool IncludeObjC, Optional<FixItHint> AccessOpFixIt) -> bool { if (!Base) return false; @@ -5196,6 +5196,9 @@ } } else if (!IsArrow && BaseType->isObjCObjectPointerType()) { // Objective-C property reference. + if (!IncludeObjC) { + return false; + } AddedPropertiesSet AddedProperties; if (const ObjCObjectPointerType *ObjCPtr = @@ -5216,6 +5219,9 @@ } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || (!IsArrow && BaseType->isObjCObjectType())) { // Objective-C instance variable access. + if (!IncludeObjC) { + return false; + } ObjCInterfaceDecl *Class = nullptr; if (const ObjCObjectPointerType *ObjCPtr = BaseType->getAs<ObjCObjectPointerType>()) @@ -5239,12 +5245,18 @@ Results.EnterNewScope(); - bool CompletionSucceded = DoCompletion(Base, IsArrow, None); + bool CompletionSucceded = + DoCompletion(Base, IsArrow, /*IncludeObjC=*/true, None); + + // Fixits are only included for C++. We avoid this for Objective-C properties + // and ivars since most properties are backed by an ivar; otherwise we would + // recommend an ivar fixit when code-completing a property. Another possible + // solution would be to de-duplicate the ivar/property mixing. if (CodeCompleter->includeFixIts()) { const CharSourceRange OpRange = CharSourceRange::getTokenRange(OpLoc, OpLoc); CompletionSucceded |= DoCompletion( - OtherOpBase, !IsArrow, + OtherOpBase, !IsArrow, /*IncludeObjC=*/false, FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->")); }
Index: clang/test/CodeCompletion/objc-member-access.m =================================================================== --- /dev/null +++ clang/test/CodeCompletion/objc-member-access.m @@ -0,0 +1,22 @@ +// Note: the run lines follow their respective tests, since line/column +// matter in this test. + +@interface TypeWithPropertiesBackedByIvars { + int _bar; + int _foo; +} +@property(nonatomic) int foo; +@property(nonatomic) int bar; +@end + +int getFoo(id object) { + TypeWithPropertiesBackedByIvars *model = (TypeWithPropertiesBackedByIvars *)object; + int foo = model.; + return foo; +} + +// RUN: %clang_cc1 -fsyntax-only -code-completion-with-fixits -code-completion-at=%s:14:19 %s -o - | FileCheck -check-prefix=CHECK-CC1 %s +// CHECK-CC1-NOT: [#int#]_bar +// CHECK-CC1-NOT: [#int#]_foo +// CHECK-CC1: [#int#]bar +// CHECK-CC1: [#int#]foo Index: clang/lib/Sema/SemaCodeComplete.cpp =================================================================== --- clang/lib/Sema/SemaCodeComplete.cpp +++ clang/lib/Sema/SemaCodeComplete.cpp @@ -5150,7 +5150,7 @@ CodeCompleter->getCodeCompletionTUInfo(), CCContext, &ResultBuilder::IsMember); - auto DoCompletion = [&](Expr *Base, bool IsArrow, + auto DoCompletion = [&](Expr *Base, bool IsArrow, bool IncludeObjC, Optional<FixItHint> AccessOpFixIt) -> bool { if (!Base) return false; @@ -5196,6 +5196,9 @@ } } else if (!IsArrow && BaseType->isObjCObjectPointerType()) { // Objective-C property reference. + if (!IncludeObjC) { + return false; + } AddedPropertiesSet AddedProperties; if (const ObjCObjectPointerType *ObjCPtr = @@ -5216,6 +5219,9 @@ } else if ((IsArrow && BaseType->isObjCObjectPointerType()) || (!IsArrow && BaseType->isObjCObjectType())) { // Objective-C instance variable access. + if (!IncludeObjC) { + return false; + } ObjCInterfaceDecl *Class = nullptr; if (const ObjCObjectPointerType *ObjCPtr = BaseType->getAs<ObjCObjectPointerType>()) @@ -5239,12 +5245,18 @@ Results.EnterNewScope(); - bool CompletionSucceded = DoCompletion(Base, IsArrow, None); + bool CompletionSucceded = + DoCompletion(Base, IsArrow, /*IncludeObjC=*/true, None); + + // Fixits are only included for C++. We avoid this for Objective-C properties + // and ivars since most properties are backed by an ivar; otherwise we would + // recommend an ivar fixit when code-completing a property. Another possible + // solution would be to de-duplicate the ivar/property mixing. if (CodeCompleter->includeFixIts()) { const CharSourceRange OpRange = CharSourceRange::getTokenRange(OpLoc, OpLoc); CompletionSucceded |= DoCompletion( - OtherOpBase, !IsArrow, + OtherOpBase, !IsArrow, /*IncludeObjC=*/false, FixItHint::CreateReplacement(OpRange, IsArrow ? "." : "->")); }
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits