Skip to content

Commit 9226e10

Browse files
dylanscottbasarat
authored andcommitted
#726 adds show-type command for type info at cursor (#970)
1 parent 2de3f5c commit 9226e10

File tree

6 files changed

+105
-0
lines changed

6 files changed

+105
-0
lines changed

dist/main/atom/commands/commands.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var renameView = require("../views/renameView");
1111
var contextView = require("../views/contextView");
1212
var fileSymbolsView = require("../views/fileSymbolsView");
1313
var projectSymbolsView = require("../views/projectSymbolsView");
14+
var typeOverlayView_1 = require("../views/typeOverlayView");
1415
var gotoHistory = require("../gotoHistory");
1516
var utils = require("../../lang/utils");
1617
var mainPanelView_1 = require("../views/mainPanelView");
@@ -244,6 +245,35 @@ function registerCommands() {
244245
});
245246
}
246247
});
248+
atom.commands.add('atom-workspace', 'typescript:show-type', function (e) {
249+
var editor = atom.workspace.getActiveTextEditor();
250+
var editorView = atom.views.getView(editor);
251+
var cursor = editor.getLastCursor();
252+
var position = atomUtils.getEditorPositionForBufferPosition(editor, cursor.getBufferPosition());
253+
var filePath = editor.getPath();
254+
parent.quickInfo({ filePath: filePath, position: position }).then(function (resp) {
255+
if (resp.valid) {
256+
var decoration = editor.decorateMarker(cursor.getMarker(), {
257+
type: 'overlay',
258+
item: typeOverlayView_1.create(resp.name, resp.comment)
259+
});
260+
var onKeydown = function (e) {
261+
if (e.keyCode == 27) {
262+
destroyTypeOverlay();
263+
}
264+
};
265+
var destroyTypeOverlay = function () {
266+
decoration.destroy();
267+
cursorListener.dispose();
268+
editorView.removeEventListener('blur', destroyTypeOverlay);
269+
editorView.removeEventListener('keydown', onKeydown);
270+
};
271+
var cursorListener = editor.onDidChangeCursorPosition(destroyTypeOverlay);
272+
editorView.addEventListener('blur', destroyTypeOverlay);
273+
editorView.addEventListener('keydown', onKeydown);
274+
}
275+
});
276+
});
247277
atom.commands.add('atom-workspace', 'typescript:go-to-next', function (e) {
248278
gotoHistory.gotoNext();
249279
});
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
"use strict";
2+
var escapeHtml = require('escape-html');
3+
function create(type, comment) {
4+
var overlayHTML = "\n <strong>" + escapeHtml(type) + "</strong>\n ";
5+
if (comment) {
6+
overlayHTML += "\n <br/>\n <div class='comment'>\n " + escapeHtml(comment).replace(/(?:\r\n|\r|\n)/g, '<br/>') + "\n </div>\n ";
7+
}
8+
var overlay = document.createElement('div');
9+
overlay.className = 'atomts-show-type-view';
10+
overlay.innerHTML = overlayHTML;
11+
return overlay;
12+
}
13+
exports.create = create;

lib/main/atom/commands/commands.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import renameView = require("../views/renameView");
88
import contextView = require("../views/contextView");
99
import fileSymbolsView = require("../views/fileSymbolsView");
1010
import projectSymbolsView = require("../views/projectSymbolsView");
11+
import {create as createTypeOverlay} from "../views/typeOverlayView";
1112
import gotoHistory = require("../gotoHistory");
1213
import utils = require("../../lang/utils");
1314
import {panelView} from "../views/mainPanelView";
@@ -320,6 +321,38 @@ export function registerCommands() {
320321
}
321322
});
322323

324+
atom.commands.add('atom-workspace', 'typescript:show-type', (e) => {
325+
var editor = atom.workspace.getActiveTextEditor();
326+
var editorView = atom.views.getView(editor);
327+
var cursor = editor.getLastCursor()
328+
var position = atomUtils.getEditorPositionForBufferPosition(editor, cursor.getBufferPosition());
329+
var filePath = editor.getPath();
330+
parent.quickInfo({ filePath, position }).then((resp) => {
331+
if (resp.valid) {
332+
var decoration = editor.decorateMarker(cursor.getMarker(), {
333+
type: 'overlay',
334+
item: createTypeOverlay(resp.name, resp.comment)
335+
});
336+
337+
var onKeydown = (e) => {
338+
if (e.keyCode == 27) { // esc
339+
destroyTypeOverlay();
340+
}
341+
};
342+
var destroyTypeOverlay = () => {
343+
decoration.destroy();
344+
cursorListener.dispose();
345+
editorView.removeEventListener('blur', destroyTypeOverlay);
346+
editorView.removeEventListener('keydown', onKeydown);
347+
};
348+
349+
var cursorListener = editor.onDidChangeCursorPosition(destroyTypeOverlay);
350+
editorView.addEventListener('blur', destroyTypeOverlay);
351+
editorView.addEventListener('keydown', onKeydown);
352+
}
353+
});
354+
});
355+
323356
atom.commands.add('atom-workspace', 'typescript:go-to-next', (e) => {
324357
gotoHistory.gotoNext();
325358
});
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import escapeHtml = require('escape-html');
2+
3+
export function create(type, comment) {
4+
let overlayHTML = `
5+
<strong>${escapeHtml(type)}</strong>
6+
`;
7+
if (comment) {
8+
overlayHTML += `
9+
<br/>
10+
<div class='comment'>
11+
${escapeHtml(comment).replace(/(?:\r\n|\r|\n)/g, '<br/>')}
12+
</div>
13+
`;
14+
}
15+
16+
const overlay = document.createElement('div');
17+
overlay.className = 'atomts-show-type-view';
18+
overlay.innerHTML = overlayHTML;
19+
return overlay;
20+
}

lib/tsconfig.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"./main/atom/views/simpleOverlaySelectionView.ts",
5959
"./main/atom/views/simpleSelectionView.ts",
6060
"./main/atom/views/tooltipView.ts",
61+
"./main/atom/views/typeOverlayView.ts",
6162
"./main/atom/views/view.ts",
6263
"./main/atomts.ts",
6364
"./main/bin/atbuild.ts",

styles/atomts-show-type-view.less

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
@import 'ui-variables';
2+
3+
.atomts-show-type-view {
4+
background-color: @app-background-color;
5+
border-radius: 3px;
6+
box-shadow: 0 2px 8px 1px rgba(0, 0, 0, 0.3);
7+
padding: 0.75em;
8+
}

0 commit comments

Comments
 (0)