Skip to content

Commit 47ce782

Browse files
feat: unique names withing declarations (#575)
Closes partially #543 ### Summary of Changes Ensure that names are unique within declarations. I'll port the checks for uniqueness on the file level in a future PR. --------- Co-authored-by: megalinter-bot <129584137+megalinter-bot@users.noreply.github.com>
1 parent 4ba7873 commit 47ce782

File tree

19 files changed

+670
-54
lines changed

19 files changed

+670
-54
lines changed

src/language/ast/checks.ts

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { SdsImport } from '../generated/ast.js';
2+
3+
export const isWildcardImport = function (node: SdsImport): boolean {
4+
const importedNamespace = node.importedNamespace ?? '';
5+
return importedNamespace.endsWith('*');
6+
};

src/language/ast/shortcuts.ts

+96
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import {
2+
isSdsAssignment,
3+
isSdsBlockLambdaResult,
4+
isSdsDeclaration,
5+
isSdsPlaceholder,
6+
SdsAnnotatedObject,
7+
SdsAnnotationCall,
8+
SdsAssignee,
9+
SdsAssignment,
10+
SdsBlock,
11+
SdsBlockLambda,
12+
SdsBlockLambdaResult,
13+
SdsClass,
14+
SdsClassMember,
15+
SdsEnum,
16+
SdsEnumVariant,
17+
SdsLiteral,
18+
SdsLiteralType,
19+
SdsParameter,
20+
SdsParameterList,
21+
SdsPlaceholder,
22+
SdsResult,
23+
SdsResultList,
24+
SdsStatement,
25+
SdsTypeArgument,
26+
SdsTypeArgumentList,
27+
SdsTypeParameter,
28+
SdsTypeParameterList,
29+
} from '../generated/ast.js';
30+
import { stream } from 'langium';
31+
32+
export const annotationCallsOrEmpty = function (node: SdsAnnotatedObject | undefined): SdsAnnotationCall[] {
33+
if (!node) {
34+
/* c8 ignore next 2 */
35+
return [];
36+
}
37+
38+
if (isSdsDeclaration(node)) {
39+
return node?.annotationCallList?.annotationCalls ?? node?.annotationCalls ?? [];
40+
} else {
41+
/* c8 ignore next 2 */
42+
return node?.annotationCalls ?? [];
43+
}
44+
};
45+
46+
export const assigneesOrEmpty = function (node: SdsAssignment | undefined): SdsAssignee[] {
47+
return node?.assigneeList?.assignees ?? [];
48+
};
49+
50+
export const blockLambdaResultsOrEmpty = function (node: SdsBlockLambda | undefined): SdsBlockLambdaResult[] {
51+
return stream(statementsOrEmpty(node?.body))
52+
.filter(isSdsAssignment)
53+
.flatMap(assigneesOrEmpty)
54+
.filter(isSdsBlockLambdaResult)
55+
.toArray();
56+
};
57+
58+
export const literalsOrEmpty = function (node: SdsLiteralType | undefined): SdsLiteral[] {
59+
return node?.literalList?.literals ?? [];
60+
};
61+
62+
export const classMembersOrEmpty = function (node: SdsClass | undefined): SdsClassMember[] {
63+
return node?.body?.members ?? [];
64+
};
65+
66+
export const parametersOrEmpty = function (node: SdsParameterList | undefined): SdsParameter[] {
67+
return node?.parameters ?? [];
68+
};
69+
70+
export const placeholdersOrEmpty = function (node: SdsBlock | undefined): SdsPlaceholder[] {
71+
return stream(statementsOrEmpty(node))
72+
.filter(isSdsAssignment)
73+
.flatMap(assigneesOrEmpty)
74+
.filter(isSdsPlaceholder)
75+
.toArray();
76+
};
77+
78+
export const resultsOrEmpty = function (node: SdsResultList | undefined): SdsResult[] {
79+
return node?.results ?? [];
80+
};
81+
82+
export const statementsOrEmpty = function (node: SdsBlock | undefined): SdsStatement[] {
83+
return node?.statements ?? [];
84+
};
85+
86+
export const typeArgumentsOrEmpty = function (node: SdsTypeArgumentList | undefined): SdsTypeArgument[] {
87+
return node?.typeArguments ?? [];
88+
};
89+
90+
export const typeParametersOrEmpty = function (node: SdsTypeParameterList | undefined): SdsTypeParameter[] {
91+
return node?.typeParameters ?? [];
92+
};
93+
94+
export const variantsOrEmpty = function (node: SdsEnum | undefined): SdsEnumVariant[] {
95+
return node?.body?.variants ?? [];
96+
};

src/language/formatting/safe-ds-formatter.ts

+12-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,16 @@
1-
import { AbstractFormatter, AstNode, CstNode, findCommentNode, Formatting, isAstNode, FormattingAction, FormattingActionOptions } from 'langium';
1+
import {
2+
AbstractFormatter,
3+
AstNode,
4+
CstNode,
5+
findCommentNode,
6+
Formatting,
7+
isAstNode,
8+
FormattingAction,
9+
FormattingActionOptions,
10+
} from 'langium';
211
import * as ast from '../generated/ast.js';
312
import { SdsImport, SdsImportAlias, SdsModule } from '../generated/ast.js';
4-
import { annotationCallsOrEmpty, literalsOrEmpty, typeArgumentsOrEmpty } from '../helpers/astShortcuts.js';
13+
import { annotationCallsOrEmpty, literalsOrEmpty, typeArgumentsOrEmpty } from '../ast/shortcuts.js';
514
import noSpace = Formatting.noSpace;
615
import newLine = Formatting.newLine;
716
import newLines = Formatting.newLines;
@@ -876,6 +885,7 @@ export class SafeDsFormatter extends AbstractFormatter {
876885
} else if (ast.isSdsUnionType(node)) {
877886
return typeArgumentsOrEmpty(node.typeArgumentList).length > 0;
878887
} else {
888+
/* c8 ignore next 2 */
879889
return false;
880890
}
881891
}

src/language/grammar/safe-ds.langium

+6-6
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ QualifiedName returns string:
8181

8282
interface SdsModuleMember extends SdsDeclaration {}
8383

84-
SdsAnnotatedModuleMember returns SdsAnnotatedObject:
84+
SdsAnnotatedModuleMember returns SdsModuleMember:
8585
{SdsAnnotationCallList}
8686
annotationCalls+=SdsAnnotationCall+
8787
(
@@ -108,7 +108,7 @@ SdsAnnotatedModuleMember returns SdsAnnotatedObject:
108108
)
109109
;
110110

111-
SdsUnannotatedModuleMember returns SdsAnnotatedObject:
111+
SdsUnannotatedModuleMember returns SdsModuleMember:
112112
{SdsAnnotation}
113113
SdsAnnotationFragment
114114

@@ -170,7 +170,7 @@ SdsParentTypeList returns SdsParentTypeList:
170170
;
171171

172172
interface SdsClassBody extends SdsObject {
173-
members: SdsAnnotatedObject[]
173+
members: SdsClassMember[]
174174
}
175175

176176
SdsClassBody returns SdsClassBody:
@@ -179,12 +179,12 @@ SdsClassBody returns SdsClassBody:
179179

180180
interface SdsClassMember extends SdsDeclaration {}
181181

182-
SdsClassMember returns SdsAnnotatedObject:
182+
SdsClassMember returns SdsClassMember:
183183
SdsAnnotatedClassMember
184184
| SdsUnannotatedClassMember
185185
;
186186

187-
SdsAnnotatedClassMember returns SdsAnnotatedObject:
187+
SdsAnnotatedClassMember returns SdsClassMember:
188188
{SdsAnnotationCallList}
189189
annotationCalls+=SdsAnnotationCall+
190190
(
@@ -203,7 +203,7 @@ SdsAnnotatedClassMember returns SdsAnnotatedObject:
203203
)
204204
;
205205

206-
SdsUnannotatedClassMember returns SdsAnnotatedObject:
206+
SdsUnannotatedClassMember returns SdsClassMember:
207207
{SdsAttribute}
208208
SdsAttributeFragment
209209

src/language/helpers/astShortcuts.ts

-38
This file was deleted.

src/language/scoping/safe-ds-scope-provider.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
SdsType,
1313
SdsYield,
1414
} from '../generated/ast.js';
15-
import { resultsOrEmpty } from '../helpers/astShortcuts.js';
15+
import { resultsOrEmpty } from '../ast/shortcuts.js';
1616

1717
export class SafeDsScopeProvider extends DefaultScopeProvider {
1818
override getScope(context: ReferenceInfo): Scope {

src/language/validation/imports.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { ValidationAcceptor } from 'langium';
22
import { SdsImportAlias } from '../generated/ast.js';
3-
import { isWildcardImport } from '../helpers/astShortcuts.js';
3+
import { isWildcardImport } from '../ast/checks.js';
44

55
export const CODE_IMPORT_WILDCARD_IMPORT_WITH_ALIAS = 'import/wildcard-import-with-alias';
66

0 commit comments

Comments
 (0)