/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang.psi.impl.expressions;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiType;
import gw.lang.parser.IHasType;
import gw.lang.parser.IParsedElement;
import gw.lang.parser.expressions.ITypeAsExpression;
import gw.lang.reflect.java.JavaTypes;
import gw.plugin.ij.lang.parser.GosuCompositeElement;
import gw.plugin.ij.lang.parser.GosuElementTypes;
import gw.plugin.ij.lang.psi.IGosuPsiElement;
import gw.plugin.ij.lang.psi.api.expressions.IGosuExpression;
import gw.plugin.ij.lang.psi.impl.GosuElementVisitor;
import gw.plugin.ij.lang.psi.impl.GosuPsiElementImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class GosuTypeAsExpressionImpl extends GosuPsiElementImpl<ITypeAsExpression> implements IGosuExpression {
public GosuTypeAsExpressionImpl(GosuCompositeElement node) {
super(node);
}
@Override
public PsiType getType() {
IParsedElement pe = getParsedElementImpl();
return createType(pe instanceof IHasType ? ((IHasType)pe).getType() : JavaTypes.pVOID());
}
@Nullable
public IGosuPsiElement getLhs() {
ITypeAsExpression pe = getParsedElement();
if (pe == null || pe.getLHS() != null) {
return (IGosuPsiElement) getChildren()[0];
}
return null;
}
@Nullable
public GosuTypeLiteralImpl getRhs() {
List<PsiElement> children = findChildrenByType(GosuElementTypes.ELEM_TYPE_TypeLiteral);
if (children.size() > 0) {
return (GosuTypeLiteralImpl)
(children.get(0) != getLhs()
? children.get(0)
: children.size() > 1
? children.get(1)
: null);
}
return null;
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if( visitor instanceof GosuElementVisitor) {
((GosuElementVisitor)visitor).visitTypeAsExpression(this);
}
else {
visitor.visitElement( this );
}
}
}