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.PrimitiveTypeInfo; 010 import org.mesopotamia.lang.java.ref.Scope; 011 import org.mesopotamia.lang.java.ref.TypeInfo; 012 import org.mesopotamia.lang.java.ref.TypeSpecInfo; 013 014 public class AdditiveExpression extends ShiftExpression { 015 016 private static final String JAVA_LANG_STRING = "java.lang.String"; 017 018 public AdditiveExpression(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 024 } 025 026 public TypeSpecInfo getTypeSpecInfo() { 027 try { 028 LanguageElement firstOperand = getChild(0); 029 TypeSpecInfo ts1 = firstOperand instanceof Expression ? ((Expression) firstOperand).getTypeSpecInfo() : null; 030 LanguageElement secondOperand = getChild(1); 031 TypeSpecInfo ts2 = secondOperand instanceof Expression ? ((Expression) secondOperand).getTypeSpecInfo() : null; 032 if (ts1==null) { 033 return ts2; 034 } 035 if (ts2==null) { 036 return ts1.getDimensions()==0 ? ts1 : null; 037 } 038 if (ts1.getDimensions()==0 039 && ts2.getDimensions()==0 040 && ts1.getTypeInfo() instanceof PrimitiveTypeInfo 041 && ts2.getTypeInfo() instanceof PrimitiveTypeInfo) { 042 if (ts1.getTypeInfo().isKindOf(ts2.getTypeInfo().getFcn())) { 043 return ts2; 044 } 045 return ts1; 046 } 047 048 if (this instanceof Plus) { 049 if (ts1.getDimensions()==0) { 050 TypeInfo ti1 = ts1.getTypeInfo(); 051 if (ti1!=null && JAVA_LANG_STRING.equals(ti1.getFcn())) { 052 return ts1; 053 } 054 } 055 if (ts2.getDimensions()==0) { 056 TypeInfo ti2 = ts2.getTypeInfo(); 057 if (ti2!=null && JAVA_LANG_STRING.equals(ti2.getFcn())) { 058 return ts2; 059 } 060 } 061 } 062 063 return null; 064 } catch (MesopotamiaException e) { 065 throw new MesopotamiaRuntimeException(e); 066 } 067 } 068 }