@Override public BType getCollectionType(char typeChar, List<BType> memberTypes) { switch (typeChar) { case 'O': return new BUnionType(memberTypes); case 'P': return new BTupleType(memberTypes); default: throw new IllegalArgumentException("unsupported collection type char: " + typeChar); } }
private static boolean checkTupleAssignable(BType sourceType, BType targetType, List<TypePair> unresolvedTypes) { List<BType> targetTupleTypes = ((BTupleType) targetType).getTupleTypes(); List<BType> sourceTupleTypes = ((BTupleType) sourceType).getTupleTypes(); if (sourceTupleTypes.size() != targetTupleTypes.size()) { return false; } for (int i = 0; i < sourceTupleTypes.size(); i++) { if (!isAssignable(sourceTupleTypes.get(i), targetTupleTypes.get(i), unresolvedTypes)) { return false; } } return true; }
private static boolean checkIsTupleType(BType sourceType, BTupleType targetType, List<TypePair> unresolvedTypes) { if (sourceType.getTag() != TypeTags.TUPLE_TAG) { return false; } List<BType> sourceTypes = ((BTupleType) sourceType).getTupleTypes(); List<BType> targetTypes = targetType.getTupleTypes(); if (sourceTypes.size() != targetTypes.size()) { return false; } for (int i = 0; i < sourceTypes.size(); i++) { if (!checkIsType(sourceTypes.get(i), targetTypes.get(i), unresolvedTypes)) { return false; } } return true; }
@Override public BValue getNext() { if (cursor++ == collection.size()) { return null; } List<BType> types = new LinkedList<>(); types.add(BTypes.typeString); types.add(BTypes.typeAny); BTupleType tupleType = new BTupleType(types); Map.Entry<K, V> next = iterator.next(); BValueArray tuple = new BValueArray(tupleType); BString key = new BString((String) next.getKey()); tuple.add(0, key); BRefType value = (BRefType<?>) next.getValue(); tuple.add(1, value); return tuple; }
private static boolean checkTupleCast(BValue sourceValue, BType targetType, List<TypePair> unresolvedTypes) { BValueArray source = (BValueArray) sourceValue; BTupleType target = (BTupleType) targetType; List<BType> targetTupleTypes = target.getTupleTypes(); if (source.size() != targetTupleTypes.size()) { return false; } for (int i = 0; i < source.size(); i++) { if (!checkCast(source.getBValue(i), targetTupleTypes.get(i), unresolvedTypes)) { return false; } } return true; }
private static boolean checkIsLikeTupleType(BValue sourceValue, BTupleType targetType) { if (!(sourceValue instanceof BValueArray)) { return false; } BValueArray source = (BValueArray) sourceValue; if (source.size() != targetType.getTupleTypes().size()) { return false; } if (BTypes.isValueType(source.elementType)) { int bound = (int) source.size(); for (int i = 0; i < bound; i++) { if (!checkIsType(source.elementType, targetType.getTupleTypes().get(i), new ArrayList<>())) { return false; } } return true; } int bound = (int) source.size(); for (int i = 0; i < bound; i++) { if (!checkIsLikeType(source.getRefValue(i), targetType.getTupleTypes().get(i))) { return false; } } return true; }
String[] tupleElements = tupleArg.split(COMMA); if (tupleElements.length != type.getTupleTypes().size()) { throw new BLangUsageException("invalid argument '(" + tupleArg + ")', element count mismatch for tuple " + "type: '" + type + "'"); for (BType elementType : type.getTupleTypes()) { String tupleElement = tupleElements[index].trim(); try {
return isAnydata(((BUnionType) type).getMemberTypes(), unresolvedTypes); case TypeTags.TUPLE_TAG: return isAnydata(((BTupleType) type).getTupleTypes(), unresolvedTypes); case TypeTags.ARRAY_TAG: return isAnydata(((BArrayType) type).getElementType(), unresolvedTypes);
} else if (type.getTag() == TypeTags.TUPLE_TAG) { BTupleType tupleType = (BTupleType) type; this.size = maxArraySize = tupleType.getTupleTypes().size(); refValues = (BRefType[]) newArrayInstance(BRefType.class); AtomicInteger counter = new AtomicInteger(0); tupleType.getTupleTypes().forEach(memType -> refValues[counter.getAndIncrement()] = memType.getEmptyValue()); } else {
for (int i = 0; i < this.size(); i++) { if (arrayValues[i] != null) { BType memberType = ((BTupleType) type).getTupleTypes().get(i); if (memberType.getTag() == TypeTags.ANYDATA_TAG || memberType.getTag() == TypeTags.JSON_TAG) { memberType = BVM.resolveMatchingTypeForUnion(arrayValues[i], memberType); ((BTupleType) type).getTupleTypes().set(i, memberType);
BType elementType = (list.getType().getTag() == TypeTags.ARRAY_TAG) ? ((BArrayType) list.getType()).getElementType() : ((BTupleType) list.getType()).getTupleTypes().get((int) index); if (!checkCast(refReg, elementType)) { ctx.setError(BLangVMErrors.createError(ctx, BallerinaErrorReasons.INHERENT_TYPE_VIOLATION_ERROR,