blob: 9c1c903f7ff94744bcd78f45c273a81d72bfc103 [file] [log] [blame]
// Copyright (c) 2012, 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.ast;
import com.google.dart.compiler.resolver.Element;
/**
* Represents a Dart property access expression (a.b).
*/
public class DartPropertyAccess extends DartExpression {
private DartNode qualifier;
private boolean isCascade;
private DartIdentifier name;
public DartPropertyAccess(DartNode qualifier, DartIdentifier name) {
this(qualifier, false, name);
}
public DartPropertyAccess(DartNode qualifier, boolean isCascade, DartIdentifier name) {
this.qualifier = becomeParentOf(qualifier);
this.isCascade = isCascade;
this.name = becomeParentOf(name);
}
@Override
public boolean isAssignable() {
return true;
}
public boolean isCascade() {
return isCascade;
}
public String getPropertyName() {
return name.getName();
}
public DartIdentifier getName() {
return name;
}
public DartNode getQualifier() {
return qualifier;
}
public DartNode getRealTarget() {
if (isCascade) {
DartNode ancestor = getParent();
while (!(ancestor instanceof DartCascadeExpression)) {
if (ancestor == null) {
return qualifier;
}
ancestor = ancestor.getParent();
}
return ((DartCascadeExpression) ancestor).getTarget();
}
return qualifier;
}
public void setName(DartIdentifier newName) {
name = becomeParentOf(newName);
}
@Override
public void setElement(Element element) {
name.setElement(element);
}
@Override
public Element getElement() {
return name.getElement();
}
@Override
public void visitChildren(ASTVisitor<?> visitor) {
safelyVisitChild(qualifier, visitor);
safelyVisitChild(name, visitor);
}
@Override
public <R> R accept(ASTVisitor<R> visitor) {
return visitor.visitPropertyAccess(this);
}
}