org.jetbrains.kotlin.js.backend.ast.JsForIn Maven / Gradle / Ivy
// 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 org.jetbrains.kotlin.js.backend.ast;
import org.jetbrains.kotlin.js.util.AstUtil;
import org.jetbrains.annotations.NotNull;
public class JsForIn extends SourceInfoAwareJsNode implements JsStatement {
private JsStatement body;
private JsExpression iterExpression;
private JsExpression objectExpression;
// Optional: the name of a new iterator variable to introduce
private final JsName iterVarName;
public JsForIn() {
this(null);
}
public JsForIn(JsName iterVarName) {
this.iterVarName = iterVarName;
}
public JsForIn(JsName iterVarName, JsExpression iterExpression, JsExpression objectExpression, JsStatement body) {
this.iterVarName = iterVarName;
this.iterExpression = iterExpression;
this.objectExpression = objectExpression;
this.body = body;
}
public JsStatement getBody() {
return body;
}
public JsExpression getIterExpression() {
return iterExpression;
}
public JsName getIterVarName() {
return iterVarName;
}
public JsExpression getObjectExpression() {
return objectExpression;
}
public void setBody(JsStatement body) {
this.body = body;
}
public void setIterExpression(JsExpression iterExpression) {
this.iterExpression = iterExpression;
}
public void setObjectExpression(JsExpression objectExpression) {
this.objectExpression = objectExpression;
}
@Override
public void accept(JsVisitor v) {
v.visitForIn(this);
}
@Override
public void acceptChildren(JsVisitor visitor) {
if (iterExpression != null) {
visitor.acceptLvalue(iterExpression);
}
visitor.accept(objectExpression);
visitor.accept(body);
}
@Override
public void traverse(JsVisitorWithContext v, JsContext ctx) {
if (v.visit(this, ctx)) {
if (iterExpression != null) {
iterExpression = v.acceptLvalue(iterExpression);
}
objectExpression = v.accept(objectExpression);
body = v.acceptStatement(body);
}
v.endVisit(this, ctx);
}
@NotNull
@Override
public JsForIn deepCopy() {
JsStatement bodyCopy = AstUtil.deepCopy(body);
JsExpression iterCopy = AstUtil.deepCopy(iterExpression);
JsExpression objectCopy = AstUtil.deepCopy(objectExpression);
return new JsForIn(iterVarName, iterCopy, objectCopy, bodyCopy).withMetadataFrom(this);
}
}