Skip to content

Commit 69c76e5

Browse files
WIP: Move property completion
1 parent 5553c73 commit 69c76e5

6 files changed

Lines changed: 100 additions & 55 deletions

File tree

libs/parsing/index/src/lib/auto-complete/auto-complete-recipe.interface.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ import {
2626
IProcedureCompletionOptions,
2727
ProcedureCompletion,
2828
} from './completion-for/completion-procedures.interface';
29+
import {
30+
IPropertyCompletionOptions,
31+
PropertyCompletion,
32+
} from './completion-for/completion-properties.interface';
2933
import {
3034
ISpecialFunctionCompletionOptions,
3135
SpecialFunctionCompletion,
@@ -58,6 +62,7 @@ export type AutoCompleteType =
5862
| IncludeCompletion
5963
| KeywordCompletion
6064
| ProcedureCompletion
65+
| PropertyCompletion
6166
| SpecialFunctionCompletion
6267
| SpecialProcedureCompletion
6368
| StructureNameCompletion
@@ -82,6 +87,8 @@ export type AutoCompleteRecipeOptions<T extends AutoCompleteType> =
8287
? IKeywordCompletionOptions
8388
: T extends ProcedureCompletion
8489
? IProcedureCompletionOptions
90+
: T extends PropertyCompletion
91+
? IPropertyCompletionOptions
8592
: T extends SpecialFunctionCompletion
8693
? ISpecialFunctionCompletionOptions
8794
: T extends SpecialProcedureCompletion

libs/parsing/index/src/lib/auto-complete/build-completion-items.interface.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { BuildFunctionCompletionItems } from './completion-for/completion-functi
1313
import { BuildIncludeCompletionItems } from './completion-for/completion-include';
1414
import { BuildKeywordCompletionItems } from './completion-for/completion-keywords';
1515
import { BuildProcedureCompletionItems } from './completion-for/completion-procedures';
16+
import { BuildPropertyCompletionItems } from './completion-for/completion-properties';
1617
import { BuildSpecialFunctionCompletionItems } from './completion-for/completion-special-functions';
1718
import { BuildSpecialProcedureCompletionItems } from './completion-for/completion-special-procedures';
1819
import { BuildCompletionStructureNameItems } from './completion-for/completion-structure-names';
@@ -54,6 +55,7 @@ export const ALL_COMPLETION_ITEM_BUILDERS: BuildCompletionItemsLookup = {
5455
include: BuildIncludeCompletionItems,
5556
keyword: BuildKeywordCompletionItems,
5657
procedure: BuildProcedureCompletionItems,
58+
property: BuildPropertyCompletionItems,
5759
'special-function': BuildSpecialFunctionCompletionItems,
5860
'special-procedure': BuildSpecialProcedureCompletionItems,
5961
'structure-name': BuildCompletionStructureNameItems,

libs/parsing/index/src/lib/auto-complete/completion-for/completion-function-methods.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ function AddCompletionFunctionMethodsForType(
115115
/**
116116
* Creates options for creating auto-complete
117117
*/
118-
export function BuildFunctionMethodCompletionOptions(
118+
export function GetFunctionMethodCompletionOptions(
119119
type: IDLDataType,
120120
addParen: boolean
121121
): IFunctionMethodCompletionOptions {
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { IDLDataType } from '@idl/types/core';
2+
3+
import { BuildCompletionItemsArg } from '../build-completion-items.interface';
4+
5+
/**
6+
* Auto-complete for function methods
7+
*/
8+
export type PropertyCompletion = 'property';
9+
10+
/**
11+
* Options for adding function method completion
12+
*/
13+
export interface IPropertyCompletionOptions {
14+
/**
15+
* Text we add on insert
16+
*/
17+
add: string;
18+
/**
19+
* Data type to add types for
20+
*/
21+
type: IDLDataType;
22+
}
23+
24+
export interface IPropertyCompletionArg
25+
extends BuildCompletionItemsArg<PropertyCompletion> {
26+
/** Current methods that we have found */
27+
found?: { [key: string]: any };
28+
}

libs/parsing/index/src/lib/auto-complete/completion-for/add-completion-properties.ts renamed to libs/parsing/index/src/lib/auto-complete/completion-for/completion-properties.ts

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { FormatterType, IAssemblerOptions } from '@idl/assembling/config';
21
import { TransformCase } from '@idl/assembling/shared';
32
import { IDL_TRANSLATION } from '@idl/translation';
43
import {
@@ -9,21 +8,20 @@ import {
98
IDLTypes,
109
ParseIDLType,
1110
} from '@idl/types/core';
12-
import { CompletionItem, CompletionItemKind } from 'vscode-languageserver';
11+
import { CompletionItemKind } from 'vscode-languageserver';
1312

14-
import { IDLIndex } from '../../idl-index.class';
1513
import { SORT_PRIORITY } from '../sort-priority.interface';
14+
import {
15+
IPropertyCompletionArg,
16+
IPropertyCompletionOptions,
17+
} from './completion-properties.interface';
1618

1719
/**
1820
* Adds variables to our completion items
1921
*/
2022
function AddCompletionPropertiesForType(
21-
complete: CompletionItem[],
22-
index: IDLIndex,
23-
type: IDLDataTypeBase<IDLTypes>,
24-
add = '',
25-
formatting: IAssemblerOptions<FormatterType>,
26-
found: { [key: string]: any } = {}
23+
arg: IPropertyCompletionArg,
24+
type: IDLDataTypeBase<IDLTypes>
2725
) {
2826
// return if we dont have a type
2927
if (type.name === IDL_TYPE_LOOKUP.ANY) {
@@ -36,30 +34,30 @@ function AddCompletionPropertiesForType(
3634
const keys = Object.keys(properties);
3735
for (let i = 0; i < keys.length; i++) {
3836
const lowKey = keys[i].toLowerCase();
39-
if (!(lowKey in found)) {
37+
if (!(lowKey in arg.found)) {
4038
const display = TransformCase(
4139
properties[keys[i]].display,
42-
formatting.style.properties
40+
arg.formatting.style.properties
4341
);
4442

4543
// add to completion
46-
complete.push({
44+
arg.complete.push({
4745
label: display,
48-
insertText: display + add,
46+
insertText: display + arg.options.add,
4947
kind: CompletionItemKind.Field,
5048
sortText: SORT_PRIORITY.PROPERTIES,
5149
documentation: properties[keys[i]].docs,
5250
});
5351

5452
// save that we already processed this property
55-
found[lowKey] = true;
53+
arg.found[lowKey] = true;
5654
}
5755
}
5856
return;
5957
}
6058

6159
// check for global token first
62-
const global = index.findMatchingGlobalToken(
60+
const global = arg.index.findMatchingGlobalToken(
6361
GLOBAL_TOKEN_TYPES.STRUCTURE,
6462
type.name.toLocaleLowerCase()
6563
);
@@ -70,64 +68,69 @@ function AddCompletionPropertiesForType(
7068
const keys = Object.keys(properties);
7169
for (let i = 0; i < keys.length; i++) {
7270
const lowKey = keys[i].toLowerCase();
73-
if (!(lowKey in found)) {
71+
if (!(lowKey in arg.found)) {
7472
const display = TransformCase(
7573
properties[keys[i]].display,
76-
formatting.style.properties
74+
arg.formatting.style.properties
7775
);
7876

7977
// add to completion
80-
complete.push({
78+
arg.complete.push({
8179
label: display,
82-
insertText: display + add,
80+
insertText: display + arg.options.add,
8381
kind: CompletionItemKind.Field,
8482
sortText: SORT_PRIORITY.PROPERTIES,
8583
detail: `${IDL_TRANSLATION.autoComplete.detail.property} ${global[0].meta.display}`,
8684
documentation: properties[keys[i]].docs,
8785
});
8886

8987
// save that we already processed this property
90-
found[lowKey] = true;
88+
arg.found[lowKey] = true;
9189
}
9290
}
9391

9492
// check if we have inheritance to consider
9593
const inherits = global[0].meta.inherits;
9694
if (inherits.length > 0) {
9795
for (let i = 0; i < inherits.length; i++) {
98-
AddCompletionProperties(
99-
complete,
100-
index,
101-
ParseIDLType(inherits[i]),
102-
add,
103-
formatting,
104-
found
105-
);
96+
BuildPropertyCompletionItems({
97+
...arg,
98+
...{
99+
options: {
100+
add: arg.options.add,
101+
type: ParseIDLType(inherits[i]),
102+
},
103+
},
104+
});
106105
}
107106
}
108107
}
109108
}
110109

110+
/**
111+
* Creates options for creating property completion items
112+
*/
113+
export function GetPropertyCompletionOptions(
114+
add: string,
115+
type: IDLDataType
116+
): IPropertyCompletionOptions {
117+
return {
118+
add,
119+
type,
120+
};
121+
}
122+
111123
/**
112124
* Adds variables to our completion items
113125
*/
114-
export function AddCompletionProperties(
115-
complete: CompletionItem[],
116-
index: IDLIndex,
117-
type: IDLDataType,
118-
add = '',
119-
formatting: IAssemblerOptions<FormatterType>,
120-
found: { [key: string]: any } = {}
121-
) {
126+
export function BuildPropertyCompletionItems(arg: IPropertyCompletionArg) {
127+
// track found if we dont have it
128+
if (!arg.found) {
129+
arg.found = {};
130+
}
131+
122132
// process each type
123-
for (let i = 0; i < type.length; i++) {
124-
AddCompletionPropertiesForType(
125-
complete,
126-
index,
127-
type[i],
128-
add,
129-
formatting,
130-
found
131-
);
133+
for (let i = 0; i < arg.options.type.length; i++) {
134+
AddCompletionPropertiesForType(arg, arg.options.type[i]);
132135
}
133136
}

libs/parsing/index/src/lib/auto-complete/get-auto-complete.ts

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import { GetTypeBefore } from '../helpers/get-type-before';
2020
import { ResolveHoverHelpLinks } from '../helpers/resolve-hover-help-links';
2121
import { IDLIndex } from '../idl-index.class';
2222
import { AddCompletionProcedureMethods } from './completion-for/add-completion-procedure-methods';
23-
import { AddCompletionProperties } from './completion-for/add-completion-properties';
2423
import { AddCompletionPropertiesInStructures } from './completion-for/add-completion-properties-in-structures';
2524
import {
2625
BuildCompileOptCompletionItems,
@@ -32,7 +31,7 @@ import {
3231
} from './completion-for/completion-executive-commands';
3332
import {
3433
BuildFunctionMethodCompletionItems,
35-
BuildFunctionMethodCompletionOptions,
34+
GetFunctionMethodCompletionOptions,
3635
} from './completion-for/completion-function-methods';
3736
import {
3837
BuildFunctionCompletionItems,
@@ -44,6 +43,10 @@ import {
4443
GetKeywordCompletionOptions,
4544
} from './completion-for/completion-keywords';
4645
import { BuildProcedureCompletionItems } from './completion-for/completion-procedures';
46+
import {
47+
BuildPropertyCompletionItems,
48+
GetPropertyCompletionOptions,
49+
} from './completion-for/completion-properties';
4750
import {
4851
BuildSpecialFunctionCompletionItems,
4952
GetSpecialFunctionCompletionOptions,
@@ -405,13 +408,15 @@ export async function GetAutoComplete(
405408
* dot for properties because something else needs to come afterwards
406409
*/
407410
if (isWithinStart && !(token?.name in NO_PROPERTIES)) {
408-
AddCompletionProperties(
411+
BuildPropertyCompletionItems({
409412
complete,
413+
formatting,
410414
index,
411-
type,
412-
local?.name in PROCEDURES ? '' : '',
413-
formatting
414-
);
415+
options: GetPropertyCompletionOptions(
416+
local?.name in PROCEDURES ? '' : '',
417+
type
418+
),
419+
});
415420
}
416421

417422
/**
@@ -448,7 +453,7 @@ export async function GetAutoComplete(
448453
complete,
449454
formatting,
450455
index,
451-
options: BuildFunctionMethodCompletionOptions(type, addParen),
456+
options: GetFunctionMethodCompletionOptions(type, addParen),
452457
});
453458
break;
454459
case token?.name in ALL_METHODS_COMPLETION:
@@ -467,7 +472,7 @@ export async function GetAutoComplete(
467472
complete,
468473
formatting,
469474
index,
470-
options: BuildFunctionMethodCompletionOptions(type, addParen),
475+
options: GetFunctionMethodCompletionOptions(type, addParen),
471476
});
472477
break;
473478
default:

0 commit comments

Comments
 (0)