Skip to content

Commit 4ece1af

Browse files
committed
hover + implementation handlers
1 parent df6b2db commit 4ece1af

File tree

5 files changed

+832
-351
lines changed

5 files changed

+832
-351
lines changed

src/DefinitionProvider.ts

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
import path from 'path';
22
import {EOL} from 'os';
3-
import {Location, Position, Range} from 'vscode-languageserver-protocol';
3+
import {Hover, Location, Position, Range} from 'vscode-languageserver-protocol';
44
import {TextDocument} from 'vscode-languageserver-textdocument';
55
import * as lsp from 'vscode-languageserver/node';
66
import {
77
CamelCaseValues,
8+
Classname,
9+
filePathToClassnameDict,
810
findImportPath,
911
genImportRegExp,
1012
getCurrentDirFromUri,
1113
getPosition,
14+
getTransformer,
1215
getWords,
1316
isImportLineMatch,
17+
stringiyClassname,
1418
} from './utils';
1519
import {textDocuments} from './textDocuments';
1620

@@ -34,6 +38,56 @@ export class CSSModulesDefinitionProvider {
3438
return this.provideDefinition(textdocument, params.position);
3539
};
3640

41+
hover = async (params: lsp.HoverParams) => {
42+
const textdocument = textDocuments.get(params.textDocument.uri);
43+
if (textdocument === undefined) {
44+
return null;
45+
}
46+
47+
return this.provideHover(textdocument, params.position);
48+
};
49+
50+
async provideHover(
51+
textdocument: TextDocument,
52+
position: Position,
53+
): Promise<null | Hover> {
54+
const fileContent = textdocument.getText();
55+
const lines = fileContent.split(EOL);
56+
const currentLine = lines[position.line];
57+
58+
if (typeof currentLine !== 'string') {
59+
return null;
60+
}
61+
const currentDir = getCurrentDirFromUri(textdocument.uri);
62+
63+
const words = getWords(currentLine, position);
64+
if (words === '' || words.indexOf('.') === -1) {
65+
return null;
66+
}
67+
68+
const [obj, field] = words.split('.');
69+
const importPath = findImportPath(fileContent, obj, currentDir);
70+
if (importPath === '') {
71+
return null;
72+
}
73+
74+
const dict = await filePathToClassnameDict(
75+
importPath,
76+
getTransformer(this._camelCaseConfig),
77+
);
78+
79+
const node: void | Classname = dict[`.${field}`];
80+
81+
if (!node) return null;
82+
83+
return {
84+
contents: {
85+
language: 'css',
86+
value: stringiyClassname(field, node.declarations),
87+
},
88+
};
89+
}
90+
3791
async provideDefinition(
3892
textdocument: TextDocument,
3993
position: Position,

src/connection.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,9 @@ export function createConnection(): lsp.Connection {
3737
const result: lsp.InitializeResult = {
3838
capabilities: {
3939
textDocumentSync: lsp.TextDocumentSyncKind.Incremental,
40+
hoverProvider: true,
4041
definitionProvider: true,
42+
implementationProvider: true,
4143
completionProvider: {
4244
/**
4345
* only invoke completion once `.` is pressed
@@ -59,7 +61,11 @@ export function createConnection(): lsp.Connection {
5961
});
6062

6163
connection.onCompletion(completionProvider.completion);
64+
6265
connection.onDefinition(definitionProvider.definition);
66+
connection.onImplementation(definitionProvider.definition);
67+
68+
connection.onHover(definitionProvider.hover);
6369

6470
return connection;
6571
}

0 commit comments

Comments
 (0)