- Notifications
You must be signed in to change notification settings - Fork 440
/
Copy pathformat.ts
78 lines (73 loc) · 2.57 KB
/
format.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import{MaybePromise}from'@theia/core';
import{inject,injectable}from'@theia/core/shared/inversify';
import*asmonacofrom'@theia/monaco-editor-core';
import{Formatter}from'../../common/protocol/formatter';
import{InoSelector}from'../selectors';
import{Contribution,URI}from'./contribution';
@injectable()
exportclassFormat
extendsContribution
implements
monaco.languages.DocumentRangeFormattingEditProvider,
monaco.languages.DocumentFormattingEditProvider
{
@inject(Formatter)
privatereadonlyformatter: Formatter;
overrideonStart(): MaybePromise<void>{
monaco.languages.registerDocumentRangeFormattingEditProvider(
InoSelector,
this
);
monaco.languages.registerDocumentFormattingEditProvider(InoSelector,this);
}
asyncprovideDocumentRangeFormattingEdits(
model: monaco.editor.ITextModel,
range: monaco.Range,
options: monaco.languages.FormattingOptions,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_token: monaco.CancellationToken
): Promise<monaco.languages.TextEdit[]>{
consttext=awaitthis.format(model,range,options);
return[{ range, text }];
}
asyncprovideDocumentFormattingEdits(
model: monaco.editor.ITextModel,
options: monaco.languages.FormattingOptions,
// eslint-disable-next-line @typescript-eslint/no-unused-vars
_token: monaco.CancellationToken
): Promise<monaco.languages.TextEdit[]>{
constrange=model.getFullModelRange();
consttext=awaitthis.format(model,range,options);
return[{ range, text }];
}
/**
* From the currently opened workspaces (IDE2 has always one), it calculates all possible
* folder locations where the `.clang-format` file could be.
*/
privateformatterConfigFolderUris(model: monaco.editor.ITextModel): string[]{
consteditorUri=newURI(model.uri.toString());
returnthis.workspaceService
.tryGetRoots()
.map(({ resource })=>resource)
.filter((workspaceUri)=>workspaceUri.isEqualOrParent(editorUri))
.map((uri)=>uri.toString());
}
privateformat(
model: monaco.editor.ITextModel,
range: monaco.Range,
options: monaco.languages.FormattingOptions
): Promise<string>{
console.info(
`Formatting ${model.uri.toString()} [Range: ${JSON.stringify(
range.toJSON()
)}]`
);
constcontent=model.getValueInRange(range);
constformatterConfigFolderUris=this.formatterConfigFolderUris(model);
returnthis.formatter.format({
content,
formatterConfigFolderUris,
options,
});
}
}