Skip to content

Commit

Permalink
Merge pull request #138 from mkslanc/error-hover-tooltip
Browse files Browse the repository at this point in the history
Fix: Error hover tooltip
  • Loading branch information
mkslanc authored Sep 12, 2024
2 parents 9f7bc45 + 2408338 commit f49ab1a
Show file tree
Hide file tree
Showing 7 changed files with 50 additions and 30 deletions.
6 changes: 3 additions & 3 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "ace-linters-root",
"version": "1.3.0",
"version": "1.3.1",
"scripts": {
"build:ace-linters": "cd packages/ace-linters && npm run build",
"build:ace-sql-linter": "cd packages/ace-sql-linter && npm run build",
Expand Down
2 changes: 1 addition & 1 deletion packages/ace-linters/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "ace-linters",
"author": "Azat Alimov <mkslanc@gmail.com>",
"version": "1.3.0",
"version": "1.3.1",
"scripts": {
"clean": "rimraf build",
"prebuild": "node prebuild.js",
Expand Down
11 changes: 11 additions & 0 deletions packages/ace-linters/src/ace/marker_group.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,17 @@ export class MarkerGroup {
});
}

/**
* Finds all markers that contain the given position.
* @param {Position} pos - The position to search for.
* @returns {Ace.MarkerGroupItem[]} - An array of all markers that contain the given position.
*/
getMarkersAtPosition(pos) {
return this.markers.filter(function (marker) {
return marker.range.contains(pos.row, pos.column);
});
}

/**
* Comparator for Array.sort function, which sorts marker definitions by their positions
*
Expand Down
51 changes: 26 additions & 25 deletions packages/ace-linters/src/language-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -326,44 +326,45 @@ export class LanguageProvider {
}

private $initHoverTooltip(editor) {
const Range = editor.getSelectionRange().constructor;

this.$hoverTooltip.setDataProvider((e, editor) => {
let session = editor.session;
let docPos = e.getDocumentPosition();
const session = editor.session;
const docPos = e.getDocumentPosition();

this.doHover(session, docPos, (hover) => {
if (!hover)
return;
var errorMarker = this.$getSessionLanguageProvider(session).state?.diagnosticMarkers?.getMarkerAtPosition(docPos);

if (!errorMarker && !hover?.content) return;
const errorMarkers = this.$getSessionLanguageProvider(session).state?.diagnosticMarkers?.getMarkersAtPosition(docPos) ?? [];
const hasHoverContent = hover?.content;
if (errorMarkers.length === 0 && !hasHoverContent) return;

var range = hover?.range || errorMarker?.range;
const Range = editor.getSelectionRange().constructor;
var range = hover?.range ?? errorMarkers[0]?.range;
range = range ? Range.fromPoints(range.start, range.end) : session.getWordRange(docPos.row, docPos.column);
var hoverNode = hover && document.createElement("div");
if (hoverNode) {
// todo render markdown using ace markdown mode
hoverNode.innerHTML = this.getTooltipText(hover);
}

var domNode = document.createElement('div');
const hoverNode = hasHoverContent ? this.createHoverNode(hover) : null;
const errorNode = errorMarkers.length > 0 ? this.createErrorNode(errorMarkers) : null;

if (errorMarker) {
var errorDiv = document.createElement('div');
var errorText = document.createTextNode(errorMarker.tooltipText.trim());
errorDiv.appendChild(errorText);
domNode.appendChild(errorDiv);
}
const domNode = document.createElement('div');
if (errorNode) domNode.appendChild(errorNode);
if (hoverNode) domNode.appendChild(hoverNode);

if (hoverNode) {
domNode.appendChild(hoverNode);
}
this.$hoverTooltip.showForRange(editor, range, domNode, e);
});
});
this.$hoverTooltip.addToEditor(editor);
}


private createHoverNode(hover) {
const hoverNode = document.createElement("div");
hoverNode.innerHTML = this.getTooltipText(hover);
return hoverNode;
}

private createErrorNode(errorMarkers) {
const errorDiv = document.createElement('div');
errorDiv.textContent = errorMarkers.map(el => el.tooltipText.trim()).join("\n");
return errorDiv;
}

private setStyles(editor) {
if (!this.stylesEmbedded) {
setStyles(editor);
Expand Down
6 changes: 6 additions & 0 deletions packages/ace-linters/types/ace/marker_group.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,12 @@ export declare class MarkerGroup {
* @returns Ace.MarkerGroupItem
*/
getMarkerAtPosition(pos: any): any;
/**
* Finds all markers that contain the given position.
* @param {Position} pos - The position to search for.
* @returns {Ace.MarkerGroupItem[]} - An array of all markers that contain the given position.
*/
getMarkersAtPosition(pos: any): any[];
/**
* Comparator for Array.sort function, which sorts marker definitions by their positions
*
Expand Down
2 changes: 2 additions & 0 deletions packages/ace-linters/types/language-provider.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,8 @@ export declare class LanguageProvider {
$registerEditor(editor: Ace.Editor): void;
private $provideCodeActions;
private $initHoverTooltip;
private createHoverNode;
private createErrorNode;
private setStyles;
setGlobalOptions<T extends keyof ServiceOptionsMap>(serviceName: T & string, options: ServiceOptionsMap[T], merge?: boolean): void;
/**
Expand Down

0 comments on commit f49ab1a

Please sign in to comment.