/*
* Copyright 2013 Guidewire Software, Inc.
*/
package gw.plugin.ij.lang.psi.impl.statements;
import com.intellij.lang.ASTNode;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.java.PsiJavaTokenImpl;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.tree.TokenSet;
import com.intellij.psi.tree.java.IJavaElementType;
import gw.lang.parser.statements.IMemberAssignmentStatement;
import gw.plugin.ij.lang.parser.GosuCompositeElement;
import gw.plugin.ij.lang.parser.GosuElementTypes;
import gw.plugin.ij.lang.psi.api.statements.IGosuStatement;
import gw.plugin.ij.lang.psi.impl.GosuElementVisitor;
import org.jetbrains.annotations.NotNull;
public class GosuMemberAssignmentStatementImpl extends GosuBaseStatementImpl<IMemberAssignmentStatement> implements IGosuStatement, PsiAssignmentExpression {
public GosuMemberAssignmentStatementImpl( GosuCompositeElement node ) {
super(node);
}
@NotNull
@Override
public PsiExpression getLExpression() {
return findChildByClass( PsiExpression.class );
}
@Override
public PsiExpression getRExpression() {
for( PsiElement elem = findAssignAop(); elem != null; elem = elem.getNextSibling() ) {
if( elem instanceof PsiExpression ) {
return (PsiExpression)elem;
}
}
return null;
}
@NotNull
@Override
public PsiJavaToken getOperationSign() {
PsiJavaToken assignAop = (PsiJavaToken) findAssignAop();
if(assignAop == null) {
assignAop = new PsiJavaTokenImpl(new IJavaElementType("ERROR"), "ERROR");
}
return assignAop;
}
@NotNull
@Override
public IElementType getOperationTokenType() {
return getOperationSign().getTokenType();
}
@Override
public PsiType getType() {
return getLExpression().getType();
}
private PsiElement findAssignAop() {
ASTNode node = getNode().findChildByType(
TokenSet.create(
GosuElementTypes.TT_OP_assign,
GosuElementTypes.TT_OP_assign_plus,
GosuElementTypes.TT_OP_assign_minus,
GosuElementTypes.TT_OP_assign_multiply,
GosuElementTypes.TT_OP_assign_divide,
GosuElementTypes.TT_OP_assign_modulo,
GosuElementTypes.TT_OP_assign_and,
GosuElementTypes.TT_OP_assign_logical_and,
GosuElementTypes.TT_OP_assing_or,
GosuElementTypes.TT_OP_assing_logical_or,
GosuElementTypes.TT_OP_assign_xor,
GosuElementTypes.TT_OP_assign_shift_left,
GosuElementTypes.TT_OP_assign_shift_right,
GosuElementTypes.TT_OP_assign_shift_right
) );
return node == null ? null : node.getPsi();
}
@Override
public void accept(@NotNull PsiElementVisitor visitor) {
if( visitor instanceof GosuElementVisitor) {
((GosuElementVisitor)visitor).visitMemberAssignmentStatement(this);
}
else {
visitor.visitElement( this );
}
}
}