Skip to content

Commit b4a79d6

Browse files
committed
Add getters for computed editor options (Fixes microsoft/monaco-editor#1734)
1 parent e7459eb commit b4a79d6

9 files changed

Lines changed: 1006 additions & 344 deletions

File tree

build/gulpfile.editor.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,13 @@ gulp.task('editor-distro',
353353
)
354354
);
355355

356+
gulp.task('monacodts', task.define('monacodts', () => {
357+
const result = monacoapi.execute();
358+
fs.writeFileSync(result.filePath, result.content);
359+
fs.writeFileSync(path.join(root, 'src/vs/editor/common/standalone/standaloneEnums.ts'), result.enums);
360+
return Promise.resolve(true);
361+
}));
362+
356363
//#region monaco type checking
357364

358365
function createTscCompileTask(watch) {

build/monaco/api.js

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ const ts = require("typescript");
99
const path = require("path");
1010
const fancyLog = require("fancy-log");
1111
const ansiColors = require("ansi-colors");
12-
const dtsv = '2';
12+
const dtsv = '3';
1313
const tsfmt = require('../../tsfmt.json');
1414
const SRC = path.join(__dirname, '../../src');
1515
exports.RECIPE_PATH = path.join(__dirname, './monaco.d.ts.recipe');
@@ -148,12 +148,35 @@ function getMassagedTopLevelDeclarationText(sourceFile, declaration, importName,
148148
}
149149
});
150150
}
151+
else if (declaration.kind === ts.SyntaxKind.VariableStatement) {
152+
const jsDoc = result.substr(0, declaration.getLeadingTriviaWidth(sourceFile));
153+
if (jsDoc.indexOf('@monacodtsreplace') >= 0) {
154+
const jsDocLines = jsDoc.split(/\r\n|\r|\n/);
155+
let directives = [];
156+
for (const jsDocLine of jsDocLines) {
157+
const m = jsDocLine.match(/^\s*\* \/([^/]+)\/([^/]+)\/$/);
158+
if (m) {
159+
directives.push([new RegExp(m[1], 'g'), m[2]]);
160+
}
161+
}
162+
// remove the jsdoc
163+
result = result.substr(jsDoc.length);
164+
if (directives.length > 0) {
165+
// apply replace directives
166+
const replacer = createReplacerFromDirectives(directives);
167+
result = replacer(result);
168+
}
169+
}
170+
}
151171
result = result.replace(/export default /g, 'export ');
152172
result = result.replace(/export declare /g, 'export ');
153173
result = result.replace(/declare /g, '');
154174
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
155175
result = result.replace(/const enum/, 'enum');
156-
enums.push(result);
176+
enums.push({
177+
enumName: declaration.name.getText(sourceFile),
178+
text: result
179+
});
157180
}
158181
return result;
159182
}
@@ -277,6 +300,14 @@ function format(text, endl) {
277300
return result;
278301
}
279302
}
303+
function createReplacerFromDirectives(directives) {
304+
return (str) => {
305+
for (let i = 0; i < directives.length; i++) {
306+
str = str.replace(directives[i][0], directives[i][1]);
307+
}
308+
return str;
309+
};
310+
}
280311
function createReplacer(data) {
281312
data = data || '';
282313
let rawDirectives = data.split(';');
@@ -292,12 +323,7 @@ function createReplacer(data) {
292323
findStr = '\\b' + findStr + '\\b';
293324
directives.push([new RegExp(findStr, 'g'), replaceStr]);
294325
});
295-
return (str) => {
296-
for (let i = 0; i < directives.length; i++) {
297-
str = str.replace(directives[i][0], directives[i][1]);
298-
}
299-
return str;
300-
};
326+
return createReplacerFromDirectives(directives);
301327
}
302328
function generateDeclarationFile(recipe, sourceFileGetter) {
303329
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
@@ -415,6 +441,15 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
415441
resultTxt = resultTxt.split(/\r\n|\n|\r/).join(endl);
416442
resultTxt = format(resultTxt, endl);
417443
resultTxt = resultTxt.split(/\r\n|\n|\r/).join(endl);
444+
enums.sort((e1, e2) => {
445+
if (e1.enumName < e2.enumName) {
446+
return -1;
447+
}
448+
if (e1.enumName > e2.enumName) {
449+
return 1;
450+
}
451+
return 0;
452+
});
418453
let resultEnums = [
419454
'/*---------------------------------------------------------------------------------------------',
420455
' * Copyright (c) Microsoft Corporation. All rights reserved.',
@@ -423,7 +458,7 @@ function generateDeclarationFile(recipe, sourceFileGetter) {
423458
'',
424459
'// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.',
425460
''
426-
].concat(enums).join(endl);
461+
].concat(enums.map(e => e.text)).join(endl);
427462
resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);
428463
resultEnums = format(resultEnums, endl);
429464
resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);

build/monaco/api.ts

Lines changed: 52 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import * as path from 'path';
99
import * as fancyLog from 'fancy-log';
1010
import * as ansiColors from 'ansi-colors';
1111

12-
const dtsv = '2';
12+
const dtsv = '3';
1313

1414
const tsfmt = require('../../tsfmt.json');
1515

@@ -138,7 +138,7 @@ function isDefaultExport(declaration: ts.InterfaceDeclaration | ts.ClassDeclarat
138138
);
139139
}
140140

141-
function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declaration: TSTopLevelDeclare, importName: string, usage: string[], enums: string[]): string {
141+
function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declaration: TSTopLevelDeclare, importName: string, usage: string[], enums: IEnumEntry[]): string {
142142
let result = getNodeText(sourceFile, declaration);
143143
if (declaration.kind === ts.SyntaxKind.InterfaceDeclaration || declaration.kind === ts.SyntaxKind.ClassDeclaration) {
144144
let interfaceDeclaration = <ts.InterfaceDeclaration | ts.ClassDeclaration>declaration;
@@ -177,14 +177,36 @@ function getMassagedTopLevelDeclarationText(sourceFile: ts.SourceFile, declarati
177177
// life..
178178
}
179179
});
180+
} else if (declaration.kind === ts.SyntaxKind.VariableStatement) {
181+
const jsDoc = result.substr(0, declaration.getLeadingTriviaWidth(sourceFile));
182+
if (jsDoc.indexOf('@monacodtsreplace') >= 0) {
183+
const jsDocLines = jsDoc.split(/\r\n|\r|\n/);
184+
let directives: [RegExp, string][] = [];
185+
for (const jsDocLine of jsDocLines) {
186+
const m = jsDocLine.match(/^\s*\* \/([^/]+)\/([^/]+)\/$/);
187+
if (m) {
188+
directives.push([new RegExp(m[1], 'g'), m[2]]);
189+
}
190+
}
191+
// remove the jsdoc
192+
result = result.substr(jsDoc.length);
193+
if (directives.length > 0) {
194+
// apply replace directives
195+
const replacer = createReplacerFromDirectives(directives);
196+
result = replacer(result);
197+
}
198+
}
180199
}
181200
result = result.replace(/export default /g, 'export ');
182201
result = result.replace(/export declare /g, 'export ');
183202
result = result.replace(/declare /g, '');
184203

185204
if (declaration.kind === ts.SyntaxKind.EnumDeclaration) {
186205
result = result.replace(/const enum/, 'enum');
187-
enums.push(result);
206+
enums.push({
207+
enumName: declaration.name.getText(sourceFile),
208+
text: result
209+
});
188210
}
189211

190212
return result;
@@ -324,6 +346,15 @@ function format(text: string, endl: string): string {
324346
}
325347
}
326348

349+
function createReplacerFromDirectives(directives: [RegExp, string][]): (str: string) => string {
350+
return (str: string) => {
351+
for (let i = 0; i < directives.length; i++) {
352+
str = str.replace(directives[i][0], directives[i][1]);
353+
}
354+
return str;
355+
};
356+
}
357+
327358
function createReplacer(data: string): (str: string) => string {
328359
data = data || '';
329360
let rawDirectives = data.split(';');
@@ -341,12 +372,7 @@ function createReplacer(data: string): (str: string) => string {
341372
directives.push([new RegExp(findStr, 'g'), replaceStr]);
342373
});
343374

344-
return (str: string) => {
345-
for (let i = 0; i < directives.length; i++) {
346-
str = str.replace(directives[i][0], directives[i][1]);
347-
}
348-
return str;
349-
};
375+
return createReplacerFromDirectives(directives);
350376
}
351377

352378
interface ITempResult {
@@ -355,6 +381,11 @@ interface ITempResult {
355381
enums: string;
356382
}
357383

384+
interface IEnumEntry {
385+
enumName: string;
386+
text: string;
387+
}
388+
358389
function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): ITempResult | null {
359390
const endl = /\r\n/.test(recipe) ? '\r\n' : '\n';
360391

@@ -376,7 +407,7 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
376407
return importName;
377408
};
378409

379-
let enums: string[] = [];
410+
let enums: IEnumEntry[] = [];
380411
let version: string | null = null;
381412

382413
lines.forEach(line => {
@@ -492,6 +523,16 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
492523
resultTxt = format(resultTxt, endl);
493524
resultTxt = resultTxt.split(/\r\n|\n|\r/).join(endl);
494525

526+
enums.sort((e1, e2) => {
527+
if (e1.enumName < e2.enumName) {
528+
return -1;
529+
}
530+
if (e1.enumName > e2.enumName) {
531+
return 1;
532+
}
533+
return 0;
534+
});
535+
495536
let resultEnums = [
496537
'/*---------------------------------------------------------------------------------------------',
497538
' * Copyright (c) Microsoft Corporation. All rights reserved.',
@@ -500,7 +541,7 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet
500541
'',
501542
'// THIS IS A GENERATED FILE. DO NOT EDIT DIRECTLY.',
502543
''
503-
].concat(enums).join(endl);
544+
].concat(enums.map(e => e.text)).join(endl);
504545
resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);
505546
resultEnums = format(resultEnums, endl);
506547
resultEnums = resultEnums.split(/\r\n|\n|\r/).join(endl);

build/monaco/monaco.d.ts.recipe

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export interface ICommandHandler {
6262
#includeAll(vs/editor/common/editorCommon;editorOptions.=>): IScrollEvent
6363
#includeAll(vs/editor/common/model/textModelEvents):
6464
#includeAll(vs/editor/common/controller/cursorEvents):
65+
#include(vs/platform/accessibility/common/accessibility): AccessibilitySupport
6566
#includeAll(vs/editor/common/config/editorOptions):
6667
#includeAll(vs/editor/browser/editorBrowser;editorCommon.=>;editorOptions.=>):
6768
#include(vs/editor/common/config/fontInfo): FontInfo, BareFontInfo
@@ -87,4 +88,4 @@ declare namespace monaco.worker {
8788

8889
}
8990

90-
//dtsv=2
91+
//dtsv=3

src/vs/editor/browser/editorBrowser.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -540,12 +540,12 @@ export interface ICodeEditor extends editorCommon.IEditor {
540540
setModel(model: ITextModel | null): void;
541541

542542
/**
543-
* @internal
543+
* Gets all the editor computed options.
544544
*/
545545
getOptions(): IComputedEditorOptions;
546546

547547
/**
548-
* @internal
548+
* Gets a specific editor option.
549549
*/
550550
getOption<T extends EditorOption>(id: T): FindComputedEditorOptionValueById<T>;
551551

0 commit comments

Comments
 (0)