Skip to content

Commit 573aade

Browse files
atscottthePunderWoman
authored andcommitted
feat(language-server): Add quick info for inline styles
This adds quick info to the langauge server for inline styles using the scss language service.
1 parent 26fd083 commit 573aade

2 files changed

Lines changed: 32 additions & 3 deletions

File tree

vscode-ng-language-service/server/src/embedded_support.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ export function getSCSSVirtualContent(sf: ts.SourceFile): string {
6969
return content;
7070
}
7171

72-
function isInlineStyleNode(node: ts.Node) {
72+
export function isInlineStyleNode(node: ts.Node) {
7373
if (!ts.isStringLiteralLike(node)) {
7474
return false;
7575
}

vscode-ng-language-service/server/src/session.ts

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ import {
3939

4040
import {readNgCompletionData, tsCompletionEntryToLspCompletionItem} from './completion';
4141
import {tsDiagnosticToLspDiagnostic} from './diagnostic';
42-
import {getHTMLVirtualContent, getSCSSVirtualContent} from './embedded_support';
42+
import {getHTMLVirtualContent, getSCSSVirtualContent, isInlineStyleNode} from './embedded_support';
4343
import {ServerHost} from './server_host';
4444
import {documentationToMarkdown} from './text_render';
4545
import {
@@ -1327,7 +1327,23 @@ export class Session {
13271327
const offset = lspPositionToTsPosition(scriptInfo, params.position);
13281328
const info = languageService.getQuickInfoAtPosition(scriptInfo.fileName, offset);
13291329
if (!info) {
1330-
return null;
1330+
const sf = this.getDefaultProjectForScriptInfo(scriptInfo)?.getSourceFile(scriptInfo.path);
1331+
if (!sf) {
1332+
return null;
1333+
}
1334+
const node = getTokenAtPosition(sf, offset);
1335+
if (!isInlineStyleNode(node)) {
1336+
return null;
1337+
}
1338+
const virtualScssDocContents = getSCSSVirtualContent(sf);
1339+
const virtualScssDoc = TextDocument.create(
1340+
params.textDocument.uri.toString(),
1341+
'scss',
1342+
0,
1343+
virtualScssDocContents,
1344+
);
1345+
const stylesheet = scssLS.parseStylesheet(virtualScssDoc);
1346+
return scssLS.doHover(virtualScssDoc, params.position, stylesheet);
13311347
}
13321348
const {kind, kindModifiers, textSpan, displayParts, documentation, tags} = info;
13331349
let desc = kindModifiers ? kindModifiers + ' ' : '';
@@ -1668,3 +1684,16 @@ function generateCommandAndTextEditsFromCodeActions(
16681684
additionalTextEdits: additionalTextEdits.length ? additionalTextEdits : undefined,
16691685
};
16701686
}
1687+
1688+
function getTokenAtPosition(sourceFile: ts.SourceFile, position: number): ts.Node {
1689+
let current: ts.Node = sourceFile;
1690+
while (true) {
1691+
const child = current
1692+
.getChildren(sourceFile)
1693+
.find((c) => c.getStart(sourceFile) <= position && c.getEnd() > position);
1694+
if (!child || child.kind === ts.SyntaxKind.EndOfFileToken) {
1695+
return current;
1696+
}
1697+
current = child;
1698+
}
1699+
}

0 commit comments

Comments
 (0)