提交 960205b8 编写于 作者: J Johannes Rieken

use ternary search tree for uris instead of paths, fyi @bpasero, @sandy081,...

use ternary search tree for uris instead of paths, fyi @bpasero, @sandy081, @roblourens, https://github.com/microsoft/vscode/issues/93368
上级 2127c70c
......@@ -6,6 +6,8 @@
import { URI } from 'vs/base/common/uri';
import { CharCode } from 'vs/base/common/charCode';
import { compareSubstringIgnoreCase, compare, compareSubstring } from 'vs/base/common/strings';
import { Schemas } from 'vs/base/common/network';
import { isLinux } from 'vs/base/common/platform';
/**
* @deprecated ES6: use `[...SetOrMap.values()]`
......@@ -154,7 +156,7 @@ const enum UriIteratorState {
export class UriIterator implements IKeyIterator<URI> {
private _pathIterator = new PathIterator(false);
private _pathIterator!: PathIterator;
private _value!: URI;
private _states: UriIteratorState[] = [];
private _stateIdx: number = 0;
......@@ -169,6 +171,10 @@ export class UriIterator implements IKeyIterator<URI> {
this._states.push(UriIteratorState.Authority);
}
if (this._value.path) {
//todo@jrieken the case-sensitive logic is copied form `resources.ts#hasToIgnoreCase`
// which cannot be used because it depends on this
const caseSensitive = key.scheme === Schemas.file && isLinux;
this._pathIterator = new PathIterator(false, caseSensitive);
this._pathIterator.reset(key.path);
if (this._pathIterator.value()) {
this._states.push(UriIteratorState.Path);
......
......@@ -317,7 +317,7 @@ export namespace DataUri {
export class ResourceGlobMatcher {
private readonly globalExpression: ParsedExpression;
private readonly expressionsByRoot: TernarySearchTree<string, { root: URI, expression: ParsedExpression }> = TernarySearchTree.forPaths<{ root: URI, expression: ParsedExpression }>();
private readonly expressionsByRoot: TernarySearchTree<URI, { root: URI, expression: ParsedExpression }> = TernarySearchTree.forUris<{ root: URI, expression: ParsedExpression }>();
constructor(
globalExpression: IExpression,
......@@ -325,12 +325,12 @@ export class ResourceGlobMatcher {
) {
this.globalExpression = parse(globalExpression);
for (const expression of rootExpressions) {
this.expressionsByRoot.set(expression.root.toString(), { root: expression.root, expression: parse(expression.expression) });
this.expressionsByRoot.set(expression.root, { root: expression.root, expression: parse(expression.expression) });
}
}
matches(resource: URI): boolean {
const rootExpression = this.expressionsByRoot.findSubstr(resource.toString());
const rootExpression = this.expressionsByRoot.findSubstr(resource);
if (rootExpression) {
const path = relativePath(rootExpression.root, resource);
if (path && !!rootExpression.expression(path)) {
......
......@@ -182,21 +182,21 @@ export class FileService extends Disposable implements IFileService {
const stat = await provider.stat(resource);
let trie: TernarySearchTree<string, boolean> | undefined;
let trie: TernarySearchTree<URI, boolean> | undefined;
return this.toFileStat(provider, resource, stat, undefined, !!resolveMetadata, (stat, siblings) => {
// lazy trie to check for recursive resolving
if (!trie) {
trie = TernarySearchTree.forPaths<true>();
trie.set(resource.toString(), true);
trie = TernarySearchTree.forUris<true>();
trie.set(resource, true);
if (isNonEmptyArray(resolveTo)) {
resolveTo.forEach(uri => trie!.set(uri.toString(), true));
resolveTo.forEach(uri => trie!.set(uri, true));
}
}
// check for recursive resolving
if (Boolean(trie.findSuperstr(stat.resource.toString()) || trie.get(stat.resource.toString()))) {
if (Boolean(trie.findSuperstr(stat.resource) || trie.get(stat.resource))) {
return true;
}
......
......@@ -144,7 +144,7 @@ export interface IWorkspaceFolder extends IWorkspaceFolderData {
export class Workspace implements IWorkspace {
private _foldersMap: TernarySearchTree<string, WorkspaceFolder> = TernarySearchTree.forPaths<WorkspaceFolder>();
private _foldersMap: TernarySearchTree<URI, WorkspaceFolder> = TernarySearchTree.forUris<WorkspaceFolder>();
private _folders!: WorkspaceFolder[];
constructor(
......@@ -191,13 +191,13 @@ export class Workspace implements IWorkspace {
scheme: resource.scheme,
authority: resource.authority,
path: resource.path
}).toString()) || null;
})) || null;
}
private updateFoldersMap(): void {
this._foldersMap = TernarySearchTree.forPaths<WorkspaceFolder>();
this._foldersMap = TernarySearchTree.forUris<WorkspaceFolder>();
for (const folder of this.folders) {
this._foldersMap.set(folder.uri.toString(), folder);
this._foldersMap.set(folder.uri, folder);
}
}
......
......@@ -116,7 +116,7 @@ class ExtHostWorkspaceImpl extends Workspace {
}
private readonly _workspaceFolders: vscode.WorkspaceFolder[] = [];
private readonly _structure = TernarySearchTree.forPaths<vscode.WorkspaceFolder>();
private readonly _structure = TernarySearchTree.forUris<vscode.WorkspaceFolder>();
constructor(id: string, private _name: string, folders: vscode.WorkspaceFolder[], configuration: URI | null, private _isUntitled: boolean) {
super(id, folders.map(f => new WorkspaceFolder(f)), configuration);
......@@ -124,7 +124,7 @@ class ExtHostWorkspaceImpl extends Workspace {
// setup the workspace folder data structure
folders.forEach(folder => {
this._workspaceFolders.push(folder);
this._structure.set(folder.uri.toString(), folder);
this._structure.set(folder.uri, folder);
});
}
......@@ -141,15 +141,15 @@ class ExtHostWorkspaceImpl extends Workspace {
}
getWorkspaceFolder(uri: URI, resolveParent?: boolean): vscode.WorkspaceFolder | undefined {
if (resolveParent && this._structure.get(uri.toString())) {
if (resolveParent && this._structure.get(uri)) {
// `uri` is a workspace folder so we check for its parent
uri = dirname(uri);
}
return this._structure.findSubstr(uri.toString());
return this._structure.findSubstr(uri);
}
resolveWorkspaceFolder(uri: URI): vscode.WorkspaceFolder | undefined {
return this._structure.get(uri.toString());
return this._structure.get(uri);
}
}
......
......@@ -696,7 +696,7 @@ export class SearchResult extends Disposable {
private _folderMatches: FolderMatchWithResource[] = [];
private _otherFilesMatch: FolderMatch | null = null;
private _folderMatchesMap: TernarySearchTree<string, FolderMatchWithResource> = TernarySearchTree.forPaths<FolderMatchWithResource>();
private _folderMatchesMap: TernarySearchTree<URI, FolderMatchWithResource> = TernarySearchTree.forUris<FolderMatchWithResource>();
private _showHighlights: boolean = false;
private _query: ITextQuery | null = null;
......@@ -741,7 +741,7 @@ export class SearchResult extends Disposable {
.then(() => this._hasRemovedResults = false);
this._rangeHighlightDecorations.removeHighlightRange();
this._folderMatchesMap = TernarySearchTree.forPaths<FolderMatchWithResource>();
this._folderMatchesMap = TernarySearchTree.forUris<FolderMatchWithResource>();
if (!query) {
return;
......@@ -751,14 +751,14 @@ export class SearchResult extends Disposable {
.map(fq => fq.folder)
.map((resource, index) => this.createFolderMatchWithResource(resource, resource.toString(), index, query));
this._folderMatches.forEach(fm => this._folderMatchesMap.set(fm.resource.toString(), fm));
this._folderMatches.forEach(fm => this._folderMatchesMap.set(fm.resource, fm));
this._otherFilesMatch = this.createOtherFilesFolderMatch('otherFiles', this._folderMatches.length + 1, query);
this._query = query;
}
private onModelAdded(model: ITextModel): void {
const folderMatch = this._folderMatchesMap.findSubstr(model.uri.toString());
const folderMatch = this._folderMatchesMap.findSubstr(model.uri);
if (folderMatch) {
folderMatch.bindModel(model);
}
......@@ -924,7 +924,7 @@ export class SearchResult extends Disposable {
}
private getFolderMatch(resource: URI): FolderMatch {
const folderMatch = this._folderMatchesMap.findSubstr(resource.toString());
const folderMatch = this._folderMatchesMap.findSubstr(resource);
return folderMatch ? folderMatch : this._otherFilesMatch!;
}
......@@ -963,7 +963,7 @@ export class SearchResult extends Disposable {
private disposeMatches(): void {
this.folderMatches().forEach(folderMatch => folderMatch.dispose());
this._folderMatches = [];
this._folderMatchesMap = TernarySearchTree.forPaths<FolderMatchWithResource>();
this._folderMatchesMap = TernarySearchTree.forUris<FolderMatchWithResource>();
this._rangeHighlightDecorations.removeHighlightRange();
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册