Skip to content

Commit fc32cd8

Browse files
committed
Add external API types to be published
1 parent 581c6d8 commit fc32cd8

File tree

6 files changed

+75
-23
lines changed

6 files changed

+75
-23
lines changed

api/README.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# VS Code clangd Extension API
2+
3+
The VS Code clangd extension exposes an API that other extensions can consume:
4+
5+
```typescript
6+
import * as vscode from 'vscode';
7+
import type { ClangdExtension, ASTParams, ASTNode, ASTType } from '@clangd/vscode-clangd';
8+
9+
const CLANGD_EXTENSION = 'llvm-vs-code-extensions.vscode-clangd';
10+
const CLANGD_API_VERSION = 1;
11+
12+
const provideHover = (document: vscode.TextDocument, position: vscode.Position, _token: vscode.CancellationToken): Promise<vscode.Hover | undefined> => {
13+
14+
const clangdExtension = vscode.extensions.getExtension<ClangdExtension>(CLANGD_EXTENSION);
15+
16+
if (clangdExtension) {
17+
const api = (await clangdExtension.activate()).getApi(CLANGD_API_VERSION);
18+
19+
const textDocument = api.languageClient.code2ProtocolConverter.asTextDocumentIdentifier(document);
20+
const range = api.languageClient.code2ProtocolConverter.asRange(new vscode.Range(position, position));
21+
const params: ASTParams = { textDocument, range };
22+
23+
const ast: ASTNode | undefined = await api.languageClient.sendRequest(ASTType, params);
24+
25+
return {
26+
contents: [ast.kind]
27+
};
28+
}
29+
};
30+
```

api/package.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
{
2+
"name": "@clangd/vscode-clangd",
3+
"version": "0.0.0",
4+
"description": "API for the llvm-vs-code-extensions.vscode-clangd VS Code extension",
5+
"types": "vscode-clangd.d.ts",
6+
"publishConfig": {
7+
"registry": "https://npm.pkg.github.com"
8+
},
9+
"repository": "https://github.com/clangd/vscode-clangd",
10+
"dependencies": {
11+
"vscode-languageclient": "8.0.2"
12+
}
13+
}

api/vscode-clangd.d.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import {BaseLanguageClient} from 'vscode-languageclient';
2+
import * as vscodelc from 'vscode-languageclient/node';
3+
4+
// The wire format: we send a position, and get back a tree of ASTNode.
5+
export interface ASTParams {
6+
textDocument: vscodelc.TextDocumentIdentifier;
7+
range: vscodelc.Range;
8+
}
9+
10+
export interface ASTNode {
11+
role: string; // e.g. expression
12+
kind: string; // e.g. BinaryOperator
13+
detail?: string; // e.g. ||
14+
arcana?: string; // e.g. BinaryOperator <0x12345> <col:12, col:1> 'bool' '||'
15+
children?: Array<ASTNode>;
16+
range?: vscodelc.Range;
17+
}
18+
19+
export const ASTType = 'textDocument/ast';
20+
21+
export interface ClangdApiV1 {
22+
languageClient: BaseLanguageClient
23+
}
24+
25+
export interface ClangdExtension {
26+
getApi(version: 1): ClangdApiV1;
27+
}

src/api.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,5 @@
11
import {BaseLanguageClient} from 'vscode-languageclient';
2-
3-
export interface ClangdApiV1 {
4-
languageClient: BaseLanguageClient
5-
}
6-
7-
export interface ClangdExtension {
8-
getApi(version: 1): ClangdApiV1;
9-
}
2+
import {ClangdApiV1, ClangdExtension} from '../api/vscode-clangd';
103

114
export class ClangdExtensionImpl implements ClangdExtension {
125
constructor(

src/ast.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,15 @@ import * as vscode from 'vscode';
44
import * as vscodelc from 'vscode-languageclient/node';
55

66
import {ClangdContext} from './clangd-context';
7+
import {ASTParams, ASTNode, ASTType} from '../api/vscode-clangd';
78

89
export function activate(context: ClangdContext) {
910
const feature = new ASTFeature(context);
1011
context.client.registerFeature(feature);
1112
}
1213

13-
// The wire format: we send a position, and get back a tree of ASTNode.
14-
interface ASTParams {
15-
textDocument: vscodelc.TextDocumentIdentifier;
16-
range: vscodelc.Range;
17-
}
18-
interface ASTNode {
19-
role: string; // e.g. expression
20-
kind: string; // e.g. BinaryOperator
21-
detail?: string; // e.g. ||
22-
arcana?: string; // e.g. BinaryOperator <0x12345> <col:12, col:1> 'bool' '||'
23-
children?: Array<ASTNode>;
24-
range?: vscodelc.Range;
25-
}
2614
const ASTRequestType =
27-
new vscodelc.RequestType<ASTParams, ASTNode|null, void>('textDocument/ast');
15+
new vscodelc.RequestType<ASTParams, ASTNode|null, void>(ASTType);
2816

2917
class ASTFeature implements vscodelc.StaticFeature {
3018
constructor(private context: ClangdContext) {

src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as vscode from 'vscode';
22
import {ClangdContext} from './clangd-context';
3-
import {ClangdExtension, ClangdExtensionImpl} from './api';
3+
import {ClangdExtension} from '../api/vscode-clangd';
4+
import {ClangdExtensionImpl} from './api';
45

56
/**
67
* This method is called when the extension is activated. The extension is

0 commit comments

Comments
 (0)