Skip to content

Commit 62426f0

Browse files
committed
realising we need declare global
1 parent e36df0d commit 62426f0

File tree

4 files changed

+75
-25
lines changed

4 files changed

+75
-25
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/ts-autocomplete/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"@types/mocha": "^9.1.1",
5555
"@types/sinon-chai": "^3.2.5",
5656
"chai": "^4.3.6",
57+
"debug": "^4.3.6",
5758
"depcheck": "^1.4.1",
5859
"eslint": "^7.25.0",
5960
"gen-esm-wrapper": "^1.1.1",
Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
import Autocompleter from './index';
22
import { expect } from 'chai';
33

4+
const FOO_TS = `
5+
6+
export type Foo = {
7+
a: string,
8+
bb: (p1: number) => void
9+
};
10+
11+
export type Params = { param1: string, param2: string };
12+
13+
declare global {
14+
declare var foo: Foo;
15+
export function bar(params: Params): void {};
16+
}
17+
`;
18+
419
describe('Autocompleter', function () {
520
let autoCompleter: Autocompleter;
621

@@ -12,45 +27,52 @@ describe('Autocompleter', function () {
1227
expect(autoCompleter.autocomplete('foo')).to.deep.equal([]);
1328
expect(autoCompleter.autocomplete('foo', 0)).to.deep.equal([]);
1429
expect(autoCompleter.autocomplete('foo', 1)).to.deep.equal([]);
30+
expect(autoCompleter.autocomplete('foo.')).to.deep.equal([]);
1531
});
1632

17-
it('returns completions when it knows of some code', function () {
33+
it('returns completions for members of global variables', function () {
1834
autoCompleter.updateCode({
19-
'foo.ts': `
20-
export type Foo = {
21-
a: string,
22-
bb: function (p1: number) {}
23-
};
24-
25-
declare global {
26-
declare var foo: Foo;
27-
}
28-
`,
35+
'/foo.d.ts': FOO_TS,
2936
});
3037

3138
expect(autoCompleter.autocomplete('foo')).to.deep.equal([]);
3239
expect(autoCompleter.autocomplete('foo.')).to.deep.equal([
3340
{ kind: 'property', name: 'a', type: 'string' },
34-
{ kind: 'property', name: 'bb', type: 'function (p1: number)' },
41+
{ kind: 'property', name: 'bb', type: '(p1: number) => void' },
3542
]);
3643

3744
expect(autoCompleter.autocomplete('foo.', 0)).to.deep.equal([]);
3845
expect(autoCompleter.autocomplete('foo.', 1)).to.deep.equal([]);
3946
expect(autoCompleter.autocomplete('foo.', 2)).to.deep.equal([]);
4047
expect(autoCompleter.autocomplete('foo.', 3)).to.deep.equal([]);
4148

42-
// TODO: is this expected?
43-
expect(autoCompleter.autocomplete('fo')).to.deep.equal([]);
44-
45-
// TODO: is this expected?
4649
expect(autoCompleter.autocomplete('foo.b')).to.deep.equal([
4750
{ kind: 'property', name: 'a', type: 'string' },
48-
{ kind: 'property', name: 'bb', type: 'function (p1: number)' },
51+
{ kind: 'property', name: 'bb', type: '(p1: number) => void' },
4952
]);
5053

5154
expect(autoCompleter.autocomplete('foo.bar', 4)).to.deep.equal([
5255
{ kind: 'property', name: 'a', type: 'string' },
53-
{ kind: 'property', name: 'bb', type: 'function (p1: number)' },
56+
{ kind: 'property', name: 'bb', type: '(p1: number) => void' },
57+
]);
58+
});
59+
60+
it('returns completions for the fields of object function parameters', function () {
61+
autoCompleter.updateCode({
62+
'/foo.d.ts': FOO_TS,
63+
});
64+
65+
expect(autoCompleter.autocomplete('bar({ par')).to.deep.equal([
66+
{
67+
kind: 'property',
68+
name: 'param1',
69+
type: 'string',
70+
},
71+
{
72+
kind: 'property',
73+
name: 'param2',
74+
type: 'string',
75+
},
5476
]);
5577
});
5678
});

packages/ts-autocomplete/src/index.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
import * as ts from 'typescript';
2+
import createDebug from 'debug';
3+
4+
const debugLog = createDebug('ts-autocomplete:log');
5+
const debugTrace = createDebug('ts-autocomplete:trace');
6+
const debugError = createDebug('ts-autocomplete:error');
27

38
type TypeFilename = string;
49

@@ -18,13 +23,17 @@ function getVirtualLanguageService(): [
1823
const updateCode = (newDef: Record<TypeFilename, string>): void => {
1924
for (const [key, value] of Object.entries(newDef)) {
2025
codeHolder[key] = value;
21-
versions[key] = (versions[key] ?? 1) + 1;
26+
versions[key] = (versions[key] ?? 0) + 1;
2227
}
2328
};
2429

2530
const servicesHost: ts.LanguageServiceHost = {
26-
getScriptFileNames: () => Object.keys(codeHolder),
27-
getScriptVersion: (fileName) => (versions[fileName] ?? 1).toString(),
31+
getScriptFileNames: () => {
32+
return Object.keys(codeHolder);
33+
},
34+
getScriptVersion: (fileName) => {
35+
return (versions[fileName] ?? 1).toString();
36+
},
2837
getScriptSnapshot: (fileName) => {
2938
if (fileName in codeHolder) {
3039
return ts.ScriptSnapshot.fromString(codeHolder[fileName]);
@@ -35,8 +44,9 @@ function getVirtualLanguageService(): [
3544
getCurrentDirectory: () => process.cwd(),
3645
getCompilationSettings: () => options,
3746
getDefaultLibFileName: (options) => ts.getDefaultLibFilePath(options),
38-
fileExists: (fileName) =>
39-
fileName in codeHolder || ts.sys.fileExists(fileName),
47+
fileExists: (fileName) => {
48+
return fileName in codeHolder || ts.sys.fileExists(fileName);
49+
},
4050
readFile: (fileName) => {
4151
if (fileName in codeHolder) {
4252
return codeHolder[fileName];
@@ -46,6 +56,10 @@ function getVirtualLanguageService(): [
4656
readDirectory: (...args) => ts.sys.readDirectory(...args),
4757
directoryExists: (...args) => ts.sys.directoryExists(...args),
4858
getDirectories: (...args) => ts.sys.getDirectories(...args),
59+
60+
log: (...args) => debugLog(args),
61+
trace: (...args) => debugTrace(args),
62+
error: (...args) => debugError(args),
4963
};
5064

5165
return [
@@ -62,6 +76,7 @@ type AutoCompletion = {
6276

6377
function mapCompletions(completions: ts.CompletionInfo): AutoCompletion[] {
6478
return completions.entries.map((entry) => {
79+
//console.log(entry.symbol?.getDeclarations());
6580
const declarations = entry.symbol?.getDeclarations();
6681
let type = 'any';
6782
if (declarations?.[0]) {
@@ -105,6 +120,18 @@ export default class Autocompleter {
105120

106121
if (completions?.isMemberCompletion) {
107122
return mapCompletions(completions);
123+
} else {
124+
/*
125+
// TOOD: trying to find examples of things that are not member completions..
126+
if (completions) {
127+
console.log(completions.entries?.length, 'entries');
128+
if (completions.entries?.length > 100) {
129+
completions.entries = [];// so I can see something
130+
}
131+
console.log(completions);
132+
//console.log(completions?.entries.map((entry) => entry.name).filter((name) => name.includes('param')));
133+
}
134+
*/
108135
}
109136

110137
return [];

0 commit comments

Comments
 (0)