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    }