Skip to content

Commit 1b04905

Browse files
authored
feat: allow instance and static members of classes to have the same name (#583)
### Summary of Changes Classes can now have static and instance members with the same name. This better matches the behavior of the scoping mechanism that does not resolve static references to instance members or dynamic references to static members.
1 parent 38afc07 commit 1b04905

File tree

2 files changed

+163
-43
lines changed

2 files changed

+163
-43
lines changed

src/language/validation/names.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
typeParametersOrEmpty,
2222
enumVariantsOrEmpty,
2323
} from '../helpers/shortcuts.js';
24+
import { isStatic } from '../helpers/checks.js';
2425

2526
export const CODE_NAME_BLOCK_LAMBDA_PREFIX = 'name/block-lambda-prefix';
2627
export const CODE_NAME_CASING = 'name/casing';
@@ -181,7 +182,11 @@ export const classMustContainUniqueNames = (node: SdsClass, accept: ValidationAc
181182
accept,
182183
);
183184

184-
namesMustBeUnique(classMembersOrEmpty(node), (name) => `A member with name '${name}' exists already.`, accept);
185+
const instanceMembers = classMembersOrEmpty(node, (it) => !isStatic(it));
186+
namesMustBeUnique(instanceMembers, (name) => `An instance member with name '${name}' exists already.`, accept);
187+
188+
const staticMembers = classMembersOrEmpty(node, isStatic);
189+
namesMustBeUnique(staticMembers, (name) => `A static member with name '${name}' exists already.`, accept);
185190
};
186191

187192
export const enumMustContainUniqueNames = (node: SdsEnum, accept: ValidationAcceptor): void => {

tests/resources/validation/names/duplicates/in class/main.sdstest

Lines changed: 157 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,104 +23,219 @@ class MyClass1<
2323
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
2424
»parameterAndMember«: Int,
2525
) {
26-
// $TEST$ no error r"A member with name '\w*' exists already\."
27-
attr »duplicateAttribute«: Int
28-
// $TEST$ error "A member with name 'duplicateAttribute' exists already."
29-
attr »duplicateAttribute«: Int
30-
// $TEST$ no error r"A member with name '\w*' exists already\."
31-
attr »uniqueAttribute«: Int
32-
33-
// $TEST$ no error r"A member with name '\w*' exists already\."
26+
// $TEST$ no error r"An instance member with name '\w*' exists already\."
27+
attr »duplicateInstanceAttribute«: Int
28+
// $TEST$ error "An instance member with name 'duplicateInstanceAttribute' exists already."
29+
attr »duplicateInstanceAttribute«: Int
30+
// $TEST$ no error r"An instance member with name '\w*' exists already\."
31+
attr »uniqueInstanceAttribute«: Int
32+
33+
// $TEST$ no error r"A static member with name '\w*' exists already\."
34+
static attr »duplicateStaticAttribute«: Int
35+
// $TEST$ error "A static member with name 'duplicateStaticAttribute' exists already."
36+
static attr »duplicateStaticAttribute«: Int
37+
// $TEST$ no error r"A static member with name '\w*' exists already\."
38+
static attr »uniqueStaticAttribute«: Int
39+
40+
// $TEST$ no error r"A static member with name '\w*' exists already\."
3441
class »DuplicateClass«
35-
// $TEST$ error "A member with name 'DuplicateClass' exists already."
42+
// $TEST$ error "A static member with name 'DuplicateClass' exists already."
3643
class »DuplicateClass«
37-
// $TEST$ no error r"A member with name '\w*' exists already\."
44+
// $TEST$ no error r"A static member with name '\w*' exists already\."
3845
class »UniqueClass«
3946

40-
// $TEST$ no error r"A member with name '\w*' exists already\."
47+
// $TEST$ no error r"A static member with name '\w*' exists already\."
4148
enum »DuplicateEnum«
42-
// $TEST$ error "A member with name 'DuplicateEnum' exists already."
49+
// $TEST$ error "A static member with name 'DuplicateEnum' exists already."
4350
enum »DuplicateEnum«
44-
// $TEST$ no error r"A member with name '\w*' exists already\."
51+
// $TEST$ no error r"A static member with name '\w*' exists already\."
4552
enum »UniqueEnum«
4653

47-
// $TEST$ no error r"A member with name '\w*' exists already\."
48-
fun »duplicateFun«()
49-
// $TEST$ error "A member with name 'duplicateFun' exists already."
50-
fun »duplicateFun«()
51-
// $TEST$ no error r"A member with name '\w*' exists already\."
52-
fun »uniqueFun«()
53-
54-
// $TEST$ no error r"A member with name '\w*' exists already\."
55-
attr »duplicateMember«: Int
56-
// $TEST$ error "A member with name 'duplicateMember' exists already."
57-
class »duplicateMember«
58-
// $TEST$ error "A member with name 'duplicateMember' exists already."
59-
enum »duplicateMember«
60-
// $TEST$ error "A member with name 'duplicateMember' exists already."
61-
fun »duplicateMember«()
54+
// $TEST$ no error r"An instance member with name '\w*' exists already\."
55+
fun »duplicateInstanceMethod«()
56+
// $TEST$ error "An instance member with name 'duplicateInstanceMethod' exists already."
57+
fun »duplicateInstanceMethod«()
58+
// $TEST$ no error r"An instance member with name '\w*' exists already\."
59+
fun »uniqueInstanceMethod«()
60+
61+
// $TEST$ no error r"A static member with name '\w*' exists already\."
62+
static fun »duplicateStaticMethod«()
63+
// $TEST$ error "A static member with name 'duplicateStaticMethod' exists already."
64+
static fun »duplicateStaticMethod«()
65+
// $TEST$ no error r"A static member with name '\w*' exists already\."
66+
static fun »uniqueStaticMethod«()
67+
68+
// $TEST$ no error r"An instance member with name '\w*' exists already\."
69+
attr »duplicateInstanceMember«: Int
70+
// $TEST$ error "An instance member with name 'duplicateInstanceMember' exists already."
71+
fun »duplicateInstanceMember«()
72+
73+
// $TEST$ no error r"A static member with name '\w*' exists already\."
74+
static attr »duplicateStaticMember«: Int
75+
// $TEST$ error "A static member with name 'duplicateStaticMember' exists already."
76+
class »duplicateStaticMember«
77+
// $TEST$ error "A static member with name 'duplicateStaticMember' exists already."
78+
enum »duplicateStaticMember«
79+
// $TEST$ error "A static member with name 'duplicateStaticMember' exists already."
80+
static fun »duplicateStaticMember«()
6281
}
6382

6483
class MyClass2<
6584
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
6685
»TypeParameterAndMember«,
6786
> {
68-
// $TEST$ no error r"A member with name '\w*' exists already\."
87+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
6988
attr »TypeParameterAndMember«: Int
89+
90+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
91+
attr »instanceAndStaticMember«: Int
92+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
93+
static attr »instanceAndStaticMember«: Int
94+
95+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
96+
static attr »staticAndInstanceMember«: Int
97+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
98+
attr »staticAndInstanceMember«: Int
7099
}
71100

72101
class MyClass3<
73102
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
74103
»TypeParameterAndMember«,
75104
> {
76-
// $TEST$ no error r"A member with name '\w*' exists already\."
77-
class »TypeParameterAndMember«
105+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
106+
static attr »TypeParameterAndMember«: Int
107+
108+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
109+
attr »instanceAndStaticMember«: Int
110+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
111+
class »instanceAndStaticMember«
112+
113+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
114+
class »staticAndInstanceMember«
115+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
116+
attr »staticAndInstanceMember«: Int
78117
}
79118

80119
class MyClass4<
81120
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
82121
»TypeParameterAndMember«,
83122
> {
84-
// $TEST$ no error r"A member with name '\w*' exists already\."
85-
enum »TypeParameterAndMember«
123+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
124+
class »TypeParameterAndMember«
125+
126+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
127+
attr »instanceAndStaticMember«: Int
128+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
129+
enum »instanceAndStaticMember«
130+
131+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
132+
enum »staticAndInstanceMember«
133+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
134+
attr »staticAndInstanceMember«: Int
86135
}
87136

88137
class MyClass5<
89138
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
90139
»TypeParameterAndMember«,
91140
> {
92-
// $TEST$ no error r"A member with name '\w*' exists already\."
141+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
142+
enum »TypeParameterAndMember«
143+
144+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
145+
attr »instanceAndStaticMember«: Int
146+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
147+
static fun »instanceAndStaticMember«()
148+
149+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
150+
static fun »staticAndInstanceMember«()
151+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
152+
attr »staticAndInstanceMember«: Int
153+
}
154+
155+
class MyClass6<
156+
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
157+
»TypeParameterAndMember«,
158+
> {
159+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
160+
fun »TypeParameterAndMember«()
161+
162+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
163+
fun »instanceAndStaticMember«()
164+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
165+
static attr »instanceAndStaticMember«: Int
166+
167+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
168+
static attr »staticAndInstanceMember«: Int
169+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
170+
fun »staticAndInstanceMember«()
171+
}
172+
173+
class MyClass7<
174+
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
175+
»TypeParameterAndMember«,
176+
> {
177+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
93178
fun »TypeParameterAndMember«()
179+
180+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
181+
fun »instanceAndStaticMember«()
182+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
183+
class »instanceAndStaticMember«
184+
185+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
186+
class »staticAndInstanceMember«
187+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
188+
fun »staticAndInstanceMember«()
94189
}
95190

96-
class MyClass6(
191+
class MyClass8(
97192
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
98193
»parameterAndMember«: Int,
99194
) {
100-
// $TEST$ no error r"A member with name '\w*' exists already\."
195+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
101196
attr »parameterAndMember«: Int
197+
198+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
199+
fun »instanceAndStaticMember«()
200+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
201+
enum »instanceAndStaticMember«
202+
203+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
204+
enum »staticAndInstanceMember«
205+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
206+
fun »staticAndInstanceMember«()
102207
}
103208

104-
class MyClass7(
209+
class MyClass9(
105210
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
106211
»parameterAndMember«: Int,
107212
) {
108-
// $TEST$ no error r"A member with name '\w*' exists already\."
213+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
109214
class »parameterAndMember«
215+
216+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
217+
fun »instanceAndStaticMember«()
218+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
219+
static fun »instanceAndStaticMember«()
220+
221+
// $TEST$ no error "r"A.*member with name '\w*' exists already\."
222+
static fun »staticAndInstanceMember«()
223+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
224+
fun »staticAndInstanceMember«()
110225
}
111226

112-
class MyClass8(
227+
class MyClass10(
113228
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
114229
»parameterAndMember«: Int,
115230
) {
116-
// $TEST$ no error r"A member with name '\w*' exists already\."
231+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
117232
enum »parameterAndMember«
118233
}
119234

120-
class MyClass9(
235+
class MyClass11(
121236
// $TEST$ no error r"A type parameter or parameter with name '\w*' exists already\."
122237
»parameterAndMember«: Int,
123238
) {
124-
// $TEST$ no error r"A member with name '\w*' exists already\."
239+
// $TEST$ no error r"A.*member with name '\w*' exists already\."
125240
fun »parameterAndMember«()
126241
}

0 commit comments

Comments
 (0)