001 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 002 // for details. All rights reserved. Use of this source code is governed by a 003 // BSD-style license that can be found in the LICENSE file. 004 005 package com.google.dart.compiler.backend.js.ast; 006 007 import com.google.dart.compiler.common.Symbol; 008 009 /** 010 * Represents a JavaScript expression that references a name. 011 */ 012 public final class JsNameRef extends JsExpressionImpl implements HasName { 013 private String ident; 014 private JsName name; 015 private JsExpression qualifier; 016 017 public JsNameRef(JsName name) { 018 this.name = name; 019 } 020 021 public JsNameRef(String ident) { 022 this.ident = ident; 023 } 024 025 public JsNameRef(String ident, JsExpression qualifier) { 026 this.ident = ident; 027 this.qualifier = qualifier; 028 } 029 030 public JsNameRef(String ident, String qualifier) { 031 this(ident, new JsNameRef(qualifier)); 032 } 033 034 public JsNameRef(JsName name, JsExpression qualifier) { 035 this.name = name; 036 this.qualifier = qualifier; 037 } 038 039 public String getIdent() { 040 return (name == null) ? ident : name.getIdent(); 041 } 042 043 @Override 044 public JsName getName() { 045 return name; 046 } 047 048 @Override 049 public Symbol getSymbol() { 050 return name; 051 } 052 053 public JsExpression getQualifier() { 054 return qualifier; 055 } 056 057 @Override 058 public boolean isLeaf() { 059 return qualifier == null; 060 } 061 062 public void resolve(JsName name) { 063 this.name = name; 064 ident = null; 065 } 066 067 public void setQualifier(JsExpression qualifier) { 068 this.qualifier = qualifier; 069 } 070 071 @Override 072 public void accept(JsVisitor v) { 073 v.visitNameRef(this); 074 } 075 076 @Override 077 public void acceptChildren(JsVisitor visitor) { 078 if (qualifier != null) { 079 visitor.accept(qualifier); 080 } 081 } 082 }