001    package org.mesopotamia.lang.java;
002    
003    import org.mesopotamia.LanguageElement;
004    import org.mesopotamia.MesopotamiaException;
005    import org.mesopotamia.MesopotamiaRuntimeException;
006    import org.mesopotamia.NodeData;
007    import org.mesopotamia.RepositoryLanguage;
008    import org.mesopotamia.Scan;
009    import org.mesopotamia.lang.java.ref.TypeInfo;
010    import org.mesopotamia.lang.java.ref.TypeSpecInfo;
011    import org.w3c.dom.Element;
012    
013    import biz.hammurapi.util.Visitable;
014    import biz.hammurapi.util.Visitor;
015    
016    public class IndexOperation extends PostfixExpression {
017    
018            public IndexOperation(NodeData xData, Class<?> context, Scan scan,
019                            RepositoryLanguage language, Object environment) throws MesopotamiaException {
020                    super(xData, context, scan, language, environment);
021    
022                    // Select attributes
023                    Index = (Expression) selectSingleElement(Expression.class, "EXPR");
024    
025            }
026    
027            public void toDom(Element holder) {
028                    super.toDom(holder);
029    
030                    // Serialize attributes
031                    setElement(holder, "Index", Index);
032            }
033    
034            // Attributes
035            private Expression Index;
036    
037            // Accessors
038            public Expression getIndex() {
039                    return Index;
040            }
041    
042            protected void acceptChildren(Visitor visitor) {
043                    super.acceptChildren(visitor);
044                    // Visiting non-text attributes
045                    if (Index instanceof Visitable) {
046                            ((Visitable) Index).accept(visitor);
047                    }
048            }
049    
050            public TypeSpecInfo getTypeSpecInfo() {
051                    try {
052                            LanguageElement firstOperand = getChild(0);
053                            final TypeSpecInfo ts =  firstOperand instanceof Expression ? ((Expression) firstOperand).getTypeSpecInfo() : null;
054                            return ts==null || ts.getDimensions()==0 ? null : new TypeSpecInfo() {
055    
056                                    public int getDimensions() {
057                                            return ts.getDimensions()-1;
058                                    }
059    
060                                    public TypeInfo getTypeInfo() {
061                                            return ts.getTypeInfo();
062                                    }
063                                    
064                            };
065                    } catch (MesopotamiaException e) {
066                            throw new MesopotamiaRuntimeException(e);
067                    }
068            }
069    }