use of org.wso2.ballerinalang.compiler.semantics.model.symbols.Symbols in project siddhi by wso2.
the class DefineTableTestCase method testQuery3.
@Test(expectedExceptions = DuplicateDefinitionException.class)
public void testQuery3() throws InterruptedException {
log.info("testTableDefinition3 - OUT 0");
SiddhiManager siddhiManager = new SiddhiManager();
String tables = "define table TestTable(symbol string, price int, volume float); " + "define table TestTable(symbols string, price int, volume float); ";
SiddhiAppRuntime siddhiAppRuntime = siddhiManager.createSiddhiAppRuntime(tables);
siddhiAppRuntime.shutdown();
}
use of org.wso2.ballerinalang.compiler.semantics.model.symbols.Symbols in project ballerina by ballerina-lang.
the class Desugar method createInvocationNode.
private BLangInvocation createInvocationNode(String functionName, List<BLangExpression> args, List<BType> retTypes) {
BLangInvocation invocationNode = (BLangInvocation) TreeBuilder.createInvocationNode();
BLangIdentifier name = (BLangIdentifier) TreeBuilder.createIdentifierNode();
name.setLiteral(false);
name.setValue(functionName);
invocationNode.name = name;
invocationNode.pkgAlias = (BLangIdentifier) TreeBuilder.createIdentifierNode();
// TODO: 2/28/18 need to find a good way to refer to symbols
invocationNode.symbol = symTable.rootScope.lookup(new Name(functionName)).symbol;
invocationNode.types = retTypes;
invocationNode.requiredArgs = args;
return invocationNode;
}
use of org.wso2.ballerinalang.compiler.semantics.model.symbols.Symbols in project ballerina by ballerina-lang.
the class PackageActionFunctionAndTypesFilter method getActionsFunctionsAndTypes.
/**
* Get the actions, functions and types.
* @param completionContext Text Document Service context (Completion Context)
* @param delimiterIndex delimiter index (index of either . or :)
* @return {@link ArrayList} List of filtered symbol info
*/
private ArrayList<SymbolInfo> getActionsFunctionsAndTypes(TextDocumentServiceContext completionContext, int delimiterIndex) {
ArrayList<SymbolInfo> actionFunctionList = new ArrayList<>();
TokenStream tokenStream = completionContext.get(DocumentServiceKeys.TOKEN_STREAM_KEY);
List<SymbolInfo> symbols = completionContext.get(CompletionKeys.VISIBLE_SYMBOLS_KEY);
String packageName = tokenStream.get(delimiterIndex - 1).getText();
// Extract the package symbol
SymbolInfo packageSymbolInfo = symbols.stream().filter(item -> {
Scope.ScopeEntry scopeEntry = item.getScopeEntry();
return item.getSymbolName().equals(packageName) && scopeEntry.symbol instanceof BPackageSymbol;
}).findFirst().orElse(null);
if (packageSymbolInfo != null) {
Scope.ScopeEntry packageEntry = packageSymbolInfo.getScopeEntry();
SymbolInfo symbolInfo = new SymbolInfo(packageSymbolInfo.getSymbolName(), packageEntry);
symbolInfo.getScopeEntry().symbol.scope.entries.forEach((name, value) -> {
if ((value.symbol instanceof BInvokableSymbol && ((BInvokableSymbol) value.symbol).receiverSymbol == null) || (value.symbol instanceof BTypeSymbol && !(value.symbol instanceof BPackageSymbol))) {
actionFunctionList.add(new SymbolInfo(name.toString(), value));
}
});
}
return actionFunctionList;
}
use of org.wso2.ballerinalang.compiler.semantics.model.symbols.Symbols in project ballerina by ballerina-lang.
the class PackageActionFunctionAndTypesFilter method invocationsAndFieldsOnIdentifier.
/**
* Get the invocations and fields against an identifier (functions, struct fields and types including the enums).
* @param context Text Document Service context (Completion Context)
* @param delimiterIndex delimiter index (index of either . or :)
* @return {@link ArrayList} List of filtered symbol info
*/
private ArrayList<SymbolInfo> invocationsAndFieldsOnIdentifier(TextDocumentServiceContext context, int delimiterIndex) {
ArrayList<SymbolInfo> actionFunctionList = new ArrayList<>();
TokenStream tokenStream = context.get(DocumentServiceKeys.TOKEN_STREAM_KEY);
List<SymbolInfo> symbols = context.get(CompletionKeys.VISIBLE_SYMBOLS_KEY);
SymbolTable symbolTable = context.get(DocumentServiceKeys.SYMBOL_TABLE_KEY);
String variableName = CommonUtil.getPreviousDefaultToken(tokenStream, delimiterIndex).getText();
SymbolInfo variable = this.getVariableByName(variableName, symbols);
String builtinPkgName = symbolTable.builtInPackageSymbol.name.getValue();
Map<Name, Scope.ScopeEntry> entries = new HashMap<>();
String currentPkgName = context.get(DocumentServiceKeys.CURRENT_PACKAGE_NAME_KEY);
if (variable == null) {
return actionFunctionList;
}
String packageID;
BType bType = variable.getScopeEntry().symbol.getType();
String bTypeValue;
if (variable.getScopeEntry().symbol instanceof BEndpointVarSymbol) {
BType getClientFuncType = ((BEndpointVarSymbol) variable.getScopeEntry().symbol).getClientFunction.type;
if (!UtilSymbolKeys.ACTION_INVOCATION_SYMBOL_KEY.equals(tokenStream.get(delimiterIndex).getText()) || !(getClientFuncType instanceof BInvokableType)) {
return actionFunctionList;
}
BType boundType = ((BInvokableType) getClientFuncType).retTypes.get(0);
packageID = boundType.tsymbol.pkgID.toString();
bTypeValue = boundType.toString();
} else if (bType instanceof BArrayType) {
packageID = ((BArrayType) bType).eType.tsymbol.pkgID.toString();
bTypeValue = bType.toString();
} else {
packageID = bType.tsymbol.pkgID.toString();
bTypeValue = bType.toString();
}
// Extract the package symbol. This is used to extract the entries of the particular package
SymbolInfo packageSymbolInfo = symbols.stream().filter(item -> {
Scope.ScopeEntry scopeEntry = item.getScopeEntry();
return (scopeEntry.symbol instanceof BPackageSymbol) && scopeEntry.symbol.pkgID.toString().equals(packageID);
}).findFirst().orElse(null);
if (packageSymbolInfo == null && packageID.equals(builtinPkgName)) {
// If the packageID is ballerina.builtin, we extract entries of builtin package
entries = symbolTable.builtInPackageSymbol.scope.entries;
} else if (packageSymbolInfo == null && packageID.equals(currentPkgName)) {
entries = this.getScopeEntries(bType, context);
} else if (packageSymbolInfo != null) {
// If the package exist, we extract particular entries from package
entries = packageSymbolInfo.getScopeEntry().symbol.scope.entries;
}
entries.forEach((name, scopeEntry) -> {
if (scopeEntry.symbol instanceof BInvokableSymbol && ((BInvokableSymbol) scopeEntry.symbol).receiverSymbol != null) {
String symbolBoundedName = ((BInvokableSymbol) scopeEntry.symbol).receiverSymbol.getType().toString();
if (symbolBoundedName.equals(bTypeValue)) {
// TODO: Need to handle the name in a proper manner
String[] nameComponents = name.toString().split("\\.");
SymbolInfo actionFunctionSymbol = new SymbolInfo(nameComponents[nameComponents.length - 1], scopeEntry);
actionFunctionList.add(actionFunctionSymbol);
}
} else if ((scopeEntry.symbol instanceof BTypeSymbol) && bTypeValue.equals(scopeEntry.symbol.type.toString())) {
// Get the struct fields
Map<Name, Scope.ScopeEntry> fields = scopeEntry.symbol.scope.entries;
fields.forEach((fieldName, fieldScopeEntry) -> {
actionFunctionList.add(new SymbolInfo(fieldName.getValue(), fieldScopeEntry));
});
}
});
// Populate possible iterable operators over the variable
populateIterableOperations(variable, actionFunctionList);
return actionFunctionList;
}
use of org.wso2.ballerinalang.compiler.semantics.model.symbols.Symbols in project ballerina by ballerina-lang.
the class BallerinaParserService method generateJSON.
public static JsonElement generateJSON(Node node, Map<String, Node> anonStructs) throws InvocationTargetException, IllegalAccessException {
if (node == null) {
return JsonNull.INSTANCE;
}
Set<Method> methods = ClassUtils.getAllInterfaces(node.getClass()).stream().flatMap(aClass -> Arrays.stream(aClass.getMethods())).collect(Collectors.toSet());
JsonObject nodeJson = new JsonObject();
JsonArray wsJsonArray = new JsonArray();
Set<Whitespace> ws = node.getWS();
if (ws != null && !ws.isEmpty()) {
for (Whitespace whitespace : ws) {
JsonObject wsJson = new JsonObject();
wsJson.addProperty("ws", whitespace.getWs());
wsJson.addProperty("i", whitespace.getIndex());
wsJson.addProperty("text", whitespace.getPrevious());
wsJson.addProperty("static", whitespace.isStatic());
wsJsonArray.add(wsJson);
}
nodeJson.add("ws", wsJsonArray);
}
Diagnostic.DiagnosticPosition position = node.getPosition();
if (position != null) {
JsonObject positionJson = new JsonObject();
positionJson.addProperty("startColumn", position.getStartColumn());
positionJson.addProperty("startLine", position.getStartLine());
positionJson.addProperty("endColumn", position.getEndColumn());
positionJson.addProperty("endLine", position.getEndLine());
nodeJson.add("position", positionJson);
}
/* Virtual props */
JsonArray type = getType(node);
if (type != null) {
nodeJson.add(SYMBOL_TYPE, type);
}
if (node.getKind() == NodeKind.INVOCATION) {
assert node instanceof BLangInvocation : node.getClass();
BLangInvocation invocation = (BLangInvocation) node;
if (invocation.symbol != null && invocation.symbol.kind != null) {
nodeJson.addProperty(INVOCATION_TYPE, invocation.symbol.kind.toString());
}
}
for (Method m : methods) {
String name = m.getName();
if (name.equals("getWS") || name.equals("getPosition")) {
continue;
}
String jsonName;
if (name.startsWith("get")) {
jsonName = toJsonName(name, 3);
} else if (name.startsWith("is")) {
jsonName = toJsonName(name, 2);
} else {
continue;
}
Object prop = m.invoke(node);
/* Literal class - This class is escaped in backend to address cases like "ss\"" and 8.0 and null */
if (node.getKind() == NodeKind.LITERAL && "value".equals(jsonName)) {
if (prop instanceof String) {
nodeJson.addProperty(jsonName, '"' + StringEscapeUtils.escapeJava((String) prop) + '"');
nodeJson.addProperty(UNESCAPED_VALUE, String.valueOf(prop));
} else {
nodeJson.addProperty(jsonName, String.valueOf(prop));
}
continue;
}
if (node.getKind() == NodeKind.ANNOTATION && node instanceof BLangAnnotation) {
JsonArray attachmentPoints = new JsonArray();
((BLangAnnotation) node).getAttachmentPoints().stream().map(BLangAnnotationAttachmentPoint::getAttachmentPoint).map(BLangAnnotationAttachmentPoint.AttachmentPoint::getValue).map(JsonPrimitive::new).forEach(attachmentPoints::add);
nodeJson.add("attachmentPoints", attachmentPoints);
}
if (node.getKind() == NodeKind.USER_DEFINED_TYPE && jsonName.equals("typeName")) {
IdentifierNode typeNode = (IdentifierNode) prop;
Node structNode;
if (typeNode.getValue().startsWith("$anonStruct$") && (structNode = anonStructs.remove(typeNode.getValue())) != null) {
JsonObject anonStruct = generateJSON(structNode, anonStructs).getAsJsonObject();
anonStruct.addProperty("anonStruct", true);
nodeJson.add("anonStruct", anonStruct);
continue;
}
}
if (prop instanceof List && jsonName.equals("types")) {
// Currently we don't need any Symbols for the UI. So skipping for now.
continue;
}
/* Node classes */
if (prop instanceof Node) {
nodeJson.add(jsonName, generateJSON((Node) prop, anonStructs));
} else if (prop instanceof List) {
List listProp = (List) prop;
JsonArray listPropJson = new JsonArray();
nodeJson.add(jsonName, listPropJson);
for (Object listPropItem : listProp) {
if (listPropItem instanceof Node) {
/* Remove top level anon func and struct */
if (node.getKind() == NodeKind.COMPILATION_UNIT) {
if (listPropItem instanceof BLangStruct && ((BLangStruct) listPropItem).isAnonymous) {
anonStructs.put(((BLangStruct) listPropItem).getName().getValue(), ((BLangStruct) listPropItem));
continue;
}
if (listPropItem instanceof BLangFunction && (((BLangFunction) listPropItem)).name.value.startsWith("$lambda$")) {
continue;
}
}
listPropJson.add(generateJSON((Node) listPropItem, anonStructs));
} else {
logger.debug("Can't serialize " + jsonName + ", has a an array of " + listPropItem);
}
}
/* Runtime model classes */
} else if (prop instanceof Set && jsonName.equals("flags")) {
Set flags = (Set) prop;
for (Flag flag : Flag.values()) {
nodeJson.addProperty(StringUtils.lowerCase(flag.toString()), flags.contains(flag));
}
} else if (prop instanceof Set) {
// TODO : limit this else if to getInputs getOutputs of transform.
Set vars = (Set) prop;
JsonArray listVarJson = new JsonArray();
nodeJson.add(jsonName, listVarJson);
for (Object obj : vars) {
listVarJson.add(obj.toString());
}
} else if (prop instanceof NodeKind) {
String kindName = CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.UPPER_CAMEL, prop.toString());
nodeJson.addProperty(jsonName, kindName);
} else if (prop instanceof OperatorKind) {
nodeJson.addProperty(jsonName, prop.toString());
/* Generic classes */
} else if (prop instanceof String) {
nodeJson.addProperty(jsonName, (String) prop);
} else if (prop instanceof Number) {
nodeJson.addProperty(jsonName, (Number) prop);
} else if (prop instanceof Boolean) {
nodeJson.addProperty(jsonName, (Boolean) prop);
} else if (prop instanceof Enum) {
nodeJson.addProperty(jsonName, StringUtils.lowerCase(((Enum) prop).name()));
} else if (prop != null) {
nodeJson.addProperty(jsonName, prop.toString());
String message = "Node " + node.getClass().getSimpleName() + " contains unknown type prop: " + jsonName + " of type " + prop.getClass();
logger.error(message);
}
}
return nodeJson;
}
Aggregations