diff --git a/build/lib/compilation.js b/build/lib/compilation.js index 5e5cadf488d..7a741a0b545 100644 --- a/build/lib/compilation.js +++ b/build/lib/compilation.js @@ -189,7 +189,12 @@ class MonacoGenerator { // Nothing changed return null; } - return monacodts.run2('src', this._dtsFilesContents2); + let r = monacodts.run2('src', this._dtsFilesContents2); + if (!r && !this._isWatch) { + // The build must always be able to generate the monaco.d.ts + throw new Error(`monaco.d.ts genration error - Cannot continue`); + } + return r; } _log(message, ...rest) { util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest); diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index 991e24bf78a..0ad0d4a6248 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -242,7 +242,12 @@ class MonacoGenerator { return null; } - return monacodts.run2('src', this._dtsFilesContents2); + let r = monacodts.run2('src', this._dtsFilesContents2); + if (!r && !this._isWatch) { + // The build must always be able to generate the monaco.d.ts + throw new Error(`monaco.d.ts genration error - Cannot continue`); + } + return r; } private _log(message: any, ...rest: any[]): void { diff --git a/build/monaco/api.js b/build/monaco/api.js index cc9fc40e9f6..979da13b201 100644 --- a/build/monaco/api.js +++ b/build/monaco/api.js @@ -8,6 +8,7 @@ const fs = require("fs"); const ts = require("typescript"); const path = require("path"); const util = require("gulp-util"); +const dtsv = '1'; const tsfmt = require('../../tsfmt.json'); function log(message, ...rest) { util.log(util.colors.cyan('[monaco.d.ts]'), message, ...rest); @@ -21,6 +22,9 @@ function logErr(message, ...rest) { util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE); util.log(util.colors.red('[monaco.d.ts]'), message, ...rest); } +function _logErr(message, ...rest) { + util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest); +} function moduleIdToPath(out, moduleId) { if (/\.d\.ts/.test(moduleId)) { return path.join(SRC, moduleId); @@ -315,6 +319,7 @@ function generateDeclarationFile(recipe, sourceFileGetter) { let usageCounter = 0; let usageImports = []; let usage = []; + let failed = false; usage.push(`var a;`); usage.push(`var b;`); const generateUsageImport = (moduleId) => { @@ -323,13 +328,23 @@ function generateDeclarationFile(recipe, sourceFileGetter) { return importName; }; let enums = []; + let version = null; lines.forEach(line => { + if (failed) { + return; + } + let m0 = line.match(/^\/\/dtsv=(\d+)$/); + if (m0) { + version = m0[1]; + } let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); if (m1) { CURRENT_PROCESSING_RULE = line; let moduleId = m1[1]; const sourceFile = sourceFileGetter(moduleId); if (!sourceFile) { + _logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`); + failed = true; return; } const importName = generateUsageImport(moduleId); @@ -355,6 +370,8 @@ function generateDeclarationFile(recipe, sourceFileGetter) { let moduleId = m2[1]; const sourceFile = sourceFileGetter(moduleId); if (!sourceFile) { + _logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`); + failed = true; return; } const importName = generateUsageImport(moduleId); @@ -391,6 +408,18 @@ function generateDeclarationFile(recipe, sourceFileGetter) { } result.push(line); }); + if (failed) { + return null; + } + if (version !== dtsv) { + if (!version) { + _logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`); + } + else { + _logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`); + } + return null; + } let resultTxt = result.join(endl); resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri'); resultTxt = resultTxt.replace(/\bEvent { let filePath = path.normalize(moduleIdToPath(out, moduleId)); @@ -550,6 +584,10 @@ function execute() { OUTPUT_FILES[SRC_FILE_TO_EXPECTED_NAME[fileName]] = emitOutput.outputFiles[0].text; }); console.log(`Generating .d.ts took ${Date.now() - t1} ms`); - return run('src', OUTPUT_FILES); + let r = run('src', OUTPUT_FILES); + if (!r) { + throw new Error(`monaco.d.ts genration error - Cannot continue`); + } + return r; } exports.execute = execute; diff --git a/build/monaco/api.ts b/build/monaco/api.ts index b9016913fe2..df692e0235a 100644 --- a/build/monaco/api.ts +++ b/build/monaco/api.ts @@ -8,6 +8,8 @@ import * as ts from 'typescript'; import * as path from 'path'; import * as util from 'gulp-util'; +const dtsv = '1'; + const tsfmt = require('../../tsfmt.json'); function log(message: any, ...rest: any[]): void { @@ -24,6 +26,9 @@ function logErr(message: any, ...rest: any[]): void { util.log(util.colors.red('[monaco.d.ts]'), 'WHILE HANDLING RULE: ', CURRENT_PROCESSING_RULE); util.log(util.colors.red('[monaco.d.ts]'), message, ...rest); } +function _logErr(message: any, ...rest: any[]): void { + util.log(util.colors.red(`[monaco.d.ts]`), message, ...rest); +} function moduleIdToPath(out: string, moduleId: string): string { if (/\.d\.ts/.test(moduleId)) { @@ -362,7 +367,13 @@ function createReplacer(data: string): (str: string) => string { }; } -function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): [string, string, string] { +interface ITempResult { + result: string; + usageContent: string; + enums: string; +} + +function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGetter): ITempResult | null { const endl = /\r\n/.test(recipe) ? '\r\n' : '\n'; let lines = recipe.split(endl); @@ -372,6 +383,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet let usageImports: string[] = []; let usage: string[] = []; + let failed = false; + usage.push(`var a;`); usage.push(`var b;`); @@ -382,15 +395,27 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet }; let enums: string[] = []; + let version: string | null = null; lines.forEach(line => { + if (failed) { + return; + } + + let m0 = line.match(/^\/\/dtsv=(\d+)$/); + if (m0) { + version = m0[1]; + } + let m1 = line.match(/^\s*#include\(([^;)]*)(;[^)]*)?\)\:(.*)$/); if (m1) { CURRENT_PROCESSING_RULE = line; let moduleId = m1[1]; const sourceFile = sourceFileGetter(moduleId); if (!sourceFile) { + _logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`); + failed = true; return; } @@ -420,6 +445,8 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet let moduleId = m2[1]; const sourceFile = sourceFileGetter(moduleId); if (!sourceFile) { + _logErr(`gulp watch restart required. ${moduleId} was added to 'monaco.d.ts.recipe'.`); + failed = true; return; } @@ -461,6 +488,19 @@ function generateDeclarationFile(recipe: string, sourceFileGetter: SourceFileGet result.push(line); }); + if (failed) { + return null; + } + + if (version !== dtsv) { + if (!version) { + _logErr(`gulp watch restart required. 'monaco.d.ts.recipe' is written before versioning was introduced.`); + } else { + _logErr(`gulp watch restart required. 'monaco.d.ts.recipe' v${version} does not match runtime v${dtsv}.`); + } + return null; + } + let resultTxt = result.join(endl); resultTxt = resultTxt.replace(/\bURI\b/g, 'Uri'); resultTxt = resultTxt.replace(/\bEvent { @@ -566,7 +613,7 @@ export function run(out: string, inputFiles: { [file: string]: string; }): IMona return _run(sourceFileGetter); } -export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult { +export function run2(out: string, sourceFileMap: ISourceFileMap): IMonacoDeclarationResult | null { const sourceFileGetter = (moduleId: string): ts.SourceFile | null => { let filePath = path.normalize(moduleIdToPath(out, moduleId)); return sourceFileMap[filePath]; @@ -663,5 +710,9 @@ export function execute(): IMonacoDeclarationResult { }); console.log(`Generating .d.ts took ${Date.now() - t1} ms`); - return run('src', OUTPUT_FILES); + let r = run('src', OUTPUT_FILES); + if (!r) { + throw new Error(`monaco.d.ts genration error - Cannot continue`); + } + return r; } diff --git a/build/monaco/monaco.d.ts.recipe b/build/monaco/monaco.d.ts.recipe index 51ed5fbaeb4..8a59ce79b52 100644 --- a/build/monaco/monaco.d.ts.recipe +++ b/build/monaco/monaco.d.ts.recipe @@ -85,3 +85,5 @@ declare namespace monaco.worker { #includeAll(vs/editor/common/services/editorSimpleWorker;): } + +//dtsv=1 \ No newline at end of file diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index 3ed51a54a04..737b51181b6 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5542,3 +5542,5 @@ declare namespace monaco.worker { } } + +//dtsv=1 \ No newline at end of file