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 }