def codeIsEQ(item, objsRefed, returnType, xlator): #print ' IsEq item:', item [S, retTypeSpec] = codeComparison(item[0], objsRefed, returnType, xlator) if len(item) > 1 and len(item[1]) > 0: if len(item[1]) > 1: print "Error: Chained == or !=.\n" exit(1) if (isinstance(retTypeSpec, int)): cdlog(logLvl(), "Invalid item in ==: {}".format(item[0])) leftOwner = owner = progSpec.getTypeSpecOwner(retTypeSpec) for i in item[1]: #print ' IsEq ', i if (i[0] == '=='): op = ' == ' elif (i[0] == '!='): op = ' != ' elif (i[0] == '==='): op = ' == ' else: print "ERROR: '==' or '!=' or '===' expected." exit(2) [S2, retType2] = codeComparison(i[1], objsRefed, returnType, xlator) rightOwner = progSpec.getTypeSpecOwner(retType2) if not isinstance(retTypeSpec, basestring) and isinstance( retTypeSpec['fieldType'], basestring) and isinstance( retType2, basestring): if retTypeSpec[ 'fieldType'] == "char" and retType2 == "string" and S2[ 0] == '"': S2 = "'" + S2[1:-1] + "'" if i[0] == '===': S = S + " == " + S2 else: S += op + S2 retTypeSpec = 'bool' return [S, retTypeSpec]
def chooseVirtualRValOwner(LVAL, RVAL): # Returns left and right text decorations for RHS of function arguments, return values, etc. if RVAL==0 or RVAL==None or isinstance(RVAL, str): return ['',''] # This happens e.g., string.size() # TODO: fix this. if LVAL==0 or LVAL==None or isinstance(LVAL, str): return ['', ''] LeftOwner =progSpec.getTypeSpecOwner(LVAL) RightOwner=progSpec.getTypeSpecOwner(RVAL) if LeftOwner == RightOwner: return ["", ""] if LeftOwner!='itr' and RightOwner=='itr': return ["", ".value"] if LeftOwner=='me' and progSpec.typeIsPointer(RVAL): return ['', ''] if progSpec.typeIsPointer(LVAL) and RightOwner=='me': return ['', ''] #if LeftOwner=='their' and (RightOwner=='our' or RightOwner=='my'): return ['','.get()'] return ['','']
def getTheDerefPtrMods(itemTypeSpec): if itemTypeSpec!=None and isinstance(itemTypeSpec, dict) and 'owner' in itemTypeSpec: if progSpec.typeIsPointer(itemTypeSpec): owner=progSpec.getTypeSpecOwner(itemTypeSpec) if owner=='itr': containerType = itemTypeSpec['arraySpec'][2] if containerType =='map' or containerType == 'multimap': return ['', '->value', False] return ['', '', False] return ['', '', False]
def determinePtrConfigForAssignments(LVAL, RVAL, assignTag, codeStr): #TODO: make test case # Returns left and right text decorations for both LHS and RHS of assignment if RVAL==0 or RVAL==None or isinstance(RVAL, str): return ['','', '',''] # This happens e.g., string.size() # TODO: fix this. if LVAL==0 or LVAL==None or isinstance(LVAL, str): return ['','', '',''] LeftOwner =progSpec.getTypeSpecOwner(LVAL) RightOwner=progSpec.getTypeSpecOwner(RVAL) if progSpec.typeIsPointer(LVAL) and progSpec.typeIsPointer(RVAL): if assignTag=='deep' :return ['','', '',''] else: return ['','', '', ''] if LeftOwner == RightOwner: return ['','', '',''] if LeftOwner=='me' and progSpec.typeIsPointer(RVAL): [leftMod, rightMod] = getTheDerefPtrMods(RVAL) return ['','', leftMod, rightMod] # ['', '', "(*", ")"] if progSpec.typeIsPointer(LVAL) and RightOwner=='me': if assignTag=='deep' :return ['','', '', ''] else: return ['','', "", ''] #if LeftOwner=='their' and (RightOwner=='our' or RightOwner=='my'): return ['','', '','.get()'] return ['','', '','']
def codeVarField_Str(intermediateType, fieldAttrs, typeSpec, fieldName, fieldValueText, className, tags, indent): #TODO: make test case fieldOwner=progSpec.getTypeSpecOwner(typeSpec) if fieldOwner=='we': defn = indent + "public static var "+ indent + fieldName + ": " + intermediateType + fieldValueText + '\n' decl = '' else: fieldTypeMod='' # if progSpec.typeIsPointer(typeSpec): # fieldTypeMod += '?CUSTARD' # Make pointer field variables optionals defn = indent + "var "+ fieldName + ": " + intermediateType + fieldTypeMod + fieldValueText + '\n' decl = '' return [defn, decl]
def codeIsEQ(item, objsRefed, returnType, expectedTypeSpec, xlator): #print(' IsEq item:', item) [S, retTypeSpec]=codeComparison(item[0], objsRefed, returnType, expectedTypeSpec, xlator) if len(item) > 1 and len(item[1])>0: if len(item[1])>1: print("Error: Chained == or !=.\n"); exit(1); if (isinstance(retTypeSpec, int)): cdlog(logLvl(), "Invalid item in ==: {}".format(item[0])) leftOwner=owner=progSpec.getTypeSpecOwner(retTypeSpec) [S_derefd, isDerefd] = derefPtr(S, retTypeSpec) for i in item[1]: #print ' IsEq ', i if (i[0] == '=='): op=' == ' elif (i[0] == '!='): op=' != ' elif (i[0] == '==='): op=' == ' else: print("ERROR: '==' or '!=' or '===' expected."); exit(2) [S2, retTypeSpec] = codeComparison(i[1], objsRefed, returnType, expectedTypeSpec, xlator) rightOwner=progSpec.getTypeSpecOwner(retTypeSpec) if not( leftOwner=='itr' and rightOwner=='itr') and i[0] != '===': if (S2!='nil' ): S=S_derefd elif S[-1]=='!': S=S[:-1] # Todo: Better detect this [S2, isDerefd]=derefPtr(S2, retTypeSpec) S+= op+S2 retTypeSpec='bool' return [S, retTypeSpec]
def codeVarField_Str(convertedType, innerType, typeSpec, fieldName, fieldValueText, className, tags, indent): # TODO: make test case S = "" fieldOwner = progSpec.getTypeSpecOwner(typeSpec) Platform = progSpec.fetchTagValue(tags, 'Platform') # TODO: make next line so it is not hard coded if (Platform == 'Android' and (convertedType == "CanvasView" or convertedType == "FragmentTransaction" or convertedType == "FragmentManager" or convertedType == "Menu" or convertedType == "static GLOBAL" or convertedType == "Toolbar" or convertedType == "NestedScrollView" or convertedType == "SubMenu" or convertedType == "APP" or convertedType == "AssetManager" or convertedType == "ScrollView" or convertedType == "LinearLayout" or convertedType == "GUI" or convertedType == "HorizontalScrollView" or convertedType == "widget" or convertedType == "GLOBAL")): #print " ConvertedType: ", convertedType, " FieldName: ", fieldName S += indent + "public " + convertedType + ' ' + fieldName + ';\n' else: S += indent + "public " + convertedType + ' ' + fieldName + fieldValueText + ';\n' return [S, '']