Skip to content

Commit 5c21cdf

Browse files
committed
Modify override_decl_extension error to be more descriptive
1 parent f138ce0 commit 5c21cdf

File tree

7 files changed

+24
-18
lines changed

7 files changed

+24
-18
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,8 +2454,10 @@ NOTE(overridden_near_match_here,none,
24542454
"potential overridden %0 %1 here",
24552455
(DescriptiveDeclKind, DeclName))
24562456
ERROR(override_decl_extension,none,
2457-
"overriding %select{|non-@objc }0declarations "
2458-
"%select{in extensions|from extensions}0 is not supported", (bool, bool))
2457+
"%select{|non-@objc}0 %2 %3 %select{"
2458+
"is declared in extension of %4 and cannot be overriden|"
2459+
"declared in %4 cannot be overriden from extension}1",
2460+
(bool, bool, DescriptiveDeclKind, DeclName, DeclName))
24592461
NOTE(overridden_here,none,
24602462
"overridden declaration is here", ())
24612463
NOTE(overridden_here_can_be_objc,none,

lib/Sema/TypeCheckDeclOverride.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1009,8 +1009,8 @@ static void checkOverrideAccessControl(ValueDecl *baseDecl, ValueDecl *decl,
10091009
!baseHasOpenAccess &&
10101010
baseDecl->getModuleContext() != decl->getModuleContext() &&
10111011
!isa<ConstructorDecl>(decl)) {
1012-
// NSObject.hashValue and NSObject.hash(into:) was made non-overridable in
1013-
// Swift 5; one should override NSObject.hash instead.
1012+
// NSObject.hashValue and NSObject.hash(into:) is not overridable;
1013+
// one should override NSObject.hash instead.
10141014
if (isNSObjectHashValue(baseDecl)) {
10151015
diags.diagnose(decl, diag::override_nsobject_hashvalue_error)
10161016
.fixItReplace(SourceRange(decl->getNameLoc()), "hash");
@@ -1814,9 +1814,13 @@ static bool checkSingleOverride(ValueDecl *override, ValueDecl *base) {
18141814
if ((isNSObjectHashValue(base) || isNSObjectHashMethod(base)) &&
18151815
!base->hasOpenAccess(override->getDeclContext()))
18161816
return true;
1817+
18171818
bool baseCanBeObjC = canBeRepresentedInObjC(base);
1819+
auto nominal = base->getDeclContext()->getSelfNominalTypeDecl();
18181820
diags.diagnose(override, diag::override_decl_extension, baseCanBeObjC,
1819-
!isa<ExtensionDecl>(base->getDeclContext()));
1821+
!isa<ExtensionDecl>(base->getDeclContext()),
1822+
override->getDescriptiveKind(), override->getName(),
1823+
nominal->getName());
18201824
// If the base and the override come from the same module, try to fix
18211825
// the base declaration. Otherwise we can wind up diagnosing into e.g. the
18221826
// SDK overlay modules.

test/ClangImporter/objc-cross-module-override.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import ImageInitializers
1212

1313
final class MyImage : Image {
14-
// CHECK: overriding non-@objc declarations from extensions is not supported
14+
// CHECK: non-@objc initializer 'init(imageLiteralResourceName:)' is declared in extension of 'Image' and cannot be overriden
1515
// Make sure we aren't emitting a fixit into the extant module...
1616
// CHECK-NOT: add '@objc' to make this declaration overridable
1717
// CHECK: ImageInitializers.Image:{{.*}}: note: overridden declaration is here

test/attr/attr_objc_override.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ class B : A {
2929
get { return self } // expected-error{{subscript getter with Objective-C selector 'objectForKeyedSubscript:' conflicts with subscript getter from superclass 'A'}}
3030
}
3131

32-
override func foo() { } // expected-error{{overriding non-@objc declarations from extensions is not supported}}
32+
override func foo() { } // expected-error{{non-@objc instance method 'foo()' is declared in extension of 'A' and cannot be overriden}}
3333

34-
override func wibble(_: SwiftStruct) { } // expected-error{{overriding declarations in extensions is not supported}}
34+
override func wibble(_: SwiftStruct) { } // expected-error{{instance method 'wibble' is declared in extension of 'A' and cannot be overriden}}
3535
}
3636

3737
extension B {
38-
override func bar() { } // expected-error{{overriding non-@objc declarations from extensions is not supported}}
38+
override func bar() { } // expected-error{{non-@objc instance method 'bar()' declared in 'A' cannot be overriden from extension}}
3939
}

test/decl/func/static_func.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ class C_Derived : C {
8383
override class func f2() {}
8484
class override func f3() {}
8585

86-
override class func ef2() {} // expected-error {{not supported}}
87-
class override func ef3() {} // expected-error {{not supported}}
86+
override class func ef2() {} // expected-error {{cannot be overriden}}
87+
class override func ef3() {} // expected-error {{cannot be overriden}}
8888
override static func f7() {} // expected-error {{static method overrides a 'final' class method}}
8989
}
9090

@@ -98,11 +98,11 @@ class C_Derived3 : C {
9898
}
9999

100100
extension C_Derived {
101-
override class func f4() {} // expected-error {{not supported}}
102-
class override func f5() {} // expected-error {{not supported}}
101+
override class func f4() {} // expected-error {{cannot be overriden}}
102+
class override func f5() {} // expected-error {{cannot be overriden}}
103103

104-
override class func ef4() {} // expected-error {{not supported}}
105-
class override func ef5() {} // expected-error {{not supported}}
104+
override class func ef4() {} // expected-error {{cannot be overriden}}
105+
class override func ef5() {} // expected-error {{cannot be overriden}}
106106
}
107107

108108
protocol P { // expected-note{{extended type declared here}}

test/decl/inherit/override.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ extension B {
4646
override func f3D() { }
4747
override func f4D() -> ObjCClassB { }
4848

49-
func f5() { } // expected-error{{overridi}}
50-
func f6() -> A { } // expected-error{{overriding declarations in extensions is not supported}}
49+
func f5() { } // expected-error{{overri}}
50+
func f6() -> A { } // expected-error{{instance method 'f6()' is declared in extension of 'A' and cannot be overriden}}
5151

5252
@objc override func f7() { }
5353
@objc override func f8() -> ObjCClassA { }

test/decl/init/basic_init.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ class InitSubclass: InitClass {}
2525
// expected-note@-1{{'init(baz:)' previously overridden here}}
2626
// expected-note@-2{{'init(bar:)' previously overridden here}}
2727
extension InitSubclass {
28-
convenience init(arg: Bool) {} // expected-error{{overriding non-@objc declarations from extensions is not supported}}
28+
convenience init(arg: Bool) {} // expected-error{{non-@objc initializer 'init(arg:)' declared in 'InitClass' cannot be overriden from extension}}
2929
convenience override init(baz: Int) {}
3030
// expected-error@-1 {{'init(baz:)' has already been overridden}}
3131
// expected-error@-2 {{cannot override a non-dynamic class declaration from an extension}}

0 commit comments

Comments
 (0)