Skip to content

Commit 2919989

Browse files
authored
Merge pull request #13 from VectorCamp/feature/autocomplete
Feature/autocomplete
2 parents 1ff9ad4 + f348d6d commit 2919989

7 files changed

Lines changed: 100 additions & 4 deletions

File tree

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ We are actively working to address these issues in an upcoming release.
112112

113113
## 1.0.7
114114
- Fix ai chat issues on session switching
115+
116+
## 1.0.8
117+
- Add intrinsics autocomplete on typing!
115118
---
116119

117120

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"name": "code-simd-ai",
33
"displayName": "code.simd.ai",
44
"description": "VScode plugin for porting of code between different cpu architectures",
5-
"version": "1.0.7",
5+
"version": "1.0.8",
66
"publisher": "VectorCamp",
77
"engines": {
88
"vscode": "^1.100.0"

src/completionProvider.ts

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as vscode from 'vscode';
2+
import { getIntrinsics } from './intrinsicsCache';
3+
import { fetchTooltip } from './api/tooltipFetcher';
4+
5+
let intrinsics: string[] = [];
6+
7+
export async function activate(context: vscode.ExtensionContext) {
8+
try {
9+
intrinsics = await getIntrinsics();
10+
intrinsics.sort(); // required for binary search
11+
} catch (err) {
12+
console.error('Failed to fetch intrinsics:', err);
13+
intrinsics = [];
14+
}
15+
16+
const languages = ['rust', 'c', 'cpp'];
17+
18+
const provider = vscode.languages.registerCompletionItemProvider(
19+
languages.map(lang => ({ scheme: 'file', language: lang })),
20+
{
21+
provideCompletionItems(document, position) {
22+
const linePrefix = document.lineAt(position).text.substring(0, position.character);
23+
24+
const wordMatch = linePrefix.match(/[a-zA-Z_][a-zA-Z0-9_]*$/);
25+
const prefix = wordMatch ? wordMatch[0] : '';
26+
27+
if (!prefix) {return undefined;}
28+
29+
const start = lowerBound(intrinsics, prefix);
30+
const maxResults = 50;
31+
const items: vscode.CompletionItem[] = [];
32+
33+
for (let i = start; i < intrinsics.length && items.length < maxResults; i++) {
34+
if (!intrinsics[i].startsWith(prefix)) {break;}
35+
const name = intrinsics[i];
36+
const item = new vscode.CompletionItem(name, vscode.CompletionItemKind.Function);
37+
item.detail = 'SIMD.info intrinsic';
38+
item.filterText = name;
39+
item.sortText = name;
40+
41+
items.push(item);
42+
}
43+
return items;
44+
},
45+
async resolveCompletionItem(item: vscode.CompletionItem) {
46+
try {
47+
const doc = await fetchTooltip(item.label.toString());
48+
if (doc) {
49+
const markdown = new vscode.MarkdownString(doc);
50+
markdown.isTrusted = true;
51+
markdown.supportHtml = true;
52+
item.documentation = markdown;
53+
}
54+
} catch (err) {
55+
console.error('Error fetching tooltip:', err);
56+
}
57+
return item;
58+
}
59+
},
60+
'_','m','v' // trigger characters
61+
);
62+
63+
64+
context.subscriptions.push(provider);
65+
}
66+
67+
// Returns the index of the first string >= prefix
68+
function lowerBound(arr: string[], prefix: string) {
69+
let lo = 0, hi = arr.length;
70+
while (lo < hi) {
71+
const mid = Math.floor((lo + hi) / 2);
72+
if (arr[mid] < prefix) {lo = mid + 1;}
73+
else {hi = mid;}
74+
}
75+
return lo;
76+
}

src/extension.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import { registerTranslateCommand } from './translation/translator';
2424
import { registerAcceptRejectCommands, registerEditSIMDCommand } from './translation/commands';
2525
import { TranslationCodeLensProvider } from './translation/codelens';
2626
import { highlightIntrinsics, initIntrinsicHighlighting, deactivateHighlighting } from './syntaxHighlighting';
27+
import { activate as activateCompletion } from './completionProvider'; // Update to correct filename
2728

2829
export function activate(context: vscode.ExtensionContext) {
2930

@@ -51,6 +52,8 @@ export function activate(context: vscode.ExtensionContext) {
5152
vscode.window.visibleTextEditors.forEach(editor => {
5253
highlightIntrinsics(editor);
5354
});
55+
56+
activateCompletion(context);
5457
}
5558

5659
export function deactivate() {

src/intrinsicsCache.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { fetchIntrinsicNames } from './api/simdAi';
2+
3+
let intrinsics: string[] | null = null;
4+
5+
export async function getIntrinsics(): Promise<string[]> {
6+
if (!intrinsics) {
7+
try {
8+
intrinsics = await fetchIntrinsicNames();
9+
} catch (err) {
10+
console.error("Failed to fetch intrinsics:", err);
11+
intrinsics = [];
12+
}
13+
}
14+
return intrinsics;
15+
}

src/syntaxHighlighting.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@
1616
import * as vscode from 'vscode';
1717
import * as fs from 'fs';
1818
import { fetchTooltip } from './api/tooltipFetcher';
19-
import { fetchIntrinsicNames } from './api/simdAi';
20-
19+
import { getIntrinsics } from './intrinsicsCache';
2120

2221
let intrinsics: string[] = [];
2322
let decorationType: vscode.TextEditorDecorationType | null = null;
2423

2524
export async function initIntrinsicHighlighting(context: vscode.ExtensionContext) {
2625
try {
27-
intrinsics = await fetchIntrinsicNames();
26+
intrinsics = await getIntrinsics();
2827
} catch (error) {
2928
console.error('Failed to fetch intrinsics:', error);
3029
}

0 commit comments

Comments
 (0)