simplify AST (idea like)
This commit is contained in:
@@ -39,11 +39,6 @@ public class ChameleonJsExpression implements JsExpression {
|
||||
return expression.makeStmt();
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return expression.getKind();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor visitor, JsContext context) {
|
||||
expression.accept(visitor, context);
|
||||
|
||||
@@ -61,9 +61,4 @@ public final class JsArrayAccess extends JsExpressionImpl {
|
||||
arrayExpression = visitor.accept(arrayExpression);
|
||||
indexExpression = visitor.accept(indexExpression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.ARRAY_ACCESS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,9 +65,4 @@ public final class JsArrayLiteral extends JsLiteral {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.acceptWithInsertRemove(expressions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.ARRAY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -83,9 +83,4 @@ public final class JsBinaryOperation extends JsExpressionImpl {
|
||||
}
|
||||
arg2 = visitor.accept(arg2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.BINARY_OP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,9 +52,4 @@ public class JsBlock extends JsNodeImpl implements JsStatement {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.acceptWithInsertRemove(statements);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.BLOCK;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,11 +16,6 @@ public final class JsBreak extends JsContinue {
|
||||
super(label);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.BREAK;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitBreak(this, context);
|
||||
|
||||
@@ -32,9 +32,4 @@ public final class JsCase extends JsSwitchMember {
|
||||
caseExpression = visitor.accept(caseExpression);
|
||||
super.acceptChildren(visitor, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.CASE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,9 +60,4 @@ public class JsCatch extends JsNodeImpl implements HasCondition {
|
||||
}
|
||||
body = visitor.accept(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.CATCH;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,9 +71,4 @@ public final class JsConditional extends JsExpressionImpl {
|
||||
thenExpr = visitor.accept(thenExpr);
|
||||
elseExpr = visitor.accept(elseExpr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.CONDITIONAL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,9 +31,4 @@ public class JsContinue extends JsNodeImpl implements JsStatement {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.CONTINUE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,22 +8,16 @@ package com.google.dart.compiler.backend.js.ast;
|
||||
* Represents a JavaScript debugger statement.
|
||||
*/
|
||||
public class JsDebugger extends JsNodeImpl implements JsStatement {
|
||||
public JsDebugger() {
|
||||
}
|
||||
|
||||
public JsDebugger() {
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDebugger(this, context);
|
||||
}
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDebugger(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.DEBUGGER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,13 +8,8 @@ package com.google.dart.compiler.backend.js.ast;
|
||||
* Represents the default option in a JavaScript swtich statement.
|
||||
*/
|
||||
public final class JsDefault extends JsSwitchMember {
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDefault(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.DEFAULT;
|
||||
}
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDefault(this, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,6 @@ public class JsDoWhile extends JsWhile {
|
||||
super(condition, body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.DO;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDoWhile(this, context);
|
||||
|
||||
@@ -22,11 +22,6 @@ public class JsDocComment extends JsExpressionImpl {
|
||||
tags = Collections.<String, Object>singletonMap(tagName, tagValue);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitDocComment(this, context);
|
||||
|
||||
@@ -16,9 +16,4 @@ public class JsEmpty extends JsNodeImpl implements JsStatement {
|
||||
@Override
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.EMPTY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,11 +25,6 @@ public final class JsExpressionStatement extends AbstractNode implements JsState
|
||||
expression = visitor.accept(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.EXPRESSION_STMT;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getSourceInfo() {
|
||||
return null;
|
||||
|
||||
@@ -95,9 +95,4 @@ public class JsFor extends JsNodeImpl implements JsStatement {
|
||||
}
|
||||
body = visitor.accept(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.FOR;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,9 +64,4 @@ public class JsForIn extends JsNodeImpl implements JsStatement {
|
||||
objectExpression = visitor.accept(objectExpression);
|
||||
body = visitor.accept(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.FOR_IN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -99,9 +99,4 @@ public final class JsFunction extends JsLiteral implements HasName {
|
||||
visitor.acceptWithInsertRemove(params);
|
||||
body = visitor.accept(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.FUNCTION;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -63,9 +63,4 @@ public final class JsIf extends JsNodeImpl implements JsStatement {
|
||||
elseStatement = visitor.accept(elseStatement);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.IF;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -76,9 +76,4 @@ public final class JsInvocation extends JsExpressionImpl.JsExpressionHasArgument
|
||||
qualifier = visitor.accept(qualifier);
|
||||
visitor.acceptList(arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.INVOKE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,14 +45,9 @@ public class JsLabel extends JsNodeImpl implements JsStatement, HasName {
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitLabel(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
statement = visitor.accept(statement);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.LABEL;
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
statement = visitor.accept(statement);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,11 +46,6 @@ public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEv
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitThis(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.THIS;
|
||||
}
|
||||
}
|
||||
|
||||
public static final class JsBooleanLiteral extends JsValueLiteral {
|
||||
@@ -89,11 +84,6 @@ public abstract class JsLiteral extends JsExpressionImpl implements CanBooleanEv
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitBoolean(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.BOOLEAN;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -104,9 +104,4 @@ public final class JsNameRef extends JsExpressionImpl implements CanBooleanEval,
|
||||
qualifier = visitor.accept(qualifier);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.NAME_REF;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -51,9 +51,4 @@ public final class JsNew extends JsExpressionImpl.JsExpressionHasArguments {
|
||||
constructorExpression = visitor.accept(constructorExpression);
|
||||
visitor.acceptList(arguments);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.NEW;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,8 +7,6 @@ package com.google.dart.compiler.backend.js.ast;
|
||||
import com.google.dart.compiler.common.HasSourceInfo;
|
||||
|
||||
public interface JsNode extends HasSourceInfo {
|
||||
NodeKind getKind();
|
||||
|
||||
/**
|
||||
* Causes this object to have the visitor visit itself and its children.
|
||||
*
|
||||
|
||||
@@ -32,9 +32,4 @@ public final class JsNullLiteral extends JsLiteral.JsValueLiteral {
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitNull(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,11 +15,6 @@ public abstract class JsNumberLiteral extends JsLiteral.JsValueLiteral {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.NUMBER;
|
||||
}
|
||||
|
||||
public static final class JsDoubleLiteral extends JsNumberLiteral {
|
||||
public final double value;
|
||||
|
||||
|
||||
@@ -77,9 +77,4 @@ public final class JsObjectLiteral extends JsLiteral {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.acceptWithInsertRemove(properties);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.OBJECT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,9 +35,4 @@ public final class JsParameter extends JsNodeImpl implements HasName {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,9 +31,4 @@ public final class JsPostfixOperation extends JsUnaryOperation {
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitPostfixOperation(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.POSTFIX_OP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,52 +6,47 @@ package com.google.dart.compiler.backend.js.ast;
|
||||
|
||||
public final class JsPrefixOperation extends JsUnaryOperation implements CanBooleanEval {
|
||||
|
||||
public JsPrefixOperation(JsUnaryOperator op) {
|
||||
this(op, null);
|
||||
}
|
||||
|
||||
public JsPrefixOperation(JsUnaryOperator op, JsExpression arg) {
|
||||
super(op, arg);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBooleanFalse() {
|
||||
if (getOperator() == JsUnaryOperator.VOID) {
|
||||
return true;
|
||||
public JsPrefixOperation(JsUnaryOperator op) {
|
||||
this(op, null);
|
||||
}
|
||||
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
|
||||
CanBooleanEval eval = (CanBooleanEval) getArg();
|
||||
return eval.isBooleanTrue();
|
||||
|
||||
public JsPrefixOperation(JsUnaryOperator op, JsExpression arg) {
|
||||
super(op, arg);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isBooleanTrue() {
|
||||
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
|
||||
CanBooleanEval eval = (CanBooleanEval) getArg();
|
||||
return eval.isBooleanFalse();
|
||||
@Override
|
||||
public boolean isBooleanFalse() {
|
||||
if (getOperator() == JsUnaryOperator.VOID) {
|
||||
return true;
|
||||
}
|
||||
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
|
||||
CanBooleanEval eval = (CanBooleanEval) getArg();
|
||||
return eval.isBooleanTrue();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return getOperator() == JsUnaryOperator.TYPEOF;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDefinitelyNotNull() {
|
||||
return getOperator() == JsUnaryOperator.TYPEOF || getOperator() != JsUnaryOperator.VOID;
|
||||
}
|
||||
@Override
|
||||
public boolean isBooleanTrue() {
|
||||
if (getOperator() == JsUnaryOperator.NOT && getArg() instanceof CanBooleanEval) {
|
||||
CanBooleanEval eval = (CanBooleanEval) getArg();
|
||||
return eval.isBooleanFalse();
|
||||
}
|
||||
return getOperator() == JsUnaryOperator.TYPEOF;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDefinitelyNull() {
|
||||
return getOperator() == JsUnaryOperator.VOID;
|
||||
}
|
||||
@Override
|
||||
public boolean isDefinitelyNotNull() {
|
||||
return getOperator() == JsUnaryOperator.TYPEOF || getOperator() != JsUnaryOperator.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitPrefixOperation(this, context);
|
||||
}
|
||||
@Override
|
||||
public boolean isDefinitelyNull() {
|
||||
return getOperator() == JsUnaryOperator.VOID;
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.PREFIX_OP;
|
||||
}
|
||||
@Override
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitPrefixOperation(this, context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -119,9 +119,4 @@ public final class JsProgram extends JsNodeImpl {
|
||||
visitor.accept(fragment);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.PROGRAM;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,9 +27,4 @@ public class JsProgramFragment extends JsNodeImpl {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.accept(globalBlock);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.PROGRAM_FRAGMENT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,9 +48,4 @@ public class JsPropertyInitializer extends JsNodeImpl {
|
||||
labelExpr = visitor.accept(labelExpr);
|
||||
valueExpr = visitor.accept(valueExpr);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.PROPERTY_INIT;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,9 +54,4 @@ public final class JsRegExp extends JsLiteral.JsValueLiteral {
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitRegExp(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.REGEXP;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,12 +33,7 @@ public final class JsReturn extends JsNodeImpl implements JsStatement {
|
||||
@Override
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
if (expression != null) {
|
||||
expression = visitor.accept(expression);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.RETURN;
|
||||
expression = visitor.accept(expression);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,9 +44,4 @@ public final class JsStringLiteral extends JsLiteral.JsValueLiteral {
|
||||
public void accept(JsVisitor v, JsContext context) {
|
||||
v.visitString(this, context);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.STRING;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,9 +41,4 @@ public class JsSwitch extends JsNodeImpl implements JsStatement {
|
||||
expr = visitor.accept(expr);
|
||||
visitor.acceptWithInsertRemove(cases);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.SWITCH;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,9 +31,4 @@ public class JsThrow extends JsNodeImpl implements JsStatement {
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.accept(expression);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.THROW;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,9 +60,4 @@ public class JsTry extends JsNodeImpl implements JsStatement {
|
||||
finallyBlock = visitor.accept(finallyBlock);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.TRY;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -91,11 +91,6 @@ public class JsVars extends JsNodeImpl implements JsStatement, Iterable<JsVars.J
|
||||
initExpression = visitor.accept(initExpression);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.VAR;
|
||||
}
|
||||
}
|
||||
|
||||
public void add(JsVar var) {
|
||||
@@ -126,9 +121,4 @@ public class JsVars extends JsNodeImpl implements JsStatement, Iterable<JsVars.J
|
||||
public void acceptChildren(JsVisitor visitor, JsContext context) {
|
||||
visitor.acceptWithInsertRemove(vars);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.VARS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,9 +45,4 @@ public class JsWhile extends JsNodeImpl implements JsStatement {
|
||||
condition = visitor.accept(condition);
|
||||
body = visitor.accept(body);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NodeKind getKind() {
|
||||
return NodeKind.WHILE;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
// Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
|
||||
// for details. All rights reserved. Use of this source code is governed by a
|
||||
// BSD-style license that can be found in the LICENSE file.
|
||||
|
||||
package com.google.dart.compiler.backend.js.ast;
|
||||
|
||||
enum NodeKind {
|
||||
ARRAY_ACCESS,
|
||||
ARRAY,
|
||||
BINARY_OP,
|
||||
BLOCK,
|
||||
BOOLEAN,
|
||||
BREAK,
|
||||
CASE,
|
||||
CATCH,
|
||||
CONDITIONAL,
|
||||
CONTINUE,
|
||||
DEBUGGER,
|
||||
DEFAULT,
|
||||
DO,
|
||||
EMPTY,
|
||||
EXPRESSION_STMT,
|
||||
FOR,
|
||||
FOR_IN,
|
||||
FUNCTION,
|
||||
IF,
|
||||
INVOKE,
|
||||
LABEL,
|
||||
NAME_REF,
|
||||
NEW,
|
||||
NULL,
|
||||
NUMBER,
|
||||
OBJECT,
|
||||
PARAMETER,
|
||||
POSTFIX_OP,
|
||||
PREFIX_OP,
|
||||
PROGRAM,
|
||||
PROGRAM_FRAGMENT,
|
||||
PROPERTY_INIT,
|
||||
REGEXP,
|
||||
RETURN,
|
||||
STRING,
|
||||
SWITCH,
|
||||
THIS,
|
||||
THROW,
|
||||
TRY,
|
||||
VARS,
|
||||
VAR,
|
||||
WHILE
|
||||
}
|
||||
Reference in New Issue
Block a user