Skip to content

Commit 72b4df0

Browse files
committed
feat: info if overriding member is not needed
1 parent a698a6a commit 72b4df0

File tree

4 files changed

+81
-39
lines changed

4 files changed

+81
-39
lines changed

packages/safe-ds-lang/src/language/validation/inheritance.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ import { ClassType, UnknownType } from '../typing/model.js';
77

88
export const CODE_INHERITANCE_CYCLE = 'inheritance/cycle';
99
export const CODE_INHERITANCE_MULTIPLE_INHERITANCE = 'inheritance/multiple-inheritance';
10-
export const CODE_INHERITANCE_MUST_MATCH_OVERRIDDEN_MEMBER = 'inheritance/must-match-overridden-member';
10+
export const CODE_INHERITANCE_IDENTICAL_TO_OVERRIDDEN_MEMBER = 'inheritance/identical-to-overridden-member';
11+
export const CODE_INHERITANCE_INCOMPATIBLE_TO_OVERRIDDEN_MEMBER = 'inheritance/incompatible-to-overridden-member';
1112
export const CODE_INHERITANCE_NOT_A_CLASS = 'inheritance/not-a-class';
1213

13-
export const classMemberMustMatchOverriddenMember = (services: SafeDsServices) => {
14+
export const classMemberMustMatchOverriddenMemberAndShouldBeNeeded = (services: SafeDsServices) => {
1415
const classHierarchy = services.types.ClassHierarchy;
1516
const typeChecker = services.types.TypeChecker;
1617
const typeComputer = services.types.TypeComputer;
@@ -35,9 +36,15 @@ export const classMemberMustMatchOverriddenMember = (services: SafeDsServices) =
3536
{
3637
node,
3738
property: 'name',
38-
code: CODE_INHERITANCE_MUST_MATCH_OVERRIDDEN_MEMBER,
39+
code: CODE_INHERITANCE_INCOMPATIBLE_TO_OVERRIDDEN_MEMBER,
3940
},
4041
);
42+
} else if (typeChecker.isAssignableTo(overriddenMemberType, ownMemberType)) {
43+
accept('info', 'Overriding member is identical to overridden member and can be removed.', {
44+
node,
45+
property: 'name',
46+
code: CODE_INHERITANCE_IDENTICAL_TO_OVERRIDDEN_MEMBER,
47+
});
4148
}
4249
};
4350
};

packages/safe-ds-lang/src/language/validation/safe-ds-validator.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import {
3636
unionTypesShouldBeUsedWithCaution,
3737
} from './experimentalLanguageFeatures.js';
3838
import {
39-
classMemberMustMatchOverriddenMember,
39+
classMemberMustMatchOverriddenMemberAndShouldBeNeeded,
4040
classMustNotInheritItself,
4141
classMustOnlyInheritASingleClass,
4242
} from './inheritance.js';
@@ -228,7 +228,7 @@ export const registerValidationChecks = function (services: SafeDsServices) {
228228
classMustNotInheritItself(services),
229229
],
230230
SdsClassBody: [classBodyShouldNotBeEmpty],
231-
SdsClassMember: [classMemberMustMatchOverriddenMember(services)],
231+
SdsClassMember: [classMemberMustMatchOverriddenMemberAndShouldBeNeeded(services)],
232232
SdsConstraintList: [constraintListsShouldBeUsedWithCaution, constraintListShouldNotBeEmpty],
233233
SdsDeclaration: [
234234
nameMustNotStartWithCodegenPrefix,
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
package tests.validation.inheritance.overridingMethodMustMatchOverriddenMethod
22

33
class MySuperClass {
4-
attr myInstanceAttribute: Int
5-
static attr myStaticAttribute: Int
4+
attr myInstanceAttribute: Number
5+
static attr myStaticAttribute: Number
66

7-
fun myInstanceMethod(a: Int = 0) -> r: Int
8-
static fun myStaticMethod(a: Int = 0) -> r: Int
7+
fun myInstanceMethod(a: Number = 0) -> r: Number
8+
static fun myStaticMethod(a: Number = 0) -> r: Number
99
}
1010

1111
class MyClass1 sub MySuperClass {
@@ -15,9 +15,9 @@ class MyClass1 sub MySuperClass {
1515
static attr »myStaticAttribute«: Int
1616

1717
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
18-
attr »myInstanceAttribute«: String
18+
attr »myInstanceAttribute«: Any
1919
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
20-
static attr »myStaticAttribute«: String
20+
static attr »myStaticAttribute«: Any
2121

2222
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
2323
attr »myOwnInstanceAttribute«: Int
@@ -26,50 +26,30 @@ class MyClass1 sub MySuperClass {
2626

2727

2828
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
29-
fun »myInstanceMethod«(a: Int = 0) -> r: Int
29+
fun »myInstanceMethod«(a: Any = 0) -> r: Int
3030
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
31-
static fun »myStaticMethod«(a: Int = 0) -> r: Int
31+
static fun »myStaticMethod«(a: Any = 0) -> r: Int
3232

3333
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
3434
fun »myInstanceMethod«() -> r: Int
3535
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
3636
static fun »myStaticMethod«() -> r: Int
3737

3838
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
39-
fun »myOwnInstanceMethod«(a: Int = 0) -> r: Int
39+
fun »myOwnInstanceMethod«(a: Any = 0) -> r: Int
4040
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
41-
static fun »myOwnStaticMethod«(a: Int = 0) -> r: Int
41+
static fun »myOwnStaticMethod«(a: Any = 0) -> r: Int
4242
}
4343

4444
class MyClass2 sub MySuperClass {
4545
// $TEST$ error r"Overriding member does not match the overridden member:[\s\S]*"
46-
attr »myInstanceAttribute«: String
46+
attr »myInstanceAttribute«: Any
4747
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
48-
static attr »myStaticAttribute«: String
49-
50-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
51-
attr »myInstanceAttribute«: Int
52-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
53-
static attr »myStaticAttribute«: Int
54-
55-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
56-
attr »myOwnInstanceAttribute«: Int
57-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
58-
static attr »myOwnStaticAttribute«: Int
48+
static attr »myStaticAttribute«: Any
5949

6050

6151
// $TEST$ error r"Overriding member does not match the overridden member:[\s\S]*"
62-
fun »myInstanceMethod«() -> r: Int
63-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
64-
static fun »myStaticMethod«() -> r: Int
65-
66-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
67-
fun »myInstanceMethod«(a: Int = 0) -> r: Int
68-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
69-
static fun »myStaticMethod«(a: Int = 0) -> r: Int
70-
71-
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
72-
fun »myOwnInstanceMethod«(a: Int = 0) -> r: Int
52+
fun »myInstanceMethod«(a: Number = 0) -> r: Any
7353
// $TEST$ no error r"Overriding member does not match the overridden member:[\s\S]*"
74-
static fun »myOwnStaticMethod«(a: Int = 0) -> r: Int
54+
static fun »myStaticMethod«(a: Number = 0) -> r: Any
7555
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package tests.validation.inheritance.overridingMethodShouldDifferFromOverriddenMethod
2+
3+
class MySuperClass {
4+
attr myInstanceAttribute: Number
5+
static attr myStaticAttribute: Number
6+
7+
fun myInstanceMethod(a: Number = 0) -> r: Number
8+
static fun myStaticMethod(a: Number = 0) -> r: Number
9+
}
10+
11+
class MyClass1 sub MySuperClass {
12+
// $TEST$ info "Overriding member is identical to overridden member and can be removed."
13+
attr »myInstanceAttribute«: Number
14+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
15+
static attr »myStaticAttribute«: Number
16+
17+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
18+
attr »myInstanceAttribute«: Number
19+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
20+
static attr »myStaticAttribute«: Number
21+
22+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
23+
attr »myOwnInstanceAttribute«: Number
24+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
25+
static attr »myOwnStaticAttribute«: Number
26+
27+
28+
// $TEST$ info "Overriding member is identical to overridden member and can be removed."
29+
fun »myInstanceMethod«(a: Number = 0) -> r: Number
30+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
31+
static fun »myStaticMethod«(a: Number = 0) -> r: Number
32+
33+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
34+
fun »myInstanceMethod«() -> r: Number
35+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
36+
static fun »myStaticMethod«() -> r: Number
37+
38+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
39+
fun »myOwnInstanceMethod«(a: Number = 0) -> r: Number
40+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
41+
static fun »myOwnStaticMethod«(a: Number = 0) -> r: Number
42+
}
43+
44+
class MyClass2 sub MySuperClass {
45+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
46+
attr »myInstanceAttribute«: Int
47+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
48+
static attr »myStaticAttribute«: Int
49+
50+
51+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
52+
fun »myInstanceMethod«(a: Number = 0) -> r: Int
53+
// $TEST$ no info "Overriding member is identical to overridden member and can be removed."
54+
static fun »myStaticMethod«(a: Number = 0) -> r: Int
55+
}

0 commit comments

Comments
 (0)