mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 18:11:19 +00:00
Add a fixit for -Wobjc-protocol-property-synthesis
rdar://32132756 Differential Revision: https://reviews.llvm.org/D34886 llvm-svn: 307014
This commit is contained in:
parent
a020d3487e
commit
6c9af50cc8
@ -1029,6 +1029,8 @@ def warn_auto_synthesizing_protocol_property :Warning<
|
||||
"auto property synthesis will not synthesize property %0"
|
||||
" declared in protocol %1">,
|
||||
InGroup<DiagGroup<"objc-protocol-property-synthesis">>;
|
||||
def note_add_synthesize_directive : Note<
|
||||
"add a '@synthesize' directive">;
|
||||
def warn_no_autosynthesis_shared_ivar_property : Warning <
|
||||
"auto property synthesis will not synthesize property "
|
||||
"%0 because it cannot share an ivar with another synthesized property">,
|
||||
|
@ -3358,9 +3358,10 @@ public:
|
||||
|
||||
/// DefaultSynthesizeProperties - This routine default synthesizes all
|
||||
/// properties which must be synthesized in the class's \@implementation.
|
||||
void DefaultSynthesizeProperties (Scope *S, ObjCImplDecl* IMPDecl,
|
||||
ObjCInterfaceDecl *IDecl);
|
||||
void DefaultSynthesizeProperties(Scope *S, Decl *D);
|
||||
void DefaultSynthesizeProperties(Scope *S, ObjCImplDecl *IMPDecl,
|
||||
ObjCInterfaceDecl *IDecl,
|
||||
SourceLocation AtEnd);
|
||||
void DefaultSynthesizeProperties(Scope *S, Decl *D, SourceLocation AtEnd);
|
||||
|
||||
/// IvarBacksCurrentMethodAccessor - This routine returns 'true' if 'IV' is
|
||||
/// an ivar synthesized for 'Method' and 'Method' is a property accessor
|
||||
|
@ -2255,7 +2255,7 @@ Parser::ObjCImplParsingDataRAII::~ObjCImplParsingDataRAII() {
|
||||
|
||||
void Parser::ObjCImplParsingDataRAII::finish(SourceRange AtEnd) {
|
||||
assert(!Finished);
|
||||
P.Actions.DefaultSynthesizeProperties(P.getCurScope(), Dcl);
|
||||
P.Actions.DefaultSynthesizeProperties(P.getCurScope(), Dcl, AtEnd.getBegin());
|
||||
for (size_t i = 0; i < LateParsedObjCMethods.size(); ++i)
|
||||
P.ParseLexedObjCMethodDefs(*LateParsedObjCMethods[i],
|
||||
true/*Methods*/);
|
||||
|
@ -1676,8 +1676,9 @@ static bool SuperClassImplementsProperty(ObjCInterfaceDecl *IDecl,
|
||||
|
||||
/// \brief Default synthesizes all properties which must be synthesized
|
||||
/// in class's \@implementation.
|
||||
void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl,
|
||||
ObjCInterfaceDecl *IDecl) {
|
||||
void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl *IMPDecl,
|
||||
ObjCInterfaceDecl *IDecl,
|
||||
SourceLocation AtEnd) {
|
||||
ObjCInterfaceDecl::PropertyMap PropMap;
|
||||
ObjCInterfaceDecl::PropertyDeclOrder PropertyOrder;
|
||||
IDecl->collectPropertiesToImplement(PropMap, PropertyOrder);
|
||||
@ -1725,6 +1726,10 @@ void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl,
|
||||
diag::warn_auto_synthesizing_protocol_property)
|
||||
<< Prop << Proto;
|
||||
Diag(Prop->getLocation(), diag::note_property_declare);
|
||||
std::string FixIt =
|
||||
(Twine("@synthesize ") + Prop->getName() + ";\n\n").str();
|
||||
Diag(AtEnd, diag::note_add_synthesize_directive)
|
||||
<< FixItHint::CreateInsertion(AtEnd, FixIt);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
@ -1764,7 +1769,8 @@ void Sema::DefaultSynthesizeProperties(Scope *S, ObjCImplDecl* IMPDecl,
|
||||
}
|
||||
}
|
||||
|
||||
void Sema::DefaultSynthesizeProperties(Scope *S, Decl *D) {
|
||||
void Sema::DefaultSynthesizeProperties(Scope *S, Decl *D,
|
||||
SourceLocation AtEnd) {
|
||||
if (!LangOpts.ObjCDefaultSynthProperties || LangOpts.ObjCRuntime.isFragile())
|
||||
return;
|
||||
ObjCImplementationDecl *IC=dyn_cast_or_null<ObjCImplementationDecl>(D);
|
||||
@ -1772,7 +1778,7 @@ void Sema::DefaultSynthesizeProperties(Scope *S, Decl *D) {
|
||||
return;
|
||||
if (ObjCInterfaceDecl* IDecl = IC->getClassInterface())
|
||||
if (!IDecl->isObjCRequiresPropertyDefs())
|
||||
DefaultSynthesizeProperties(S, IC, IDecl);
|
||||
DefaultSynthesizeProperties(S, IC, IDecl, AtEnd);
|
||||
}
|
||||
|
||||
static void DiagnoseUnimplementedAccessor(
|
||||
|
14
clang/test/FixIt/fixit-add-synthesize-to-property.m
Normal file
14
clang/test/FixIt/fixit-add-synthesize-to-property.m
Normal file
@ -0,0 +1,14 @@
|
||||
// RUN: %clang_cc1 -fdiagnostics-parseable-fixits %s 2>&1 | FileCheck %s
|
||||
|
||||
@protocol P1
|
||||
|
||||
@property int prop;
|
||||
|
||||
@end
|
||||
|
||||
@interface I <P1>
|
||||
|
||||
@end
|
||||
|
||||
@implementation I
|
||||
@end // CHECK: fix-it:{{.*}}:{[[@LINE]]:1-[[@LINE]]:1}:"@synthesize prop;\n\n"
|
@ -173,13 +173,13 @@ typedef NSObject<Fooing> FooObject;
|
||||
@end
|
||||
|
||||
@implementation Okay // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}}
|
||||
@end
|
||||
@end // expected-note 2 {{add a '@synthesize' directive}}
|
||||
|
||||
@interface Fail : FooObject
|
||||
@end
|
||||
|
||||
@implementation Fail // expected-warning {{auto property synthesis will not synthesize property 'muahahaha' declared in protocol 'Fooing'}} expected-warning {{auto property synthesis will not synthesize property 'hoho' declared in protocol 'SubFooling'}}
|
||||
@end
|
||||
@end // expected-note 2 {{add a '@synthesize' directive}}
|
||||
|
||||
// rdar://16089191
|
||||
@class NSURL;
|
||||
|
@ -137,7 +137,7 @@
|
||||
@end
|
||||
|
||||
@implementation MyClass // expected-warning {{auto property synthesis will not synthesize property 'requiredString' declared in protocol 'MyProtocol'}}
|
||||
@end
|
||||
@end // expected-note {{add a '@synthesize' directive}}
|
||||
|
||||
// rdar://18152478
|
||||
@protocol NSObject @end
|
||||
|
@ -17,4 +17,4 @@
|
||||
|
||||
@implementation IBImageCatalogDocument // expected-warning {{auto property synthesis will not synthesize property 'Prop' declared in protocol 'DVTInvalidation'}} \
|
||||
// expected-warning {{method 'invalidate' in protocol 'DVTInvalidation' not implemented}}
|
||||
@end
|
||||
@end // expected-note {{add a '@synthesize' directive}}
|
||||
|
Loading…
Reference in New Issue
Block a user