Skip to content

Commit

Permalink
feat: scoping for parameters of enum variants
Browse files Browse the repository at this point in the history
  • Loading branch information
lars-reimann committed Oct 7, 2023
1 parent 7538120 commit 6cdabda
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 10 deletions.
4 changes: 2 additions & 2 deletions src/language/scoping/safe-ds-scope-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,8 @@ export class SafeDsScopeProvider extends DefaultScopeProvider {
// Scopes.scopeFor(members, Scopes.scopeFor(superTypeMembers, resultScope))
return this.createScopeForNodes(ownInstanceMembers, resultScope);
} else if (receiverType instanceof EnumVariantType) {
// Scopes.scopeFor(type.sdsEnumVariant.parametersOrEmpty())
return resultScope;
const parameters = parametersOrEmpty(receiverType.sdsEnumVariant);
return this.createScopeForNodes(parameters, resultScope);
}

return resultScope;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package tests.scoping.memberAccesses.toParametersOfEnumVariants

enum MyEnum {
MyEnumVariant(
// $TEST$ target param
»param«: Int,

// $TEST$ target redeclared
»redeclared«: Int,
redeclared: Int,
)

MyOtherEnumVariant
}

enum MyOtherEnum {
MyEnumVariant
}

pipeline myPipeline {
// $TEST$ references param
MyEnum.MyEnumVariant().»param«;

// $TEST$ references redeclared
MyEnum.MyEnumVariant().»redeclared«;


// $TEST$ unresolved
MyOtherEnum.MyEnumVariant.»param«;

// $TEST$ unresolved
MyEnum.MyOtherEnumVariant().»param«;

// $TEST$ unresolved
MyOtherEnum.MyEnumVariant().»param«;

// $TEST$ unresolved
MyEnum.MyEnumVariant().»unresolved«;

// $TEST$ unresolved
MyEnum.unresolved().»param«;

// $TEST$ unresolved
unresolved.MyEnumVariant().»param«;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,23 @@ class MyClass() {
attr »result«: Int
}

enum MyEnum {
// $TEST$ target MyEnum_result
MyEnumVariant(»result«: Int)
}

pipeline myPipeline {
val lambdaWithOneResultWithIdenticalMember = () {
val f1 = () {
yield result = MyClass();
};

val f2 = () {
yield result = MyEnum.MyEnumVariant(0);
};

// $TEST$ references MyClass_result
lambdaWithOneResultWithIdenticalMember().»result«;
f1().»result«;

// $TEST$ references MyEnum_result
f2().»result«;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,19 @@ class MyClass() {
attr »result«: Int
}

enum MyEnum {
// $TEST$ target MyEnum_result
MyEnumVariant(»result«: Int)
}

segment mySegment(
callableWithIdenticalMember: () -> result: MyClass
f1: () -> result: MyClass,
f2: () -> result: MyEnum.MyEnumVariant,
) {

// $TEST$ references MyClass_result
callableWithIdenticalMember().»result«;
f1().»result«;

// $TEST$ references MyEnum_result
f2().»result«;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,18 @@ class MyClass() {
attr »result«: Int
}

fun functionWithOneResultWithIdenticalMember() -> result: MyClass
enum MyEnum {
// $TEST$ target MyEnum_result
MyEnumVariant(»result«: Int)
}

fun f1() -> result: MyClass
fun f2() -> result: MyEnum.MyEnumVariant

pipeline myPipeline {
// $TEST$ references MyClass_result
functionWithOneResultWithIdenticalMember().»result«;
f1().»result«;

// $TEST$ references MyEnum_result
f2().»result«;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,18 @@ class MyClass() {
attr »result«: Int
}

segment segmentWithOneResultWithIdenticalMember() -> result: MyClass {}
enum MyEnum {
// $TEST$ target MyEnum_result
MyEnumVariant(»result«: Int)
}

segment s1() -> result: MyClass {}
segment s2() -> result: MyEnum.MyEnumVariant {}

pipeline myPipeline {
// $TEST$ references MyClass_result
segmentWithOneResultWithIdenticalMember().»result«;
s1().»result«;

// $TEST$ references MyEnum_result
s2().»result«;
}

0 comments on commit 6cdabda

Please sign in to comment.