]> granicus.if.org Git - clang/commitdiff
Add code completion support for ObjC property declarations/attributes.
authorSteve Naroff <snaroff@apple.com>
Thu, 8 Oct 2009 21:55:05 +0000 (21:55 +0000)
committerSteve Naroff <snaroff@apple.com>
Thu, 8 Oct 2009 21:55:05 +0000 (21:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83579 91177308-0d34-0410-b5e6-96231b3b80d8

clang.xcodeproj/project.pbxproj
include/clang/Parse/Action.h
lib/Parse/ParseObjc.cpp
lib/Sema/Sema.h
lib/Sema/SemaCodeComplete.cpp
test/CodeCompletion/property.m [new file with mode: 0644]

index 26a603f19f0bbba305242e4a3e66586c5f865fd8..8c71b76100af4d33e7a1cc39939fd6f656d8ff3f 100644 (file)
                35F9B1560D1C6B2E00DDFDAE /* UninitializedValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UninitializedValues.h; path = clang/Analysis/Analyses/UninitializedValues.h; sourceTree = "<group>"; };
                35FE6BCE0DF6EE1F00739712 /* DeclBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = DeclBase.cpp; path = lib/AST/DeclBase.cpp; sourceTree = "<group>"; tabWidth = 2; };
                72D16C1E0D9975C400E6DA4A /* HTMLRewrite.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = HTMLRewrite.cpp; path = lib/Rewrite/HTMLRewrite.cpp; sourceTree = "<group>"; };
+               7F270AFE107A90010031B377 /* CodeCompleteConsumer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CodeCompleteConsumer.h; path = clang/Sema/CodeCompleteConsumer.h; sourceTree = "<group>"; };
                84AF36A00CB17A3B00C820A5 /* DeclObjC.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = DeclObjC.h; path = clang/AST/DeclObjC.h; sourceTree = "<group>"; tabWidth = 2; };
                84D9A8870C1A57E100AC7ABC /* AttributeList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.cpp.cpp; name = AttributeList.cpp; path = lib/Parse/AttributeList.cpp; sourceTree = "<group>"; tabWidth = 2; };
                84D9A88B0C1A581300AC7ABC /* AttributeList.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 2; lastKnownFileType = sourcecode.c.h; name = AttributeList.h; path = clang/Parse/AttributeList.h; sourceTree = "<group>"; tabWidth = 2; };
                DE67E7260C02108300F66BC5 /* Sema */ = {
                        isa = PBXGroup;
                        children = (
+                               7F270AFE107A90010031B377 /* CodeCompleteConsumer.h */,
                                9063F2210F9E8BDF002F7251 /* ExternalSemaSource.h */,
                                9063F2220F9E8BDF002F7251 /* SemaConsumer.h */,
                                DE67E7270C02109800F66BC5 /* ParseAST.h */,
index 4be5a763a92d5112150ae0429c10ef3917423128..5e0a360df196f2a03626a57762714128b6843ad4 100644 (file)
@@ -2340,6 +2340,14 @@ public:
   ///
   /// \param S the scope in which the operator keyword occurs.
   virtual void CodeCompleteOperatorName(Scope *S) { }
+
+  /// \brief Code completion for an ObjC property decl.
+  ///
+  /// This code completion action is invoked when the code-completion token is
+  /// found after the left paren.
+  ///
+  /// \param S the scope in which the operator keyword occurs.  
+  virtual void CodeCompleteObjCProperty(Scope *S, ObjCDeclSpec &ODS) { }
   //@}
 };
 
index 014f10edd40f1433f383ebeb99243be147ae163d..1d29f319c58465f4b516a12c33620d401f75dac1 100644 (file)
@@ -390,6 +390,10 @@ void Parser::ParseObjCPropertyAttribute(ObjCDeclSpec &DS) {
   SourceLocation LHSLoc = ConsumeParen(); // consume '('
 
   while (1) {
+    if (Tok.is(tok::code_completion)) {
+      Actions.CodeCompleteObjCProperty(CurScope, DS);
+      ConsumeToken();
+    }
     const IdentifierInfo *II = Tok.getIdentifierInfo();
 
     // If this is not an identifier at all, bail out early.
index 08cb06db561655014ab79438b5d904b17936bcaf..f85c1a821b9c7c8ead0050c3995fa71a665526cf 100644 (file)
@@ -3699,6 +3699,8 @@ public:
   virtual void CodeCompleteNamespaceDecl(Scope *S);
   virtual void CodeCompleteNamespaceAliasDecl(Scope *S);
   virtual void CodeCompleteOperatorName(Scope *S);
+  
+  virtual void CodeCompleteObjCProperty(Scope *S, ObjCDeclSpec &ODS);
   //@}
   
   //===--------------------------------------------------------------------===//
index 7a916ef03602b972deb6c5534000a1a5a39b45c0..b648702650129713665094ae0554c6f58b0615e9 100644 (file)
@@ -1393,3 +1393,30 @@ void Sema::CodeCompleteOperatorName(Scope *S) {
   HandleCodeCompleteResults(CodeCompleter, Results.data(), Results.size());  
 }
 
+void Sema::CodeCompleteObjCProperty(Scope *S, ObjCDeclSpec &ODS) { 
+  if (!CodeCompleter)
+    return;
+  unsigned Attributes = ODS.getPropertyAttributes();
+  
+  typedef CodeCompleteConsumer::Result Result;
+  ResultBuilder Results(*this);
+  Results.EnterNewScope();
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_readonly))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("readonly", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_assign))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("assign", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_readwrite))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("readwrite", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_retain))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("retain", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_copy))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("copy", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_nonatomic))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("nonatomic", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_setter))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("setter", 0));
+  if (!(Attributes & ObjCDeclSpec::DQ_PR_getter))
+    Results.MaybeAddResult(CodeCompleteConsumer::Result("getter", 0));
+  Results.ExitScope();
+  HandleCodeCompleteResults(CodeCompleter, Results.data(), Results.size());  
+}
diff --git a/test/CodeCompletion/property.m b/test/CodeCompletion/property.m
new file mode 100644 (file)
index 0000000..a8dd2ba
--- /dev/null
@@ -0,0 +1,29 @@
+// Note: the run lines follow their respective tests, since line/column
+// matter in this test.
+
+@interface Foo  {
+  void *isa;
+}
+@property(copy) Foo *myprop;
+@property(retain, nonatomic) id xx;
+// RUN: clang-cc -fsyntax-only -code-completion-at=%s:7:11 %s -o - | FileCheck -check-prefix=CC1 %s &&
+// CC1: readonly
+// CC1-NEXT: assign
+// CC1-NEXT: readwrite
+// CC1-NEXT: retain
+// CC1-NEXT: copy
+// CC1-NEXT: nonatomic
+// CC1-NEXT: setter
+// CC1-NEXT: getter
+// RUN: clang-cc -fsyntax-only -code-completion-at=%s:8:18 %s -o - | FileCheck -check-prefix=CC2 %s
+// CC2: readonly
+// CC2-NEXT: assign
+// CC2-NEXT: readwrite
+// CC2-NEXT: copy
+// CC2-NEXT: nonatomic
+// CC2-NEXT: setter
+// CC2-NEXT: getter
+@end
+
+
+