use of org.wso2.carbon.registry.core.Tag in project ballerina by ballerina-lang.
the class CodeGenerator method generateForeachVarAssignment.
// private helper methods of visitors.
private void generateForeachVarAssignment(BLangForeach foreach, Operand iteratorIndex) {
List<BLangVariableReference> variables = foreach.varRefs.stream().map(expr -> (BLangVariableReference) expr).collect(Collectors.toList());
// create Local variable Info entries.
variables.stream().filter(// Ignoring ignored ("_") variables.
v -> v.type.tag != TypeTags.NONE).forEach(varRef -> visitVarSymbol(varRef.symbol, lvIndexes, localVarAttrInfo));
List<Operand> nextOperands = new ArrayList<>();
nextOperands.add(iteratorIndex);
nextOperands.add(new Operand(variables.size()));
foreach.varTypes.forEach(v -> nextOperands.add(new Operand(v.tag)));
nextOperands.add(new Operand(variables.size()));
for (int i = 0; i < variables.size(); i++) {
BLangVariableReference varRef = variables.get(i);
nextOperands.add(Optional.ofNullable(varRef.symbol.varIndex).orElse(getRegIndex(foreach.varTypes.get(i).tag)));
}
this.emit(InstructionCodes.ITR_NEXT, nextOperands.toArray(new Operand[0]));
}
use of org.wso2.carbon.registry.core.Tag in project ballerina by ballerina-lang.
the class CodeGenerator method getFuncOperands.
private Operand[] getFuncOperands(BLangInvocation iExpr, int funcRefCPIndex) {
// call funcRefCPIndex, nArgRegs, argRegs[nArgRegs], nRetRegs, retRegs[nRetRegs]
int i = 0;
int nArgRegs = iExpr.requiredArgs.size() + iExpr.namedArgs.size() + iExpr.restArgs.size();
int nRetRegs = iExpr.types.size();
int flags = FunctionFlags.NOTHING;
Operand[] operands = new Operand[nArgRegs + nRetRegs + 4];
operands[i++] = getOperand(funcRefCPIndex);
if (iExpr.async) {
flags = FunctionFlags.markAsync(flags);
}
if (iExpr.actionInvocation) {
flags = FunctionFlags.markObserved(flags);
}
operands[i++] = getOperand(flags);
operands[i++] = getOperand(nArgRegs);
// Write required arguments
for (BLangExpression argExpr : iExpr.requiredArgs) {
operands[i++] = genNode(argExpr, this.env).regIndex;
}
// Write named arguments
i = generateNamedArgs(iExpr, operands, i);
// Write rest arguments
for (BLangExpression argExpr : iExpr.restArgs) {
operands[i++] = genNode(argExpr, this.env).regIndex;
}
// Calculate registers to store return values
operands[i++] = getOperand(nRetRegs);
RegIndex[] iExprRegIndexes;
if (iExpr.regIndex != null) {
iExprRegIndexes = new RegIndex[nRetRegs];
iExprRegIndexes[0] = iExpr.regIndex;
} else {
iExprRegIndexes = new RegIndex[nRetRegs];
}
for (int j = 0; j < nRetRegs; j++) {
RegIndex regIndex = calcAndGetExprRegIndex(iExprRegIndexes[j], iExpr.getTypes().get(j).tag);
iExprRegIndexes[j] = regIndex;
operands[i++] = regIndex;
}
iExpr.setRegIndexes(iExprRegIndexes);
return operands;
}
use of org.wso2.carbon.registry.core.Tag in project ballerina by ballerina-lang.
the class CodeGenerator method visit.
@Override
public void visit(BLangXMLElementLiteral xmlElementLiteral) {
SymbolEnv xmlElementEnv = SymbolEnv.getXMLElementEnv(xmlElementLiteral, env);
xmlElementLiteral.regIndex = calcAndGetExprRegIndex(xmlElementLiteral);
// Visit in-line namespace declarations. These needs to be visited first before visiting the
// attributes, start and end tag names of the element.
xmlElementLiteral.inlineNamespaces.forEach(xmlns -> {
genNode(xmlns, xmlElementEnv);
});
// Create start tag name
BLangExpression startTagName = (BLangExpression) xmlElementLiteral.getStartTagName();
RegIndex startTagNameRegIndex = visitXMLTagName(startTagName, xmlElementEnv, xmlElementLiteral);
// Create end tag name. If there is no endtag name (empty XML tag),
// then consider start tag name as the end tag name too.
BLangExpression endTagName = (BLangExpression) xmlElementLiteral.getEndTagName();
RegIndex endTagNameRegIndex = endTagName == null ? startTagNameRegIndex : visitXMLTagName(endTagName, xmlElementEnv, xmlElementLiteral);
// Create an XML with the given QName
RegIndex defaultNsURIIndex = getNamespaceURIIndex(xmlElementLiteral.defaultNsSymbol, xmlElementEnv);
emit(InstructionCodes.NEWXMLELEMENT, xmlElementLiteral.regIndex, startTagNameRegIndex, endTagNameRegIndex, defaultNsURIIndex);
// Add namespaces decelerations visible to this element.
xmlElementLiteral.namespacesInScope.forEach((name, symbol) -> {
BLangXMLQName nsQName = new BLangXMLQName(name.getValue(), XMLConstants.XMLNS_ATTRIBUTE);
genNode(nsQName, xmlElementEnv);
RegIndex uriIndex = getNamespaceURIIndex(symbol, xmlElementEnv);
emit(InstructionCodes.XMLATTRSTORE, xmlElementLiteral.regIndex, nsQName.regIndex, uriIndex);
});
// Add attributes
xmlElementLiteral.attributes.forEach(attribute -> {
genNode(attribute, xmlElementEnv);
emit(InstructionCodes.XMLATTRSTORE, xmlElementLiteral.regIndex, attribute.name.regIndex, attribute.value.regIndex);
});
// Add children
xmlElementLiteral.modifiedChildren.forEach(child -> {
genNode(child, xmlElementEnv);
emit(InstructionCodes.XMLSEQSTORE, xmlElementLiteral.regIndex, child.regIndex);
});
}
use of org.wso2.carbon.registry.core.Tag in project ballerina by ballerina-lang.
the class Desugar method visit.
@Override
public void visit(BLangArrayLiteral arrayLiteral) {
arrayLiteral.exprs = rewriteExprs(arrayLiteral.exprs);
if (arrayLiteral.type.tag == TypeTags.JSON || getElementType(arrayLiteral.type).tag == TypeTags.JSON) {
result = new BLangJSONArrayLiteral(arrayLiteral.exprs, arrayLiteral.type);
return;
}
result = arrayLiteral;
}
use of org.wso2.carbon.registry.core.Tag in project ballerina by ballerina-lang.
the class ParserRuleMatchStatementContextResolver method resolveItems.
@Override
public ArrayList<CompletionItem> resolveItems(TextDocumentServiceContext completionContext) {
ArrayList<CompletionItem> completionItems = new ArrayList<>();
int currentTokenIndex = completionContext.get(DocumentServiceKeys.TOKEN_INDEX_KEY);
List<SymbolInfo> visibleSymbols = completionContext.get(CompletionKeys.VISIBLE_SYMBOLS_KEY);
TokenStream tokenStream = completionContext.get(DocumentServiceKeys.TOKEN_STREAM_KEY);
while (true) {
if (currentTokenIndex < 0) {
// Ideally should not come to this point
return completionItems;
}
Token token = CommonUtil.getPreviousDefaultToken(tokenStream, currentTokenIndex);
if (token.getText().equals(UtilSymbolKeys.MATCH_KEYWORD_KEY)) {
currentTokenIndex = token.getTokenIndex();
break;
} else {
currentTokenIndex = token.getTokenIndex();
}
}
String identifierMatched = CommonUtil.getNextDefaultToken(tokenStream, currentTokenIndex).getText();
SymbolInfo identifierSymbol = visibleSymbols.stream().filter(symbolInfo -> symbolInfo.getScopeEntry().symbol.getName().getValue().equals(identifierMatched)).findFirst().orElseGet(null);
if (identifierSymbol == null) {
return completionItems;
} else if (identifierSymbol.getScopeEntry().symbol.type instanceof BUnionType) {
Set<BType> memberTypes = ((BUnionType) identifierSymbol.getScopeEntry().symbol.type).getMemberTypes();
memberTypes.forEach(bType -> {
completionItems.add(this.populateCompletionItem(bType.toString(), ItemResolverConstants.B_TYPE, bType.toString()));
});
} else if (identifierSymbol.getScopeEntry().symbol.type instanceof BJSONType) {
ArrayList<Integer> typeTagsList = new ArrayList<>(Arrays.asList(TypeTags.INT, TypeTags.FLOAT, TypeTags.BOOLEAN, TypeTags.STRING, TypeTags.NULL, TypeTags.JSON));
List<SymbolInfo> filteredBasicTypes = visibleSymbols.stream().filter(symbolInfo -> {
BSymbol bSymbol = symbolInfo.getScopeEntry().symbol;
return bSymbol instanceof BTypeSymbol && typeTagsList.contains(bSymbol.getType().tag);
}).collect(Collectors.toList());
this.populateCompletionItemList(filteredBasicTypes, completionItems);
} else if (identifierSymbol.getScopeEntry().symbol.type instanceof BStructType) {
List<SymbolInfo> structSymbols = visibleSymbols.stream().filter(symbolInfo -> {
BSymbol bSymbol = symbolInfo.getScopeEntry().symbol;
return bSymbol instanceof BStructSymbol && !bSymbol.getName().getValue().startsWith(UtilSymbolKeys.ANON_STRUCT_CHECKER);
}).collect(Collectors.toList());
this.populateCompletionItemList(structSymbols, completionItems);
}
return completionItems;
}
Aggregations