[PATCH] D81263: [Sema][CodeComplete][ObjC] Don't include arrow/dot fixits
David Goldman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Jun 8 05:58:07 PDT 2020
dgoldman updated this revision to Diff 269189.
dgoldman added a comment.
Check AccessOpFixIt.hasValue()
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.
+
+ at interface TypeWithPropertiesBackedByIvars {
+ int _bar;
+ int _foo;
+}
+ at property(nonatomic) int foo;
+ at property(nonatomic) int bar;
+ at 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
@@ -5195,7 +5195,13 @@
Results.AddResult(std::move(Result));
}
} else if (!IsArrow && BaseType->isObjCObjectPointerType()) {
- // Objective-C property reference.
+ // Objective-C property reference. Bail if we're performing fix-it code
+ // completion since we don't handle forwarding the fix-it for Objective-C
+ // objects. Since Objective-C properties are normally backed by ivars,
+ // most Objecive-C fix-its here would have little value anyways.
+ if (AccessOpFixIt.hasValue()) {
+ return false;
+ }
AddedPropertiesSet AddedProperties;
if (const ObjCObjectPointerType *ObjCPtr =
@@ -5215,7 +5221,13 @@
/*InOriginalClass*/ false);
} else if ((IsArrow && BaseType->isObjCObjectPointerType()) ||
(!IsArrow && BaseType->isObjCObjectType())) {
- // Objective-C instance variable access.
+ // Objective-C instance variable access. Bail if we're performing fix-it
+ // code completion since we don't handle forwarding the fix-it for
+ // Objective-C objects. Since Objective-C properties are normally backed
+ // by ivars, most Objecive-C fix-its here would have little value anyways.
+ if (AccessOpFixIt.hasValue()) {
+ return false;
+ }
ObjCInterfaceDecl *Class = nullptr;
if (const ObjCObjectPointerType *ObjCPtr =
BaseType->getAs<ObjCObjectPointerType>())
@@ -5240,6 +5252,11 @@
Results.EnterNewScope();
bool CompletionSucceded = DoCompletion(Base, IsArrow, 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);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D81263.269189.patch
Type: text/x-patch
Size: 3062 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200608/471428a8/attachment-0001.bin>
More information about the cfe-commits
mailing list