Skip to content

Commit 8ca79c5

Browse files
committed
review fix
1 parent b9a3aa0 commit 8ca79c5

3 files changed

Lines changed: 65 additions & 3 deletions

File tree

de.peeeq.wurstscript/src/main/antlr/de/peeeq/wurstscript/antlr/Wurst.g4

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -350,7 +350,7 @@ indexes:
350350

351351

352352
expr:
353-
receiverTypeName=ID receiverTypeTypeArgs=typeArgsNonEmpty dotsTypeCall=('.'|'..') typeFuncName=ID? typeCallTypeArgs=typeArgs typeCallArgs=argumentList
353+
receiverType=genericTypeReceiver dotsTypeCall=('.'|'..') typeFuncName=ID? typeCallTypeArgs=typeArgs typeCallArgs=argumentList
354354
| exprPrimary
355355
| left=expr 'castTo' castToType=typeExpr
356356
| left=expr 'instanceof' instaneofType=typeExpr
@@ -446,6 +446,22 @@ typeArgs: ('<' (args+=typeExpr (',' args+=typeExpr)*)? '>')?;
446446

447447
typeArgsNonEmpty: '<' args+=typeExpr (',' args+=typeExpr)* '>';
448448

449+
genericTypeReceiver:
450+
receiverTypePrefixes+=genericTypeReceiverPrefixPart* receiverTypeGenericPart=genericTypeReceiverGenericPart receiverTypeSuffixes+=genericTypeReceiverSuffixPart*
451+
;
452+
453+
genericTypeReceiverPrefixPart:
454+
typeName=ID typeArgs '.'
455+
;
456+
457+
genericTypeReceiverGenericPart:
458+
typeName=ID typeArgsNonEmpty
459+
;
460+
461+
genericTypeReceiverSuffixPart:
462+
'.' typeName=ID typeArgs
463+
;
464+
449465
exprList : exprs+=expr (',' exprs+=expr)*;
450466

451467

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/parser/antlr/AntlrWurstParseTreeTransformer.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,8 +1097,7 @@ private Expr transformExpr(ExprContext e) {
10971097
return Ast.ExprCast(source, transformTypeExpr(e.castToType),
10981098
transformExpr(e.left));
10991099
} else if (e.dotsTypeCall != null) {
1100-
TypeExpr receiverType = Ast.TypeExprSimple(source(e.receiverTypeName),
1101-
Ast.NoTypeExpr(), e.receiverTypeName.getText(), transformTypeArgs(e.receiverTypeTypeArgs));
1100+
TypeExpr receiverType = transformGenericTypeReceiver(e.receiverType);
11021101
Expr left = Ast.ExprTypeRef(receiverType.getSource(), receiverType);
11031102
return transformMemberMethodCall2(source, left, e.dotsTypeCall,
11041103
e.typeFuncName, e.typeCallTypeArgs, e.typeCallArgs);
@@ -1131,6 +1130,30 @@ private Expr transformExpr(ExprContext e) {
11311130

11321131
}
11331132

1133+
private TypeExpr transformGenericTypeReceiver(GenericTypeReceiverContext receiverType) {
1134+
OptTypeExpr scopeType = Ast.NoTypeExpr();
1135+
TypeExpr result = null;
1136+
1137+
for (GenericTypeReceiverPrefixPartContext part : receiverType.receiverTypePrefixes) {
1138+
result = Ast.TypeExprSimple(source(part.typeName), scopeType,
1139+
part.typeName.getText(), transformTypeArgs(part.typeArgs()));
1140+
scopeType = result;
1141+
}
1142+
1143+
GenericTypeReceiverGenericPartContext genericPart = receiverType.receiverTypeGenericPart;
1144+
result = Ast.TypeExprSimple(source(genericPart.typeName), scopeType,
1145+
genericPart.typeName.getText(), transformTypeArgs(genericPart.typeArgsNonEmpty()));
1146+
scopeType = result;
1147+
1148+
for (GenericTypeReceiverSuffixPartContext part : receiverType.receiverTypeSuffixes) {
1149+
result = Ast.TypeExprSimple(source(part.typeName), scopeType,
1150+
part.typeName.getText(), transformTypeArgs(part.typeArgs()));
1151+
scopeType = result;
1152+
}
1153+
1154+
return result;
1155+
}
1156+
11341157
private int beginPos(ParseTree left) {
11351158
if (left instanceof ParserRuleContext) {
11361159
ParserRuleContext left2 = (ParserRuleContext) left;

de.peeeq.wurstscript/src/test/java/tests/wurstscript/tests/GenericsWithTypeclassesTests.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,6 +1438,29 @@ public void genericStaticArray_staticMethods_specializedTypeReceiver_runtime() {
14381438
);
14391439
}
14401440

1441+
@Test
1442+
public void genericStaticArray_staticMethods_qualifiedSpecializedTypeReceiver_runtime() {
1443+
testAssertOkLines(true,
1444+
"package test",
1445+
" native testSuccess()",
1446+
" class Outer",
1447+
" static class Box<T:>",
1448+
" private static T array store",
1449+
" static function put(int i, T v)",
1450+
" store[i] = v",
1451+
" static function get(int i) returns T",
1452+
" return store[i]",
1453+
" static function same(T v) returns T",
1454+
" return v",
1455+
" init",
1456+
" Outer.Box<int>.put(1, 42)",
1457+
" Outer.Box<real>.put(1, 2.5)",
1458+
" if Outer.Box<int>.get(1) == 42 and Outer.Box<int>.same(13) == 13 and Outer.Box<real>.get(1) == 2.5 and Outer.Box<real>.same(3.5) == 3.5",
1459+
" testSuccess()",
1460+
"endpackage"
1461+
);
1462+
}
1463+
14411464
@Test
14421465
public void genericStaticTuple_runtime() {
14431466
testAssertOkLines(true,

0 commit comments

Comments
 (0)