diff --git a/extensions/markdown-language-features/src/extension.ts b/extensions/markdown-language-features/src/extension.ts index 7c719527a29..9932530cd9d 100644 --- a/extensions/markdown-language-features/src/extension.ts +++ b/extensions/markdown-language-features/src/extension.ts @@ -6,13 +6,13 @@ import * as vscode from 'vscode'; import { CommandManager } from './commandManager'; import * as commands from './commands/index'; -import LinkProvider from './languageFeatures/documentLinkProvider'; -import MDDocumentSymbolProvider from './languageFeatures/documentSymbolProvider'; +import { MdLinkProvider } from './languageFeatures/documentLinkProvider'; +import { MdDocumentSymbolProvider } from './languageFeatures/documentSymbolProvider'; import { registerDropIntoEditor } from './languageFeatures/dropIntoEditor'; -import MarkdownFoldingProvider from './languageFeatures/foldingProvider'; -import { PathCompletionProvider } from './languageFeatures/pathCompletions'; -import MarkdownSmartSelect from './languageFeatures/smartSelect'; -import MarkdownWorkspaceSymbolProvider from './languageFeatures/workspaceSymbolProvider'; +import { MdFoldingProvider } from './languageFeatures/foldingProvider'; +import { MdPathCompletionProvider } from './languageFeatures/pathCompletions'; +import { MdSmartSelect } from './languageFeatures/smartSelect'; +import { MdWorkspaceSymbolProvider } from './languageFeatures/workspaceSymbolProvider'; import { Logger } from './logger'; import { MarkdownEngine } from './markdownEngine'; import { getMarkdownExtensionContributions } from './markdownExtensions'; @@ -35,7 +35,7 @@ export function activate(context: vscode.ExtensionContext) { const logger = new Logger(); const contentProvider = new MarkdownContentProvider(engine, context, cspArbiter, contributions, logger); - const symbolProvider = new MDDocumentSymbolProvider(engine); + const symbolProvider = new MdDocumentSymbolProvider(engine); const previewManager = new MarkdownPreviewManager(contentProvider, logger, contributions, engine); context.subscriptions.push(previewManager); @@ -51,18 +51,18 @@ export function activate(context: vscode.ExtensionContext) { } function registerMarkdownLanguageFeatures( - symbolProvider: MDDocumentSymbolProvider, + symbolProvider: MdDocumentSymbolProvider, engine: MarkdownEngine ): vscode.Disposable { const selector: vscode.DocumentSelector = { language: 'markdown', scheme: '*' }; return vscode.Disposable.from( vscode.languages.registerDocumentSymbolProvider(selector, symbolProvider), - vscode.languages.registerDocumentLinkProvider(selector, new LinkProvider(engine)), - vscode.languages.registerFoldingRangeProvider(selector, new MarkdownFoldingProvider(engine)), - vscode.languages.registerSelectionRangeProvider(selector, new MarkdownSmartSelect(engine)), - vscode.languages.registerWorkspaceSymbolProvider(new MarkdownWorkspaceSymbolProvider(symbolProvider)), - PathCompletionProvider.register(selector, engine), + vscode.languages.registerDocumentLinkProvider(selector, new MdLinkProvider(engine)), + vscode.languages.registerFoldingRangeProvider(selector, new MdFoldingProvider(engine)), + vscode.languages.registerSelectionRangeProvider(selector, new MdSmartSelect(engine)), + vscode.languages.registerWorkspaceSymbolProvider(new MdWorkspaceSymbolProvider(symbolProvider)), + MdPathCompletionProvider.register(selector, engine), ); } diff --git a/extensions/markdown-language-features/src/languageFeatures/documentLinkProvider.ts b/extensions/markdown-language-features/src/languageFeatures/documentLinkProvider.ts index 123dbc17f65..b2007da7b5e 100644 --- a/extensions/markdown-language-features/src/languageFeatures/documentLinkProvider.ts +++ b/extensions/markdown-language-features/src/languageFeatures/documentLinkProvider.ts @@ -138,7 +138,7 @@ function isLinkInsideCode(code: CodeInDocument, link: vscode.DocumentLink) { code.inline.some(position => position.intersection(link.range)); } -export default class LinkProvider implements vscode.DocumentLinkProvider { +export class MdLinkProvider implements vscode.DocumentLinkProvider { constructor( private readonly engine: MarkdownEngine ) { } @@ -179,7 +179,7 @@ export default class LinkProvider implements vscode.DocumentLinkProvider { ): vscode.DocumentLink[] { const results: vscode.DocumentLink[] = []; - const definitions = LinkProvider.getDefinitions(text, document); + const definitions = MdLinkProvider.getDefinitions(text, document); for (const match of text.matchAll(referenceLinkPattern)) { let linkStart: vscode.Position; let linkEnd: vscode.Position; diff --git a/extensions/markdown-language-features/src/languageFeatures/documentSymbolProvider.ts b/extensions/markdown-language-features/src/languageFeatures/documentSymbolProvider.ts index 065602ea368..0df8f19aed9 100644 --- a/extensions/markdown-language-features/src/languageFeatures/documentSymbolProvider.ts +++ b/extensions/markdown-language-features/src/languageFeatures/documentSymbolProvider.ts @@ -13,7 +13,7 @@ interface MarkdownSymbol { readonly children: vscode.DocumentSymbol[]; } -export default class MDDocumentSymbolProvider implements vscode.DocumentSymbolProvider { +export class MdDocumentSymbolProvider implements vscode.DocumentSymbolProvider { constructor( private readonly engine: MarkdownEngine diff --git a/extensions/markdown-language-features/src/languageFeatures/foldingProvider.ts b/extensions/markdown-language-features/src/languageFeatures/foldingProvider.ts index 305649e753e..e30107633d0 100644 --- a/extensions/markdown-language-features/src/languageFeatures/foldingProvider.ts +++ b/extensions/markdown-language-features/src/languageFeatures/foldingProvider.ts @@ -14,7 +14,7 @@ interface MarkdownItTokenWithMap extends Token { map: [number, number]; } -export default class MarkdownFoldingProvider implements vscode.FoldingRangeProvider { +export class MdFoldingProvider implements vscode.FoldingRangeProvider { constructor( private readonly engine: MarkdownEngine diff --git a/extensions/markdown-language-features/src/languageFeatures/pathCompletions.ts b/extensions/markdown-language-features/src/languageFeatures/pathCompletions.ts index 4cf0a682337..178a4997a2a 100644 --- a/extensions/markdown-language-features/src/languageFeatures/pathCompletions.ts +++ b/extensions/markdown-language-features/src/languageFeatures/pathCompletions.ts @@ -8,7 +8,7 @@ import * as vscode from 'vscode'; import { MarkdownEngine } from '../markdownEngine'; import { TableOfContents } from '../tableOfContentsProvider'; import { resolveUriToMarkdownFile } from '../util/openDocumentLink'; -import LinkProvider from './documentLinkProvider'; +import { MdLinkProvider } from './documentLinkProvider'; enum CompletionContextKind { /** `[...](|)` */ @@ -75,10 +75,10 @@ function tryDecodeUriComponent(str: string): string { } } -export class PathCompletionProvider implements vscode.CompletionItemProvider { +export class MdPathCompletionProvider implements vscode.CompletionItemProvider { public static register(selector: vscode.DocumentSelector, engine: MarkdownEngine): vscode.Disposable { - return vscode.languages.registerCompletionItemProvider(selector, new PathCompletionProvider(engine), '.', '/', '#'); + return vscode.languages.registerCompletionItemProvider(selector, new MdPathCompletionProvider(engine), '.', '/', '#'); } constructor( @@ -230,7 +230,7 @@ export class PathCompletionProvider implements vscode.CompletionItemProvider { const insertionRange = new vscode.Range(context.linkTextStartPosition, position); const replacementRange = new vscode.Range(insertionRange.start, position.translate({ characterDelta: context.linkSuffix.length })); - const definitions = LinkProvider.getDefinitions(document.getText(), document); + const definitions = MdLinkProvider.getDefinitions(document.getText(), document); for (const def of definitions) { yield { kind: vscode.CompletionItemKind.Reference, diff --git a/extensions/markdown-language-features/src/languageFeatures/smartSelect.ts b/extensions/markdown-language-features/src/languageFeatures/smartSelect.ts index fdeab7990e2..4ac9b4a3f1b 100644 --- a/extensions/markdown-language-features/src/languageFeatures/smartSelect.ts +++ b/extensions/markdown-language-features/src/languageFeatures/smartSelect.ts @@ -11,7 +11,7 @@ interface MarkdownItTokenWithMap extends Token { map: [number, number]; } -export default class MarkdownSmartSelect implements vscode.SelectionRangeProvider { +export class MdSmartSelect implements vscode.SelectionRangeProvider { constructor( private readonly engine: MarkdownEngine diff --git a/extensions/markdown-language-features/src/languageFeatures/workspaceSymbolProvider.ts b/extensions/markdown-language-features/src/languageFeatures/workspaceSymbolProvider.ts index e016e9a87d4..755c2dd7c3d 100644 --- a/extensions/markdown-language-features/src/languageFeatures/workspaceSymbolProvider.ts +++ b/extensions/markdown-language-features/src/languageFeatures/workspaceSymbolProvider.ts @@ -8,7 +8,7 @@ import { SkinnyTextDocument, SkinnyTextLine } from '../tableOfContentsProvider'; import { Disposable } from '../util/dispose'; import { isMarkdownFile } from '../util/file'; import { Lazy, lazy } from '../util/lazy'; -import MDDocumentSymbolProvider from './documentSymbolProvider'; +import { MdDocumentSymbolProvider } from './documentSymbolProvider'; export interface WorkspaceMarkdownDocumentProvider { getAllMarkdownDocuments(): Thenable>; @@ -128,13 +128,13 @@ class VSCodeWorkspaceMarkdownDocumentProvider extends Disposable implements Work } } -export default class MarkdownWorkspaceSymbolProvider extends Disposable implements vscode.WorkspaceSymbolProvider { +export class MdWorkspaceSymbolProvider extends Disposable implements vscode.WorkspaceSymbolProvider { private readonly _symbolCache = new Map>>(); private _symbolCachePopulated: boolean = false; public constructor( - private _symbolProvider: MDDocumentSymbolProvider, + private _symbolProvider: MdDocumentSymbolProvider, private _workspaceMarkdownDocumentProvider: WorkspaceMarkdownDocumentProvider = new VSCodeWorkspaceMarkdownDocumentProvider() ) { super(); diff --git a/extensions/markdown-language-features/src/markdownEngine.ts b/extensions/markdown-language-features/src/markdownEngine.ts index 4c3ea214621..61b8e3072c2 100644 --- a/extensions/markdown-language-features/src/markdownEngine.ts +++ b/extensions/markdown-language-features/src/markdownEngine.ts @@ -180,7 +180,7 @@ export class MarkdownEngine { return engine.parse(text.replace(UNICODE_NEWLINE_REGEX, ''), {}); } - public resetSlugCount(): void { + private resetSlugCount(): void { this._slugCount = new Map(); } diff --git a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts index da0b479b4cf..7bf3f2b2abb 100644 --- a/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts +++ b/extensions/markdown-language-features/src/test/documentLinkProvider.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import LinkProvider from '../languageFeatures/documentLinkProvider'; +import { MdLinkProvider } from '../languageFeatures/documentLinkProvider'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; import { joinLines, noopToken } from './util'; @@ -16,7 +16,7 @@ const testFile = vscode.Uri.joinPath(vscode.workspace.workspaceFolders![0].uri, function getLinksForFile(fileContents: string) { const doc = new InMemoryDocument(testFile, fileContents); - const provider = new LinkProvider(createNewMarkdownEngine()); + const provider = new MdLinkProvider(createNewMarkdownEngine()); return provider.provideDocumentLinks(doc, noopToken); } diff --git a/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts b/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts index cf4326d825e..f53df9f31f3 100644 --- a/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts +++ b/extensions/markdown-language-features/src/test/documentSymbolProvider.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import SymbolProvider from '../languageFeatures/documentSymbolProvider'; +import { MdDocumentSymbolProvider } from '../languageFeatures/documentSymbolProvider'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; @@ -16,7 +16,7 @@ const testFileName = vscode.Uri.file('test.md'); function getSymbolsForFile(fileContents: string) { const doc = new InMemoryDocument(testFileName, fileContents); - const provider = new SymbolProvider(createNewMarkdownEngine()); + const provider = new MdDocumentSymbolProvider(createNewMarkdownEngine()); return provider.provideDocumentSymbols(doc); } diff --git a/extensions/markdown-language-features/src/test/foldingProvider.test.ts b/extensions/markdown-language-features/src/test/foldingProvider.test.ts index 486e68115fa..e8374ba275b 100644 --- a/extensions/markdown-language-features/src/test/foldingProvider.test.ts +++ b/extensions/markdown-language-features/src/test/foldingProvider.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import MarkdownFoldingProvider from '../languageFeatures/foldingProvider'; +import { MdFoldingProvider } from '../languageFeatures/foldingProvider'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; @@ -192,6 +192,6 @@ fa async function getFoldsForDocument(contents: string) { const doc = new InMemoryDocument(testFileName, contents); - const provider = new MarkdownFoldingProvider(createNewMarkdownEngine()); + const provider = new MdFoldingProvider(createNewMarkdownEngine()); return await provider.provideFoldingRanges(doc, {}, new vscode.CancellationTokenSource().token); } diff --git a/extensions/markdown-language-features/src/test/pathCompletion.test.ts b/extensions/markdown-language-features/src/test/pathCompletion.test.ts index fac55bbf00d..cce19874350 100644 --- a/extensions/markdown-language-features/src/test/pathCompletion.test.ts +++ b/extensions/markdown-language-features/src/test/pathCompletion.test.ts @@ -6,7 +6,7 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import { PathCompletionProvider } from '../languageFeatures/pathCompletions'; +import { MdPathCompletionProvider } from '../languageFeatures/pathCompletions'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; import { CURSOR, getCursorPositions, joinLines, noopToken } from './util'; @@ -18,7 +18,7 @@ function workspaceFile(...segments: string[]): vscode.Uri { function getCompletionsAtCursor(resource: vscode.Uri, fileContents: string) { const doc = new InMemoryDocument(resource, fileContents); - const provider = new PathCompletionProvider(createNewMarkdownEngine()); + const provider = new MdPathCompletionProvider(createNewMarkdownEngine()); const cursorPositions = getCursorPositions(fileContents, doc); return provider.provideCompletionItems(doc, cursorPositions[0], noopToken, { triggerCharacter: undefined, diff --git a/extensions/markdown-language-features/src/test/smartSelect.test.ts b/extensions/markdown-language-features/src/test/smartSelect.test.ts index aa04d3fc619..a5e585dc91d 100644 --- a/extensions/markdown-language-features/src/test/smartSelect.test.ts +++ b/extensions/markdown-language-features/src/test/smartSelect.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import * as vscode from 'vscode'; -import MarkdownSmartSelect from '../languageFeatures/smartSelect'; +import { MdSmartSelect } from '../languageFeatures/smartSelect'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; import { CURSOR, getCursorPositions, joinLines } from './util'; @@ -17,6 +17,7 @@ suite('markdown.SmartSelect', () => { const ranges = await getSelectionRangesForDocument(`Hel${CURSOR}lo`); assertNestedLineNumbersEqual(ranges![0], [0, 0]); }); + test('Smart select multi-line paragraph', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -26,11 +27,13 @@ suite('markdown.SmartSelect', () => { )); assertNestedLineNumbersEqual(ranges![0], [0, 2]); }); + test('Smart select paragraph', async () => { const ranges = await getSelectionRangesForDocument(`Many of the core components and extensions to ${CURSOR}VS Code live in their own repositories on GitHub. For example, the [node debug adapter](https://github.com/microsoft/vscode-node-debug) and the [mono debug adapter](https://github.com/microsoft/vscode-mono-debug) have their own repositories. For a complete list, please visit the [Related Projects](https://github.com/microsoft/vscode/wiki/Related-Projects) page on our [wiki](https://github.com/microsoft/vscode/wiki).`); assertNestedLineNumbersEqual(ranges![0], [0, 0]); }); + test('Smart select html block', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -40,6 +43,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 2]); }); + test('Smart select header on header line', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -49,6 +53,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 1]); }); + test('Smart select single word w grandparent header on text line', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -59,6 +64,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [2, 2], [1, 2]); }); + test('Smart select html block w parent header', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -69,6 +75,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [1, 1], [1, 3], [0, 3]); }); + test('Smart select fenced code block', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -78,6 +85,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 2]); }); + test('Smart select list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -87,6 +95,7 @@ suite('markdown.SmartSelect', () => { `- item 4`)); assertNestedLineNumbersEqual(ranges![0], [1, 1], [0, 3]); }); + test('Smart select list with fenced code block', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -99,6 +108,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [1, 3], [0, 5]); }); + test('Smart select multi cursor', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -112,6 +122,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 0], [0, 5]); assertNestedLineNumbersEqual(ranges![1], [4, 4], [0, 5]); }); + test('Smart select nested block quotes', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -121,6 +132,7 @@ suite('markdown.SmartSelect', () => { `>> item 4`)); assertNestedLineNumbersEqual(ranges![0], [2, 2], [2, 3], [0, 3]); }); + test('Smart select multi nested block quotes', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -130,6 +142,7 @@ suite('markdown.SmartSelect', () => { `>>>> item 4`)); assertNestedLineNumbersEqual(ranges![0], [2, 2], [2, 3], [1, 3], [0, 3]); }); + test('Smart select subheader content', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -141,6 +154,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [3, 3], [2, 3], [1, 3], [0, 3]); }); + test('Smart select subheader line', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -152,6 +166,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [2, 3], [1, 3], [0, 3]); }); + test('Smart select blank line', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -163,6 +178,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [1, 3], [0, 3]); }); + test('Smart select line between paragraphs', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -172,10 +188,12 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 2]); }); + test('Smart select empty document', async () => { const ranges = await getSelectionRangesForDocument(``, [new vscode.Position(0, 0)]); assert.strictEqual(ranges!.length, 0); }); + test('Smart select fenced code block then list then subheader content then subheader then header content then header', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -194,6 +212,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [4, 6], [3, 9], [3, 10], [2, 10], [1, 10], [0, 10]); }); + test('Smart select list with one element without selecting child subheader', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -207,6 +226,7 @@ suite('markdown.SmartSelect', () => { `# main header 2`)); assertNestedLineNumbersEqual(ranges![0], [2, 2], [2, 3], [1, 3], [1, 6], [0, 6]); }); + test('Smart select content under header then subheaders and their content', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -221,6 +241,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [0, 3], [0, 6]); }); + test('Smart select last blockquote element under header then subheaders and their content', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -239,6 +260,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [5, 5], [4, 5], [2, 5], [1, 7], [1, 10], [0, 10]); }); + test('Smart select content of subheader then subheader then content of main header then main header', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -263,6 +285,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [11, 11], [9, 12], [9, 17], [8, 17], [1, 17], [0, 17]); }); + test('Smart select last line content of subheader then subheader then content of main header then main header', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -287,6 +310,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [17, 17], [14, 17], [13, 17], [9, 17], [8, 17], [1, 17], [0, 17]); }); + test('Smart select last line content after content of subheader then subheader then content of main header then main header', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -311,6 +335,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [17, 17], [14, 17], [13, 17], [9, 17], [8, 17], [1, 17], [0, 17]); }); + test('Smart select fenced code block then list then rest of content', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -335,6 +360,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [9, 11], [8, 12], [8, 12], [7, 17], [1, 17], [0, 17]); }); + test('Smart select fenced code block then list then rest of content on fenced line', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -359,6 +385,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [8, 12], [7, 17], [1, 17], [0, 17]); }); + test('Smart select without multiple ranges', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -370,6 +397,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [3, 3], [3, 4], [1, 4], [0, 4]); }); + test('Smart select on second level of a list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -383,6 +411,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [5, 5], [1, 5], [0, 5], [0, 6]); }); + test('Smart select on third level of a list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -396,6 +425,7 @@ suite('markdown.SmartSelect', () => { `* level 0`)); assertNestedLineNumbersEqual(ranges![0], [3, 3], [3, 4], [2, 4], [1, 6], [0, 6], [0, 7]); }); + test('Smart select level 2 then level 1', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -405,6 +435,7 @@ suite('markdown.SmartSelect', () => { `* level 1`)); assertNestedLineNumbersEqual(ranges![0], [1, 1], [1, 2], [0, 2], [0, 3]); }); + test('Smart select last list item', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -414,6 +445,7 @@ suite('markdown.SmartSelect', () => { `- level ${CURSOR}1`)); assertNestedLineNumbersEqual(ranges![0], [3, 3], [0, 3]); }); + test('Smart select without multiple ranges', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -425,6 +457,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [3, 3], [3, 4], [1, 4], [0, 4]); }); + test('Smart select on second level of a list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -438,6 +471,7 @@ suite('markdown.SmartSelect', () => { assertNestedLineNumbersEqual(ranges![0], [5, 5], [1, 5], [0, 5], [0, 6]); }); + test('Smart select on third level of a list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -451,6 +485,7 @@ suite('markdown.SmartSelect', () => { `* level 0`)); assertNestedLineNumbersEqual(ranges![0], [3, 3], [3, 4], [2, 4], [1, 6], [0, 6], [0, 7]); }); + test('Smart select level 2 then level 1', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -460,6 +495,7 @@ suite('markdown.SmartSelect', () => { `* level 1`)); assertNestedLineNumbersEqual(ranges![0], [1, 1], [1, 2], [0, 2], [0, 3]); }); + test('Smart select bold', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -467,6 +503,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 13, 0, 30], [0, 11, 0, 32], [0, 0, 0, 41]); }); + test('Smart select link', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -474,6 +511,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 18, 0, 46], [0, 17, 0, 47], [0, 11, 0, 47], [0, 0, 0, 56]); }); + test('Smart select brackets', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -481,6 +519,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 12, 0, 26], [0, 11, 0, 27], [0, 11, 0, 47], [0, 0, 0, 56]); }); + test('Smart select brackets under header in list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -495,6 +534,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [6, 14, 6, 28], [6, 13, 6, 29], [6, 13, 6, 49], [6, 0, 6, 58], [5, 0, 7, 6], [4, 0, 7, 6], [1, 0, 7, 6], [0, 0, 7, 6]); }); + test('Smart select link under header in list', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -509,6 +549,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [6, 20, 6, 48], [6, 19, 6, 49], [6, 13, 6, 49], [6, 0, 6, 58], [5, 0, 7, 6], [4, 0, 7, 6], [1, 0, 7, 6], [0, 0, 7, 6]); }); + test('Smart select bold within list where multiple bold elements exists', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -523,6 +564,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [6, 22, 6, 45], [6, 20, 6, 47], [6, 0, 6, 60], [5, 0, 7, 6], [4, 0, 7, 6], [1, 0, 7, 6], [0, 0, 7, 6]); }); + test('Smart select link in paragraph with multiple links', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -530,6 +572,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 123, 0, 140], [0, 122, 0, 141], [0, 122, 0, 191], [0, 0, 0, 283]); }); + test('Smart select bold link', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -537,6 +580,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 3, 0, 22], [0, 2, 0, 23], [0, 2, 0, 43], [0, 2, 0, 43], [0, 0, 0, 45], [0, 0, 0, 45]); }); + test('Smart select inline code block', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -544,6 +588,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 2, 0, 22], [0, 1, 0, 23], [0, 0, 0, 24]); }); + test('Smart select link with inline code block text', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -551,6 +596,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 2, 0, 22], [0, 1, 0, 23], [0, 1, 0, 23], [0, 0, 0, 24], [0, 0, 0, 44], [0, 0, 0, 44]); }); + test('Smart select italic', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -558,6 +604,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 1, 0, 25], [0, 0, 0, 26], [0, 0, 0, 26]); }); + test('Smart select italic link', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -565,6 +612,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 2, 0, 21], [0, 1, 0, 22], [0, 1, 0, 42], [0, 1, 0, 42], [0, 0, 0, 43], [0, 0, 0, 43]); }); + test('Smart select italic on end', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -572,6 +620,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 1, 0, 28], [0, 0, 0, 29], [0, 0, 0, 29]); }); + test('Smart select italic then bold', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -579,6 +628,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 25, 0, 48], [0, 24, 0, 49], [0, 13, 0, 60], [0, 11, 0, 62], [0, 0, 0, 73]); }); + test('Smart select bold then italic', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -586,6 +636,7 @@ suite('markdown.SmartSelect', () => { )); assertNestedRangesEqual(ranges![0], [0, 27, 0, 48], [0, 25, 0, 50], [0, 12, 0, 63], [0, 11, 0, 64], [0, 0, 0, 75]); }); + test('Third level header from release notes', async () => { const ranges = await getSelectionRangesForDocument( joinLines( @@ -623,8 +674,10 @@ suite('markdown.SmartSelect', () => { ); assertNestedRangesEqual(ranges![0], [27, 0, 27, 201], [26, 0, 29, 70], [25, 0, 29, 70], [24, 0, 29, 70], [23, 0, 29, 70], [10, 0, 29, 70], [9, 0, 29, 70]); }); + }); + function assertNestedLineNumbersEqual(range: vscode.SelectionRange, ...expectedRanges: [number, number][]) { const lineage = getLineage(range); assert.strictEqual(lineage.length, expectedRanges.length, `expected depth: ${expectedRanges.length}, but was ${lineage.length} ${getValues(lineage)}`); @@ -666,7 +719,7 @@ function assertLineNumbersEqual(selectionRange: vscode.SelectionRange, startLine async function getSelectionRangesForDocument(contents: string, pos?: vscode.Position[]) { const doc = new InMemoryDocument(testFileName, contents); - const provider = new MarkdownSmartSelect(createNewMarkdownEngine()); + const provider = new MdSmartSelect(createNewMarkdownEngine()); const positions = pos ? pos : getCursorPositions(contents, doc); return await provider.provideSelectionRanges(doc, positions, new vscode.CancellationTokenSource().token); } diff --git a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts index d1369361b50..6d1e0eaa660 100644 --- a/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts +++ b/extensions/markdown-language-features/src/test/workspaceSymbolProvider.test.ts @@ -6,17 +6,17 @@ import * as assert from 'assert'; import 'mocha'; import * as vscode from 'vscode'; -import MDDocumentSymbolProvider from '../languageFeatures/documentSymbolProvider'; -import MarkdownWorkspaceSymbolProvider, { WorkspaceMarkdownDocumentProvider } from '../languageFeatures/workspaceSymbolProvider'; +import { MdDocumentSymbolProvider } from '../languageFeatures/documentSymbolProvider'; +import { MdWorkspaceSymbolProvider, WorkspaceMarkdownDocumentProvider } from '../languageFeatures/workspaceSymbolProvider'; import { createNewMarkdownEngine } from './engine'; import { InMemoryDocument } from './inMemoryDocument'; -const symbolProvider = new MDDocumentSymbolProvider(createNewMarkdownEngine()); +const symbolProvider = new MdDocumentSymbolProvider(createNewMarkdownEngine()); suite('markdown.WorkspaceSymbolProvider', () => { test('Should not return anything for empty workspace', async () => { - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider([])); + const provider = new MdWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider([])); assert.deepStrictEqual(await provider.provideWorkspaceSymbols(''), []); }); @@ -24,7 +24,7 @@ suite('markdown.WorkspaceSymbolProvider', () => { test('Should return symbols from workspace with one markdown file', async () => { const testFileName = vscode.Uri.file('test.md'); - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider([ + const provider = new MdWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider([ new InMemoryDocument(testFileName, `# header1\nabc\n## header2`) ])); @@ -42,7 +42,7 @@ suite('markdown.WorkspaceSymbolProvider', () => { files.push(new InMemoryDocument(testFileName, `# common\nabc\n## header${i}`)); } - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider(files)); + const provider = new MdWorkspaceSymbolProvider(symbolProvider, new InMemoryWorkspaceMarkdownDocumentProvider(files)); const symbols = await provider.provideWorkspaceSymbols(''); assert.strictEqual(symbols.length, fileNameCount * 2); @@ -55,7 +55,7 @@ suite('markdown.WorkspaceSymbolProvider', () => { new InMemoryDocument(testFileName, `# header1`, 1 /* version */) ]); - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); + const provider = new MdWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); assert.strictEqual((await provider.provideWorkspaceSymbols('')).length, 1); @@ -74,7 +74,7 @@ suite('markdown.WorkspaceSymbolProvider', () => { new InMemoryDocument(testFileName, `# header1`) ]); - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); + const provider = new MdWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); assert.strictEqual((await provider.provideWorkspaceSymbols('')).length, 1); // delete file @@ -90,7 +90,7 @@ suite('markdown.WorkspaceSymbolProvider', () => { new InMemoryDocument(testFileName, `# header1`) ]); - const provider = new MarkdownWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); + const provider = new MdWorkspaceSymbolProvider(symbolProvider, workspaceFileProvider); assert.strictEqual((await provider.provideWorkspaceSymbols('')).length, 1); // Creat file