# Path: krakatau-lib/src/main/resources/Lib/Krakatau/ssa/objtypes.py
# def TypeTT(baset, dim):
# def baset(tt): return tt[0]
# def dim(tt): return tt[1]
# def withDimInc(tt, inc): return TypeTT(baset(tt), dim(tt)+inc)
# def withNoDim(tt): return TypeTT(baset(tt), 0)
# def isBaseTClass(tt): return not baset(tt).startswith('.')
# def className(tt): return baset(tt) if not baset(tt).startswith('.') else None
# def primName(tt): return baset(tt)[1:] if baset(tt).startswith('.') else None
# def isSubtype(env, x, y):
# def commonSupertype(env, tts):
# def verifierToSynthetic_seq(vtypes):
# def verifierToSynthetic(vtype):
# def declTypeToActual(env, decltype):
# 
# Path: krakatau-lib/src/main/resources/Lib/Krakatau/java/stringescape.py
# def escapeString(u):
#     if set(u) <= ok_chars:
#         return u 
# 
#     escaped = []
#     for c in u:
#         if c in ok_chars:
#             escaped.append(c)
#         elif c in late_escape:
#             escaped.append(late_escape[c])
#         else:
#             i = ord(c)
#             if i <= 0xFFFF:
#                 escaped.append(r'\u{0:04x}'.format(i))
#             else:
#                 i -= 0x10000
#                 high = 0xD800 + (i>>10)
#                 low = 0xDC00 + (i & 0x3FF)
#                 escaped.append(r'\u{0:04x}\u{1:04x}'.format(high,low))
#     return ''.join(escaped)


import itertools, math
from ..ssa import objtypes
from .stringescape import escapeString

    @property
    def dtype(self): return self.params[0].dtype if self._dtype is None else self._dtype

    def addParens_sub(self):
        myprec = self.precedence
        associative = myprec >= 15 #for now we treat +, *, etc as nonassociative due to floats

        for i, p in enumerate(self.params):
            if p.precedence > myprec:
                self.params[i] = Parenthesis(p)
            elif p.precedence == myprec and i > 0 and not associative:
                self.params[i] = Parenthesis(p)

    def tree(self, printer, tree): return [self.__class__.__name__, self.opstr, tree(self.params[0]), tree(self.params[1])]

class Cast(JavaExpression):
    precedence = 5
    def __init__(self, *params):
        self.dtype = params[0].tt
        self.params = params
        self.fmt = '({}){}'

    def fix(self, env):
        tt, expr = self.dtype, self.params[1]
        # "Impossible" casts are a compile error in Java.
        # This can be fixed with an intermediate cast to Object
        if isReferenceType(tt):
            if not isJavaAssignable(env, tt, expr.dtype):
                if not isJavaAssignable(env, expr.dtype, tt):

# Path: krakatau-lib/src/main/resources/Lib/Krakatau/ssa/objtypes.py
# def TypeTT(baset, dim):
# def baset(tt): return tt[0]
# def dim(tt): return tt[1]
# def withDimInc(tt, inc): return TypeTT(baset(tt), dim(tt)+inc)
# def withNoDim(tt): return TypeTT(baset(tt), 0)
# def isBaseTClass(tt): return not baset(tt).startswith('.')
# def className(tt): return baset(tt) if not baset(tt).startswith('.') else None
# def primName(tt): return baset(tt)[1:] if baset(tt).startswith('.') else None
# def isSubtype(env, x, y):
# def commonSupertype(env, tts):
# def verifierToSynthetic_seq(vtypes):
# def verifierToSynthetic(vtype):
# def declTypeToActual(env, decltype):
# 
# Path: krakatau-lib/src/main/resources/Lib/Krakatau/java/stringescape.py
# def escapeString(u):
#     if set(u) <= ok_chars:
#         return u 
# 
#     escaped = []
#     for c in u:
#         if c in ok_chars:
#             escaped.append(c)
#         elif c in late_escape:
#             escaped.append(late_escape[c])
#         else:
#             i = ord(c)
#             if i <= 0xFFFF:
#                 escaped.append(r'\u{0:04x}'.format(i))
#             else:
#                 i -= 0x10000
#                 high = 0xD800 + (i>>10)
#                 low = 0xDC00 + (i & 0x3FF)
#                 escaped.append(r'\u{0:04x}\u{1:04x}'.format(high,low))
#     return ''.join(escaped)


# Path: krakatau-lib/src/main/resources/Lib/Krakatau/java/ast.py
import itertools, math
from ..ssa import objtypes
from .stringescape import escapeString


    @property
    def dtype(self): return self.params[0].dtype if self._dtype is None else self._dtype

    def addParens_sub(self):
        myprec = self.precedence
        associative = myprec >= 15 #for now we treat +, *, etc as nonassociative due to floats

        for i, p in enumerate(self.params):
            if p.precedence > myprec:
                self.params[i] = Parenthesis(p)
            elif p.precedence == myprec and i > 0 and not associative:
                self.params[i] = Parenthesis(p)

    def tree(self, printer, tree): return [self.__class__.__name__, self.opstr, tree(self.params[0]), tree(self.params[1])]

class Cast(JavaExpression):
    precedence = 5
    def __init__(self, *params):
        self.dtype = params[0].tt
        self.params = params
        self.fmt = '({}){}'

    def fix(self, env):
        tt, expr = self.dtype, self.params[1]
        # "Impossible" casts are a compile error in Java.
        # This can be fixed with an intermediate cast to Object
        if isReferenceType(tt):
            if not isJavaAssignable(env, tt, expr.dtype):
                if not isJavaAssignable(env, expr.dtype, tt):

                    expr = makeCastExpr(objtypes.ObjectTT, expr)