use of org.wso2.ballerinalang.compiler.tree.BLangPackage in project ballerina by ballerina-lang.
the class DefinitionUtil method getDefinitionPosition.
/**
* Get definition position for the given definition context.
*
* @param definitionContext context of the definition.
* @param lSPackageCache package context for language server.
* @return position
*/
public static List<Location> getDefinitionPosition(TextDocumentServiceContext definitionContext, LSPackageCache lSPackageCache) {
List<Location> contents = new ArrayList<>();
if (definitionContext.get(NodeContextKeys.SYMBOL_KIND_OF_NODE_KEY) == null) {
return contents;
}
String nodeKind = definitionContext.get(NodeContextKeys.SYMBOL_KIND_OF_NODE_KEY);
BLangPackage bLangPackage = getPackageOfTheOwner(definitionContext.get(NodeContextKeys.NODE_OWNER_PACKAGE_KEY), definitionContext, lSPackageCache);
BLangNode bLangNode = null;
switch(nodeKind) {
case ContextConstants.FUNCTION:
bLangNode = bLangPackage.functions.stream().filter(function -> function.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.STRUCT:
bLangNode = bLangPackage.structs.stream().filter(struct -> struct.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.OBJECT:
bLangNode = bLangPackage.objects.stream().filter(object -> object.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.ENUM:
bLangNode = bLangPackage.enums.stream().filter(enm -> enm.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
// Fixing the position issue with enum node.
bLangNode.getPosition().eLine = bLangNode.getPosition().sLine;
bLangNode.getPosition().eCol = bLangNode.getPosition().sCol;
break;
case ContextConstants.CONNECTOR:
bLangNode = bLangPackage.connectors.stream().filter(bConnector -> bConnector.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.ACTION:
bLangNode = bLangPackage.connectors.stream().filter(bConnector -> bConnector.name.getValue().equals(((BLangInvocation) definitionContext.get(NodeContextKeys.PREVIOUSLY_VISITED_NODE_KEY)).symbol.owner.name.getValue())).flatMap(connector -> connector.actions.stream()).filter(bAction -> bAction.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.TRANSFORMER:
bLangNode = bLangPackage.transformers.stream().filter(bTransformer -> bTransformer.name.getValue().equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
break;
case ContextConstants.ENDPOINT:
bLangNode = bLangPackage.globalEndpoints.stream().filter(globalEndpoint -> globalEndpoint.name.value.equals(definitionContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangNode == null) {
DefinitionTreeVisitor definitionTreeVisitor = new DefinitionTreeVisitor(definitionContext);
definitionContext.get(NodeContextKeys.NODE_STACK_KEY).pop().accept(definitionTreeVisitor);
if (definitionContext.get(NodeContextKeys.NODE_KEY) != null) {
bLangNode = definitionContext.get(NodeContextKeys.NODE_KEY);
}
}
break;
case ContextConstants.VARIABLE:
bLangNode = bLangPackage.globalVars.stream().filter(globalVar -> globalVar.name.getValue().equals(definitionContext.get(NodeContextKeys.VAR_NAME_OF_NODE_KEY))).findAny().orElse(null);
// BLangNode is null only when node at the cursor position is a local variable.
if (bLangNode == null) {
DefinitionTreeVisitor definitionTreeVisitor = new DefinitionTreeVisitor(definitionContext);
definitionContext.get(NodeContextKeys.NODE_STACK_KEY).pop().accept(definitionTreeVisitor);
if (definitionContext.get(NodeContextKeys.NODE_KEY) != null) {
bLangNode = definitionContext.get(NodeContextKeys.NODE_KEY);
break;
}
}
break;
default:
break;
}
if (bLangNode == null) {
return contents;
}
Location l = new Location();
TextDocumentPositionParams position = definitionContext.get(DocumentServiceKeys.POSITION_KEY);
Path parentPath = CommonUtil.getPath(new LSDocument(position.getTextDocument().getUri())).getParent();
if (parentPath != null) {
String fileName = bLangNode.getPosition().getSource().getCompilationUnitName();
Path filePath = Paths.get(CommonUtil.getPackageURI(definitionContext.get(NodeContextKeys.PACKAGE_OF_NODE_KEY).name.getValue(), parentPath.toString(), definitionContext.get(NodeContextKeys.PACKAGE_OF_NODE_KEY).name.getValue()), fileName);
l.setUri(filePath.toUri().toString());
Range r = new Range();
// Subtract 1 to convert the token lines and char positions to zero based indexing
r.setStart(new Position(bLangNode.getPosition().getStartLine() - 1, bLangNode.getPosition().getStartColumn() - 1));
r.setEnd(new Position(bLangNode.getPosition().getEndLine() - 1, bLangNode.getPosition().getEndColumn() - 1));
l.setRange(r);
contents.add(l);
}
return contents;
}
use of org.wso2.ballerinalang.compiler.tree.BLangPackage in project ballerina by ballerina-lang.
the class TextDocumentFormatUtil method getAST.
/**
* Get the AST for the current text document's content.
*
* @param params Document Formatting parameters
* @param documentManager Workspace document manager instance
* @param context Document formatting context
* @return {@link JsonObject} AST as a Json Object
*/
public static JsonObject getAST(DocumentFormattingParams params, WorkspaceDocumentManager documentManager, TextDocumentServiceContext context) {
String documentUri = params.getTextDocument().getUri();
String[] uriParts = documentUri.split(Pattern.quote(File.separator));
String fileName = uriParts[uriParts.length - 1];
final BLangPackage bLangPackage = TextDocumentServiceUtil.getBLangPackage(context, documentManager, true, LSCustomErrorStrategy.class, false).get(0);
context.put(DocumentServiceKeys.CURRENT_PACKAGE_NAME_KEY, bLangPackage.symbol.getName().getValue());
final List<Diagnostic> diagnostics = new ArrayList<>();
JsonArray errors = new JsonArray();
JsonObject result = new JsonObject();
result.add("errors", errors);
Gson gson = new Gson();
JsonElement diagnosticsJson = gson.toJsonTree(diagnostics);
result.add("diagnostics", diagnosticsJson);
BLangCompilationUnit compilationUnit = bLangPackage.getCompilationUnits().stream().filter(compUnit -> fileName.equals(compUnit.getName())).findFirst().orElseGet(null);
JsonElement modelElement = CommonUtil.generateJSON(compilationUnit, new HashMap<>());
result.add("model", modelElement);
return result;
}
use of org.wso2.ballerinalang.compiler.tree.BLangPackage in project ballerina by ballerina-lang.
the class HoverUtil method getHoverInformation.
/**
* Get the hover information for the given hover context.
*
* @param bLangPackage resolved bLangPackage for the hover context.
* @param hoverContext context of the hover.
* @return hover content.
*/
public static Hover getHoverInformation(BLangPackage bLangPackage, TextDocumentServiceContext hoverContext) {
Hover hover;
switch(hoverContext.get(NodeContextKeys.SYMBOL_KIND_OF_NODE_PARENT_KEY)) {
case ContextConstants.FUNCTION:
BLangFunction bLangFunction = bLangPackage.functions.stream().filter(function -> function.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangFunction != null) {
if (bLangFunction.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangFunction.docAttachments);
} else {
hover = getAnnotationContent(bLangFunction.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.STRUCT:
BLangStruct bLangStruct = bLangPackage.structs.stream().filter(struct -> struct.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangStruct != null) {
if (bLangStruct.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangStruct.docAttachments);
} else {
hover = getAnnotationContent(bLangStruct.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.OBJECT:
BLangObject bLangObject = bLangPackage.objects.stream().filter(object -> object.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangObject != null) {
if (bLangObject.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangObject.docAttachments);
} else {
hover = getAnnotationContent(bLangObject.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.ENUM:
BLangEnum bLangEnum = bLangPackage.enums.stream().filter(bEnum -> bEnum.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangEnum != null) {
if (bLangEnum.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangEnum.docAttachments);
} else {
hover = getAnnotationContent(bLangEnum.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.TRANSFORMER:
BLangTransformer bLangTransformer = bLangPackage.transformers.stream().filter(bTransformer -> bTransformer.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangTransformer != null) {
if (bLangTransformer.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangTransformer.docAttachments);
} else {
hover = getAnnotationContent(bLangTransformer.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.CONNECTOR:
BLangConnector bLangConnector = bLangPackage.connectors.stream().filter(bConnector -> bConnector.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangConnector != null) {
if (bLangConnector.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangConnector.docAttachments);
} else {
hover = getAnnotationContent(bLangConnector.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.ACTION:
BLangAction bLangAction = bLangPackage.connectors.stream().filter(bConnector -> bConnector.name.getValue().equals(((BLangInvocation) hoverContext.get(NodeContextKeys.PREVIOUSLY_VISITED_NODE_KEY)).symbol.owner.name.getValue())).flatMap(connector -> connector.actions.stream()).filter(bAction -> bAction.name.getValue().equals(hoverContext.get(NodeContextKeys.NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangAction != null) {
if (bLangAction.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangAction.docAttachments);
} else {
hover = getAnnotationContent(bLangAction.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.ENDPOINT:
BLangEndpoint bLangEndpoint = bLangPackage.globalEndpoints.stream().filter(globalEndpoint -> globalEndpoint.name.value.equals(hoverContext.get(NodeContextKeys.VAR_NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangEndpoint != null) {
hover = getAnnotationContent(bLangEndpoint.annAttachments);
} else {
hover = getDefaultHoverObject();
}
break;
case ContextConstants.VARIABLE:
BLangVariable bLangVariable = bLangPackage.globalVars.stream().filter(globalVar -> globalVar.name.getValue().equals(hoverContext.get(NodeContextKeys.VAR_NAME_OF_NODE_KEY))).findAny().orElse(null);
if (bLangVariable != null) {
if (bLangVariable.docAttachments.size() > 0) {
hover = getDocumentationContent(bLangVariable.docAttachments);
} else {
hover = getAnnotationContent(bLangVariable.annAttachments);
}
} else {
hover = getDefaultHoverObject();
}
break;
default:
hover = new Hover();
List<Either<String, MarkedString>> contents = new ArrayList<>();
contents.add(Either.forLeft(""));
hover.setContents(contents);
break;
}
return hover;
}
use of org.wso2.ballerinalang.compiler.tree.BLangPackage in project ballerina by ballerina-lang.
the class Generator method generatePageForPrimitives.
/**
* Generate the page for primitive types.
* @param balPackage The ballerina.builtin package.
* @param packages List of available packages.
* @return A page model for the primitive types.
*/
public static Page generatePageForPrimitives(BLangPackage balPackage, List<Link> packages) {
ArrayList<Documentable> primitiveTypes = new ArrayList<>();
// Check for functions in the package
if (balPackage.getFunctions().size() > 0) {
for (BLangFunction function : balPackage.getFunctions()) {
if (function.getFlags().contains(Flag.PUBLIC) && function.getReceiver() != null) {
TypeNode langType = function.getReceiver().getTypeNode();
if (!(langType instanceof BLangUserDefinedType)) {
// Check for primitives in ballerina.builtin
Optional<PrimitiveTypeDoc> existingPrimitiveType = primitiveTypes.stream().filter((doc) -> doc instanceof PrimitiveTypeDoc && (((PrimitiveTypeDoc) doc)).name.equals(langType.toString())).map(doc -> (PrimitiveTypeDoc) doc).findFirst();
PrimitiveTypeDoc primitiveTypeDoc;
if (existingPrimitiveType.isPresent()) {
primitiveTypeDoc = existingPrimitiveType.get();
} else {
primitiveTypeDoc = new PrimitiveTypeDoc(langType.toString(), new ArrayList<>());
primitiveTypes.add(primitiveTypeDoc);
}
primitiveTypeDoc.children.add(createDocForNode(function));
}
}
}
}
// Create the links to select which page or package is active
List<Link> links = new ArrayList<>();
for (Link pkgLink : packages) {
if (BallerinaDocConstants.PRIMITIVE_TYPES_PAGE_NAME.equals(pkgLink.caption.value)) {
links.add(new Link(pkgLink.caption, pkgLink.href, true));
} else {
links.add(new Link(pkgLink.caption, pkgLink.href, false));
}
}
StaticCaption primitivesPageHeading = new StaticCaption(BallerinaDocConstants.PRIMITIVE_TYPES_PAGE_NAME);
return new Page(primitivesPageHeading, primitiveTypes, links);
}
use of org.wso2.ballerinalang.compiler.tree.BLangPackage in project ballerina by ballerina-lang.
the class BallerinaDocGenerator method generateApiDocs.
/**
* API to generate Ballerina API documentation.
*
* @param output path to the output directory where the API documentation will be written to.
* @param packageFilter comma separated list of package names to be filtered from the documentation.
* @param isNative whether the given packages are native or not.
* @param sources either the path to the directories where Ballerina source files reside or a
* path to a Ballerina file which does not belong to a package.
*/
public static void generateApiDocs(String output, String packageFilter, boolean isNative, String... sources) {
out.println("docerina: API documentation generation for sources - " + Arrays.toString(sources));
for (String source : sources) {
source = source.trim();
try {
Map<String, BLangPackage> docsMap;
if (source.endsWith(".bal")) {
Path sourceFilePath = Paths.get(source);
Path parentDir = sourceFilePath.getParent();
Path fileName = sourceFilePath.getFileName();
if (fileName == null) {
log.warn("Skipping the source generation for invalid path: " + sourceFilePath);
continue;
}
if (parentDir == null) {
parentDir = Paths.get(".");
}
docsMap = generatePackageDocsFromBallerina(parentDir.toString(), fileName, packageFilter, isNative);
} else {
Path dirPath = Paths.get(source);
// TODO fix this properly
// TODO Temporary fix that creates .ballerina to create project structure
Path projectFolder = dirPath.resolve(ProjectDirConstants.DOT_BALLERINA_DIR_NAME);
Files.createDirectory(projectFolder);
Path sourceRootPath = LauncherUtils.getSourceRootPath(dirPath.toString());
docsMap = generatePackageDocsFromBallerina(sourceRootPath.toString(), dirPath, packageFilter, isNative);
}
if (docsMap.size() == 0) {
out.println("docerina: no package definitions found!");
return;
}
if (BallerinaDocUtils.isDebugEnabled()) {
out.println("Generating HTML API documentation...");
}
String userDir = System.getProperty("user.dir");
// If output directory is empty
if (output == null) {
output = System.getProperty(BallerinaDocConstants.HTML_OUTPUT_PATH_KEY, userDir + File.separator + "api-docs" + File.separator + "html");
}
// Create output directories
Files.createDirectories(Paths.get(output));
// Sort packages by package path
List<BLangPackage> packageList = new ArrayList<>(docsMap.values());
packageList.sort(Comparator.comparing(pkg -> pkg.packageID.toString()));
// Iterate over the packages to generate the pages
List<String> packageNames = new ArrayList<>(docsMap.keySet());
// Sort the package names
Collections.sort(packageNames);
List<Link> packageNameList = PackageName.convertList(packageNames);
if (packageNames.contains("ballerina.builtin")) {
StaticCaption primitivesLinkName = new StaticCaption(BallerinaDocConstants.PRIMITIVE_TYPES_PAGE_NAME);
packageNameList.add(0, new Link(primitivesLinkName, BallerinaDocConstants.PRIMITIVE_TYPES_PAGE_HREF, false));
}
// Generate pages for the packages
String packageTemplateName = System.getProperty(BallerinaDocConstants.PACKAGE_TEMPLATE_NAME_KEY, "page");
for (BLangPackage bLangPackage : packageList) {
// Sort functions, connectors, structs, type mappers and annotationDefs
bLangPackage.getFunctions().sort(Comparator.comparing(f -> (f.getReceiver() == null ? "" : f.getReceiver().getName()) + f.getName().getValue()));
bLangPackage.getConnectors().sort(Comparator.comparing(c -> c.getName().getValue()));
bLangPackage.getStructs().sort(Comparator.comparing(s -> s.getName().getValue()));
bLangPackage.getAnnotations().sort(Comparator.comparing(a -> a.getName().getValue()));
bLangPackage.getEnums().sort(Comparator.comparing(a -> a.getName().getValue()));
// Sort connector actions
if ((bLangPackage.getConnectors() != null) && (bLangPackage.getConnectors().size() > 0)) {
bLangPackage.getConnectors().forEach(connector -> connector.getActions().sort(Comparator.comparing(a -> a.getName().getValue())));
}
String packagePath = refinePackagePath(bLangPackage);
Page page = Generator.generatePage(bLangPackage, packageNameList);
String filePath = output + File.separator + packagePath + HTML;
Writer.writeHtmlDocument(page, packageTemplateName, filePath);
if ("ballerina.builtin".equals(packagePath)) {
Page primitivesPage = Generator.generatePageForPrimitives(bLangPackage, packageNameList);
String primitivesFilePath = output + File.separator + "primitive-types" + HTML;
Writer.writeHtmlDocument(primitivesPage, packageTemplateName, primitivesFilePath);
}
}
// Generate the index file with the list of all packages
String indexTemplateName = System.getProperty(BallerinaDocConstants.PACKAGE_TEMPLATE_NAME_KEY, "index");
String indexFilePath = output + File.separator + "index" + HTML;
Writer.writeHtmlDocument(packageNameList, indexTemplateName, indexFilePath);
if (BallerinaDocUtils.isDebugEnabled()) {
out.println("Copying HTML theme...");
}
BallerinaDocUtils.copyResources("docerina-theme", output);
} catch (IOException e) {
out.println(String.format("docerina: API documentation generation failed for %s: %s", source, e.getMessage()));
log.error(String.format("API documentation generation failed for %s", source), e);
}
}
try {
String zipPath = System.getProperty(BallerinaDocConstants.OUTPUT_ZIP_PATH);
if (zipPath != null) {
BallerinaDocUtils.packageToZipFile(output, zipPath);
}
} catch (IOException e) {
out.println(String.format("docerina: API documentation zip packaging failed for %s: %s", output, e.getMessage()));
log.error(String.format("API documentation zip packaging failed for %s", output), e);
}
}
Aggregations