mirror of
https://github.com/microsoft/vscode.git
synced 2026-04-26 19:44:25 +01:00
Add a mechanism to debug TM grammars
This commit is contained in:
@@ -30,6 +30,7 @@ import { IConfigurationService } from 'vs/platform/configuration/common/configur
|
||||
import { IValidGrammarDefinition, IValidEmbeddedLanguagesMap, IValidTokenTypeMap } from 'vs/workbench/services/textMate/common/TMScopeRegistry';
|
||||
import { TMGrammarFactory } from 'vs/workbench/services/textMate/common/TMGrammarFactory';
|
||||
import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader';
|
||||
import { IProgressService, ProgressLocation } from 'vs/platform/progress/common/progress';
|
||||
|
||||
export abstract class AbstractTextMateService extends Disposable implements ITextMateService {
|
||||
public _serviceBrand: undefined;
|
||||
@@ -41,6 +42,9 @@ export abstract class AbstractTextMateService extends Disposable implements ITex
|
||||
private readonly _createdModes: string[];
|
||||
private readonly _encounteredLanguages: boolean[];
|
||||
|
||||
private _debugMode: boolean;
|
||||
private _debugModePrintFunc: (str: string) => void;
|
||||
|
||||
private _grammarDefinitions: IValidGrammarDefinition[] | null;
|
||||
private _grammarFactory: TMGrammarFactory | null;
|
||||
private _tokenizersRegistrations: IDisposable[];
|
||||
@@ -54,7 +58,8 @@ export abstract class AbstractTextMateService extends Disposable implements ITex
|
||||
@INotificationService private readonly _notificationService: INotificationService,
|
||||
@ILogService private readonly _logService: ILogService,
|
||||
@IConfigurationService private readonly _configurationService: IConfigurationService,
|
||||
@IStorageService private readonly _storageService: IStorageService
|
||||
@IStorageService private readonly _storageService: IStorageService,
|
||||
@IProgressService private readonly _progressService: IProgressService
|
||||
) {
|
||||
super();
|
||||
this._styleElement = dom.createStyleSheet();
|
||||
@@ -62,6 +67,9 @@ export abstract class AbstractTextMateService extends Disposable implements ITex
|
||||
this._createdModes = [];
|
||||
this._encounteredLanguages = [];
|
||||
|
||||
this._debugMode = false;
|
||||
this._debugModePrintFunc = () => { };
|
||||
|
||||
this._grammarDefinitions = null;
|
||||
this._grammarFactory = null;
|
||||
this._tokenizersRegistrations = [];
|
||||
@@ -174,6 +182,46 @@ export abstract class AbstractTextMateService extends Disposable implements ITex
|
||||
});
|
||||
}
|
||||
|
||||
public startDebugMode(printFn: (str: string) => void, onStop: () => void): void {
|
||||
if (this._debugMode) {
|
||||
this._notificationService.error(nls.localize('alreadyDebugging', "Already Logging."));
|
||||
return;
|
||||
}
|
||||
|
||||
this._debugModePrintFunc = printFn;
|
||||
this._debugMode = true;
|
||||
|
||||
if (this._debugMode) {
|
||||
this._progressService.withProgress(
|
||||
{
|
||||
location: ProgressLocation.Notification,
|
||||
buttons: [nls.localize('stop', "Stop")]
|
||||
},
|
||||
(progress) => {
|
||||
progress.report({
|
||||
message: nls.localize('progress1', "Preparing to log TM Grammar parsing. Press Stop when finished.")
|
||||
});
|
||||
|
||||
return this._getVSCodeOniguruma().then((vscodeOniguruma) => {
|
||||
vscodeOniguruma.setDefaultDebugCall(true);
|
||||
progress.report({
|
||||
message: nls.localize('progress2', "Now logging TM Grammar parsing. Press Stop when finished.")
|
||||
});
|
||||
return new Promise<void>((resolve, reject) => { });
|
||||
});
|
||||
},
|
||||
(choice) => {
|
||||
this._getVSCodeOniguruma().then((vscodeOniguruma) => {
|
||||
this._debugModePrintFunc = () => { };
|
||||
this._debugMode = false;
|
||||
vscodeOniguruma.setDefaultDebugCall(false);
|
||||
onStop();
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private _canCreateGrammarFactory(): boolean {
|
||||
// Check if extension point is ready
|
||||
return (this._grammarDefinitions ? true : false);
|
||||
@@ -354,7 +402,13 @@ export abstract class AbstractTextMateService extends Disposable implements ITex
|
||||
|
||||
private async _doGetVSCodeOniguruma(): Promise<typeof import('vscode-oniguruma')> {
|
||||
const [vscodeOniguruma, wasm] = await Promise.all([import('vscode-oniguruma'), this._loadVSCodeOnigurumWASM()]);
|
||||
await vscodeOniguruma.loadWASM(wasm);
|
||||
const options = {
|
||||
data: wasm,
|
||||
print: (str: string) => {
|
||||
this._debugModePrintFunc(str);
|
||||
}
|
||||
};
|
||||
await vscodeOniguruma.loadWASM(options);
|
||||
return vscodeOniguruma;
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ import { IWorkbenchThemeService } from 'vs/workbench/services/themes/common/work
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
import { IStorageService } from 'vs/platform/storage/common/storage';
|
||||
import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader';
|
||||
import { IProgressService } from 'vs/platform/progress/common/progress';
|
||||
|
||||
export class TextMateService extends AbstractTextMateService {
|
||||
|
||||
@@ -23,9 +24,10 @@ export class TextMateService extends AbstractTextMateService {
|
||||
@INotificationService notificationService: INotificationService,
|
||||
@ILogService logService: ILogService,
|
||||
@IConfigurationService configurationService: IConfigurationService,
|
||||
@IStorageService storageService: IStorageService
|
||||
@IStorageService storageService: IStorageService,
|
||||
@IProgressService progressService: IProgressService
|
||||
) {
|
||||
super(modeService, themeService, extensionResourceLoaderService, notificationService, logService, configurationService, storageService);
|
||||
super(modeService, themeService, extensionResourceLoaderService, notificationService, logService, configurationService, storageService, progressService);
|
||||
}
|
||||
|
||||
protected async _loadVSCodeOnigurumWASM(): Promise<Response | ArrayBuffer> {
|
||||
|
||||
Reference in New Issue
Block a user