search.ts 4.2 KB
Newer Older
J
Joao Moreno 已提交
1 2 3 4 5 6 7
/*---------------------------------------------------------------------------------------------
 *  Copyright (c) Microsoft Corporation. All rights reserved.
 *  Licensed under the MIT License. See License.txt in the project root for license information.
 *--------------------------------------------------------------------------------------------*/

'use strict';

8
import { TPromise } from 'vs/base/common/winjs.base';
B
Benjamin Pasero 已提交
9
import { IExpression } from 'vs/base/common/glob';
10
import { IProgress, ILineMatch, IPatternInfo, IFileSearchStats, ISearchEngineStats } from 'vs/platform/search/common/search';
C
Christof Marti 已提交
11
import { ITelemetryData } from 'vs/platform/telemetry/common/telemetry';
12
import { Event } from 'vs/base/common/event';
J
Joao Moreno 已提交
13

R
Rob Lourens 已提交
14 15 16
export interface IFolderSearch {
	folder: string;
	excludePattern?: IExpression;
17
	includePattern?: IExpression;
R
Rob Lourens 已提交
18
	fileEncoding?: string;
19
	disregardIgnoreFiles?: boolean;
R
Rob Lourens 已提交
20 21
}

J
Joao Moreno 已提交
22
export interface IRawSearch {
R
Rob Lourens 已提交
23
	folderQueries: IFolderSearch[];
24
	ignoreSymlinks?: boolean;
J
Joao Moreno 已提交
25 26
	extraFiles?: string[];
	filePattern?: string;
B
Benjamin Pasero 已提交
27 28
	excludePattern?: IExpression;
	includePattern?: IExpression;
J
Joao Moreno 已提交
29 30
	contentPattern?: IPatternInfo;
	maxResults?: number;
31
	exists?: boolean;
32 33
	sortByScore?: boolean;
	cacheKey?: string;
J
Joao Moreno 已提交
34
	maxFilesize?: number;
35
	useRipgrep?: boolean;
R
Rob Lourens 已提交
36
	disregardIgnoreFiles?: boolean;
J
Joao Moreno 已提交
37 38
}

C
Christof Marti 已提交
39 40 41 42 43
export interface ITelemetryEvent {
	eventName: string;
	data: ITelemetryData;
}

J
Joao Moreno 已提交
44
export interface IRawSearchService {
45 46
	fileSearch(search: IRawSearch): Event<ISerializedSearchProgressItem | ISerializedSearchComplete>;
	textSearch(search: IRawSearch): Event<ISerializedSearchProgressItem | ISerializedSearchComplete>;
47
	clearCache(cacheKey: string): TPromise<void>;
J
Joao Moreno 已提交
48 49
}

50
export interface IRawFileMatch {
C
Christof Marti 已提交
51
	base?: string;
52
	relativePath: string;
53
	basename: string;
C
Christof Marti 已提交
54
	size?: number;
55 56 57
}

export interface ISearchEngine<T> {
58
	search: (onResult: (matches: T) => void, onProgress: (progress: IProgress) => void, done: (error: Error, complete: ISearchEngineSuccess) => void) => void;
J
Joao Moreno 已提交
59 60 61
	cancel: () => void;
}

62 63
export interface ISerializedSearchSuccess {
	type: 'success';
J
Joao Moreno 已提交
64
	limitHit: boolean;
65 66 67 68 69 70
	stats: IFileSearchStats;
}

export interface ISearchEngineSuccess {
	limitHit: boolean;
	stats: ISearchEngineStats;
J
Joao Moreno 已提交
71 72
}

73 74
export interface ISerializedSearchError {
	type: 'error';
J
Joao Moreno 已提交
75 76 77 78
	error: {
		message: string,
		stack: string
	};
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
}

export type ISerializedSearchComplete = ISerializedSearchSuccess | ISerializedSearchError;

export function isSerializedSearchComplete(arg: ISerializedSearchProgressItem | ISerializedSearchComplete): arg is ISerializedSearchComplete {
	if ((arg as any).type === 'error') {
		return true;
	} else if ((arg as any).type === 'success') {
		return true;
	} else {
		return false;
	}
}

export function isSerializedSearchSuccess(arg: ISerializedSearchComplete): arg is ISerializedSearchSuccess {
	return arg.type === 'success';
}

J
Joao Moreno 已提交
97
export interface ISerializedFileMatch {
98
	path: string;
J
Joao Moreno 已提交
99
	lineMatches?: ILineMatch[];
100
	numMatches?: number;
J
Joao Moreno 已提交
101 102
}

C
chrmarti 已提交
103
// Type of the possible values for progress calls from the engine
104
export type ISerializedSearchProgressItem = ISerializedFileMatch | ISerializedFileMatch[] | IProgress;
R
Rob Lourens 已提交
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
export type IFileSearchProgressItem = IRawFileMatch | IRawFileMatch[] | IProgress;


export class FileMatch implements ISerializedFileMatch {
	path: string;
	lineMatches: LineMatch[];

	constructor(path: string) {
		this.path = path;
		this.lineMatches = [];
	}

	addMatch(lineMatch: LineMatch): void {
		this.lineMatches.push(lineMatch);
	}

	serialize(): ISerializedFileMatch {
		let lineMatches: ILineMatch[] = [];
		let numMatches = 0;

		for (let i = 0; i < this.lineMatches.length; i++) {
			numMatches += this.lineMatches[i].offsetAndLengths.length;
			lineMatches.push(this.lineMatches[i].serialize());
		}

		return {
			path: this.path,
			lineMatches,
			numMatches
		};
	}
}

export class LineMatch implements ILineMatch {
	preview: string;
	lineNumber: number;
	offsetAndLengths: number[][];

	constructor(preview: string, lineNumber: number) {
		this.preview = preview.replace(/(\r|\n)*$/, '');
		this.lineNumber = lineNumber;
		this.offsetAndLengths = [];
	}

	addMatch(offset: number, length: number): void {
		this.offsetAndLengths.push([offset, length]);
	}

	serialize(): ILineMatch {
		const result = {
			preview: this.preview,
			lineNumber: this.lineNumber,
			offsetAndLengths: this.offsetAndLengths
		};

		return result;
	}
}