Terrascript refactor

This commit is contained in:
Astrash
2023-07-23 16:11:56 +10:00
parent 81e354f91c
commit f3d1751c87
98 changed files with 864 additions and 876 deletions
@@ -16,10 +16,10 @@ import java.util.Map;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.Executable; import com.dfsek.terra.addons.terrascript.parser.lang.Executable;
import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.Statement;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; import com.dfsek.terra.addons.terrascript.parser.lang.Expression.ReturnType;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope.ScopeBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.Scope.ScopeBuilder;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression;
@@ -58,7 +58,7 @@ import com.dfsek.terra.addons.terrascript.parser.lang.variables.assign.VariableA
import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.BoolVariableReferenceNode; import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.BoolVariableReferenceNode;
import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.NumVariableReferenceNode; import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.NumVariableReferenceNode;
import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.StrVariableReferenceNode; import com.dfsek.terra.addons.terrascript.parser.lang.variables.reference.StrVariableReferenceNode;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.addons.terrascript.tokenizer.Token; import com.dfsek.terra.addons.terrascript.tokenizer.Token;
import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer; import com.dfsek.terra.addons.terrascript.tokenizer.Tokenizer;
import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.generic.pair.Pair;
@@ -66,12 +66,12 @@ import com.dfsek.terra.api.util.generic.pair.Pair;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class Parser { public class Parser {
private final String data; private final String source;
private final Map<String, FunctionBuilder<? extends Function<?>>> functions = new HashMap<>(); private final Map<String, FunctionBuilder<? extends Function<?>>> functions = new HashMap<>();
private final List<String> ignoredFunctions = new ArrayList<>(); private final List<String> ignoredFunctions = new ArrayList<>();
public Parser(String data) { public Parser(String source) {
this.data = data; this.source = source;
} }
public Parser registerFunction(String name, FunctionBuilder<? extends Function<?>> functionBuilder) { public Parser registerFunction(String name, FunctionBuilder<? extends Function<?>> functionBuilder) {
@@ -93,7 +93,7 @@ public class Parser {
*/ */
public Executable parse() { public Executable parse() {
ScopeBuilder scopeBuilder = new ScopeBuilder(); ScopeBuilder scopeBuilder = new ScopeBuilder();
return new Executable(parseBlock(new Tokenizer(data), false, scopeBuilder), scopeBuilder); return new Executable(parseBlock(new Tokenizer(source), false, scopeBuilder), scopeBuilder);
} }
private Keyword<?> parseLoopLike(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) throws ParseException { private Keyword<?> parseLoopLike(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) throws ParseException {
@@ -112,102 +112,102 @@ public class Parser {
}; };
} }
private WhileKeyword parseWhileLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { private WhileKeyword parseWhileLoop(Tokenizer tokens, SourcePosition start, ScopeBuilder scopeBuilder) {
Returnable<?> first = parseExpression(tokens, true, scopeBuilder); Expression<?> first = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); ParserUtil.checkReturnType(first, Expression.ReturnType.BOOLEAN);
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END);
return new WhileKeyword(parseStatementBlock(tokens, true, scopeBuilder), (Returnable<Boolean>) first, start); // While loop return new WhileKeyword(parseStatementBlock(tokens, true, scopeBuilder), (Expression<Boolean>) first, start); // While loop
} }
private IfKeyword parseIfStatement(Tokenizer tokens, Position start, boolean loop, ScopeBuilder scopeBuilder) { private IfKeyword parseIfStatement(Tokenizer tokens, SourcePosition start, boolean loop, ScopeBuilder scopeBuilder) {
Returnable<?> condition = parseExpression(tokens, true, scopeBuilder); Expression<?> condition = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); ParserUtil.checkReturnType(condition, Expression.ReturnType.BOOLEAN);
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END);
Block elseBlock = null; Block elseBlock = null;
Block statement = parseStatementBlock(tokens, loop, scopeBuilder); Block statement = parseStatementBlock(tokens, loop, scopeBuilder);
List<Pair<Returnable<Boolean>, Block>> elseIf = new ArrayList<>(); List<Pair<Expression<Boolean>, Block>> elseIf = new ArrayList<>();
while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { while(tokens.hasNext() && tokens.current().getType().equals(Token.Type.ELSE)) {
tokens.consume(); // Consume else. tokens.consume(); // Consume else.
if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { if(tokens.current().getType().equals(Token.Type.IF_STATEMENT)) {
tokens.consume(); // Consume if. tokens.consume(); // Consume if.
Returnable<?> elseCondition = parseExpression(tokens, true, scopeBuilder); Expression<?> elseCondition = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); ParserUtil.checkReturnType(elseCondition, Expression.ReturnType.BOOLEAN);
elseIf.add(Pair.of((Returnable<Boolean>) elseCondition, parseStatementBlock(tokens, loop, scopeBuilder))); elseIf.add(Pair.of((Expression<Boolean>) elseCondition, parseStatementBlock(tokens, loop, scopeBuilder)));
} else { } else {
elseBlock = parseStatementBlock(tokens, loop, scopeBuilder); elseBlock = parseStatementBlock(tokens, loop, scopeBuilder);
break; // Else must be last. break; // Else must be last.
} }
} }
return new IfKeyword(statement, (Returnable<Boolean>) condition, elseIf, elseBlock, start); // If statement return new IfKeyword(statement, (Expression<Boolean>) condition, elseIf, elseBlock, start); // If statement
} }
private Block parseStatementBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { private Block parseStatementBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) {
if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { if(tokens.current().getType().equals(Token.Type.BLOCK_BEGIN)) {
ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN);
Block block = parseBlock(tokens, loop, scopeBuilder); Block block = parseBlock(tokens, loop, scopeBuilder);
ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END);
return block; return block;
} else { } else {
Position position = tokens.get().getPosition(); SourcePosition position = tokens.current().getPosition();
Block block = new Block(Collections.singletonList(parseItem(tokens, loop, scopeBuilder)), position); Block block = new Block(Collections.singletonList(parseStatement(tokens, loop, scopeBuilder)), position);
ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END);
return block; return block;
} }
} }
private ForKeyword parseForLoop(Tokenizer tokens, Position start, ScopeBuilder scopeBuilder) { private ForKeyword parseForLoop(Tokenizer tokens, SourcePosition start, ScopeBuilder scopeBuilder) {
scopeBuilder = scopeBuilder.sub(); // new scope scopeBuilder = scopeBuilder.sub(); // new scope
Token f = tokens.get(); Token f = tokens.current();
ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER);
Item<?> initializer; Statement<?> initializer;
if(f.isVariableDeclaration()) { if(f.isVariableDeclaration()) {
VariableAssignmentNode<?> forVar = parseVariableDeclaration(tokens, scopeBuilder); VariableAssignmentNode<?> forVar = parseVariableDeclaration(tokens, scopeBuilder);
Token name = tokens.get(); Token name = tokens.current();
if(functions.containsKey(name.getContent()) || scopeBuilder.contains(name.getContent())) if(functions.containsKey(name.getContent()) || scopeBuilder.contains(name.getContent()))
throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition());
initializer = forVar; initializer = forVar;
} else initializer = parseExpression(tokens, true, scopeBuilder); } else initializer = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END);
Returnable<?> conditional = parseExpression(tokens, true, scopeBuilder); Expression<?> conditional = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); ParserUtil.checkReturnType(conditional, Expression.ReturnType.BOOLEAN);
ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END);
Item<?> incrementer; Statement<?> incrementer;
Token token = tokens.get(); Token token = tokens.current();
if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment if(scopeBuilder.contains(token.getContent())) { // Assume variable assignment
incrementer = parseAssignment(tokens, scopeBuilder); incrementer = parseAssignment(tokens, scopeBuilder);
} else incrementer = parseFunction(tokens, true, scopeBuilder); } else incrementer = parseFunction(tokens, true, scopeBuilder);
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END);
return new ForKeyword(parseStatementBlock(tokens, true, scopeBuilder), initializer, (Returnable<Boolean>) conditional, incrementer, return new ForKeyword(parseStatementBlock(tokens, true, scopeBuilder), initializer, (Expression<Boolean>) conditional, incrementer,
start); start);
} }
private Returnable<?> parseExpression(Tokenizer tokens, boolean full, ScopeBuilder scopeBuilder) { private Expression<?> parseExpression(Tokenizer tokens, boolean full, ScopeBuilder scopeBuilder) {
boolean booleanInverted = false; // Check for boolean not operator boolean booleanInverted = false; // Check for boolean not operator
boolean negate = false; boolean negate = false;
if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { if(tokens.current().getType().equals(Token.Type.BOOLEAN_NOT)) {
booleanInverted = true; booleanInverted = true;
tokens.consume(); tokens.consume();
} else if(tokens.get().getType().equals(Token.Type.SUBTRACTION_OPERATOR)) { } else if(tokens.current().getType().equals(Token.Type.SUBTRACTION_OPERATOR)) {
negate = true; negate = true;
tokens.consume(); tokens.consume();
} }
Token id = tokens.get(); Token id = tokens.current();
ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN);
Returnable<?> expression; Expression<?> expression;
if(id.isConstant()) { if(id.isConstant()) {
expression = parseConstantExpression(tokens); expression = parseConstantExpression(tokens);
} else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression
@@ -230,14 +230,14 @@ public class Parser {
} }
if(booleanInverted) { // Invert operation if boolean not detected if(booleanInverted) { // Invert operation if boolean not detected
ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); ParserUtil.checkReturnType(expression, Expression.ReturnType.BOOLEAN);
expression = new BooleanNotOperation((Returnable<Boolean>) expression, expression.getPosition()); expression = new BooleanNotOperation((Expression<Boolean>) expression, expression.getPosition());
} else if(negate) { } else if(negate) {
ParserUtil.checkReturnType(expression, Returnable.ReturnType.NUMBER); ParserUtil.checkReturnType(expression, Expression.ReturnType.NUMBER);
expression = new NegationOperation((Returnable<Number>) expression, expression.getPosition()); expression = new NegationOperation((Expression<Number>) expression, expression.getPosition());
} }
if(full && tokens.get().isBinaryOperator()) { // Parse binary operations if(full && tokens.current().isBinaryOperator()) { // Parse binary operations
return parseBinaryOperation(expression, tokens, scopeBuilder); return parseBinaryOperation(expression, tokens, scopeBuilder);
} }
return expression; return expression;
@@ -245,7 +245,7 @@ public class Parser {
private ConstantExpression<?> parseConstantExpression(Tokenizer tokens) { private ConstantExpression<?> parseConstantExpression(Tokenizer tokens) {
Token constantToken = tokens.consume(); Token constantToken = tokens.consume();
Position position = constantToken.getPosition(); SourcePosition position = constantToken.getPosition();
switch(constantToken.getType()) { switch(constantToken.getType()) {
case NUMBER: case NUMBER:
String content = constantToken.getContent(); String content = constantToken.getContent();
@@ -260,21 +260,21 @@ public class Parser {
} }
} }
private Returnable<?> parseGroup(Tokenizer tokens, ScopeBuilder scopeBuilder) { private Expression<?> parseGroup(Tokenizer tokens, ScopeBuilder scopeBuilder) {
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN);
Returnable<?> expression = parseExpression(tokens, true, scopeBuilder); // Parse inside of group as a separate expression Expression<?> expression = parseExpression(tokens, true, scopeBuilder); // Parse inside of group as a separate expression
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END);
return expression; return expression;
} }
private BinaryOperation<?, ?> parseBinaryOperation(Returnable<?> left, Tokenizer tokens, private BinaryOperation<?, ?> parseBinaryOperation(Expression<?> left, Tokenizer tokens,
ScopeBuilder scopeBuilder) { ScopeBuilder scopeBuilder) {
Token binaryOperator = tokens.consume(); Token binaryOperator = tokens.consume();
ParserUtil.checkBinaryOperator(binaryOperator); ParserUtil.checkBinaryOperator(binaryOperator);
Returnable<?> right = parseExpression(tokens, false, scopeBuilder); Expression<?> right = parseExpression(tokens, false, scopeBuilder);
Token other = tokens.get(); Token other = tokens.current();
if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) { if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) {
return assemble(left, parseBinaryOperation(right, tokens, scopeBuilder), binaryOperator); return assemble(left, parseBinaryOperation(right, tokens, scopeBuilder), binaryOperator);
} else if(other.isBinaryOperator()) { } else if(other.isBinaryOperator()) {
@@ -283,41 +283,41 @@ public class Parser {
return assemble(left, right, binaryOperator); return assemble(left, right, binaryOperator);
} }
private BinaryOperation<?, ?> assemble(Returnable<?> left, Returnable<?> right, Token binaryOperator) { private BinaryOperation<?, ?> assemble(Expression<?> left, Expression<?> right, Token binaryOperator) {
if(binaryOperator.isStrictNumericOperator()) if(binaryOperator.isStrictNumericOperator())
ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking
if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); // Boolean type checking if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); // Boolean type checking
switch(binaryOperator.getType()) { switch(binaryOperator.getType()) {
case ADDITION_OPERATOR: case ADDITION_OPERATOR:
if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { if(left.returnType().equals(Expression.ReturnType.NUMBER) && right.returnType().equals(Expression.ReturnType.NUMBER)) {
return new NumberAdditionOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new NumberAdditionOperation((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
} }
return new ConcatenationOperation((Returnable<Object>) left, (Returnable<Object>) right, binaryOperator.getPosition()); return new ConcatenationOperation((Expression<Object>) left, (Expression<Object>) right, binaryOperator.getPosition());
case SUBTRACTION_OPERATOR: case SUBTRACTION_OPERATOR:
return new SubtractionOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new SubtractionOperation((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case MULTIPLICATION_OPERATOR: case MULTIPLICATION_OPERATOR:
return new MultiplicationOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new MultiplicationOperation((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case DIVISION_OPERATOR: case DIVISION_OPERATOR:
return new DivisionOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new DivisionOperation((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case EQUALS_OPERATOR: case EQUALS_OPERATOR:
return new EqualsStatement((Returnable<Object>) left, (Returnable<Object>) right, binaryOperator.getPosition()); return new EqualsStatement((Expression<Object>) left, (Expression<Object>) right, binaryOperator.getPosition());
case NOT_EQUALS_OPERATOR: case NOT_EQUALS_OPERATOR:
return new NotEqualsStatement((Returnable<Object>) left, (Returnable<Object>) right, binaryOperator.getPosition()); return new NotEqualsStatement((Expression<Object>) left, (Expression<Object>) right, binaryOperator.getPosition());
case GREATER_THAN_OPERATOR: case GREATER_THAN_OPERATOR:
return new GreaterThanStatement((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new GreaterThanStatement((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case LESS_THAN_OPERATOR: case LESS_THAN_OPERATOR:
return new LessThanStatement((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new LessThanStatement((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case GREATER_THAN_OR_EQUALS_OPERATOR: case GREATER_THAN_OR_EQUALS_OPERATOR:
return new GreaterOrEqualsThanStatement((Returnable<Number>) left, (Returnable<Number>) right, return new GreaterOrEqualsThanStatement((Expression<Number>) left, (Expression<Number>) right,
binaryOperator.getPosition()); binaryOperator.getPosition());
case LESS_THAN_OR_EQUALS_OPERATOR: case LESS_THAN_OR_EQUALS_OPERATOR:
return new LessThanOrEqualsStatement((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new LessThanOrEqualsStatement((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
case BOOLEAN_AND: case BOOLEAN_AND:
return new BooleanAndOperation((Returnable<Boolean>) left, (Returnable<Boolean>) right, binaryOperator.getPosition()); return new BooleanAndOperation((Expression<Boolean>) left, (Expression<Boolean>) right, binaryOperator.getPosition());
case BOOLEAN_OR: case BOOLEAN_OR:
return new BooleanOrOperation((Returnable<Boolean>) left, (Returnable<Boolean>) right, binaryOperator.getPosition()); return new BooleanOrOperation((Expression<Boolean>) left, (Expression<Boolean>) right, binaryOperator.getPosition());
case MODULO_OPERATOR: case MODULO_OPERATOR:
return new ModuloOperation((Returnable<Number>) left, (Returnable<Number>) right, binaryOperator.getPosition()); return new ModuloOperation((Expression<Number>) left, (Expression<Number>) right, binaryOperator.getPosition());
default: default:
throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType());
} }
@@ -327,7 +327,7 @@ public class Parser {
Token type = tokens.consume(); Token type = tokens.consume();
ParserUtil.checkType(type, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); ParserUtil.checkType(type, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE);
Returnable.ReturnType returnType = ParserUtil.getVariableReturnType(type); Expression.ReturnType returnType = ParserUtil.getVariableReturnType(type);
ParserUtil.checkVarType(type, returnType); // Check for type mismatch ParserUtil.checkVarType(type, returnType); // Check for type mismatch
Token identifier = tokens.consume(); Token identifier = tokens.consume();
@@ -336,40 +336,40 @@ public class Parser {
throw new ParseException(identifier.getContent() + " is already defined in this scope", identifier.getPosition()); throw new ParseException(identifier.getContent() + " is already defined in this scope", identifier.getPosition());
ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT);
Returnable<?> value = parseExpression(tokens, true, scopeBuilder); Expression<?> value = parseExpression(tokens, true, scopeBuilder);
ParserUtil.checkReturnType(value, returnType); ParserUtil.checkReturnType(value, returnType);
String id = identifier.getContent(); String id = identifier.getContent();
return switch(value.returnType()) { return switch(value.returnType()) {
case NUMBER -> new NumAssignmentNode((Returnable<Number>) value, identifier.getPosition(), scopeBuilder.num(id)); case NUMBER -> new NumAssignmentNode((Expression<Number>) value, identifier.getPosition(), scopeBuilder.num(id));
case STRING -> new StrAssignmentNode((Returnable<String>) value, identifier.getPosition(), scopeBuilder.str(id)); case STRING -> new StrAssignmentNode((Expression<String>) value, identifier.getPosition(), scopeBuilder.str(id));
case BOOLEAN -> new BoolAssignmentNode((Returnable<Boolean>) value, identifier.getPosition(), scopeBuilder.bool(id)); case BOOLEAN -> new BoolAssignmentNode((Expression<Boolean>) value, identifier.getPosition(), scopeBuilder.bool(id));
default -> throw new ParseException("Illegal type for variable declaration: " + type, value.getPosition()); default -> throw new ParseException("Illegal type for variable declaration: " + type, value.getPosition());
}; };
} }
private Block parseBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { private Block parseBlock(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) {
List<Item<?>> parsedItems = new ArrayList<>(); List<Statement<?>> statements = new ArrayList<>();
scopeBuilder = scopeBuilder.sub(); scopeBuilder = scopeBuilder.sub();
Token first = tokens.get(); Token first = tokens.current();
while(tokens.hasNext()) { while(tokens.hasNext()) {
Token token = tokens.get(); Token token = tokens.current();
if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end.
Item<?> parsedItem = parseItem(tokens, loop, scopeBuilder); Statement<?> statement = parseStatement(tokens, loop, scopeBuilder);
if(parsedItem != Function.NULL) { if(statement != Function.NULL) {
parsedItems.add(parsedItem); statements.add(statement);
} }
if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END);
} }
return new Block(parsedItems, first.getPosition()); return new Block(statements, first.getPosition());
} }
private Item<?> parseItem(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) { private Statement<?> parseStatement(Tokenizer tokens, boolean loop, ScopeBuilder scopeBuilder) {
Token token = tokens.get(); Token token = tokens.current();
if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP,
Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE,
Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL);
@@ -384,9 +384,7 @@ public class Parser {
return parseAssignment(tokens, scopeBuilder); return parseAssignment(tokens, scopeBuilder);
} else return parseFunction(tokens, true, scopeBuilder); } else return parseFunction(tokens, true, scopeBuilder);
} else if(token.isVariableDeclaration()) { } else if(token.isVariableDeclaration()) {
return parseVariableDeclaration(tokens, scopeBuilder); return parseVariableDeclaration(tokens, scopeBuilder);
} else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition()); } else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition());
else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition()); else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition());
else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition()); else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition());
@@ -401,7 +399,7 @@ public class Parser {
ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT);
Returnable<?> value = parseExpression(tokens, true, scopeBuilder); Expression<?> value = parseExpression(tokens, true, scopeBuilder);
String id = identifier.getContent(); String id = identifier.getContent();
@@ -410,9 +408,9 @@ public class Parser {
ReturnType type = value.returnType(); ReturnType type = value.returnType();
return switch(type) { return switch(type) {
case NUMBER -> new NumAssignmentNode((Returnable<Number>) value, identifier.getPosition(), scopeBuilder.getIndex(id)); case NUMBER -> new NumAssignmentNode((Expression<Number>) value, identifier.getPosition(), scopeBuilder.getIndex(id));
case STRING -> new StrAssignmentNode((Returnable<String>) value, identifier.getPosition(), scopeBuilder.getIndex(id)); case STRING -> new StrAssignmentNode((Expression<String>) value, identifier.getPosition(), scopeBuilder.getIndex(id));
case BOOLEAN -> new BoolAssignmentNode((Returnable<Boolean>) value, identifier.getPosition(), scopeBuilder.getIndex(id)); case BOOLEAN -> new BoolAssignmentNode((Expression<Boolean>) value, identifier.getPosition(), scopeBuilder.getIndex(id));
default -> throw new ParseException("Illegal type for variable assignment: " + type, value.getPosition()); default -> throw new ParseException("Illegal type for variable assignment: " + type, value.getPosition());
}; };
} }
@@ -427,11 +425,11 @@ public class Parser {
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin
List<Returnable<?>> args = getArgs(tokens, scopeBuilder); // Extract arguments, consume the rest. List<Expression<?>> args = getArgs(tokens, scopeBuilder); // Extract arguments, consume the rest.
ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end
if(fullStatement) ParserUtil.checkType(tokens.get(), Token.Type.STATEMENT_END); if(fullStatement) ParserUtil.checkType(tokens.current(), Token.Type.STATEMENT_END);
if(ignoredFunctions.contains(identifier.getContent())) { if(ignoredFunctions.contains(identifier.getContent())) {
return Function.NULL; return Function.NULL;
@@ -444,7 +442,7 @@ public class Parser {
throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition()); throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition());
for(int i = 0; i < args.size(); i++) { for(int i = 0; i < args.size(); i++) {
Returnable<?> argument = args.get(i); Expression<?> argument = args.get(i);
if(builder.getArgument(i) == null) if(builder.getArgument(i) == null)
throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(),
identifier.getPosition()); identifier.getPosition());
@@ -455,13 +453,13 @@ public class Parser {
throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent());
} }
private List<Returnable<?>> getArgs(Tokenizer tokens, ScopeBuilder scopeBuilder) { private List<Expression<?>> getArgs(Tokenizer tokens, ScopeBuilder scopeBuilder) {
List<Returnable<?>> args = new ArrayList<>(); List<Expression<?>> args = new ArrayList<>();
while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { while(!tokens.current().getType().equals(Token.Type.GROUP_END)) {
args.add(parseExpression(tokens, true, scopeBuilder)); args.add(parseExpression(tokens, true, scopeBuilder));
ParserUtil.checkType(tokens.get(), Token.Type.SEPARATOR, Token.Type.GROUP_END); ParserUtil.checkType(tokens.current(), Token.Type.SEPARATOR, Token.Type.GROUP_END);
if(tokens.get().getType().equals(Token.Type.SEPARATOR)) tokens.consume(); if(tokens.current().getType().equals(Token.Type.SEPARATOR)) tokens.consume();
} }
return args; return args;
} }
@@ -13,7 +13,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Token; import com.dfsek.terra.addons.terrascript.tokenizer.Token;
@@ -56,31 +56,31 @@ public class ParserUtil {
throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType(), token.getPosition()); throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType(), token.getPosition());
} }
public static void checkReturnType(Returnable<?> returnable, Returnable.ReturnType... types) { public static void checkReturnType(Expression<?> returnable, Expression.ReturnType... types) {
for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; for(Expression.ReturnType type : types) if(returnable.returnType().equals(type)) return;
throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType(), returnable.getPosition()); throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType(), returnable.getPosition());
} }
public static void checkArithmeticOperation(Returnable<?> left, Returnable<?> right, Token operation) { public static void checkArithmeticOperation(Expression<?> left, Expression<?> right, Token operation) {
if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { if(!left.returnType().equals(Expression.ReturnType.NUMBER) || !right.returnType().equals(Expression.ReturnType.NUMBER)) {
throw new ParseException( throw new ParseException(
"Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), "Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(),
operation.getPosition()); operation.getPosition());
} }
} }
public static void checkBooleanOperation(Returnable<?> left, Returnable<?> right, Token operation) { public static void checkBooleanOperation(Expression<?> left, Expression<?> right, Token operation) {
if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { if(!left.returnType().equals(Expression.ReturnType.BOOLEAN) || !right.returnType().equals(Expression.ReturnType.BOOLEAN)) {
throw new ParseException( throw new ParseException(
"Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), "Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(),
operation.getPosition()); operation.getPosition());
} }
} }
public static void checkVarType(Token token, Returnable.ReturnType returnType) { public static void checkVarType(Token token, Expression.ReturnType returnType) {
if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; if(returnType.equals(Expression.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return;
if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; if(returnType.equals(Expression.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return;
if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; if(returnType.equals(Expression.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return;
throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType(), token.getPosition()); throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType(), token.getPosition());
} }
@@ -96,11 +96,11 @@ public class ParserUtil {
throw new ParseException("Expected binary operator, found " + token.getType(), token.getPosition()); throw new ParseException("Expected binary operator, found " + token.getType(), token.getPosition());
} }
public static Returnable.ReturnType getVariableReturnType(Token varToken) { public static Expression.ReturnType getVariableReturnType(Token varToken) {
return switch(varToken.getType()) { return switch(varToken.getType()) {
case NUMBER_VARIABLE -> Returnable.ReturnType.NUMBER; case NUMBER_VARIABLE -> Expression.ReturnType.NUMBER;
case STRING_VARIABLE -> Returnable.ReturnType.STRING; case STRING_VARIABLE -> Expression.ReturnType.STRING;
case BOOLEAN_VARIABLE -> Returnable.ReturnType.BOOLEAN; case BOOLEAN_VARIABLE -> Expression.ReturnType.BOOLEAN;
default -> throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration", default -> throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration",
varToken.getPosition()); varToken.getPosition());
}; };
@@ -9,20 +9,20 @@ package com.dfsek.terra.addons.terrascript.parser.exceptions;
import java.io.Serial; import java.io.Serial;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ParseException extends RuntimeException { public class ParseException extends RuntimeException {
@Serial @Serial
private static final long serialVersionUID = 6744390543046766386L; private static final long serialVersionUID = 6744390543046766386L;
private final Position position; private final SourcePosition position;
public ParseException(String message, Position position) { public ParseException(String message, SourcePosition position) {
super(message); super(message);
this.position = position; this.position = position;
} }
public ParseException(String message, Position position, Throwable cause) { public ParseException(String message, SourcePosition position, Throwable cause) {
super(message, cause); super(message, cause);
this.position = position; this.position = position;
} }
@@ -32,7 +32,7 @@ public class ParseException extends RuntimeException {
return super.getMessage() + ": " + position; return super.getMessage() + ": " + position;
} }
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -9,22 +9,23 @@ package com.dfsek.terra.addons.terrascript.parser.lang;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.parser.lang.Block.ReturnInfo;
import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class Block implements Item<Block.ReturnInfo<?>> { public class Block implements Statement<ReturnInfo<?>> {
private final List<Item<?>> items; private final List<Statement<?>> items;
private final Position position; private final SourcePosition position;
public Block(List<Item<?>> items, Position position) { public Block(List<Statement<?>> items, SourcePosition position) {
this.items = items; this.items = items;
this.position = position; this.position = position;
} }
@Override @Override
public ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
for(Item<?> item : items) { for(Statement<?> item : items) {
Object result = item.apply(implementationArguments, scope); Object result = item.invoke(implementationArguments, scope);
if(result instanceof ReturnInfo<?> level) { if(result instanceof ReturnInfo<?> level) {
if(!level.getLevel().equals(ReturnLevel.NONE)) return level; if(!level.getLevel().equals(ReturnLevel.NONE)) return level;
} }
@@ -33,7 +34,7 @@ public class Block implements Item<Block.ReturnInfo<?>> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -14,6 +14,6 @@ public class Executable {
} }
public boolean execute(ImplementationArguments arguments) { public boolean execute(ImplementationArguments arguments) {
return script.apply(arguments, scope.get()).getLevel() != Block.ReturnLevel.FAIL; return script.invoke(arguments, scope.get()).getLevel() != Block.ReturnLevel.FAIL;
} }
} }
@@ -7,7 +7,7 @@
package com.dfsek.terra.addons.terrascript.parser.lang; package com.dfsek.terra.addons.terrascript.parser.lang;
public interface Returnable<T> extends Item<T> { public interface Expression<T> extends Statement<T> {
ReturnType returnType(); ReturnType returnType();
enum ReturnType { enum ReturnType {
@@ -8,7 +8,7 @@
package com.dfsek.terra.addons.terrascript.parser.lang; package com.dfsek.terra.addons.terrascript.parser.lang;
/** /**
* Arguments passed to {@link Item}s by the implementation * Arguments passed to {@link Statement}s by the implementation
*/ */
public interface ImplementationArguments { public interface ImplementationArguments {
} }
@@ -1,25 +0,0 @@
/*
* Copyright (c) 2020-2021 Polyhedral Development
*
* The Terra Core Addons are licensed under the terms of the MIT License. For more details,
* reference the LICENSE file in this module's root directory.
*/
package com.dfsek.terra.addons.terrascript.parser.lang;
import com.dfsek.terra.addons.terrascript.tokenizer.Position;
public interface Item<T> {
T apply(ImplementationArguments implementationArguments, Scope scope);
default double applyDouble(ImplementationArguments implementationArguments, Scope scope) {
throw new UnsupportedOperationException("Cannot apply " + this + " as double");
}
default boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) {
throw new UnsupportedOperationException("Cannot apply " + this + " as double");
}
Position getPosition();
}
@@ -7,5 +7,5 @@
package com.dfsek.terra.addons.terrascript.parser.lang; package com.dfsek.terra.addons.terrascript.parser.lang;
public interface Keyword<T> extends Returnable<T> { public interface Keyword<T> extends Expression<T> {
} }
@@ -6,7 +6,7 @@ import net.jafama.FastMath;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; import com.dfsek.terra.addons.terrascript.parser.lang.Expression.ReturnType;
import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.generic.pair.Pair;
@@ -7,5 +7,19 @@
package com.dfsek.terra.addons.terrascript.parser.lang; package com.dfsek.terra.addons.terrascript.parser.lang;
public interface Statement extends Item<Boolean> { import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public interface Statement<T> {
T invoke(ImplementationArguments implementationArguments, Scope scope);
default double applyDouble(ImplementationArguments implementationArguments, Scope scope) {
throw new UnsupportedOperationException("Cannot apply " + this + " as double");
}
default boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) {
throw new UnsupportedOperationException("Cannot apply " + this + " as double");
}
SourcePosition getPosition();
} }
@@ -9,13 +9,13 @@ package com.dfsek.terra.addons.terrascript.parser.lang.constants;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BooleanConstant extends ConstantExpression<Boolean> { public class BooleanConstant extends ConstantExpression<Boolean> {
private final boolean constant; private final boolean constant;
public BooleanConstant(Boolean constant, Position position) { public BooleanConstant(Boolean constant, SourcePosition position) {
super(constant, position); super(constant, position);
this.constant = constant; this.constant = constant;
} }
@@ -8,27 +8,27 @@
package com.dfsek.terra.addons.terrascript.parser.lang.constants; package com.dfsek.terra.addons.terrascript.parser.lang.constants;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class ConstantExpression<T> implements Returnable<T> { public abstract class ConstantExpression<T> implements Expression<T> {
private final T constant; private final T constant;
private final Position position; private final SourcePosition position;
public ConstantExpression(T constant, Position position) { public ConstantExpression(T constant, SourcePosition position) {
this.constant = constant; this.constant = constant;
this.position = position; this.position = position;
} }
@Override @Override
public T apply(ImplementationArguments implementationArguments, Scope scope) { public T invoke(ImplementationArguments implementationArguments, Scope scope) {
return constant; return constant;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -8,15 +8,15 @@
package com.dfsek.terra.addons.terrascript.parser.lang.constants; package com.dfsek.terra.addons.terrascript.parser.lang.constants;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NumericConstant extends ConstantExpression<Number> { public class NumericConstant extends ConstantExpression<Number> {
private final double constant; private final double constant;
public NumericConstant(Number constant, Position position) { public NumericConstant(Number constant, SourcePosition position) {
super(constant, position); super(constant, position);
this.constant = constant.doubleValue(); this.constant = constant.doubleValue();
} }
@@ -27,7 +27,7 @@ public class NumericConstant extends ConstantExpression<Number> {
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.NUMBER; return Expression.ReturnType.NUMBER;
} }
} }
@@ -7,17 +7,17 @@
package com.dfsek.terra.addons.terrascript.parser.lang.constants; package com.dfsek.terra.addons.terrascript.parser.lang.constants;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class StringConstant extends ConstantExpression<String> { public class StringConstant extends ConstantExpression<String> {
public StringConstant(String constant, Position position) { public StringConstant(String constant, SourcePosition position) {
super(constant, position); super(constant, position);
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.STRING; return Expression.ReturnType.STRING;
} }
} }
@@ -8,12 +8,12 @@
package com.dfsek.terra.addons.terrascript.parser.lang.functions; package com.dfsek.terra.addons.terrascript.parser.lang.functions;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public interface Function<T> extends Returnable<T> { public interface Function<T> extends Expression<T> {
Function<?> NULL = new Function<>() { Function<?> NULL = new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -21,23 +21,23 @@ public interface Function<T> extends Returnable<T> {
} }
@Override @Override
public Object apply(ImplementationArguments implementationArguments, Scope scope) { public Object invoke(ImplementationArguments implementationArguments, Scope scope) {
return null; return null;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return null; return null;
} }
}; };
@Override @Override
default double applyDouble(ImplementationArguments implementationArguments, Scope scope) { default double applyDouble(ImplementationArguments implementationArguments, Scope scope) {
return ((Number) apply(implementationArguments, scope)).doubleValue(); return ((Number) invoke(implementationArguments, scope)).doubleValue();
} }
@Override @Override
default boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) { default boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) {
return (Boolean) apply(implementationArguments, scope); return (Boolean) invoke(implementationArguments, scope);
} }
} }
@@ -9,14 +9,14 @@ package com.dfsek.terra.addons.terrascript.parser.lang.functions;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public interface FunctionBuilder<T extends Function<?>> { public interface FunctionBuilder<T extends Function<?>> {
T build(List<Returnable<?>> argumentList, Position position); T build(List<Expression<?>> argumentList, SourcePosition position);
int argNumber(); int argNumber();
Returnable.ReturnType getArgument(int position); Expression.ReturnType getArgument(int position);
} }
@@ -11,23 +11,23 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BreakKeyword implements Keyword<Block.ReturnInfo<?>> { public class BreakKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Position position; private final SourcePosition position;
public BreakKeyword(Position position) { public BreakKeyword(SourcePosition position) {
this.position = position; this.position = position;
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
return new Block.ReturnInfo<>(Block.ReturnLevel.BREAK, null); return new Block.ReturnInfo<>(Block.ReturnLevel.BREAK, null);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -11,23 +11,23 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ContinueKeyword implements Keyword<Block.ReturnInfo<?>> { public class ContinueKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Position position; private final SourcePosition position;
public ContinueKeyword(Position position) { public ContinueKeyword(SourcePosition position) {
this.position = position; this.position = position;
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
return new Block.ReturnInfo<>(Block.ReturnLevel.CONTINUE, null); return new Block.ReturnInfo<>(Block.ReturnLevel.CONTINUE, null);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -11,23 +11,23 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class FailKeyword implements Keyword<Block.ReturnInfo<?>> { public class FailKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Position position; private final SourcePosition position;
public FailKeyword(Position position) { public FailKeyword(SourcePosition position) {
this.position = position; this.position = position;
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
return new Block.ReturnInfo<>(Block.ReturnLevel.FAIL, null); return new Block.ReturnInfo<>(Block.ReturnLevel.FAIL, null);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -11,23 +11,23 @@ import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ReturnKeyword implements Keyword<Block.ReturnInfo<?>> { public class ReturnKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Position position; private final SourcePosition position;
public ReturnKeyword(Position position) { public ReturnKeyword(SourcePosition position) {
this.position = position; this.position = position;
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
return new Block.ReturnInfo<>(Block.ReturnLevel.RETURN, null); return new Block.ReturnInfo<>(Block.ReturnLevel.RETURN, null);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -9,21 +9,21 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike;
import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.Statement;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ForKeyword implements Keyword<Block.ReturnInfo<?>> { public class ForKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Block conditional; private final Block conditional;
private final Item<?> initializer; private final Statement<?> initializer;
private final Returnable<Boolean> statement; private final Expression<Boolean> statement;
private final Item<?> incrementer; private final Statement<?> incrementer;
private final Position position; private final SourcePosition position;
public ForKeyword(Block conditional, Item<?> initializer, Returnable<Boolean> statement, Item<?> incrementer, Position position) { public ForKeyword(Block conditional, Statement<?> initializer, Expression<Boolean> statement, Statement<?> incrementer, SourcePosition position) {
this.conditional = conditional; this.conditional = conditional;
this.initializer = initializer; this.initializer = initializer;
this.statement = statement; this.statement = statement;
@@ -32,11 +32,11 @@ public class ForKeyword implements Keyword<Block.ReturnInfo<?>> {
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
for(initializer.apply(implementationArguments, scope); for(initializer.invoke(implementationArguments, scope);
statement.apply(implementationArguments, scope); statement.invoke(implementationArguments, scope);
incrementer.apply(implementationArguments, scope)) { incrementer.invoke(implementationArguments, scope)) {
Block.ReturnInfo<?> level = conditional.apply(implementationArguments, scope); Block.ReturnInfo<?> level = conditional.invoke(implementationArguments, scope);
if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break;
if(level.getLevel().isReturnFast()) return level; if(level.getLevel().isReturnFast()) return level;
} }
@@ -44,7 +44,7 @@ public class ForKeyword implements Keyword<Block.ReturnInfo<?>> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -14,21 +14,21 @@ import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.generic.pair.Pair; import com.dfsek.terra.api.util.generic.pair.Pair;
public class IfKeyword implements Keyword<Block.ReturnInfo<?>> { public class IfKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Block conditional; private final Block conditional;
private final Returnable<Boolean> statement; private final Expression<Boolean> statement;
private final Position position; private final SourcePosition position;
private final List<Pair<Returnable<Boolean>, Block>> elseIf; private final List<Pair<Expression<Boolean>, Block>> elseIf;
private final Block elseBlock; private final Block elseBlock;
public IfKeyword(Block conditional, Returnable<Boolean> statement, List<Pair<Returnable<Boolean>, Block>> elseIf, public IfKeyword(Block conditional, Expression<Boolean> statement, List<Pair<Expression<Boolean>, Block>> elseIf,
@Nullable Block elseBlock, Position position) { @Nullable Block elseBlock, SourcePosition position) {
this.conditional = conditional; this.conditional = conditional;
this.statement = statement; this.statement = statement;
this.position = position; this.position = position;
@@ -37,21 +37,21 @@ public class IfKeyword implements Keyword<Block.ReturnInfo<?>> {
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
if(statement.apply(implementationArguments, scope)) return conditional.apply(implementationArguments, scope); if(statement.invoke(implementationArguments, scope)) return conditional.invoke(implementationArguments, scope);
else { else {
for(Pair<Returnable<Boolean>, Block> pair : elseIf) { for(Pair<Expression<Boolean>, Block> pair : elseIf) {
if(pair.getLeft().apply(implementationArguments, scope)) { if(pair.getLeft().invoke(implementationArguments, scope)) {
return pair.getRight().apply(implementationArguments, scope); return pair.getRight().invoke(implementationArguments, scope);
} }
} }
if(elseBlock != null) return elseBlock.apply(implementationArguments, scope); if(elseBlock != null) return elseBlock.invoke(implementationArguments, scope);
} }
return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -10,26 +10,26 @@ package com.dfsek.terra.addons.terrascript.parser.lang.keywords.looplike;
import com.dfsek.terra.addons.terrascript.parser.lang.Block; import com.dfsek.terra.addons.terrascript.parser.lang.Block;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Keyword; import com.dfsek.terra.addons.terrascript.parser.lang.Keyword;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class WhileKeyword implements Keyword<Block.ReturnInfo<?>> { public class WhileKeyword implements Keyword<Block.ReturnInfo<?>> {
private final Block conditional; private final Block conditional;
private final Returnable<Boolean> statement; private final Expression<Boolean> statement;
private final Position position; private final SourcePosition position;
public WhileKeyword(Block conditional, Returnable<Boolean> statement, Position position) { public WhileKeyword(Block conditional, Expression<Boolean> statement, SourcePosition position) {
this.conditional = conditional; this.conditional = conditional;
this.statement = statement; this.statement = statement;
this.position = position; this.position = position;
} }
@Override @Override
public Block.ReturnInfo<?> apply(ImplementationArguments implementationArguments, Scope scope) { public Block.ReturnInfo<?> invoke(ImplementationArguments implementationArguments, Scope scope) {
while(statement.apply(implementationArguments, scope)) { while(statement.invoke(implementationArguments, scope)) {
Block.ReturnInfo<?> level = conditional.apply(implementationArguments, scope); Block.ReturnInfo<?> level = conditional.invoke(implementationArguments, scope);
if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break;
if(level.getLevel().isReturnFast()) return level; if(level.getLevel().isReturnFast()) return level;
} }
@@ -37,7 +37,7 @@ public class WhileKeyword implements Keyword<Block.ReturnInfo<?>> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -7,23 +7,23 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class BinaryOperation<I, O> implements Returnable<O> { public abstract class BinaryOperation<I, O> implements Expression<O> {
protected final Returnable<I> left; protected final Expression<I> left;
protected final Returnable<I> right; protected final Expression<I> right;
private final Position start; private final SourcePosition start;
public BinaryOperation(Returnable<I> left, Returnable<I> right, Position start) { public BinaryOperation(Expression<I> left, Expression<I> right, SourcePosition start) {
this.left = left; this.left = left;
this.right = right; this.right = right;
this.start = start; this.start = start;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return start; return start;
} }
} }
@@ -8,13 +8,13 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BooleanAndOperation extends BinaryOperation<Boolean, Boolean> { public class BooleanAndOperation extends BinaryOperation<Boolean, Boolean> {
public BooleanAndOperation(Returnable<Boolean> left, Returnable<Boolean> right, Position start) { public BooleanAndOperation(Expression<Boolean> left, Expression<Boolean> right, SourcePosition start) {
super(left, right, start); super(left, right, start);
} }
@@ -24,7 +24,7 @@ public class BooleanAndOperation extends BinaryOperation<Boolean, Boolean> {
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BooleanNotOperation extends UnaryOperation<Boolean> { public class BooleanNotOperation extends UnaryOperation<Boolean> {
public BooleanNotOperation(Returnable<Boolean> input, Position position) { public BooleanNotOperation(Expression<Boolean> input, SourcePosition position) {
super(input, position); super(input, position);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BooleanOrOperation extends BinaryOperation<Boolean, Boolean> { public class BooleanOrOperation extends BinaryOperation<Boolean, Boolean> {
public BooleanOrOperation(Returnable<Boolean> left, Returnable<Boolean> right, Position start) { public BooleanOrOperation(Expression<Boolean> left, Expression<Boolean> right, SourcePosition start) {
super(left, right, start); super(left, right, start);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -8,13 +8,13 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ConcatenationOperation extends BinaryOperation<Object, Object> { public class ConcatenationOperation extends BinaryOperation<Object, Object> {
public ConcatenationOperation(Returnable<Object> left, Returnable<Object> right, Position position) { public ConcatenationOperation(Expression<Object> left, Expression<Object> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@@ -30,12 +30,12 @@ public class ConcatenationOperation extends BinaryOperation<Object, Object> {
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.STRING; return Expression.ReturnType.STRING;
} }
@Override @Override
public Object apply(ImplementationArguments implementationArguments, Scope scope) { public Object invoke(ImplementationArguments implementationArguments, Scope scope) {
return toString(left.apply(implementationArguments, scope)) + toString(right.apply(implementationArguments, scope)); return toString(left.invoke(implementationArguments, scope)) + toString(right.invoke(implementationArguments, scope));
} }
} }
@@ -8,23 +8,23 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class DivisionOperation extends BinaryOperation<Number, Number> { public class DivisionOperation extends BinaryOperation<Number, Number> {
public DivisionOperation(Returnable<Number> left, Returnable<Number> right, Position position) { public DivisionOperation(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.NUMBER; return Expression.ReturnType.NUMBER;
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ModuloOperation extends BinaryOperation<Number, Number> { public class ModuloOperation extends BinaryOperation<Number, Number> {
public ModuloOperation(Returnable<Number> left, Returnable<Number> right, Position start) { public ModuloOperation(Expression<Number> left, Expression<Number> right, SourcePosition start) {
super(left, right, start); super(left, right, start);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class MultiplicationOperation extends BinaryOperation<Number, Number> { public class MultiplicationOperation extends BinaryOperation<Number, Number> {
public MultiplicationOperation(Returnable<Number> left, Returnable<Number> right, Position position) { public MultiplicationOperation(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -8,13 +8,13 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NegationOperation extends UnaryOperation<Number> { public class NegationOperation extends UnaryOperation<Number> {
public NegationOperation(Returnable<Number> input, Position position) { public NegationOperation(Expression<Number> input, SourcePosition position) {
super(input, position); super(input, position);
} }
@@ -24,7 +24,7 @@ public class NegationOperation extends UnaryOperation<Number> {
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NumberAdditionOperation extends BinaryOperation<Number, Number> { public class NumberAdditionOperation extends BinaryOperation<Number, Number> {
public NumberAdditionOperation(Returnable<Number> left, Returnable<Number> right, Position position) { public NumberAdditionOperation(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class SubtractionOperation extends BinaryOperation<Number, Number> { public class SubtractionOperation extends BinaryOperation<Number, Number> {
public SubtractionOperation(Returnable<Number> left, Returnable<Number> right, Position position) { public SubtractionOperation(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -7,21 +7,21 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations; package com.dfsek.terra.addons.terrascript.parser.lang.operations;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class UnaryOperation<T> implements Returnable<T> { public abstract class UnaryOperation<T> implements Expression<T> {
protected final Returnable<T> input; protected final Expression<T> input;
private final Position position; private final SourcePosition position;
public UnaryOperation(Returnable<T> input, Position position) { public UnaryOperation(Expression<T> input, SourcePosition position) {
this.input = input; this.input = input;
this.position = position; this.position = position;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -10,35 +10,35 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import static com.dfsek.terra.api.util.MathUtil.EPSILON; import static com.dfsek.terra.api.util.MathUtil.EPSILON;
public class EqualsStatement extends BinaryOperation<Object, Boolean> { public class EqualsStatement extends BinaryOperation<Object, Boolean> {
public EqualsStatement(Returnable<Object> left, Returnable<Object> right, Position position) { public EqualsStatement(Expression<Object> left, Expression<Object> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@Override @Override
public boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) { public boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) {
Object leftValue = left.apply(implementationArguments, scope); Object leftValue = left.invoke(implementationArguments, scope);
Object rightValue = right.apply(implementationArguments, scope); Object rightValue = right.invoke(implementationArguments, scope);
if(leftValue instanceof Number l && rightValue instanceof Number r) { if(leftValue instanceof Number l && rightValue instanceof Number r) {
return FastMath.abs(l.doubleValue() - r.doubleValue()) <= EPSILON; return FastMath.abs(l.doubleValue() - r.doubleValue()) <= EPSILON;
} }
@@ -8,24 +8,24 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements; package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class GreaterOrEqualsThanStatement extends BinaryOperation<Number, Boolean> { public class GreaterOrEqualsThanStatement extends BinaryOperation<Number, Boolean> {
public GreaterOrEqualsThanStatement(Returnable<Number> left, Returnable<Number> right, Position position) { public GreaterOrEqualsThanStatement(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -8,20 +8,20 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements; package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class GreaterThanStatement extends BinaryOperation<Number, Boolean> { public class GreaterThanStatement extends BinaryOperation<Number, Boolean> {
public GreaterThanStatement(Returnable<Number> left, Returnable<Number> right, Position position) { public GreaterThanStatement(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -31,7 +31,7 @@ public class GreaterThanStatement extends BinaryOperation<Number, Boolean> {
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
} }
@@ -8,20 +8,20 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements; package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class LessThanOrEqualsStatement extends BinaryOperation<Number, Boolean> { public class LessThanOrEqualsStatement extends BinaryOperation<Number, Boolean> {
public LessThanOrEqualsStatement(Returnable<Number> left, Returnable<Number> right, Position position) { public LessThanOrEqualsStatement(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -31,7 +31,7 @@ public class LessThanOrEqualsStatement extends BinaryOperation<Number, Boolean>
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
} }
@@ -8,20 +8,20 @@
package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements; package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class LessThanStatement extends BinaryOperation<Number, Boolean> { public class LessThanStatement extends BinaryOperation<Number, Boolean> {
public LessThanStatement(Returnable<Number> left, Returnable<Number> right, Position position) { public LessThanStatement(Expression<Number> left, Expression<Number> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -31,7 +31,7 @@ public class LessThanStatement extends BinaryOperation<Number, Boolean> {
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
} }
@@ -10,28 +10,28 @@ package com.dfsek.terra.addons.terrascript.parser.lang.operations.statements;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation; import com.dfsek.terra.addons.terrascript.parser.lang.operations.BinaryOperation;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import static com.dfsek.terra.api.util.MathUtil.EPSILON; import static com.dfsek.terra.api.util.MathUtil.EPSILON;
public class NotEqualsStatement extends BinaryOperation<Object, Boolean> { public class NotEqualsStatement extends BinaryOperation<Object, Boolean> {
public NotEqualsStatement(Returnable<Object> left, Returnable<Object> right, Position position) { public NotEqualsStatement(Expression<Object> left, Expression<Object> right, SourcePosition position) {
super(left, right, position); super(left, right, position);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@Override @Override
public boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) { public boolean applyBoolean(ImplementationArguments implementationArguments, Scope scope) {
Object leftValue = left.apply(implementationArguments, scope); Object leftValue = left.invoke(implementationArguments, scope);
Object rightValue = right.apply(implementationArguments, scope); Object rightValue = right.invoke(implementationArguments, scope);
if(leftValue instanceof Number l && rightValue instanceof Number r) { if(leftValue instanceof Number l && rightValue instanceof Number r) {
return FastMath.abs(l.doubleValue() - r.doubleValue()) > EPSILON; return FastMath.abs(l.doubleValue() - r.doubleValue()) > EPSILON;
} }
@@ -40,7 +40,7 @@ public class NotEqualsStatement extends BinaryOperation<Object, Boolean> {
} }
@Override @Override
public Returnable.ReturnType returnType() { public Expression.ReturnType returnType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
} }
@@ -7,15 +7,15 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables; package com.dfsek.terra.addons.terrascript.parser.lang.variables;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BooleanVariable implements Variable<Boolean> { public class BooleanVariable implements Variable<Boolean> {
private final Position position; private final SourcePosition position;
private Boolean value; private Boolean value;
public BooleanVariable(Boolean value, Position position) { public BooleanVariable(Boolean value, SourcePosition position) {
this.value = value; this.value = value;
this.position = position; this.position = position;
} }
@@ -31,12 +31,12 @@ public class BooleanVariable implements Variable<Boolean> {
} }
@Override @Override
public Returnable.ReturnType getType() { public Expression.ReturnType getType() {
return Returnable.ReturnType.BOOLEAN; return Expression.ReturnType.BOOLEAN;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -7,15 +7,15 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables; package com.dfsek.terra.addons.terrascript.parser.lang.variables;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NumberVariable implements Variable<Number> { public class NumberVariable implements Variable<Number> {
private final Position position; private final SourcePosition position;
private Number value; private Number value;
public NumberVariable(Number value, Position position) { public NumberVariable(Number value, SourcePosition position) {
this.value = value; this.value = value;
this.position = position; this.position = position;
} }
@@ -31,12 +31,12 @@ public class NumberVariable implements Variable<Number> {
} }
@Override @Override
public Returnable.ReturnType getType() { public Expression.ReturnType getType() {
return Returnable.ReturnType.NUMBER; return Expression.ReturnType.NUMBER;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -7,15 +7,15 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables; package com.dfsek.terra.addons.terrascript.parser.lang.variables;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class StringVariable implements Variable<String> { public class StringVariable implements Variable<String> {
private final Position position; private final SourcePosition position;
private String value; private String value;
public StringVariable(String value, Position position) { public StringVariable(String value, SourcePosition position) {
this.value = value; this.value = value;
this.position = position; this.position = position;
} }
@@ -31,12 +31,12 @@ public class StringVariable implements Variable<String> {
} }
@Override @Override
public Returnable.ReturnType getType() { public Expression.ReturnType getType() {
return Returnable.ReturnType.STRING; return Expression.ReturnType.STRING;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -7,8 +7,8 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables; package com.dfsek.terra.addons.terrascript.parser.lang.variables;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public interface Variable<T> { public interface Variable<T> {
@@ -16,7 +16,7 @@ public interface Variable<T> {
void setValue(T value); void setValue(T value);
Returnable.ReturnType getType(); Expression.ReturnType getType();
Position getPosition(); SourcePosition getPosition();
} }
@@ -1,18 +1,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign; package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BoolAssignmentNode extends VariableAssignmentNode<Boolean> { public class BoolAssignmentNode extends VariableAssignmentNode<Boolean> {
public BoolAssignmentNode(Returnable<Boolean> value, Position position, int index) { public BoolAssignmentNode(Expression<Boolean> value, SourcePosition position, int index) {
super(value, position, index); super(value, position, index);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyBoolean(implementationArguments, scope); return applyBoolean(implementationArguments, scope);
} }
@@ -1,18 +1,18 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign; package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NumAssignmentNode extends VariableAssignmentNode<Number> { public class NumAssignmentNode extends VariableAssignmentNode<Number> {
public NumAssignmentNode(Returnable<Number> value, Position position, int index) { public NumAssignmentNode(Expression<Number> value, SourcePosition position, int index) {
super(value, position, index); super(value, position, index);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return applyDouble(implementationArguments, scope); return applyDouble(implementationArguments, scope);
} }
@@ -1,19 +1,19 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign; package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class StrAssignmentNode extends VariableAssignmentNode<String> { public class StrAssignmentNode extends VariableAssignmentNode<String> {
public StrAssignmentNode(Returnable<String> value, Position position, int index) { public StrAssignmentNode(Expression<String> value, SourcePosition position, int index) {
super(value, position, index); super(value, position, index);
} }
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
String val = value.apply(implementationArguments, scope); String val = value.invoke(implementationArguments, scope);
scope.setStr(index, val); scope.setStr(index, val);
return val; return val;
} }
@@ -7,25 +7,25 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign; package com.dfsek.terra.addons.terrascript.parser.lang.variables.assign;
import com.dfsek.terra.addons.terrascript.parser.lang.Item; import com.dfsek.terra.addons.terrascript.parser.lang.Statement;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class VariableAssignmentNode<T> implements Item<T> { public abstract class VariableAssignmentNode<T> implements Statement<T> {
protected final Returnable<T> value; protected final Expression<T> value;
protected final int index; protected final int index;
private final Position position; private final SourcePosition position;
public VariableAssignmentNode(Returnable<T> value, Position position, int index) { public VariableAssignmentNode(Expression<T> value, SourcePosition position, int index) {
this.value = value; this.value = value;
this.index = index; this.index = index;
this.position = position; this.position = position;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -2,16 +2,16 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables.reference;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BoolVariableReferenceNode extends VariableReferenceNode<Boolean> { public class BoolVariableReferenceNode extends VariableReferenceNode<Boolean> {
public BoolVariableReferenceNode(Position position, ReturnType type, int index) { public BoolVariableReferenceNode(SourcePosition position, ReturnType type, int index) {
super(position, type, index); super(position, type, index);
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
return scope.getBool(index); return scope.getBool(index);
} }
@@ -2,16 +2,16 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables.reference;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class NumVariableReferenceNode extends VariableReferenceNode<Number> { public class NumVariableReferenceNode extends VariableReferenceNode<Number> {
public NumVariableReferenceNode(Position position, ReturnType type, int index) { public NumVariableReferenceNode(SourcePosition position, ReturnType type, int index) {
super(position, type, index); super(position, type, index);
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return scope.getNum(index); return scope.getNum(index);
} }
@@ -2,16 +2,16 @@ package com.dfsek.terra.addons.terrascript.parser.lang.variables.reference;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class StrVariableReferenceNode extends VariableReferenceNode<String> { public class StrVariableReferenceNode extends VariableReferenceNode<String> {
public StrVariableReferenceNode(Position position, ReturnType type, int index) { public StrVariableReferenceNode(SourcePosition position, ReturnType type, int index) {
super(position, type, index); super(position, type, index);
} }
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
return scope.getStr(index); return scope.getStr(index);
} }
} }
@@ -7,16 +7,16 @@
package com.dfsek.terra.addons.terrascript.parser.lang.variables.reference; package com.dfsek.terra.addons.terrascript.parser.lang.variables.reference;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class VariableReferenceNode<T> implements Returnable<T> { public abstract class VariableReferenceNode<T> implements Expression<T> {
protected final int index; protected final int index;
private final Position position; private final SourcePosition position;
private final ReturnType type; private final ReturnType type;
public VariableReferenceNode(Position position, ReturnType type, int index) { public VariableReferenceNode(SourcePosition position, ReturnType type, int index) {
this.position = position; this.position = position;
this.type = type; this.type = type;
this.index = index; this.index = index;
@@ -28,7 +28,7 @@ public abstract class VariableReferenceNode<T> implements Returnable<T> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -19,7 +19,7 @@ import java.util.Random;
import com.dfsek.terra.addons.terrascript.parser.Parser; import com.dfsek.terra.addons.terrascript.parser.Parser;
import com.dfsek.terra.addons.terrascript.parser.lang.Executable; import com.dfsek.terra.addons.terrascript.parser.lang.Executable;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.addons.terrascript.script.builders.BinaryNumberFunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.addons.terrascript.script.builders.BiomeFunctionBuilder;
@@ -58,12 +58,12 @@ public class StructureScript implements Structure, Keyed<StructureScript> {
private final Platform platform; private final Platform platform;
@SuppressWarnings("rawtypes") @SuppressWarnings("rawtypes")
public StructureScript(InputStream inputStream, RegistryKey id, Platform platform, Registry<Structure> registry, public StructureScript(InputStream source, RegistryKey id, Platform platform, Registry<Structure> structureRegistry,
Registry<LootTable> lootRegistry, Registry<LootTable> lootRegistry,
Registry<FunctionBuilder> functionRegistry) { Registry<FunctionBuilder> functionRegistry) {
Parser parser; Parser parser;
try { try {
parser = new Parser(IOUtils.toString(inputStream, Charset.defaultCharset())); parser = new Parser(IOUtils.toString(source, Charset.defaultCharset()));
} catch(IOException e) { } catch(IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@@ -76,7 +76,7 @@ public class StructureScript implements Structure, Keyed<StructureScript> {
parser parser
.registerFunction("block", new BlockFunctionBuilder(platform)) .registerFunction("block", new BlockFunctionBuilder(platform))
.registerFunction("debugBlock", new BlockFunctionBuilder(platform)) .registerFunction("debugBlock", new BlockFunctionBuilder(platform))
.registerFunction("structure", new StructureFunctionBuilder(registry, platform)) .registerFunction("structure", new StructureFunctionBuilder(structureRegistry, platform))
.registerFunction("randomInt", new RandomFunctionBuilder()) .registerFunction("randomInt", new RandomFunctionBuilder())
.registerFunction("recursions", new RecursionsFunctionBuilder()) .registerFunction("recursions", new RecursionsFunctionBuilder())
.registerFunction("setMark", new SetMarkFunctionBuilder()) .registerFunction("setMark", new SetMarkFunctionBuilder())
@@ -89,15 +89,15 @@ public class StructureScript implements Structure, Keyed<StructureScript> {
.registerFunction("state", new StateFunctionBuilder(platform)) .registerFunction("state", new StateFunctionBuilder(platform))
.registerFunction("setWaterlog", new UnaryBooleanFunctionBuilder((waterlog, args) -> args.setWaterlog(waterlog))) .registerFunction("setWaterlog", new UnaryBooleanFunctionBuilder((waterlog, args) -> args.setWaterlog(waterlog)))
.registerFunction("originX", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getX(), .registerFunction("originX", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getX(),
Returnable.ReturnType.NUMBER)) Expression.ReturnType.NUMBER))
.registerFunction("originY", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getY(), .registerFunction("originY", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getY(),
Returnable.ReturnType.NUMBER)) Expression.ReturnType.NUMBER))
.registerFunction("originZ", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getZ(), .registerFunction("originZ", new ZeroArgFunctionBuilder<Number>(arguments -> arguments.getOrigin().getZ(),
Returnable.ReturnType.NUMBER)) Expression.ReturnType.NUMBER))
.registerFunction("rotation", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().toString(), .registerFunction("rotation", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().toString(),
Returnable.ReturnType.STRING)) Expression.ReturnType.STRING))
.registerFunction("rotationDegrees", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().getDegrees(), .registerFunction("rotationDegrees", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().getDegrees(),
Returnable.ReturnType.NUMBER)) Expression.ReturnType.NUMBER))
.registerFunction("print", .registerFunction("print",
new UnaryStringFunctionBuilder(string -> LOGGER.info("[TerraScript:{}] {}", id, string))) new UnaryStringFunctionBuilder(string -> LOGGER.info("[TerraScript:{}] {}", id, string)))
.registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue())))
@@ -11,11 +11,11 @@ import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class BinaryNumberFunctionBuilder implements FunctionBuilder<Function<Number>> { public class BinaryNumberFunctionBuilder implements FunctionBuilder<Function<Number>> {
@@ -27,7 +27,7 @@ public class BinaryNumberFunctionBuilder implements FunctionBuilder<Function<Num
} }
@Override @Override
public Function<Number> build(List<Returnable<?>> argumentList, Position position) { public Function<Number> build(List<Expression<?>> argumentList, SourcePosition position) {
return new Function<>() { return new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -36,13 +36,13 @@ public class BinaryNumberFunctionBuilder implements FunctionBuilder<Function<Num
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return function.apply(((Returnable<Number>) argumentList.get(0)).apply(implementationArguments, scope), return function.apply(((Expression<Number>) argumentList.get(0)).invoke(implementationArguments, scope),
((Returnable<Number>) argumentList.get(1)).apply(implementationArguments, scope)); ((Expression<Number>) argumentList.get(1)).invoke(implementationArguments, scope));
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
}; };
@@ -54,8 +54,8 @@ public class BinaryNumberFunctionBuilder implements FunctionBuilder<Function<Num
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0 || position == 1) return Returnable.ReturnType.NUMBER; if(position == 0 || position == 1) return Expression.ReturnType.NUMBER;
return null; return null;
} }
} }
@@ -9,10 +9,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.BiomeFunction; import com.dfsek.terra.addons.terrascript.script.functions.BiomeFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -25,9 +25,9 @@ public class BiomeFunctionBuilder implements FunctionBuilder<BiomeFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public BiomeFunction build(List<Returnable<?>> argumentList, Position position) { public BiomeFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new BiomeFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new BiomeFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), position); (Expression<Number>) argumentList.get(2), position);
} }
@Override @Override
@@ -36,9 +36,9 @@ public class BiomeFunctionBuilder implements FunctionBuilder<BiomeFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
default -> null; default -> null;
}; };
} }
@@ -10,12 +10,12 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.BooleanConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.BlockFunction; import com.dfsek.terra.addons.terrascript.script.functions.BlockFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -28,17 +28,17 @@ public class BlockFunctionBuilder implements FunctionBuilder<BlockFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public BlockFunction build(List<Returnable<?>> argumentList, Position position) { public BlockFunction build(List<Expression<?>> argumentList, SourcePosition position) {
if(argumentList.size() < 4) throw new ParseException("Expected data", position); if(argumentList.size() < 4) throw new ParseException("Expected data", position);
Returnable<Boolean> booleanReturnable = new BooleanConstant(true, position); Expression<Boolean> booleanReturnable = new BooleanConstant(true, position);
if(argumentList.size() == 5) booleanReturnable = (Returnable<Boolean>) argumentList.get(4); if(argumentList.size() == 5) booleanReturnable = (Expression<Boolean>) argumentList.get(4);
if(argumentList.get(3) instanceof StringConstant) { if(argumentList.get(3) instanceof StringConstant) {
return new BlockFunction.Constant((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new BlockFunction.Constant((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (StringConstant) argumentList.get(3), (Expression<Number>) argumentList.get(2), (StringConstant) argumentList.get(3),
booleanReturnable, platform, position); booleanReturnable, platform, position);
} }
return new BlockFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new BlockFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), booleanReturnable, (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), booleanReturnable,
platform, position); platform, position);
} }
@@ -48,11 +48,11 @@ public class BlockFunctionBuilder implements FunctionBuilder<BlockFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
case 4 -> Returnable.ReturnType.BOOLEAN; case 4 -> Expression.ReturnType.BOOLEAN;
default -> null; default -> null;
}; };
} }
@@ -9,18 +9,18 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.CheckBlockFunction; import com.dfsek.terra.addons.terrascript.script.functions.CheckBlockFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class CheckBlockFunctionBuilder implements FunctionBuilder<CheckBlockFunction> { public class CheckBlockFunctionBuilder implements FunctionBuilder<CheckBlockFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public CheckBlockFunction build(List<Returnable<?>> argumentList, Position position) { public CheckBlockFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new CheckBlockFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new CheckBlockFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), position); (Expression<Number>) argumentList.get(2), position);
} }
@Override @Override
@@ -29,9 +29,9 @@ public class CheckBlockFunctionBuilder implements FunctionBuilder<CheckBlockFunc
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
default -> null; default -> null;
}; };
} }
@@ -9,10 +9,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.EntityFunction; import com.dfsek.terra.addons.terrascript.script.functions.EntityFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -25,9 +25,9 @@ public class EntityFunctionBuilder implements FunctionBuilder<EntityFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public EntityFunction build(List<Returnable<?>> argumentList, Position position) { public EntityFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new EntityFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new EntityFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), platform, position); (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), platform, position);
} }
@Override @Override
@@ -36,10 +36,10 @@ public class EntityFunctionBuilder implements FunctionBuilder<EntityFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
default -> null; default -> null;
}; };
} }
@@ -9,10 +9,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.GetMarkFunction; import com.dfsek.terra.addons.terrascript.script.functions.GetMarkFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class GetMarkFunctionBuilder implements FunctionBuilder<GetMarkFunction> { public class GetMarkFunctionBuilder implements FunctionBuilder<GetMarkFunction> {
@@ -22,9 +22,9 @@ public class GetMarkFunctionBuilder implements FunctionBuilder<GetMarkFunction>
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public GetMarkFunction build(List<Returnable<?>> argumentList, Position position) { public GetMarkFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new GetMarkFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new GetMarkFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), position); (Expression<Number>) argumentList.get(2), position);
} }
@Override @Override
@@ -33,9 +33,9 @@ public class GetMarkFunctionBuilder implements FunctionBuilder<GetMarkFunction>
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
default -> null; default -> null;
}; };
} }
@@ -9,11 +9,11 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.addons.terrascript.script.StructureScript;
import com.dfsek.terra.addons.terrascript.script.functions.LootFunction; import com.dfsek.terra.addons.terrascript.script.functions.LootFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.LootTable;
@@ -32,9 +32,9 @@ public class LootFunctionBuilder implements FunctionBuilder<LootFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public LootFunction build(List<Returnable<?>> argumentList, Position position) { public LootFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new LootFunction(registry, (Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new LootFunction(registry, (Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), platform, position, (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), platform, position,
script); script);
} }
@@ -44,10 +44,10 @@ public class LootFunctionBuilder implements FunctionBuilder<LootFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
default -> null; default -> null;
}; };
} }
@@ -9,10 +9,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.PullFunction; import com.dfsek.terra.addons.terrascript.script.functions.PullFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -25,9 +25,9 @@ public class PullFunctionBuilder implements FunctionBuilder<PullFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public PullFunction build(List<Returnable<?>> argumentList, Position position) { public PullFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new PullFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new PullFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), platform, position); (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), platform, position);
} }
@Override @Override
@@ -36,10 +36,10 @@ public class PullFunctionBuilder implements FunctionBuilder<PullFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
default -> null; default -> null;
}; };
} }
@@ -9,17 +9,17 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.RandomFunction; import com.dfsek.terra.addons.terrascript.script.functions.RandomFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class RandomFunctionBuilder implements FunctionBuilder<RandomFunction> { public class RandomFunctionBuilder implements FunctionBuilder<RandomFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public RandomFunction build(List<Returnable<?>> argumentList, Position position) { public RandomFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new RandomFunction((Returnable<Number>) argumentList.get(0), position); return new RandomFunction((Expression<Number>) argumentList.get(0), position);
} }
@Override @Override
@@ -28,8 +28,8 @@ public class RandomFunctionBuilder implements FunctionBuilder<RandomFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0) return Returnable.ReturnType.NUMBER; if(position == 0) return Expression.ReturnType.NUMBER;
return null; return null;
} }
} }
@@ -9,15 +9,15 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.RecursionsFunction; import com.dfsek.terra.addons.terrascript.script.functions.RecursionsFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class RecursionsFunctionBuilder implements FunctionBuilder<RecursionsFunction> { public class RecursionsFunctionBuilder implements FunctionBuilder<RecursionsFunction> {
@Override @Override
public RecursionsFunction build(List<Returnable<?>> argumentList, Position position) { public RecursionsFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new RecursionsFunction(position); return new RecursionsFunction(position);
} }
@@ -27,7 +27,7 @@ public class RecursionsFunctionBuilder implements FunctionBuilder<RecursionsFunc
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return null; return null;
} }
} }
@@ -9,10 +9,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.SetMarkFunction; import com.dfsek.terra.addons.terrascript.script.functions.SetMarkFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class SetMarkFunctionBuilder implements FunctionBuilder<SetMarkFunction> { public class SetMarkFunctionBuilder implements FunctionBuilder<SetMarkFunction> {
@@ -22,9 +22,9 @@ public class SetMarkFunctionBuilder implements FunctionBuilder<SetMarkFunction>
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public SetMarkFunction build(List<Returnable<?>> argumentList, Position position) { public SetMarkFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new SetMarkFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new SetMarkFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), position); (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), position);
} }
@Override @Override
@@ -33,10 +33,10 @@ public class SetMarkFunctionBuilder implements FunctionBuilder<SetMarkFunction>
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
default -> null; default -> null;
}; };
} }
@@ -10,10 +10,10 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.StateFunction; import com.dfsek.terra.addons.terrascript.script.functions.StateFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -26,10 +26,10 @@ public class StateFunctionBuilder implements FunctionBuilder<StateFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public StateFunction build(List<Returnable<?>> argumentList, Position position) { public StateFunction build(List<Expression<?>> argumentList, SourcePosition position) {
if(argumentList.size() < 4) throw new ParseException("Expected data", position); if(argumentList.size() < 4) throw new ParseException("Expected data", position);
return new StateFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new StateFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Returnable<String>) argumentList.get(3), position); (Expression<Number>) argumentList.get(2), (Expression<String>) argumentList.get(3), position);
} }
@Override @Override
@@ -38,10 +38,10 @@ public class StateFunctionBuilder implements FunctionBuilder<StateFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
case 3 -> Returnable.ReturnType.STRING; case 3 -> Expression.ReturnType.STRING;
default -> null; default -> null;
}; };
} }
@@ -11,10 +11,10 @@ import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.functions.StructureFunction; import com.dfsek.terra.addons.terrascript.script.functions.StructureFunction;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
@@ -31,12 +31,12 @@ public class StructureFunctionBuilder implements FunctionBuilder<StructureFuncti
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public StructureFunction build(List<Returnable<?>> argumentList, Position position) { public StructureFunction build(List<Expression<?>> argumentList, SourcePosition position) {
if(argumentList.size() < 5) throw new ParseException("Expected rotations", position); if(argumentList.size() < 5) throw new ParseException("Expected rotations", position);
return new StructureFunction((Returnable<Number>) argumentList.remove(0), (Returnable<Number>) argumentList.remove(0), return new StructureFunction((Expression<Number>) argumentList.remove(0), (Expression<Number>) argumentList.remove(0),
(Returnable<Number>) argumentList.remove(0), (Returnable<String>) argumentList.remove(0), (Expression<Number>) argumentList.remove(0), (Expression<String>) argumentList.remove(0),
argumentList.stream().map(item -> ((Returnable<String>) item)).collect(Collectors.toList()), registry, argumentList.stream().map(item -> ((Expression<String>) item)).collect(Collectors.toList()), registry,
position, platform); position, platform);
} }
@@ -46,10 +46,10 @@ public class StructureFunctionBuilder implements FunctionBuilder<StructureFuncti
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
default -> Returnable.ReturnType.STRING; default -> Expression.ReturnType.STRING;
}; };
} }
} }
@@ -11,12 +11,12 @@ import java.util.List;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Void>> { public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Void>> {
@@ -28,7 +28,7 @@ public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Voi
} }
@Override @Override
public Function<Void> build(List<Returnable<?>> argumentList, Position position) { public Function<Void> build(List<Expression<?>> argumentList, SourcePosition position) {
return new Function<>() { return new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -37,14 +37,14 @@ public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Voi
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
function.accept(((Returnable<Boolean>) argumentList.get(0)).apply(implementationArguments, scope), function.accept(((Expression<Boolean>) argumentList.get(0)).invoke(implementationArguments, scope),
(TerraImplementationArguments) implementationArguments); (TerraImplementationArguments) implementationArguments);
return null; return null;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
}; };
@@ -56,8 +56,8 @@ public class UnaryBooleanFunctionBuilder implements FunctionBuilder<Function<Voi
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0) return Returnable.ReturnType.BOOLEAN; if(position == 0) return Expression.ReturnType.BOOLEAN;
return null; return null;
} }
} }
@@ -10,11 +10,11 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class UnaryNumberFunctionBuilder implements FunctionBuilder<Function<Number>> { public class UnaryNumberFunctionBuilder implements FunctionBuilder<Function<Number>> {
@@ -26,7 +26,7 @@ public class UnaryNumberFunctionBuilder implements FunctionBuilder<Function<Numb
} }
@Override @Override
public Function<Number> build(List<Returnable<?>> argumentList, Position position) { public Function<Number> build(List<Expression<?>> argumentList, SourcePosition position) {
return new Function<>() { return new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -35,12 +35,12 @@ public class UnaryNumberFunctionBuilder implements FunctionBuilder<Function<Numb
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return function.apply(((Returnable<Number>) argumentList.get(0)).apply(implementationArguments, scope)); return function.apply(((Expression<Number>) argumentList.get(0)).invoke(implementationArguments, scope));
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
}; };
@@ -52,8 +52,8 @@ public class UnaryNumberFunctionBuilder implements FunctionBuilder<Function<Numb
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0) return Returnable.ReturnType.NUMBER; if(position == 0) return Expression.ReturnType.NUMBER;
return null; return null;
} }
} }
@@ -10,11 +10,11 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class UnaryStringFunctionBuilder implements FunctionBuilder<Function<Void>> { public class UnaryStringFunctionBuilder implements FunctionBuilder<Function<Void>> {
@@ -26,7 +26,7 @@ public class UnaryStringFunctionBuilder implements FunctionBuilder<Function<Void
} }
@Override @Override
public Function<Void> build(List<Returnable<?>> argumentList, Position position) { public Function<Void> build(List<Expression<?>> argumentList, SourcePosition position) {
return new Function<>() { return new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -35,13 +35,13 @@ public class UnaryStringFunctionBuilder implements FunctionBuilder<Function<Void
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
function.accept(((Returnable<String>) argumentList.get(0)).apply(implementationArguments, scope)); function.accept(((Expression<String>) argumentList.get(0)).invoke(implementationArguments, scope));
return null; return null;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
}; };
@@ -53,8 +53,8 @@ public class UnaryStringFunctionBuilder implements FunctionBuilder<Function<Void
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0) return Returnable.ReturnType.STRING; if(position == 0) return Expression.ReturnType.STRING;
return null; return null;
} }
} }
@@ -10,25 +10,25 @@ package com.dfsek.terra.addons.terrascript.script.builders;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ZeroArgFunctionBuilder<T> implements FunctionBuilder<Function<T>> { public class ZeroArgFunctionBuilder<T> implements FunctionBuilder<Function<T>> {
private final java.util.function.Function<TerraImplementationArguments, T> function; private final java.util.function.Function<TerraImplementationArguments, T> function;
private final Returnable.ReturnType type; private final Expression.ReturnType type;
public ZeroArgFunctionBuilder(java.util.function.Function<TerraImplementationArguments, T> function, Returnable.ReturnType type) { public ZeroArgFunctionBuilder(java.util.function.Function<TerraImplementationArguments, T> function, Expression.ReturnType type) {
this.function = function; this.function = function;
this.type = type; this.type = type;
} }
@Override @Override
public Function<T> build(List<Returnable<?>> argumentList, Position position) { public Function<T> build(List<Expression<?>> argumentList, SourcePosition position) {
return new Function<>() { return new Function<>() {
@Override @Override
public ReturnType returnType() { public ReturnType returnType() {
@@ -36,12 +36,12 @@ public class ZeroArgFunctionBuilder<T> implements FunctionBuilder<Function<T>> {
} }
@Override @Override
public T apply(ImplementationArguments implementationArguments, Scope scope) { public T invoke(ImplementationArguments implementationArguments, Scope scope) {
return function.apply((TerraImplementationArguments) implementationArguments); return function.apply((TerraImplementationArguments) implementationArguments);
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
}; };
@@ -53,7 +53,7 @@ public class ZeroArgFunctionBuilder<T> implements FunctionBuilder<Function<T>> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
if(position == 0) return type; if(position == 0) return type;
return null; return null;
} }
@@ -10,11 +10,11 @@ package com.dfsek.terra.addons.terrascript.script.functions;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
@@ -22,11 +22,11 @@ import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
public class BiomeFunction implements Function<String> { public class BiomeFunction implements Function<String> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public BiomeFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Position position) { public BiomeFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -35,11 +35,11 @@ public class BiomeFunction implements Function<String> {
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), z.invoke(implementationArguments, scope).doubleValue()),
arguments.getRotation()); arguments.getRotation());
@@ -49,12 +49,12 @@ public class BiomeFunction implements Function<String> {
.toVector3() .toVector3()
.mutable() .mutable()
.add(Vector3.of(FastMath.roundToInt(xz.getX()), .add(Vector3.of(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope).intValue(), y.invoke(implementationArguments, scope).intValue(),
FastMath.roundToInt(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID(); FastMath.roundToInt(xz.getZ()))).immutable(), arguments.getWorld().getSeed()).getID();
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -15,12 +15,12 @@ import java.util.HashMap;
import java.util.Map; import java.util.Map;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
@@ -30,15 +30,15 @@ import com.dfsek.terra.api.util.vector.Vector3;
public class BlockFunction implements Function<Void> { public class BlockFunction implements Function<Void> {
private static final Logger logger = LoggerFactory.getLogger(BlockFunction.class); private static final Logger logger = LoggerFactory.getLogger(BlockFunction.class);
protected final Returnable<Number> x, y, z; protected final Expression<Number> x, y, z;
protected final Returnable<String> blockData; protected final Expression<String> blockData;
protected final Platform platform; protected final Platform platform;
private final Map<String, BlockState> data = new HashMap<>(); private final Map<String, BlockState> data = new HashMap<>();
private final Returnable<Boolean> overwrite; private final Expression<Boolean> overwrite;
private final Position position; private final SourcePosition position;
public BlockFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> blockData, public BlockFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> blockData,
Returnable<Boolean> overwrite, Platform platform, Position position) { Expression<Boolean> overwrite, Platform platform, SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -49,7 +49,7 @@ public class BlockFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
BlockState rot = getBlockState(implementationArguments, scope); BlockState rot = getBlockState(implementationArguments, scope);
setBlock(implementationArguments, scope, arguments, rot); setBlock(implementationArguments, scope, arguments, rot);
@@ -57,7 +57,7 @@ public class BlockFunction implements Function<Void> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -68,14 +68,14 @@ public class BlockFunction implements Function<Void> {
void setBlock(ImplementationArguments implementationArguments, Scope scope, void setBlock(ImplementationArguments implementationArguments, Scope scope,
TerraImplementationArguments arguments, BlockState rot) { TerraImplementationArguments arguments, BlockState rot) {
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
try { try {
Vector3.Mutable set = Vector3.of(FastMath.roundToInt(xz.getX()), Vector3.Mutable set = Vector3.of(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope).doubleValue(), y.invoke(implementationArguments, scope).doubleValue(),
FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()); FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin());
BlockState current = arguments.getWorld().getBlockState(set); BlockState current = arguments.getWorld().getBlockState(set);
if(overwrite.apply(implementationArguments, scope) || current.isAir()) { if(overwrite.invoke(implementationArguments, scope) || current.isAir()) {
arguments.getWorld().setBlockState(set, rot); arguments.getWorld().setBlockState(set, rot);
} }
} catch(RuntimeException e) { } catch(RuntimeException e) {
@@ -84,15 +84,15 @@ public class BlockFunction implements Function<Void> {
} }
protected BlockState getBlockState(ImplementationArguments arguments, Scope scope) { protected BlockState getBlockState(ImplementationArguments arguments, Scope scope) {
return data.computeIfAbsent(blockData.apply(arguments, scope), platform.getWorldHandle()::createBlockState); return data.computeIfAbsent(blockData.invoke(arguments, scope), platform.getWorldHandle()::createBlockState);
} }
public static class Constant extends BlockFunction { public static class Constant extends BlockFunction {
private final BlockState state; private final BlockState state;
public Constant(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, StringConstant blockData, public Constant(Expression<Number> x, Expression<Number> y, Expression<Number> z, StringConstant blockData,
Returnable<Boolean> overwrite, Platform platform, Position position) { Expression<Boolean> overwrite, Platform platform, SourcePosition position) {
super(x, y, z, blockData, overwrite, platform, position); super(x, y, z, blockData, overwrite, platform, position);
this.state = platform.getWorldHandle().createBlockState(blockData.getConstant()); this.state = platform.getWorldHandle().createBlockState(blockData.getConstant());
} }
@@ -10,21 +10,21 @@ package com.dfsek.terra.addons.terrascript.script.functions;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
public class CheckBlockFunction implements Function<String> { public class CheckBlockFunction implements Function<String> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public CheckBlockFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Position position) { public CheckBlockFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -33,11 +33,11 @@ public class CheckBlockFunction implements Function<String> {
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), z.invoke(implementationArguments, scope).doubleValue()),
arguments.getRotation()); arguments.getRotation());
@@ -46,7 +46,7 @@ public class CheckBlockFunction implements Function<String> {
.toVector3() .toVector3()
.mutable() .mutable()
.add(Vector3.of(FastMath.roundToInt(xz.getX()), .add(Vector3.of(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope) y.invoke(implementationArguments, scope)
.doubleValue(), FastMath.roundToInt(xz.getZ())))) .doubleValue(), FastMath.roundToInt(xz.getZ()))))
.getAsString(); .getAsString();
if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties
@@ -54,7 +54,7 @@ public class CheckBlockFunction implements Function<String> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -9,12 +9,12 @@ package com.dfsek.terra.addons.terrascript.script.functions;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Entity;
import com.dfsek.terra.api.entity.EntityType; import com.dfsek.terra.api.entity.EntityType;
@@ -26,12 +26,12 @@ import com.dfsek.terra.api.util.vector.Vector3;
public class EntityFunction implements Function<Void> { public class EntityFunction implements Function<Void> {
private final EntityType data; private final EntityType data;
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
private final Platform platform; private final Platform platform;
public EntityFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, Platform platform, public EntityFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> data, Platform platform,
Position position) { SourcePosition position) {
this.position = position; this.position = position;
this.platform = platform; this.platform = platform;
if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition()); if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition());
@@ -43,12 +43,12 @@ public class EntityFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
Entity entity = arguments.getWorld().spawnEntity(Vector3.of(xz.getX(), y.apply(implementationArguments, scope).doubleValue(), Entity entity = arguments.getWorld().spawnEntity(Vector3.of(xz.getX(), y.invoke(implementationArguments, scope).doubleValue(),
xz.getZ()) xz.getZ())
.mutable() .mutable()
.add(arguments.getOrigin()) .add(arguments.getOrigin())
@@ -59,7 +59,7 @@ public class EntityFunction implements Function<Void> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -10,21 +10,21 @@ package com.dfsek.terra.addons.terrascript.script.functions;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
public class GetMarkFunction implements Function<String> { public class GetMarkFunction implements Function<String> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public GetMarkFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Position position) { public GetMarkFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, SourcePosition position) {
this.position = position; this.position = position;
this.x = x; this.x = x;
this.y = y; this.y = y;
@@ -32,13 +32,13 @@ public class GetMarkFunction implements Function<String> {
} }
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
String mark = arguments.getMark(Vector3.of(FastMath.floorToInt(xz.getX()), FastMath.floorToInt( String mark = arguments.getMark(Vector3.of(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(
y.apply(implementationArguments, scope).doubleValue()), y.invoke(implementationArguments, scope).doubleValue()),
FastMath.floorToInt(xz.getZ())) FastMath.floorToInt(xz.getZ()))
.mutable() .mutable()
.add(arguments.getOrigin()) .add(arguments.getOrigin())
@@ -47,7 +47,7 @@ public class GetMarkFunction implements Function<String> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -14,12 +14,12 @@ import org.slf4j.LoggerFactory;
import java.util.Random; import java.util.Random;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.addons.terrascript.script.StructureScript;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.block.entity.Container; import com.dfsek.terra.api.block.entity.Container;
@@ -35,14 +35,14 @@ import com.dfsek.terra.api.util.vector.Vector3;
public class LootFunction implements Function<Void> { public class LootFunction implements Function<Void> {
private static final Logger LOGGER = LoggerFactory.getLogger(LootFunction.class); private static final Logger LOGGER = LoggerFactory.getLogger(LootFunction.class);
private final Registry<LootTable> registry; private final Registry<LootTable> registry;
private final Returnable<String> data; private final Expression<String> data;
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
private final Platform platform; private final Platform platform;
private final StructureScript script; private final StructureScript script;
public LootFunction(Registry<LootTable> registry, Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, public LootFunction(Registry<LootTable> registry, Expression<Number> x, Expression<Number> y, Expression<Number> z,
Returnable<String> data, Platform platform, Position position, StructureScript script) { Expression<String> data, Platform platform, SourcePosition position, StructureScript script) {
this.registry = registry; this.registry = registry;
this.position = position; this.position = position;
this.data = data; this.data = data;
@@ -54,20 +54,20 @@ public class LootFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), z.invoke(implementationArguments, scope).doubleValue()),
arguments.getRotation()); arguments.getRotation());
String id = data.apply(implementationArguments, scope); String id = data.invoke(implementationArguments, scope);
registry.get(RegistryKey.parse(id)) registry.get(RegistryKey.parse(id))
.ifPresentOrElse(table -> { .ifPresentOrElse(table -> {
Vector3 apply = Vector3.of(FastMath.roundToInt(xz.getX()), Vector3 apply = Vector3.of(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope) y.invoke(implementationArguments, scope)
.intValue(), .intValue(),
FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(); FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable();
@@ -97,7 +97,7 @@ public class LootFunction implements Function<Void> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -11,12 +11,12 @@ import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression; import com.dfsek.terra.addons.terrascript.parser.lang.constants.ConstantExpression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.block.state.BlockState;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
@@ -26,11 +26,11 @@ import com.dfsek.terra.api.util.vector.Vector3;
public class PullFunction implements Function<Void> { public class PullFunction implements Function<Void> {
private final BlockState data; private final BlockState data;
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public PullFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, Platform platform, public PullFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> data, Platform platform,
Position position) { SourcePosition position) {
this.position = position; this.position = position;
if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition());
@@ -41,12 +41,12 @@ public class PullFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
Vector3.Mutable mutable = Vector3.of(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, scope).intValue(), Vector3.Mutable mutable = Vector3.of(FastMath.roundToInt(xz.getX()), y.invoke(implementationArguments, scope).intValue(),
FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()); FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin());
while(mutable.getY() > arguments.getWorld().getMinHeight()) { while(mutable.getY() > arguments.getWorld().getMinHeight()) {
if(!arguments.getWorld().getBlockState(mutable).isAir()) { if(!arguments.getWorld().getBlockState(mutable).isAir()) {
@@ -59,7 +59,7 @@ public class PullFunction implements Function<Void> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -8,18 +8,18 @@
package com.dfsek.terra.addons.terrascript.script.functions; package com.dfsek.terra.addons.terrascript.script.functions;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class RandomFunction implements Function<Integer> { public class RandomFunction implements Function<Integer> {
private final Returnable<Number> numberReturnable; private final Expression<Number> numberReturnable;
private final Position position; private final SourcePosition position;
public RandomFunction(Returnable<Number> numberReturnable, Position position) { public RandomFunction(Expression<Number> numberReturnable, SourcePosition position) {
this.numberReturnable = numberReturnable; this.numberReturnable = numberReturnable;
this.position = position; this.position = position;
} }
@@ -31,13 +31,13 @@ public class RandomFunction implements Function<Integer> {
} }
@Override @Override
public Integer apply(ImplementationArguments implementationArguments, Scope scope) { public Integer invoke(ImplementationArguments implementationArguments, Scope scope) {
return ((TerraImplementationArguments) implementationArguments).getRandom().nextInt( return ((TerraImplementationArguments) implementationArguments).getRandom().nextInt(
numberReturnable.apply(implementationArguments, scope).intValue()); numberReturnable.invoke(implementationArguments, scope).intValue());
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -11,13 +11,13 @@ import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class RecursionsFunction implements Function<Number> { public class RecursionsFunction implements Function<Number> {
private final Position position; private final SourcePosition position;
public RecursionsFunction(Position position) { public RecursionsFunction(SourcePosition position) {
this.position = position; this.position = position;
} }
@@ -27,12 +27,12 @@ public class RecursionsFunction implements Function<Number> {
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
return ((TerraImplementationArguments) implementationArguments).getRecursions(); return ((TerraImplementationArguments) implementationArguments).getRecursions();
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -10,22 +10,22 @@ package com.dfsek.terra.addons.terrascript.script.functions;
import net.jafama.FastMath; import net.jafama.FastMath;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
public class SetMarkFunction implements Function<Void> { public class SetMarkFunction implements Function<Void> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
private final Returnable<String> mark; private final Expression<String> mark;
public SetMarkFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> mark, Position position) { public SetMarkFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> mark, SourcePosition position) {
this.position = position; this.position = position;
this.mark = mark; this.mark = mark;
this.x = x; this.x = x;
@@ -34,22 +34,22 @@ public class SetMarkFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
arguments.setMark(Vector3.of(FastMath.floorToInt(xz.getX()), arguments.setMark(Vector3.of(FastMath.floorToInt(xz.getX()),
FastMath.floorToInt( FastMath.floorToInt(
y.apply(implementationArguments, scope).doubleValue()), y.invoke(implementationArguments, scope).doubleValue()),
FastMath.floorToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(), FastMath.floorToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(),
mark.apply(implementationArguments, scope)); mark.invoke(implementationArguments, scope));
return null; return null;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -12,11 +12,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.block.entity.BlockEntity; import com.dfsek.terra.api.block.entity.BlockEntity;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
@@ -25,12 +25,12 @@ import com.dfsek.terra.api.util.vector.Vector3;
public class StateFunction implements Function<Void> { public class StateFunction implements Function<Void> {
private static final Logger LOGGER = LoggerFactory.getLogger(StateFunction.class); private static final Logger LOGGER = LoggerFactory.getLogger(StateFunction.class);
private final Returnable<String> data; private final Expression<String> data;
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public StateFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> data, public StateFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> data,
Position position) { SourcePosition position) {
this.position = position; this.position = position;
this.data = data; this.data = data;
this.x = x; this.x = x;
@@ -39,17 +39,17 @@ public class StateFunction implements Function<Void> {
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
Vector3 origin = Vector3.of(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, scope).intValue(), Vector3 origin = Vector3.of(FastMath.roundToInt(xz.getX()), y.invoke(implementationArguments, scope).intValue(),
FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable(); FastMath.roundToInt(xz.getZ())).mutable().add(arguments.getOrigin()).immutable();
try { try {
BlockEntity state = arguments.getWorld().getBlockEntity(origin); BlockEntity state = arguments.getWorld().getBlockEntity(origin);
state.applyState(data.apply(implementationArguments, scope)); state.applyState(data.invoke(implementationArguments, scope));
state.update(false); state.update(false);
} catch(Exception e) { } catch(Exception e) {
LOGGER.warn("Could not apply BlockState at {}", origin, e); LOGGER.warn("Could not apply BlockState at {}", origin, e);
@@ -59,7 +59,7 @@ public class StateFunction implements Function<Void> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -14,12 +14,12 @@ import org.slf4j.LoggerFactory;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.StructureScript; import com.dfsek.terra.addons.terrascript.script.StructureScript;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.registry.Registry; import com.dfsek.terra.api.registry.Registry;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
@@ -31,14 +31,14 @@ import com.dfsek.terra.api.util.vector.Vector2;
public class StructureFunction implements Function<Boolean> { public class StructureFunction implements Function<Boolean> {
private static final Logger LOGGER = LoggerFactory.getLogger(StructureFunction.class); private static final Logger LOGGER = LoggerFactory.getLogger(StructureFunction.class);
private final Registry<Structure> registry; private final Registry<Structure> registry;
private final Returnable<String> id; private final Expression<String> id;
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
private final Platform platform; private final Platform platform;
private final List<Returnable<String>> rotations; private final List<Expression<String>> rotations;
public StructureFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Returnable<String> id, public StructureFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, Expression<String> id,
List<Returnable<String>> rotations, Registry<Structure> registry, Position position, Platform platform) { List<Expression<String>> rotations, Registry<Structure> registry, SourcePosition position, Platform platform) {
this.registry = registry; this.registry = registry;
this.id = id; this.id = id;
this.position = position; this.position = position;
@@ -55,20 +55,20 @@ public class StructureFunction implements Function<Boolean> {
} }
@Override @Override
public Boolean apply(ImplementationArguments implementationArguments, Scope scope) { public Boolean invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
if(arguments.getRecursions() > platform.getTerraConfig().getMaxRecursion()) if(arguments.getRecursions() > platform.getTerraConfig().getMaxRecursion())
throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions()); throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions());
Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = RotationUtil.rotateVector(Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()), arguments.getRotation()); z.invoke(implementationArguments, scope).doubleValue()), arguments.getRotation());
String app = id.apply(implementationArguments, scope); String app = id.invoke(implementationArguments, scope);
return registry.getByID(app).map(script -> { return registry.getByID(app).map(script -> {
Rotation rotation1; Rotation rotation1;
String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).apply(implementationArguments, scope); String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).invoke(implementationArguments, scope);
try { try {
rotation1 = Rotation.valueOf(rotString); rotation1 = Rotation.valueOf(rotString);
} catch(IllegalArgumentException e) { } catch(IllegalArgumentException e) {
@@ -80,7 +80,7 @@ public class StructureFunction implements Function<Boolean> {
return structureScript.generate(arguments.getOrigin(), return structureScript.generate(arguments.getOrigin(),
arguments.getWorld() arguments.getWorld()
.buffer(FastMath.roundToInt(xz.getX()), .buffer(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope).intValue(), y.invoke(implementationArguments, scope).intValue(),
FastMath.roundToInt(xz.getZ())), FastMath.roundToInt(xz.getZ())),
arguments.getRandom(), arguments.getRandom(),
arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1);
@@ -88,7 +88,7 @@ public class StructureFunction implements Function<Boolean> {
return script.generate(arguments.getOrigin(), return script.generate(arguments.getOrigin(),
arguments.getWorld() arguments.getWorld()
.buffer(FastMath.roundToInt(xz.getX()), .buffer(FastMath.roundToInt(xz.getX()),
y.apply(implementationArguments, scope).intValue(), y.invoke(implementationArguments, scope).intValue(),
FastMath.roundToInt(xz.getZ())), FastMath.roundToInt(xz.getZ())),
arguments.getRandom(), arguments.getRandom(),
arguments.getRotation().rotate(rotation1)); arguments.getRotation().rotate(rotation1));
@@ -99,7 +99,7 @@ public class StructureFunction implements Function<Boolean> {
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
} }
@@ -17,14 +17,14 @@ import java.util.List;
/** /**
* Stream-like data structure that allows viewing future elements without consuming current. * Stream-like data structure that allows viewing future elements without consuming current.
*/ */
public class Lookahead { public class LookaheadStream {
private final List<Char> buffer = new ArrayList<>(); private final List<Char> buffer = new ArrayList<>();
private final Reader input; private final Reader input;
private int index = 0; private int index = 0;
private int line = 0; private int line = 0;
private boolean end = false; private boolean end = false;
public Lookahead(Reader r) { public LookaheadStream(Reader r) {
this.input = r; this.input = r;
} }
@@ -88,7 +88,7 @@ public class Lookahead {
} }
} }
public boolean matches(String check, boolean consume) { public boolean matchesString(String check, boolean consume) {
if(check == null) return false; if(check == null) return false;
for(int i = 0; i < check.length(); i++) { for(int i = 0; i < check.length(); i++) {
@@ -120,11 +120,7 @@ public class Lookahead {
} }
} }
public int getLine() { public SourcePosition getPosition() {
return line; return new SourcePosition(line, index);
}
public int getIndex() {
return index;
} }
} }
@@ -7,11 +7,11 @@
package com.dfsek.terra.addons.terrascript.tokenizer; package com.dfsek.terra.addons.terrascript.tokenizer;
public class Position { public class SourcePosition {
private final int line; private final int line;
private final int index; private final int index;
public Position(int line, int index) { public SourcePosition(int line, int index) {
this.line = line; this.line = line;
this.index = index; this.index = index;
} }
@@ -10,9 +10,9 @@ package com.dfsek.terra.addons.terrascript.tokenizer;
public class Token { public class Token {
private final String content; private final String content;
private final Type type; private final Type type;
private final Position start; private final SourcePosition start;
public Token(String content, Type type, Position start) { public Token(String content, Type type, SourcePosition start) {
this.content = content; this.content = content;
this.type = type; this.type = type;
this.start = start; this.start = start;
@@ -31,7 +31,7 @@ public class Token {
return content; return content;
} }
public Position getPosition() { public SourcePosition getPosition() {
return start; return start;
} }
@@ -232,6 +232,10 @@ public class Token {
/** /**
* Else keyword * Else keyword
*/ */
ELSE ELSE,
/**
* End of file
*/
END_OF_FILE
} }
} }
@@ -22,14 +22,13 @@ import com.dfsek.terra.addons.terrascript.tokenizer.exceptions.TokenizerExceptio
public class Tokenizer { public class Tokenizer {
public static final Set<Character> syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', public static final Set<Character> syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/',
'>', '<', '!'); // Reserved chars '>', '<', '!'); // Reserved chars
private final Lookahead reader; private final LookaheadStream reader;
private final Stack<Token> brackets = new Stack<>(); private final Stack<Token> bracketStack = new Stack<>();
private Token current; private Token current;
private Token last;
public Tokenizer(String data) { public Tokenizer(String data) {
reader = new Lookahead(new StringReader(data + '\0')); reader = new LookaheadStream(new StringReader(data + '\0'));
current = fetchCheck(); current = tokenize();
} }
/** /**
@@ -39,8 +38,7 @@ public class Tokenizer {
* *
* @throws ParseException If token does not exist * @throws ParseException If token does not exist
*/ */
public Token get() { public Token current() {
if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition());
return current; return current;
} }
@@ -52,64 +50,66 @@ public class Tokenizer {
* @throws ParseException If token does not exist * @throws ParseException If token does not exist
*/ */
public Token consume() { public Token consume() {
if(!hasNext()) throw new ParseException("Unexpected end of input", last.getPosition()); if (current.getType() == Token.Type.END_OF_FILE) return current;
Token temp = current; Token temp = current;
current = fetchCheck(); current = tokenize();
return temp; return temp;
} }
private Token fetchCheck() { /**
Token fetch = fetch(); * Whether this {@code Tokenizer} contains additional tokens.
if(fetch != null) { *
last = fetch; * @return {@code true} if more tokens are present, otherwise {@code false}
if(fetch.getType() == Token.Type.BLOCK_BEGIN) brackets.push(fetch); // Opening bracket */
else if(fetch.getType() == Token.Type.BLOCK_END) { public boolean hasNext() {
if(!brackets.isEmpty()) brackets.pop(); return current.getType() != Token.Type.END_OF_FILE;
else throw new ParseException("Dangling opening brace", new Position(0, 0));
}
} else if(!brackets.isEmpty()) {
throw new ParseException("Dangling closing brace", brackets.peek().getPosition());
}
return fetch;
} }
private Token fetch() throws TokenizerException { private Token tokenize() throws TokenizerException {
while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); consumeWhitespace();
while(reader.matches("//", true)) skipLine(); // Skip line if comment // Skip line if comment
while(reader.matchesString("//", true)) skipLine();
if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment // Skip multi line comment
if(reader.matchesString("/*", true)) skipTo("*/");
if(reader.current().isEOF()) return null; // EOF // Reached end of file
if(reader.current().isEOF()) {
if (!bracketStack.isEmpty()) throw new ParseException("Dangling closing brace", bracketStack.peek().getPosition());
return new Token(reader.consume().toString(), Token.Type.END_OF_FILE, reader.getPosition());
}
if(reader.matches("==", true)) // Check if operator token
return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString("==", true))
if(reader.matches("!=", true)) return new Token("==", Token.Type.EQUALS_OPERATOR, reader.getPosition());
return new Token("!=", Token.Type.NOT_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString("!=", true))
if(reader.matches(">=", true)) return new Token("!=", Token.Type.NOT_EQUALS_OPERATOR, reader.getPosition());
return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString(">=", true))
if(reader.matches("<=", true)) return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, reader.getPosition());
return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString("<=", true))
if(reader.matches(">", true)) return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, reader.getPosition());
return new Token(">", Token.Type.GREATER_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString(">", true))
if(reader.matches("<", true)) return new Token(">", Token.Type.GREATER_THAN_OPERATOR, reader.getPosition());
return new Token("<", Token.Type.LESS_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matchesString("<", true))
return new Token("<", Token.Type.LESS_THAN_OPERATOR, reader.getPosition());
if(reader.matches("||", true))
return new Token("||", Token.Type.BOOLEAN_OR, new Position(reader.getLine(), reader.getIndex()));
if(reader.matches("&&", true))
return new Token("&&", Token.Type.BOOLEAN_AND, new Position(reader.getLine(), reader.getIndex()));
// Check if logical operator
if(reader.matchesString("||", true))
return new Token("||", Token.Type.BOOLEAN_OR, reader.getPosition());
if(reader.matchesString("&&", true))
return new Token("&&", Token.Type.BOOLEAN_AND, reader.getPosition());
// Check if number
if(isNumberStart()) { if(isNumberStart()) {
StringBuilder num = new StringBuilder(); StringBuilder num = new StringBuilder();
while(!reader.current().isEOF() && isNumberLike()) { while(!reader.current().isEOF() && isNumberLike()) {
num.append(reader.consume()); num.append(reader.consume());
} }
return new Token(num.toString(), Token.Type.NUMBER, new Position(reader.getLine(), reader.getIndex())); return new Token(num.toString(), Token.Type.NUMBER, reader.getPosition());
} }
// Check if string literal
if(reader.current().is('"')) { if(reader.current().is('"')) {
reader.consume(); // Consume first quote reader.consume(); // Consume first quote
StringBuilder string = new StringBuilder(); StringBuilder string = new StringBuilder();
@@ -121,83 +121,93 @@ public class Tokenizer {
continue; continue;
} else ignoreNext = false; } else ignoreNext = false;
if(reader.current().isEOF()) if(reader.current().isEOF())
throw new FormatException("No end of string literal found. ", new Position(reader.getLine(), reader.getIndex())); throw new FormatException("No end of string literal found. ", reader.getPosition());
string.append(reader.consume()); string.append(reader.consume());
} }
reader.consume(); // Consume last quote reader.consume(); // Consume last quote
return new Token(string.toString(), Token.Type.STRING, new Position(reader.getLine(), reader.getIndex())); return new Token(string.toString(), Token.Type.STRING, reader.getPosition());
} }
if(reader.current().is('(')) if(reader.current().is('('))
return new Token(reader.consume().toString(), Token.Type.GROUP_BEGIN, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.GROUP_BEGIN, reader.getPosition());
if(reader.current().is(')')) if(reader.current().is(')'))
return new Token(reader.consume().toString(), Token.Type.GROUP_END, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.GROUP_END, reader.getPosition());
if(reader.current().is(';')) if(reader.current().is(';'))
return new Token(reader.consume().toString(), Token.Type.STATEMENT_END, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.STATEMENT_END, reader.getPosition());
if(reader.current().is(',')) if(reader.current().is(','))
return new Token(reader.consume().toString(), Token.Type.SEPARATOR, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.SEPARATOR, reader.getPosition());
if(reader.current().is('{'))
return new Token(reader.consume().toString(), Token.Type.BLOCK_BEGIN, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('{')) {
if(reader.current().is('}')) Token token = new Token(reader.consume().toString(), Token.Type.BLOCK_BEGIN, reader.getPosition());
return new Token(reader.consume().toString(), Token.Type.BLOCK_END, new Position(reader.getLine(), reader.getIndex())); bracketStack.push(token);
return token;
}
if(reader.current().is('}')) {
if(bracketStack.isEmpty()) throw new ParseException("Dangling opening brace", new SourcePosition(0, 0));
bracketStack.pop();
return new Token(reader.consume().toString(), Token.Type.BLOCK_END, reader.getPosition());
}
if(reader.current().is('=')) if(reader.current().is('='))
return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, reader.getPosition());
if(reader.current().is('+')) if(reader.current().is('+'))
return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, reader.getPosition());
if(reader.current().is('-')) if(reader.current().is('-'))
return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR, return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR,
new Position(reader.getLine(), reader.getIndex())); reader.getPosition());
if(reader.current().is('*')) if(reader.current().is('*'))
return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR,
new Position(reader.getLine(), reader.getIndex())); reader.getPosition());
if(reader.current().is('/')) if(reader.current().is('/'))
return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, reader.getPosition());
if(reader.current().is('%')) if(reader.current().is('%'))
return new Token(reader.consume().toString(), Token.Type.MODULO_OPERATOR, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.MODULO_OPERATOR, reader.getPosition());
if(reader.current().is('!')) if(reader.current().is('!'))
return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, new Position(reader.getLine(), reader.getIndex())); return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, reader.getPosition());
// Read word
StringBuilder token = new StringBuilder(); StringBuilder token = new StringBuilder();
while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) {
Char c = reader.consume(); Char c = reader.consume();
if(c.isWhitespace()) break; if(c.isWhitespace()) break;
token.append(c); token.append(c);
} }
String tokenString = token.toString(); String tokenString = token.toString();
// Check if word is a keyword
if(tokenString.equals("true")) if(tokenString.equals("true"))
return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.BOOLEAN, reader.getPosition());
if(tokenString.equals("false")) if(tokenString.equals("false"))
return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.BOOLEAN, reader.getPosition());
if(tokenString.equals("num")) if(tokenString.equals("num"))
return new Token(tokenString, Token.Type.NUMBER_VARIABLE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.NUMBER_VARIABLE, reader.getPosition());
if(tokenString.equals("str")) if(tokenString.equals("str"))
return new Token(tokenString, Token.Type.STRING_VARIABLE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.STRING_VARIABLE, reader.getPosition());
if(tokenString.equals("bool")) if(tokenString.equals("bool"))
return new Token(tokenString, Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.BOOLEAN_VARIABLE, reader.getPosition());
if(tokenString.equals("if")) if(tokenString.equals("if"))
return new Token(tokenString, Token.Type.IF_STATEMENT, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.IF_STATEMENT, reader.getPosition());
if(tokenString.equals("else")) if(tokenString.equals("else"))
return new Token(tokenString, Token.Type.ELSE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.ELSE, reader.getPosition());
if(tokenString.equals("while")) if(tokenString.equals("while"))
return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.WHILE_LOOP, reader.getPosition());
if(tokenString.equals("for")) if(tokenString.equals("for"))
return new Token(tokenString, Token.Type.FOR_LOOP, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.FOR_LOOP, reader.getPosition());
if(tokenString.equals("return")) if(tokenString.equals("return"))
return new Token(tokenString, Token.Type.RETURN, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.RETURN, reader.getPosition());
if(tokenString.equals("continue")) if(tokenString.equals("continue"))
return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.CONTINUE, reader.getPosition());
if(tokenString.equals("break")) if(tokenString.equals("break"))
return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.BREAK, reader.getPosition());
if(tokenString.equals("fail")) if(tokenString.equals("fail"))
return new Token(tokenString, Token.Type.FAIL, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.FAIL, reader.getPosition());
return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); // If not keyword, assume it is an identifier
return new Token(tokenString, Token.Type.IDENTIFIER, reader.getPosition());
} }
private void skipLine() { private void skipLine() {
@@ -210,9 +220,9 @@ public class Tokenizer {
} }
private void skipTo(String s) throws EOFException { private void skipTo(String s) throws EOFException {
Position begin = new Position(reader.getLine(), reader.getIndex()); SourcePosition begin = reader.getPosition();
while(!reader.current().isEOF()) { while(!reader.current().isEOF()) {
if(reader.matches(s, true)) { if(reader.matchesString(s, true)) {
consumeWhitespace(); consumeWhitespace();
return; return;
} }
@@ -221,15 +231,6 @@ public class Tokenizer {
throw new EOFException("No end of expression found.", begin); throw new EOFException("No end of expression found.", begin);
} }
/**
* Whether this {@code Tokenizer} contains additional tokens.
*
* @return {@code true} if more tokens are present, otherwise {@code false}
*/
public boolean hasNext() {
return !(current == null);
}
private boolean isNumberLike() { private boolean isNumberLike() {
return reader.current().isDigit() return reader.current().isDigit()
|| reader.current().is('_', '.', 'E'); || reader.current().is('_', '.', 'E');
@@ -243,5 +244,4 @@ public class Tokenizer {
public boolean isSyntaxSignificant(char c) { public boolean isSyntaxSignificant(char c) {
return syntaxSignificant.contains(c); return syntaxSignificant.contains(c);
} }
} }
@@ -9,7 +9,7 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions;
import java.io.Serial; import java.io.Serial;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class EOFException extends TokenizerException { public class EOFException extends TokenizerException {
@@ -17,11 +17,11 @@ public class EOFException extends TokenizerException {
@Serial @Serial
private static final long serialVersionUID = 3980047409902809440L; private static final long serialVersionUID = 3980047409902809440L;
public EOFException(String message, Position position) { public EOFException(String message, SourcePosition position) {
super(message, position); super(message, position);
} }
public EOFException(String message, Position position, Throwable cause) { public EOFException(String message, SourcePosition position, Throwable cause) {
super(message, position, cause); super(message, position, cause);
} }
} }
@@ -9,7 +9,7 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions;
import java.io.Serial; import java.io.Serial;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class FormatException extends TokenizerException { public class FormatException extends TokenizerException {
@@ -17,11 +17,11 @@ public class FormatException extends TokenizerException {
@Serial @Serial
private static final long serialVersionUID = -791308012940744455L; private static final long serialVersionUID = -791308012940744455L;
public FormatException(String message, Position position) { public FormatException(String message, SourcePosition position) {
super(message, position); super(message, position);
} }
public FormatException(String message, Position position, Throwable cause) { public FormatException(String message, SourcePosition position, Throwable cause) {
super(message, position, cause); super(message, position, cause);
} }
} }
@@ -10,7 +10,7 @@ package com.dfsek.terra.addons.terrascript.tokenizer.exceptions;
import java.io.Serial; import java.io.Serial;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public abstract class TokenizerException extends ParseException { public abstract class TokenizerException extends ParseException {
@@ -18,11 +18,11 @@ public abstract class TokenizerException extends ParseException {
@Serial @Serial
private static final long serialVersionUID = 2792384010083575420L; private static final long serialVersionUID = 2792384010083575420L;
public TokenizerException(String message, Position position) { public TokenizerException(String message, SourcePosition position) {
super(message, position); super(message, position);
} }
public TokenizerException(String message, Position position, Throwable cause) { public TokenizerException(String message, SourcePosition position, Throwable cause) {
super(message, position, cause); super(message, position, cause);
} }
} }
@@ -11,13 +11,13 @@ import org.junit.jupiter.api.Test;
import java.io.StringReader; import java.io.StringReader;
import com.dfsek.terra.addons.terrascript.tokenizer.Lookahead; import com.dfsek.terra.addons.terrascript.tokenizer.PeekableStream;
public class LookaheadTest { public class PeekableStreamTest {
@Test @Test
public void lookahead() { public void lookahead() {
Lookahead lookahead = new Lookahead(new StringReader("Test string...")); PeekableStream lookahead = new PeekableStream(new StringReader("Test string..."));
for(int i = 0; lookahead.next(i) != null; i++) { for(int i = 0; lookahead.next(i) != null; i++) {
System.out.print(lookahead.next(i).getCharacter()); System.out.print(lookahead.next(i).getCharacter());
@@ -20,11 +20,11 @@ import com.dfsek.terra.addons.terrascript.parser.Parser;
import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException; import com.dfsek.terra.addons.terrascript.parser.exceptions.ParseException;
import com.dfsek.terra.addons.terrascript.parser.lang.Executable; import com.dfsek.terra.addons.terrascript.parser.lang.Executable;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class ParserTest { public class ParserTest {
@@ -35,7 +35,7 @@ public class ParserTest {
parser.registerFunction("test", new FunctionBuilder<Test1>() { parser.registerFunction("test", new FunctionBuilder<Test1>() {
@Override @Override
public Test1 build(List<Returnable<?>> argumentList, Position position) { public Test1 build(List<Expression<?>> argumentList, SourcePosition position) {
return new Test1(argumentList.get(0), argumentList.get(1), position); return new Test1(argumentList.get(0), argumentList.get(1), position);
} }
@@ -45,10 +45,10 @@ public class ParserTest {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0 -> Returnable.ReturnType.STRING; case 0 -> Expression.ReturnType.STRING;
case 1 -> Returnable.ReturnType.NUMBER; case 1 -> Expression.ReturnType.NUMBER;
default -> null; default -> null;
}; };
} }
@@ -66,25 +66,25 @@ public class ParserTest {
} }
private static class Test1 implements Function<Void> { private static class Test1 implements Function<Void> {
private final Returnable<?> a; private final Expression<?> a;
private final Returnable<?> b; private final Expression<?> b;
private final Position position; private final SourcePosition position;
public Test1(Returnable<?> a, Returnable<?> b, Position position) { public Test1(Expression<?> a, Expression<?> b, SourcePosition position) {
this.a = a; this.a = a;
this.b = b; this.b = b;
this.position = position; this.position = position;
} }
@Override @Override
public Void apply(ImplementationArguments implementationArguments, Scope scope) { public Void invoke(ImplementationArguments implementationArguments, Scope scope) {
System.out.println("string: " + a.apply(implementationArguments, scope) + ", double: " + System.out.println("string: " + a.invoke(implementationArguments, scope) + ", double: " +
b.apply(implementationArguments, scope)); b.invoke(implementationArguments, scope));
return null; return null;
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -12,11 +12,11 @@ import net.jafama.FastMath;
import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D; import com.dfsek.terra.addons.chunkgenerator.generation.NoiseChunkGenerator3D;
import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider; import com.dfsek.terra.addons.chunkgenerator.generation.math.samplers.SamplerProvider;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.util.RotationUtil; import com.dfsek.terra.api.util.RotationUtil;
import com.dfsek.terra.api.util.vector.Vector2; import com.dfsek.terra.api.util.vector.Vector2;
import com.dfsek.terra.api.util.vector.Vector3; import com.dfsek.terra.api.util.vector.Vector3;
@@ -25,10 +25,10 @@ import com.dfsek.terra.api.world.WritableWorld;
public class CheckFunction implements Function<String> { public class CheckFunction implements Function<String> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Position position; private final SourcePosition position;
public CheckFunction(Returnable<Number> x, Returnable<Number> y, Returnable<Number> z, Position position) { public CheckFunction(Expression<Number> x, Expression<Number> y, Expression<Number> z, SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -37,26 +37,26 @@ public class CheckFunction implements Function<String> {
@Override @Override
public String apply(ImplementationArguments implementationArguments, Scope scope) { public String invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
Vector2 xz = Vector2.of(x.apply(implementationArguments, scope).doubleValue(), Vector2 xz = Vector2.of(x.invoke(implementationArguments, scope).doubleValue(),
z.apply(implementationArguments, scope).doubleValue()); z.invoke(implementationArguments, scope).doubleValue());
RotationUtil.rotateVector(xz, arguments.getRotation()); RotationUtil.rotateVector(xz, arguments.getRotation());
Vector3 location = arguments.getOrigin().toVector3Mutable().add( Vector3 location = arguments.getOrigin().toVector3Mutable().add(
Vector3.of(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments, scope).doubleValue(), Vector3.of(FastMath.roundToInt(xz.getX()), y.invoke(implementationArguments, scope).doubleValue(),
FastMath.roundToInt(xz.getZ()))).immutable(); FastMath.roundToInt(xz.getZ()))).immutable();
return apply(location, arguments.getWorld()); return apply(location, arguments.getWorld());
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -9,9 +9,9 @@ package com.dfsek.terra.addon.terrascript.check;
import java.util.List; import java.util.List;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
@@ -24,9 +24,9 @@ public class CheckFunctionBuilder implements FunctionBuilder<CheckFunction> {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public CheckFunction build(List<Returnable<?>> argumentList, Position position) { public CheckFunction build(List<Expression<?>> argumentList, SourcePosition position) {
return new CheckFunction((Returnable<Number>) argumentList.get(0), (Returnable<Number>) argumentList.get(1), return new CheckFunction((Expression<Number>) argumentList.get(0), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), position); (Expression<Number>) argumentList.get(2), position);
} }
@Override @Override
@@ -35,9 +35,9 @@ public class CheckFunctionBuilder implements FunctionBuilder<CheckFunction> {
} }
@Override @Override
public Returnable.ReturnType getArgument(int position) { public Expression.ReturnType getArgument(int position) {
return switch(position) { return switch(position) {
case 0, 1, 2 -> Returnable.ReturnType.NUMBER; case 0, 1, 2 -> Expression.ReturnType.NUMBER;
default -> null; default -> null;
}; };
} }
@@ -1,28 +1,28 @@
package com.dfsek.terra.addons.terrascript.sampler; package com.dfsek.terra.addons.terrascript.sampler;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
public class ConstantSamplerFunction implements Function<Number> { public class ConstantSamplerFunction implements Function<Number> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final NoiseSampler sampler; private final NoiseSampler sampler;
private final boolean twoD; private final boolean twoD;
private final Position position; private final SourcePosition position;
public ConstantSamplerFunction(NoiseSampler sampler, public ConstantSamplerFunction(NoiseSampler sampler,
Returnable<Number> x, Expression<Number> x,
Returnable<Number> y, Expression<Number> y,
Returnable<Number> z, Expression<Number> z,
boolean twoD, boolean twoD,
Position position) { SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -32,22 +32,22 @@ public class ConstantSamplerFunction implements Function<Number> {
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
double x = this.x.apply(implementationArguments, scope).doubleValue(); double x = this.x.invoke(implementationArguments, scope).doubleValue();
double z = this.z.apply(implementationArguments, scope).doubleValue(); double z = this.z.invoke(implementationArguments, scope).doubleValue();
if(twoD) { if(twoD) {
return sampler.noise(arguments.getWorld().getSeed(), x, z); return sampler.noise(arguments.getWorld().getSeed(), x, z);
} else { } else {
double y = this.y.apply(implementationArguments, scope).doubleValue(); double y = this.y.invoke(implementationArguments, scope).doubleValue();
return sampler.noise(arguments.getWorld().getSeed(), x, y, z); return sampler.noise(arguments.getWorld().getSeed(), x, y, z);
} }
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -3,30 +3,30 @@ package com.dfsek.terra.addons.terrascript.sampler;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments; import com.dfsek.terra.addons.terrascript.parser.lang.ImplementationArguments;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Scope; import com.dfsek.terra.addons.terrascript.parser.lang.Scope;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function; import com.dfsek.terra.addons.terrascript.parser.lang.functions.Function;
import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments; import com.dfsek.terra.addons.terrascript.script.TerraImplementationArguments;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
public class SamplerFunction implements Function<Number> { public class SamplerFunction implements Function<Number> {
private final Returnable<Number> x, y, z; private final Expression<Number> x, y, z;
private final Returnable<String> function; private final Expression<String> function;
private final java.util.function.Function<Supplier<String>, NoiseSampler> samplerFunction; private final java.util.function.Function<Supplier<String>, NoiseSampler> samplerFunction;
private final boolean twoD; private final boolean twoD;
private final Position position; private final SourcePosition position;
public SamplerFunction(Returnable<String> function, public SamplerFunction(Expression<String> function,
Returnable<Number> x, Expression<Number> x,
Returnable<Number> y, Expression<Number> y,
Returnable<Number> z, Expression<Number> z,
java.util.function.Function<Supplier<String>, NoiseSampler> samplerFunction, java.util.function.Function<Supplier<String>, NoiseSampler> samplerFunction,
boolean twoD, boolean twoD,
Position position) { SourcePosition position) {
this.x = x; this.x = x;
this.y = y; this.y = y;
this.z = z; this.z = z;
@@ -37,23 +37,23 @@ public class SamplerFunction implements Function<Number> {
} }
@Override @Override
public Number apply(ImplementationArguments implementationArguments, Scope scope) { public Number invoke(ImplementationArguments implementationArguments, Scope scope) {
TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments;
double x = this.x.apply(implementationArguments, scope).doubleValue(); double x = this.x.invoke(implementationArguments, scope).doubleValue();
double z = this.z.apply(implementationArguments, scope).doubleValue(); double z = this.z.invoke(implementationArguments, scope).doubleValue();
NoiseSampler sampler = samplerFunction.apply(() -> function.apply(implementationArguments, scope)); NoiseSampler sampler = samplerFunction.apply(() -> function.invoke(implementationArguments, scope));
if(twoD) { if(twoD) {
return sampler.noise(arguments.getWorld().getSeed(), x, z); return sampler.noise(arguments.getWorld().getSeed(), x, z);
} else { } else {
double y = this.y.apply(implementationArguments, scope).doubleValue(); double y = this.y.invoke(implementationArguments, scope).doubleValue();
return sampler.noise(arguments.getWorld().getSeed(), x, y, z); return sampler.noise(arguments.getWorld().getSeed(), x, y, z);
} }
} }
@Override @Override
public Position getPosition() { public SourcePosition getPosition() {
return position; return position;
} }
@@ -6,12 +6,12 @@ import java.util.Map;
import java.util.Objects; import java.util.Objects;
import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler; import com.dfsek.terra.addons.noise.config.DimensionApplicableNoiseSampler;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable; import com.dfsek.terra.addons.terrascript.parser.lang.Expression;
import com.dfsek.terra.addons.terrascript.parser.lang.Returnable.ReturnType; import com.dfsek.terra.addons.terrascript.parser.lang.Expression.ReturnType;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.NumericConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant; import com.dfsek.terra.addons.terrascript.parser.lang.constants.StringConstant;
import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.addons.terrascript.parser.lang.functions.FunctionBuilder;
import com.dfsek.terra.addons.terrascript.tokenizer.Position; import com.dfsek.terra.addons.terrascript.tokenizer.SourcePosition;
public class SamplerFunctionBuilder implements FunctionBuilder<com.dfsek.terra.addons.terrascript.parser.lang.functions.Function<Number>> { public class SamplerFunctionBuilder implements FunctionBuilder<com.dfsek.terra.addons.terrascript.parser.lang.functions.Function<Number>> {
@@ -33,25 +33,25 @@ public class SamplerFunctionBuilder implements FunctionBuilder<com.dfsek.terra.a
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public com.dfsek.terra.addons.terrascript.parser.lang.functions.Function<Number> build(List<Returnable<?>> argumentList, public com.dfsek.terra.addons.terrascript.parser.lang.functions.Function<Number> build(List<Expression<?>> argumentList,
Position position) { SourcePosition position) {
Returnable<String> arg = (Returnable<String>) argumentList.get(0); Expression<String> arg = (Expression<String>) argumentList.get(0);
if(argumentList.size() == 3) { // 2D if(argumentList.size() == 3) { // 2D
if(arg instanceof StringConstant constant) { if(arg instanceof StringConstant constant) {
return new ConstantSamplerFunction(Objects.requireNonNull(samplers2d.get(constant.getConstant()), return new ConstantSamplerFunction(Objects.requireNonNull(samplers2d.get(constant.getConstant()),
"No such 2D noise function " + constant.getConstant()) "No such 2D noise function " + constant.getConstant())
.getSampler(), .getSampler(),
(Returnable<Number>) argumentList.get(1), (Expression<Number>) argumentList.get(1),
new NumericConstant(0, position), new NumericConstant(0, position),
(Returnable<Number>) argumentList.get(2), (Expression<Number>) argumentList.get(2),
true, true,
position); position);
} else { } else {
return new SamplerFunction((Returnable<String>) argumentList.get(0), return new SamplerFunction((Expression<String>) argumentList.get(0),
(Returnable<Number>) argumentList.get(1), (Expression<Number>) argumentList.get(1),
new NumericConstant(0, position), new NumericConstant(0, position),
(Returnable<Number>) argumentList.get(2), (Expression<Number>) argumentList.get(2),
s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get()) s -> Objects.requireNonNull(samplers2d.get(s.get()), "No such 2D noise function " + s.get())
.getSampler(), .getSampler(),
true, true,
@@ -63,16 +63,16 @@ public class SamplerFunctionBuilder implements FunctionBuilder<com.dfsek.terra.a
return new ConstantSamplerFunction(Objects.requireNonNull(samplers3d.get(constant.getConstant()), return new ConstantSamplerFunction(Objects.requireNonNull(samplers3d.get(constant.getConstant()),
"No such 3D noise function " + constant.getConstant()) "No such 3D noise function " + constant.getConstant())
.getSampler(), .getSampler(),
(Returnable<Number>) argumentList.get(1), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Expression<Number>) argumentList.get(2),
(Returnable<Number>) argumentList.get(3), (Expression<Number>) argumentList.get(3),
true, true,
position); position);
} else { } else {
return new SamplerFunction((Returnable<String>) argumentList.get(0), return new SamplerFunction((Expression<String>) argumentList.get(0),
(Returnable<Number>) argumentList.get(1), (Expression<Number>) argumentList.get(1),
(Returnable<Number>) argumentList.get(2), (Expression<Number>) argumentList.get(2),
(Returnable<Number>) argumentList.get(3), (Expression<Number>) argumentList.get(3),
s -> Objects.requireNonNull(samplers3d.get(s.get()), "No such 3D noise function " + s.get()) s -> Objects.requireNonNull(samplers3d.get(s.get()), "No such 3D noise function " + s.get())
.getSampler(), .getSampler(),
true, true,