зеркало из https://github.com/microsoft/clang-1.git
Add code completion support for ObjC property declarations/attributes.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@83579 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8408db36ee
Коммит
ece8e71d12
|
@ -503,6 +503,7 @@
|
|||
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; };
|
||||
|
@ -1229,6 +1230,7 @@
|
|||
DE67E7260C02108300F66BC5 /* Sema */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
7F270AFE107A90010031B377 /* CodeCompleteConsumer.h */,
|
||||
9063F2210F9E8BDF002F7251 /* ExternalSemaSource.h */,
|
||||
9063F2220F9E8BDF002F7251 /* SemaConsumer.h */,
|
||||
DE67E7270C02109800F66BC5 /* ParseAST.h */,
|
||||
|
|
|
@ -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) { }
|
||||
//@}
|
||||
};
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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);
|
||||
//@}
|
||||
|
||||
//===--------------------------------------------------------------------===//
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче