ASTOperatorFunctionCall class
Пакет: com.hypixel.hytale.server.npc.util.expression.compile.ast
Файл: com/hypixel/hytale/server/npc/util/expression/compile/ast/ASTOperatorFunctionCall.java
extends: ASTOperator
Поля (15)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
String |
functionName |
|
AST |
var10 |
|
ValueType |
var11 |
|
ASTOperatorFunctionCall |
var12 |
|
String |
var16 |
|
Scope |
var17 |
|
List |
var18 |
|
ExecutionContext |
var19 |
|
Stack |
var2 |
|
ValueType |
var20 |
|
int |
var3 |
|
AST |
var4 |
|
StringBuilder |
var6 |
|
boolean |
var7 |
|
int |
var8 |
Методы (9)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Failed to evaluate constant function AST") |
|
|
for for(int var9 = var8; var9 < var3; var9++) |
|
|
for for(int var14 = var8; var14 < var3; var14++) |
|
|
for for(int var13 = var8; var13 < var3; var13++) |
static |
void |
fromParsedFunctionvoid fromParsedFunction(int var0, @Nonnull CompileContext var1) |
|
|
if if(var11 == null) |
|
|
if if(var7) |
|
|
if if(var20 == ValueType.VOID) |
abstract |
|
super super(var1, Token.FUNCTION_CALL, var3) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.util.expression.compile.ast;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ExecutionContext;
class="kw">import com.hypixel.hytale.server.npc.util.expression.Scope;
class="kw">import com.hypixel.hytale.server.npc.util.expression.ValueType;
class="kw">import com.hypixel.hytale.server.npc.util.expression.compile.CompileContext;
class="kw">import com.hypixel.hytale.server.npc.util.expression.compile.Token;
class="kw">import java.text.ParseException;
class="kw">import java.util.List;
class="kw">import java.util.Stack;
class="kw">import javax.annotation.Nonnull;
class="kw">public class ASTOperatorFunctionCall class="kw">extends ASTOperator {
class="kw">private class="kw">final String functionName;
class="kw">public ASTOperatorFunctionCall(@Nonnull ValueType var1, String var2, int var3) {
super(var1, Token.FUNCTION_CALL, var3);
this.functionName = var2;
this.codeGen = var1x -> ExecutionContext.genCALL(this.functionName, this.getArguments().size(), var1x);
}
@Override
class="kw">public boolean isConstant() {
class="kw">return false;
}
class="kw">public class="kw">static void fromParsedFunction(int var0, @Nonnull CompileContext var1) class="kw">throws ParseException {
Stack var2 = var1.getOperandStack();
int var3 = var2.size();
AST var4 = var2.get(var3 - var0 - 1);
if (!(var4 class="kw">instanceof ASTOperandIdentifier var5)) {
throw new ParseException("Expected identifier for function name but found type " + var4.getValueType(), var4.getTokenPosition());
} else {
StringBuilder var6 = new StringBuilder(var5.getIdentifier()).append('@');
boolean var7 = true;
int var8 = var3 - var0;
for (int var9 = var8; var9 < var3; var9++) {
AST var10 = var2.get(var9);
var6.append(Scope.encodeType(var10.getValueType()));
var7 &= var10.isConstant();
}
String var16 = var6.toString();
Scope var17 = var1.getScope();
ValueType var11 = var17.getType(var16);
if (var11 == null) {
throw new IllegalStateException("Unable to find function (or argument types are not matching):" + var16);
}
var7 &= var17.isConstant(var16);
if (var7) {
List var18 = var1.getInstructions();
ExecutionContext var19 = var1.getExecutionContext();
var18.clear();
for (int var14 = var8; var14 < var3; var14++) {
var2.get(var14).genCode(var18, null);
}
var18.add(ExecutionContext.genCALL(var16, var0, null));
ValueType var20 = var19.execute(var18, var17);
if (var20 == ValueType.VOID) {
throw new IllegalStateException("Failed to evaluate constant function AST");
}
var2.setSize(var8 - 1);
var2.push(ASTOperand.createFromOperand(var4.getToken(), var4.getTokenPosition(), var19.top()));
} else {
ASTOperatorFunctionCall var12 = new ASTOperatorFunctionCall(var11, var16, var4.getTokenPosition());
for (int var13 = var8; var13 < var3; var13++) {
var12.addArgument(var2.get(var13));
}
var2.setSize(var8 - 1);
var2.push(var12);
}
}
}
}