use of org.wso2.ballerinalang.compiler.tree.expressions.BLangRecordLiteral.BLangStructLiteral in project ballerina by ballerina-lang.
the class Desugar method getReturnType.
private BLangStructLiteral getReturnType(BLangTableQueryExpression tableQueryExpression) {
// create a literal to represent the sql query.
BTableType tableType = (BTableType) tableQueryExpression.type;
BStructType structType = (BStructType) tableType.constraint;
return new BLangStructLiteral(new ArrayList<>(), structType);
}
use of org.wso2.ballerinalang.compiler.tree.expressions.BLangRecordLiteral.BLangStructLiteral in project ballerina by ballerina-lang.
the class Desugar method getInitExpr.
private BLangExpression getInitExpr(BType type) {
// Don't need to create an empty init expressions if the type allows null.
if (type.isNullable()) {
return null;
}
switch(type.tag) {
case TypeTags.INT:
case TypeTags.FLOAT:
case TypeTags.BOOLEAN:
case TypeTags.STRING:
case TypeTags.BLOB:
// Int, float, boolean, string, blob types will get default values from VM side.
break;
case TypeTags.JSON:
return new BLangJSONLiteral(new ArrayList<>(), type);
case TypeTags.XML:
return new BLangXMLSequenceLiteral(type);
case TypeTags.TABLE:
return new BLangTableLiteral(type);
case TypeTags.STREAM:
return new BLangStreamLiteral(type, null);
case TypeTags.MAP:
return new BLangMapLiteral(new ArrayList<>(), type);
case TypeTags.STRUCT:
if (((BStructSymbol) type.tsymbol).isObject) {
return new BLangTypeInit();
}
return new BLangStructLiteral(new ArrayList<>(), type);
case TypeTags.ARRAY:
BLangArrayLiteral array = new BLangArrayLiteral();
array.exprs = new ArrayList<>();
array.type = type;
return rewriteExpr(array);
default:
break;
}
return null;
}
use of org.wso2.ballerinalang.compiler.tree.expressions.BLangRecordLiteral.BLangStructLiteral in project ballerina by ballerina-lang.
the class CodeGenerator method visit.
@Override
public void visit(BLangStructLiteral structLiteral) {
BStructSymbol structSymbol = (BStructSymbol) structLiteral.type.tsymbol;
int pkgCPIndex = addPackageRefCPEntry(currentPkgInfo, structSymbol.pkgID);
int structNameCPIndex = addUTF8CPEntry(currentPkgInfo, structSymbol.name.value);
StructureRefCPEntry structureRefCPEntry = new StructureRefCPEntry(pkgCPIndex, structNameCPIndex);
Operand structCPIndex = getOperand(currentPkgInfo.addCPEntry(structureRefCPEntry));
// Emit an instruction to create a new struct.
RegIndex structRegIndex = calcAndGetExprRegIndex(structLiteral);
emit(InstructionCodes.NEWSTRUCT, structCPIndex, structRegIndex);
// Invoke the struct default values init function here.
if (structSymbol.defaultsValuesInitFunc != null) {
int funcRefCPIndex = getFuncRefCPIndex(structSymbol.defaultsValuesInitFunc.symbol);
// call funcRefCPIndex 1 structRegIndex 0
Operand[] operands = new Operand[5];
operands[0] = getOperand(funcRefCPIndex);
operands[1] = getOperand(false);
operands[2] = getOperand(1);
operands[3] = structRegIndex;
operands[4] = getOperand(0);
emit(InstructionCodes.CALL, operands);
}
// Invoke the struct initializer here.
if (structLiteral.initializer != null) {
int funcRefCPIndex = getFuncRefCPIndex(structLiteral.initializer.symbol);
// call funcRefCPIndex 1 structRegIndex 0
Operand[] operands = new Operand[5];
operands[0] = getOperand(funcRefCPIndex);
operands[1] = getOperand(false);
operands[2] = getOperand(1);
operands[3] = structRegIndex;
operands[4] = getOperand(0);
emit(InstructionCodes.CALL, operands);
}
// Generate code the struct literal.
for (BLangRecordKeyValue keyValue : structLiteral.keyValuePairs) {
BLangRecordKey key = keyValue.key;
Operand fieldIndex = key.fieldSymbol.varIndex;
genNode(keyValue.valueExpr, this.env);
int opcode = getOpcode(key.fieldSymbol.type.tag, InstructionCodes.IFIELDSTORE);
emit(opcode, structRegIndex, fieldIndex, keyValue.valueExpr.regIndex);
}
}
use of org.wso2.ballerinalang.compiler.tree.expressions.BLangRecordLiteral.BLangStructLiteral in project ballerina by ballerina-lang.
the class Desugar method addArgInitExpr.
private void addArgInitExpr(BLangTransformer transformerNode, BLangVariable var) {
BLangSimpleVarRef varRef = new BLangLocalVarRef(var.symbol);
varRef.lhsVar = true;
varRef.pos = var.pos;
varRef.type = var.type;
BLangExpression initExpr = null;
switch(var.type.tag) {
case TypeTags.MAP:
initExpr = new BLangMapLiteral(new ArrayList<>(), var.type);
break;
case TypeTags.JSON:
initExpr = new BLangJSONLiteral(new ArrayList<>(), var.type);
break;
case TypeTags.STRUCT:
initExpr = new BLangStructLiteral(new ArrayList<>(), var.type);
break;
case TypeTags.INT:
case TypeTags.FLOAT:
case TypeTags.STRING:
case TypeTags.BOOLEAN:
case TypeTags.BLOB:
case TypeTags.XML:
return;
case TypeTags.TABLE:
case TypeTags.STREAM:
// TODO: add this once the able initializing is supported.
return;
default:
return;
}
initExpr.pos = var.pos;
BLangAssignment assignStmt = (BLangAssignment) TreeBuilder.createAssignmentNode();
assignStmt.pos = var.pos;
assignStmt.addVariable(varRef);
assignStmt.expr = initExpr;
transformerNode.body.stmts.add(0, assignStmt);
}
use of org.wso2.ballerinalang.compiler.tree.expressions.BLangRecordLiteral.BLangStructLiteral in project ballerina by ballerina-lang.
the class Desugar method visit.
@Override
public void visit(BLangRecordLiteral recordLiteral) {
recordLiteral.keyValuePairs.forEach(keyValue -> {
BLangExpression keyExpr = keyValue.key.expr;
if (keyExpr.getKind() == NodeKind.SIMPLE_VARIABLE_REF) {
BLangSimpleVarRef varRef = (BLangSimpleVarRef) keyExpr;
keyValue.key.expr = createStringLiteral(varRef.pos, varRef.variableName.value);
} else {
keyValue.key.expr = rewriteExpr(keyValue.key.expr);
}
keyValue.valueExpr = rewriteExpr(keyValue.valueExpr);
});
BLangExpression expr;
if (recordLiteral.type.tag == TypeTags.STRUCT) {
expr = new BLangStructLiteral(recordLiteral.keyValuePairs, recordLiteral.type);
} else if (recordLiteral.type.tag == TypeTags.MAP) {
expr = new BLangMapLiteral(recordLiteral.keyValuePairs, recordLiteral.type);
} else if (recordLiteral.type.tag == TypeTags.TABLE) {
expr = new BLangTableLiteral(recordLiteral.type);
} else if (recordLiteral.type.tag == TypeTags.STREAM) {
expr = new BLangStreamLiteral(recordLiteral.type, recordLiteral.name);
} else {
expr = new BLangJSONLiteral(recordLiteral.keyValuePairs, recordLiteral.type);
}
result = rewriteExpr(expr);
}
Aggregations