use of org.wso2.ballerinalang.compiler.semantics.model.types.BTupleType in project ballerina by ballerina-lang.
the class SymbolResolver method visit.
public void visit(BLangTupleTypeNode tupleTypeNode) {
List<BType> memberTypes = tupleTypeNode.memberTypeNodes.stream().map(memTypeNode -> resolveTypeNode(memTypeNode, env)).collect(Collectors.toList());
resultType = new BTupleType(memberTypes);
}
use of org.wso2.ballerinalang.compiler.semantics.model.types.BTupleType in project ballerina by ballerina-lang.
the class IterableAnalyzer method calculatedGivenOutputArgs.
private List<BType> calculatedGivenOutputArgs(Operation operation) {
final List<BType> givenRetTypes;
if (operation.lambdaType.getReturnTypes().isEmpty()) {
givenRetTypes = Collections.emptyList();
operation.outputType = symTable.voidType;
} else {
final BType returnType = operation.outputType = operation.lambdaType.getReturnTypes().get(0);
if (returnType.tag == TypeTags.TUPLE) {
givenRetTypes = ((BTupleType) returnType).tupleTypes;
} else {
givenRetTypes = operation.lambdaType.getReturnTypes();
}
}
return givenRetTypes;
}
use of org.wso2.ballerinalang.compiler.semantics.model.types.BTupleType in project ballerina by ballerina-lang.
the class IterableAnalyzer method validateIterableContext.
public void validateIterableContext(IterableContext context) {
final Operation lastOperation = context.operations.getLast();
final BType expectedType = lastOperation.expectedType;
final BType outputType = lastOperation.resultType;
if (expectedType.tag == TypeTags.VOID && outputType.tag == TypeTags.VOID) {
context.resultType = symTable.noType;
return;
}
if (expectedType.tag == TypeTags.VOID) {
// This error already logged.
return;
}
if (expectedType == symTable.errType) {
context.resultType = symTable.errType;
return;
}
if (outputType.tag == TypeTags.VOID) {
dlog.error(lastOperation.pos, DiagnosticCode.DOES_NOT_RETURN_VALUE, lastOperation.kind);
context.resultType = symTable.errType;
return;
}
// Calculate expected type, if this is an chained iterable operation.
if (outputType.tag == TypeTags.INTERMEDIATE_COLLECTION) {
BIntermediateCollectionType collectionType = (BIntermediateCollectionType) outputType;
final BTupleType tupleType = collectionType.tupleType;
if (expectedType.tag == TypeTags.ARRAY && tupleType.tupleTypes.size() == 1) {
// Convert result into an array.
context.resultType = new BArrayType(tupleType.tupleTypes.get(0));
return;
} else if (expectedType.tag == TypeTags.MAP && tupleType.tupleTypes.size() == 2 && tupleType.tupleTypes.get(0).tag == TypeTags.STRING) {
// Convert result into a map.
context.resultType = new BMapType(TypeTags.MAP, tupleType.tupleTypes.get(1), null);
return;
} else if (expectedType.tag == TypeTags.TABLE) {
// 3. Whether the returned struct is compatible with the constraint struct of the expected type(table)
if (tupleType.getTupleTypes().size() == 1 && tupleType.getTupleTypes().get(0).tag == TypeTags.STRUCT && types.isAssignable(tupleType.getTupleTypes().get(0), ((BTableType) expectedType).constraint)) {
context.resultType = symTable.tableType;
} else {
context.resultType = types.checkType(lastOperation.pos, outputType, ((BTableType) expectedType).constraint, DiagnosticCode.INCOMPATIBLE_TYPES);
}
return;
} else if (expectedType.tag == TypeTags.ANY) {
context.resultType = symTable.errType;
dlog.error(lastOperation.pos, DiagnosticCode.ITERABLE_RETURN_TYPE_MISMATCH, lastOperation.kind);
return;
} else if (expectedType.tag == TypeTags.NONE) {
context.resultType = symTable.noType;
return;
}
}
// Validate compatibility with calculated and expected type.
context.resultType = types.checkType(lastOperation.pos, outputType, expectedType, DiagnosticCode.INCOMPATIBLE_TYPES);
}
use of org.wso2.ballerinalang.compiler.semantics.model.types.BTupleType in project ballerina by ballerina-lang.
the class IterableAnalyzer method assignOutputAndResultType.
private void assignOutputAndResultType(Operation op, List<BType> argTypes, List<BType> supportedRetTypes) {
if (supportedRetTypes.isEmpty()) {
op.outputType = op.resultType = symTable.voidType;
return;
}
if (op.kind.isTerminal()) {
op.outputType = op.resultType = supportedRetTypes.get(0);
return;
}
if (op.kind == IterableKind.FILTER) {
op.outputType = new BTupleType(argTypes);
op.resultType = new BIntermediateCollectionType((BTupleType) op.outputType);
return;
}
if (supportedRetTypes.size() == 1) {
op.outputType = supportedRetTypes.get(0);
} else {
op.outputType = new BTupleType(supportedRetTypes);
}
op.resultType = new BIntermediateCollectionType(new BTupleType(supportedRetTypes));
}
use of org.wso2.ballerinalang.compiler.semantics.model.types.BTupleType in project ballerina by ballerina-lang.
the class IterableAnalyzer method calculatedGivenInputArgs.
private List<BType> calculatedGivenInputArgs(Operation operation) {
final BType inputParam = operation.lambdaType.getParameterTypes().get(0);
final List<BType> givenArgTypes;
if (inputParam.tag == TypeTags.TUPLE) {
final BTupleType bTupleType = (BTupleType) inputParam;
givenArgTypes = bTupleType.tupleTypes;
} else {
givenArgTypes = operation.lambdaType.getParameterTypes();
}
operation.arity = givenArgTypes.size();
return givenArgTypes;
}
Aggregations