1
1
import {
2
2
isSdsQualifiedImport ,
3
3
SdsAnnotation ,
4
+ SdsAttribute ,
4
5
SdsBlockLambda ,
6
+ SdsBlockLambdaResult ,
5
7
SdsCallableType ,
6
8
SdsClass ,
7
9
SdsDeclaration ,
@@ -11,11 +13,15 @@ import {
11
13
SdsFunction ,
12
14
SdsImportedDeclaration ,
13
15
SdsModule ,
16
+ SdsParameter ,
14
17
SdsPipeline ,
18
+ SdsPlaceholder ,
19
+ SdsResult ,
15
20
SdsSchema ,
16
21
SdsSegment ,
22
+ SdsTypeParameter ,
17
23
} from '../generated/ast.js' ;
18
- import { getDocument , ValidationAcceptor } from 'langium' ;
24
+ import { AstNodeDescription , getDocument , ValidationAcceptor } from 'langium' ;
19
25
import {
20
26
getColumns ,
21
27
getEnumVariants ,
@@ -37,6 +43,7 @@ import { declarationIsAllowedInPipelineFile, declarationIsAllowedInStubFile } fr
37
43
import { SafeDsServices } from '../safe-ds-module.js' ;
38
44
import { listBuiltinFiles } from '../builtins/fileFinder.js' ;
39
45
import { CODEGEN_PREFIX } from '../../cli/generator.js' ;
46
+ import { BUILTINS_ROOT_PACKAGE } from '../builtins/packageNames.js' ;
40
47
41
48
export const CODE_NAME_CODEGEN_PREFIX = 'name/codegen-prefix' ;
42
49
export const CODE_NAME_CASING = 'name/casing' ;
@@ -67,21 +74,21 @@ export const nameMustNotStartWithCodegenPrefix = (node: SdsDeclaration, accept:
67
74
68
75
export const nameShouldHaveCorrectCasing = ( node : SdsDeclaration , accept : ValidationAcceptor ) : void => {
69
76
switch ( node . $type ) {
70
- case ' SdsAnnotation' :
77
+ case SdsAnnotation :
71
78
return nameShouldBeUpperCamelCase ( node , 'annotations' , accept ) ;
72
- case ' SdsAttribute' :
79
+ case SdsAttribute :
73
80
return nameShouldBeLowerCamelCase ( node , 'attributes' , accept ) ;
74
- case ' SdsBlockLambdaResult' :
81
+ case SdsBlockLambdaResult :
75
82
return nameShouldBeLowerCamelCase ( node , 'block lambda results' , accept ) ;
76
- case ' SdsClass' :
83
+ case SdsClass :
77
84
return nameShouldBeUpperCamelCase ( node , 'classes' , accept ) ;
78
- case ' SdsEnum' :
85
+ case SdsEnum :
79
86
return nameShouldBeUpperCamelCase ( node , 'enums' , accept ) ;
80
- case ' SdsEnumVariant' :
87
+ case SdsEnumVariant :
81
88
return nameShouldBeUpperCamelCase ( node , 'enum variants' , accept ) ;
82
- case ' SdsFunction' :
89
+ case SdsFunction :
83
90
return nameShouldBeLowerCamelCase ( node , 'functions' , accept ) ;
84
- case ' SdsModule' :
91
+ case SdsModule :
85
92
const name = node . name ?? '' ;
86
93
const segments = name . split ( '.' ) ;
87
94
if ( name !== '' && segments . every ( ( it ) => it !== '' ) && ! segments . every ( isLowerCamelCase ) ) {
@@ -92,19 +99,19 @@ export const nameShouldHaveCorrectCasing = (node: SdsDeclaration, accept: Valida
92
99
} ) ;
93
100
}
94
101
return ;
95
- case ' SdsParameter' :
102
+ case SdsParameter :
96
103
return nameShouldBeLowerCamelCase ( node , 'parameters' , accept ) ;
97
- case ' SdsPipeline' :
104
+ case SdsPipeline :
98
105
return nameShouldBeLowerCamelCase ( node , 'pipelines' , accept ) ;
99
- case ' SdsPlaceholder' :
106
+ case SdsPlaceholder :
100
107
return nameShouldBeLowerCamelCase ( node , 'placeholders' , accept ) ;
101
- case ' SdsResult' :
108
+ case SdsResult :
102
109
return nameShouldBeLowerCamelCase ( node , 'results' , accept ) ;
103
- case ' SdsSchema' :
110
+ case SdsSchema :
104
111
return nameShouldBeUpperCamelCase ( node , 'schemas' , accept ) ;
105
- case ' SdsSegment' :
112
+ case SdsSegment :
106
113
return nameShouldBeLowerCamelCase ( node , 'segments' , accept ) ;
107
- case ' SdsTypeParameter' :
114
+ case SdsTypeParameter :
108
115
return nameShouldBeUpperCamelCase ( node , 'type parameters' , accept ) ;
109
116
}
110
117
/* c8 ignore next */
@@ -224,7 +231,17 @@ export const moduleMemberMustHaveNameThatIsUniqueInPackage = (services: SafeDsSe
224
231
225
232
for ( const member of getModuleMembers ( node ) ) {
226
233
const packageName = getPackageName ( member ) ?? '' ;
227
- const declarationsInPackage = packageManager . getDeclarationsInPackage ( packageName ) ;
234
+
235
+ let declarationsInPackage : AstNodeDescription [ ] ;
236
+ let kind : string ;
237
+ if ( packageName . startsWith ( BUILTINS_ROOT_PACKAGE ) ) {
238
+ // For a builtin package the simple names of declarations must be unique
239
+ declarationsInPackage = packageManager . getDeclarationsInPackageOrSubpackage ( BUILTINS_ROOT_PACKAGE ) ;
240
+ kind = 'builtin declarations' ;
241
+ } else {
242
+ declarationsInPackage = packageManager . getDeclarationsInPackage ( packageName ) ;
243
+ kind = 'declarations in this package' ;
244
+ }
228
245
229
246
if (
230
247
declarationsInPackage . some (
@@ -234,7 +251,7 @@ export const moduleMemberMustHaveNameThatIsUniqueInPackage = (services: SafeDsSe
234
251
! builtinUris . has ( it . documentUri . toString ( ) ) ,
235
252
)
236
253
) {
237
- accept ( 'error' , `Multiple declarations in this package have the name '${ member . name } '.` , {
254
+ accept ( 'error' , `Multiple ${ kind } have the name '${ member . name } '.` , {
238
255
node : member ,
239
256
property : 'name' ,
240
257
code : CODE_NAME_DUPLICATE ,
0 commit comments