Skip to content

Commit 3039ddb

Browse files
committed
fix loop warnings
1 parent 4cf4a89 commit 3039ddb

3 files changed

Lines changed: 43 additions & 12 deletions

File tree

de.peeeq.wurstscript/src/main/java/de/peeeq/wurstscript/jurst/AntlrJurstParseTreeTransformer.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -769,8 +769,8 @@ private WStatement transformForLoop(StmtForLoopContext s) {
769769

770770
private WStatement transformForRangeLoop(ForRangeLoopContext s) {
771771
WPos source = source(s);
772-
LocalVarDef loopVar = transformLocalVarDef(s.loopVar);
773-
loopVar.setInitialExpr(transformExpr(s.start));
772+
Expr start = transformExpr(s.start);
773+
LocalVarDef loopVar = transformLocalVarDef(s.loopVar, start);
774774
Expr to = transformExpr(s.end);
775775
Expr step;
776776
if (s.step == null) {
@@ -787,17 +787,17 @@ private WStatement transformForRangeLoop(ForRangeLoopContext s) {
787787
throw error(s, "for range loop not implemented: " + text(s));
788788
}
789789

790-
private LocalVarDef transformLocalVarDef(LocalVarDefInlineContext v) {
791-
Modifiers modifiers = Ast.Modifiers();
790+
private LocalVarDef transformLocalVarDef(LocalVarDefInlineContext v, OptExpr initialExpr) {
791+
// Loop variables behave like let-variables for user code.
792+
Modifiers modifiers = Ast.Modifiers(Ast.ModConstant(source(v)));
792793
OptTypeExpr optTyp = transformOptionalType(v.typeExpr());
793794
Identifier name = text(v.name);
794-
OptExpr initialExpr = Ast.NoExpr();
795795
return Ast.LocalVarDef(source(v), modifiers, optTyp, name, initialExpr);
796796
}
797797

798798
private WStatement transformForIteratorLoop(ForIteratorLoopContext s) {
799799
WPos source = source(s);
800-
LocalVarDef loopVar = transformLocalVarDef(s.loopVar);
800+
LocalVarDef loopVar = transformLocalVarDef(s.loopVar, Ast.NoExpr());
801801
Expr in = transformExpr(s.iteratorExpr);
802802
WStatements body = transformStatements(s.statementsBlock());
803803
if (s.iterStyle.getType() == JurstParser.IN) {

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -933,8 +933,8 @@ private WStatement transformForLoop(StmtForLoopContext s) {
933933

934934
private WStatement transformForRangeLoop(ForRangeLoopContext s) {
935935
WPos source = source(s);
936-
LocalVarDef loopVar = transformLocalVarDef(s.loopVar);
937-
loopVar.setInitialExpr(transformExpr(s.start));
936+
Expr start = transformExpr(s.start);
937+
LocalVarDef loopVar = transformLocalVarDef(s.loopVar, start);
938938
Expr to = transformExpr(s.end);
939939
Expr step;
940940
if (s.step == null) {
@@ -951,17 +951,17 @@ private WStatement transformForRangeLoop(ForRangeLoopContext s) {
951951
throw error(s, "not implemented: " + text(s));
952952
}
953953

954-
private LocalVarDef transformLocalVarDef(LocalVarDefInlineContext v) {
955-
Modifiers modifiers = Ast.Modifiers();
954+
private LocalVarDef transformLocalVarDef(LocalVarDefInlineContext v, OptExpr initialExpr) {
955+
// Loop variables behave like let-variables for user code.
956+
Modifiers modifiers = Ast.Modifiers(Ast.ModConstant(source(v)));
956957
OptTypeExpr optTyp = transformOptionalType(v.typeExpr());
957958
Identifier name = text(v.name);
958-
OptExpr initialExpr = Ast.NoExpr();
959959
return Ast.LocalVarDef(source(v), modifiers, optTyp, name, initialExpr);
960960
}
961961

962962
private WStatement transformForIteratorLoop(ForIteratorLoopContext s) {
963963
WPos source = source(s);
964-
LocalVarDef loopVar = transformLocalVarDef(s.loopVar);
964+
LocalVarDef loopVar = transformLocalVarDef(s.loopVar, Ast.NoExpr());
965965
Expr in = transformExpr(s.iteratorExpr);
966966
WStatements body = transformStatements(s.statementsBlock());
967967
if (s.iterStyle.getType() == WurstParser.IN) {

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -898,6 +898,37 @@ public void unreadVarWarning3() { // #380
898898
);
899899
}
900900

901+
@Test
902+
public void forRangeStartReadsParameter() {
903+
CompilationResult result = test()
904+
.setStopOnFirstError(false)
905+
.executeProg(false)
906+
.lines(
907+
"package test",
908+
"function foo(int bar)",
909+
" for i = bar to 10",
910+
" skip",
911+
"endpackage"
912+
);
913+
914+
Assert.assertTrue(
915+
result.getGui().getWarningList().stream()
916+
.noneMatch(w -> w.getMessage().contains("The parameter bar is never read")),
917+
"Unexpected unused warning for parameter bar: " + result.getGui().getWarningList()
918+
);
919+
}
920+
921+
@Test
922+
public void forRangeLoopVarIsImmutable() {
923+
testAssertErrorsLines(false, "Cannot assign a new value to constant",
924+
"package test",
925+
"init",
926+
" int stackPointer = 3",
927+
" for i = 0 to stackPointer",
928+
" i--",
929+
"endpackage");
930+
}
931+
901932

902933
@Test
903934
public void unreadVarWarningArrays() { // #813

0 commit comments

Comments
 (0)