private static String mergeTypeEx(String a,String b){
  if (a.equals(b)) {
    return a;
  }
  int as=countArrayDim(a);
  int bs=countArrayDim(b);
  if (as > bs) {
    return a;
  }
 else   if (bs > as) {
    return b;
  }
 else {
    String elementTypeA=a.substring(as);
    String elementTypeB=a.substring(bs);
    TypeClass ta=TypeClass.clzOf(elementTypeA);
    TypeClass tb=TypeClass.clzOf(elementTypeB);
    if (ta.fixed && !tb.fixed) {
      return a;
    }
 else     if (!ta.fixed && tb.fixed) {
      return b;
    }
 else     if (ta.fixed && tb.fixed) {
      if (ta != tb) {
        if (as == 0) {
          throw new RuntimeException();
        }
        return buildArray(as - 1,"L");
      }
      if (ta == TypeClass.INT) {
        String chooseType="I";
        for (int i=possibleIntTypes.length - 1; i >= 0; i--) {
          String t=possibleIntTypes[i];
          if (a.equals(t) || b.equals(t)) {
            chooseType=t;
            break;
          }
        }
        return buildArray(as,chooseType);
      }
 else {
        return buildArray(as,"L");
      }
    }
 else {
      return buildArray(as,TypeClass.merge(ta,tb).name);
    }
  }
}

private static String mergeTypeEx ( String a , String b ) { if ( a . equals ( b ) ) { return a ; } int as = countArrayDim ( a ) ; int bs = countArrayDim ( b ) ; if ( as > bs ) { return a ; } else if ( bs > as ) { return b ; } else { String elementTypeA = a . substring ( as ) ; String elementTypeB = a . substring ( bs ) ; TypeClass ta = TypeClass . clzOf ( elementTypeA ) ; TypeClass tb = TypeClass . clzOf ( elementTypeB ) ; if ( ta . fixed && ! tb . fixed ) { return a ; } else if ( ! ta . fixed && tb . fixed ) { return b ; } else if ( ta . fixed && tb . fixed ) { if ( ta != tb ) { if ( as == 0 ) { throw new RuntimeException ( ) ; } return buildArray ( as - 1 , "L" ) ; } if ( ta == TypeClass . INT ) { String chooseType = "I" ; for ( int i = possibleIntTypes . length - 1 ; i >= 0 ; i -- ) { String t = possibleIntTypes [ i ] ; if ( a . equals ( t ) || b . equals ( t ) ) { chooseType = t ; break ; } } return buildArray ( as , chooseType ) ; } else { return buildArray ( as , "L" ) ; } } else { return buildArray ( as , TypeClass . merge ( ta , tb ) . name ) ; } } }
[ [ b + [ [ d - > [ l [ b + l - > [ b [ [ b + [ b - > [ [ b
