Skip to content

Commit a49bc01

Browse files
committed
Made 'init' and 'iteration' statements of a for-loop optionals.
1 parent 16f1390 commit a49bc01

5 files changed

Lines changed: 44 additions & 14 deletions

File tree

dsl/src/main/java/fr/jamailun/ultimatespellsystem/dsl/nodes/statements/blocks/ForLoopStatement.java

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import lombok.Getter;
1313
import lombok.RequiredArgsConstructor;
1414
import org.jetbrains.annotations.NotNull;
15+
import org.jetbrains.annotations.Nullable;
1516

1617
/**
1718
* A for loop.
@@ -20,17 +21,17 @@
2021
@RequiredArgsConstructor
2122
public class ForLoopStatement extends StatementNode {
2223

23-
private final StatementNode initialization;
24+
private final @Nullable StatementNode initialization;
2425
private final ExpressionNode condition;
25-
private final StatementNode iteration;
26+
private final @Nullable StatementNode iteration;
2627
private final StatementNode child;
2728

2829
@Override
2930
public void validateTypes(@NotNull TypesContext context) {
3031
TypesContext childContext = context.childContext();
31-
initialization.validateTypes(childContext);
32+
if(initialization != null) initialization.validateTypes(childContext);
3233
assertExpressionType(condition, CollectionFilter.MONO_ELEMENT, childContext, TypePrimitive.BOOLEAN);
33-
iteration.validateTypes(childContext);
34+
if(iteration != null) iteration.validateTypes(childContext);
3435
child.validateTypes(childContext);
3536
}
3637

@@ -48,12 +49,27 @@ public void visit(@NotNull StatementVisitor visitor) {
4849
public static @NotNull ForLoopStatement parseForLoop(@NotNull TokenStream tokens) {
4950
tokens.dropOrThrow(TokenType.BRACKET_OPEN);
5051

51-
StatementNode init = StatementNode.parseNextStatement(tokens);
52+
// Optional init
53+
StatementNode init;
54+
if(tokens.peek().getType() == TokenType.SEMI_COLON) {
55+
init = null;
56+
tokens.drop();
57+
} else {
58+
init = StatementNode.parseNextStatement(tokens);
59+
}
60+
61+
// Required condition
5262
ExpressionNode condition = ExpressionNode.readNextExpression(tokens);
5363
tokens.dropOrThrow(TokenType.SEMI_COLON);
54-
StatementNode iterator = StatementNode.parseNextStatement(tokens);
5564

56-
tokens.dropOrThrow(TokenType.BRACKET_CLOSE);
65+
// Optional iteration
66+
StatementNode iterator;
67+
if(tokens.dropOptional(TokenType.BRACKET_CLOSE)) {
68+
iterator = null;
69+
} else {
70+
iterator = StatementNode.parseNextStatement(tokens);
71+
tokens.dropOrThrow(TokenType.BRACKET_CLOSE);
72+
}
5773
StatementNode child = StatementNode.parseNextStatement(tokens);
5874

5975
return new ForLoopStatement(init, condition, iterator, child);

dsl/src/main/java/fr/jamailun/ultimatespellsystem/dsl/visitor/PrintingVisitor.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -334,10 +334,10 @@ public void handleIf(@NotNull IfElseStatement statement) {
334334
public void handleForLoop(@NotNull ForLoopStatement statement) {
335335
builder.append(indent())
336336
.append("FOR(");
337-
statement.getInitialization().visit(this);
337+
if(statement.getInitialization() != null) statement.getInitialization().visit(this);
338338
statement.getCondition().visit(this);
339339
builder.append(";");
340-
statement.getInitialization().visit(this);
340+
if(statement.getIteration() != null) statement.getIteration().visit(this);
341341
builder.append("):");
342342
statement.getChild().visit(this);
343343
}
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
for(define %i = 0; %i < 5; increment %i) {
2-
send to %caster message "[%i]";
2+
send to %caster message "i=%i";
3+
}
4+
5+
%x = 12;
6+
for(; %x < 5; decrement %x) {
7+
send to %caster message "x=%x";
8+
}
9+
10+
%z = 8;
11+
for(; %x > 5; ) {
12+
decrement %z;
13+
send to %caster message "z=%z";
314
}

plugin/src/main/java/fr/jamailun/ultimatespellsystem/plugin/runner/builder/SpellBuilderVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import fr.jamailun.ultimatespellsystem.api.runner.RuntimeStatement;
1616
import fr.jamailun.ultimatespellsystem.plugin.runner.nodes.functions.*;
1717
import lombok.Getter;
18+
import org.jetbrains.annotations.Contract;
1819
import org.jetbrains.annotations.NotNull;
1920
import org.jetbrains.annotations.Nullable;
2021

@@ -242,6 +243,7 @@ private void add(RuntimeStatement rs) {
242243
currentQueue.add(rs);
243244
}
244245

246+
@Contract("null -> null; !null -> !null")
245247
private RuntimeStatement convertOneStatement(@Nullable StatementNode dsl) {
246248
if(dsl == null)
247249
return null;

plugin/src/main/java/fr/jamailun/ultimatespellsystem/plugin/runner/nodes/blocks/ForLoopNode.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,18 @@
77
import fr.jamailun.ultimatespellsystem.api.runner.SpellRuntime;
88
import lombok.Getter;
99
import org.jetbrains.annotations.NotNull;
10+
import org.jetbrains.annotations.Nullable;
1011

1112
public class ForLoopNode extends RuntimeStatement {
1213

1314
private final RuntimeExpression condition;
14-
private final RuntimeStatement initializer, iteration;
15+
private final @Nullable RuntimeStatement initializer, iteration;
1516
@Getter private final RuntimeStatement child;
1617

1718
//TODO make the safeguard configurable !
1819
private final static int MAX_ITERATIONS = 4096;
1920

20-
public ForLoopNode(@NotNull RuntimeStatement initializer, @NotNull RuntimeExpression condition, @NotNull RuntimeStatement iteration, @NotNull RuntimeStatement child) {
21+
public ForLoopNode(@Nullable RuntimeStatement initializer, @NotNull RuntimeExpression condition, @Nullable RuntimeStatement iteration, @NotNull RuntimeStatement child) {
2122
this.initializer = initializer;
2223
this.condition = condition;
2324
this.iteration = iteration;
@@ -28,7 +29,7 @@ public ForLoopNode(@NotNull RuntimeStatement initializer, @NotNull RuntimeExpres
2829
public void run(@NotNull SpellRuntime runtimeParent) {
2930
SpellRuntime runtime = runtimeParent.makeChild();
3031

31-
initializer.run(runtime);
32+
if(initializer != null) initializer.run(runtime);
3233
RunInstance run = new RunInstance(runtime);
3334

3435
while(run.conditionValid()) {
@@ -56,7 +57,7 @@ private class RunInstance {
5657
void applyIteration() {
5758
iterationCount++;
5859
child.run(runtime);
59-
iteration.run(runtime);
60+
if(iteration != null) iteration.run(runtime);
6061
}
6162

6263
boolean conditionValid() {

0 commit comments

Comments
 (0)