Add logging for MD language features (#152792)

This verbose logging will help track down inefficient calling patterns (such as recomputing stuff)
This commit is contained in:
Matt Bierner
2022-06-21 14:18:36 -07:00
committed by GitHub
parent 4ae2e2ddfd
commit d5a75f2ceb
23 changed files with 105 additions and 52 deletions

View File

@@ -6,10 +6,10 @@ import * as vscode from 'vscode';
import { SkinnyTextDocument } from '../workspaceContents';
import { MdReferencesProvider } from './references';
export class MdDefinitionProvider implements vscode.DefinitionProvider {
export class MdVsCodeDefinitionProvider implements vscode.DefinitionProvider {
constructor(
private readonly referencesProvider: MdReferencesProvider
private readonly referencesProvider: MdReferencesProvider,
) { }
async provideDefinition(document: SkinnyTextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise<vscode.Definition | undefined> {
@@ -23,5 +23,5 @@ export function registerDefinitionSupport(
selector: vscode.DocumentSelector,
referencesProvider: MdReferencesProvider,
): vscode.Disposable {
return vscode.languages.registerDefinitionProvider(selector, new MdDefinitionProvider(referencesProvider));
return vscode.languages.registerDefinitionProvider(selector, new MdVsCodeDefinitionProvider(referencesProvider));
}

View File

@@ -7,6 +7,7 @@ import * as picomatch from 'picomatch';
import * as vscode from 'vscode';
import * as nls from 'vscode-nls';
import { CommandManager } from '../commandManager';
import { ILogger } from '../logging';
import { MdTableOfContentsProvider } from '../tableOfContents';
import { MdTableOfContentsWatcher } from '../test/tableOfContentsWatcher';
import { Delayer } from '../util/async';
@@ -310,6 +311,7 @@ export class DiagnosticManager extends Disposable {
private readonly reporter: DiagnosticReporter,
private readonly referencesProvider: MdReferencesProvider,
tocProvider: MdTableOfContentsProvider,
private readonly logger: ILogger,
delay = 300,
) {
super();
@@ -367,6 +369,8 @@ export class DiagnosticManager extends Disposable {
}
private async recomputeDiagnosticState(doc: SkinnyTextDocument, token: vscode.CancellationToken): Promise<{ diagnostics: readonly vscode.Diagnostic[]; links: readonly MdLink[]; config: DiagnosticOptions }> {
this.logger.verbose('DiagnosticManager', `recomputeDiagnosticState - ${doc.uri}`);
const config = this.configuration.getOptions(doc.uri);
if (!config.enabled) {
return { diagnostics: [], links: [], config };
@@ -642,6 +646,7 @@ export function registerDiagnosticSupport(
commandManager: CommandManager,
referenceProvider: MdReferencesProvider,
tocProvider: MdTableOfContentsProvider,
logger: ILogger,
): vscode.Disposable {
const configuration = new VSCodeDiagnosticConfiguration();
const manager = new DiagnosticManager(
@@ -650,7 +655,8 @@ export function registerDiagnosticSupport(
configuration,
new DiagnosticCollectionReporter(),
referenceProvider,
tocProvider);
tocProvider,
logger);
return vscode.Disposable.from(
configuration,
manager,

View File

@@ -14,6 +14,7 @@ import { Disposable } from '../util/dispose';
import { getUriForLinkWithKnownExternalScheme, isOfScheme, Schemes } from '../util/schemes';
import { MdWorkspaceContents, SkinnyTextDocument } from '../workspaceContents';
import { MdDocumentInfoCache } from '../util/workspaceCache';
import { ILogger } from '../logging';
const localize = nls.loadMessageBundle();
@@ -438,10 +439,14 @@ export class MdLinkProvider extends Disposable {
constructor(
tokenizer: IMdParser,
workspaceContents: MdWorkspaceContents,
logger: ILogger,
) {
super();
this.linkComputer = new MdLinkComputer(tokenizer);
this._linkCache = this._register(new MdDocumentInfoCache(workspaceContents, doc => this.linkComputer.getAllLinks(doc, noopToken)));
this._linkCache = this._register(new MdDocumentInfoCache(workspaceContents, doc => {
logger.verbose('LinkProvider', `compute - ${doc.uri}`);
return this.linkComputer.getAllLinks(doc, noopToken);
}));
}
public async getLinks(document: SkinnyTextDocument): Promise<{

View File

@@ -4,6 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import { ILogger } from '../logging';
import { MdTableOfContentsProvider, TocEntry } from '../tableOfContents';
import { SkinnyTextDocument } from '../workspaceContents';
@@ -17,9 +18,11 @@ export class MdDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
constructor(
private readonly tocProvider: MdTableOfContentsProvider,
private readonly logger: ILogger,
) { }
public async provideDocumentSymbolInformation(document: SkinnyTextDocument): Promise<vscode.SymbolInformation[]> {
this.logger.verbose('DocumentSymbolProvider', `provideDocumentSymbolInformation - ${document.uri}`);
const toc = await this.tocProvider.getForDocument(document);
return toc.entries.map(entry => this.toSymbolInformation(entry));
}
@@ -76,6 +79,7 @@ export class MdDocumentSymbolProvider implements vscode.DocumentSymbolProvider {
export function registerDocumentSymbolSupport(
selector: vscode.DocumentSelector,
tocProvider: MdTableOfContentsProvider,
logger: ILogger,
): vscode.Disposable {
return vscode.languages.registerDocumentSymbolProvider(selector, new MdDocumentSymbolProvider(tocProvider));
return vscode.languages.registerDocumentSymbolProvider(selector, new MdDocumentSymbolProvider(tocProvider, logger));
}

View File

@@ -4,14 +4,15 @@
*--------------------------------------------------------------------------------------------*/
import * as vscode from 'vscode';
import * as uri from 'vscode-uri';
import { ILogger } from '../logging';
import { IMdParser } from '../markdownEngine';
import { MdTableOfContentsProvider, TocEntry } from '../tableOfContents';
import { noopToken } from '../util/cancellation';
import { Disposable } from '../util/dispose';
import { looksLikeMarkdownPath } from '../util/file';
import { MdWorkspaceInfoCache } from '../util/workspaceCache';
import { MdWorkspaceContents, SkinnyTextDocument } from '../workspaceContents';
import { InternalHref, MdLink, MdLinkComputer } from './documentLinks';
import { MdWorkspaceInfoCache } from '../util/workspaceCache';
/**
@@ -71,6 +72,7 @@ export class MdReferencesProvider extends Disposable {
private readonly parser: IMdParser,
private readonly workspaceContents: MdWorkspaceContents,
private readonly tocProvider: MdTableOfContentsProvider,
private readonly logger: ILogger,
) {
super();
@@ -79,6 +81,8 @@ export class MdReferencesProvider extends Disposable {
}
public async getReferencesAtPosition(document: SkinnyTextDocument, position: vscode.Position, token: vscode.CancellationToken): Promise<MdReference[]> {
this.logger.verbose('ReferencesProvider', `getReferencesAtPosition: ${document.uri}`);
const toc = await this.tocProvider.get(document.uri);
if (token.isCancellationRequested) {
return [];
@@ -93,6 +97,8 @@ export class MdReferencesProvider extends Disposable {
}
public async getAllReferencesToFile(resource: vscode.Uri, _token: vscode.CancellationToken): Promise<MdReference[]> {
this.logger.verbose('ReferencesProvider', `getAllReferencesToFile: ${resource}`);
const allLinksInWorkspace = (await this._linkCache.values()).flat();
return Array.from(this.findAllLinksToFile(resource, allLinksInWorkspace, undefined));
}