// 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.common.Symbol; import org.jetbrains.kotlin.js.util.AstUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** * Represents a JavaScript expression that references a name. */ public final class JsNameRef extends JsExpression implements HasName { private String ident; private JsName name; private JsExpression qualifier; public JsNameRef(@NotNull JsName name) { this.name = name; } public JsNameRef(@NotNull String ident) { this.ident = ident; } public JsNameRef(@NotNull String ident, JsExpression qualifier) { this.ident = ident; this.qualifier = qualifier; } public JsNameRef(@NotNull String ident, @NotNull String qualifier) { this(ident, new JsNameRef(qualifier)); } public JsNameRef(@NotNull JsName name, JsExpression qualifier) { this.name = name; this.qualifier = qualifier; } @NotNull public String getIdent() { return (name == null) ? ident : name.getIdent(); } @Nullable @Override public JsName getName() { return name; } @Override public void setName(JsName name) { this.name = name; } @Nullable @Override public Symbol getSymbol() { return name; } @Nullable public JsExpression getQualifier() { return qualifier; } @Override public boolean isLeaf() { return qualifier == null; } public void resolve(JsName name) { this.name = name; ident = null; } public void setQualifier(JsExpression qualifier) { this.qualifier = qualifier; } @Override public void accept(JsVisitor v) { v.visitNameRef(this); } @Override public void acceptChildren(JsVisitor visitor) { if (qualifier != null) { visitor.accept(qualifier); } } @Override public void traverse(JsVisitorWithContext v, JsContext ctx) { if (v.visit(this, ctx)) { if (qualifier != null) { qualifier = v.accept(qualifier); } } v.endVisit(this, ctx); } @NotNull @Override public JsNameRef deepCopy() { JsExpression qualifierCopy = AstUtil.deepCopy(qualifier); if (name != null) return new JsNameRef(name, qualifierCopy).withMetadataFrom(this); return new JsNameRef(ident, qualifierCopy).withMetadataFrom(this); } }