'use strict'; import { TextDocument, TextEditor, Uri } from 'vscode'; abstract class Comparer { abstract equals(lhs: T, rhs: T): boolean; } class UriComparer extends Comparer { equals(lhs: Uri, rhs: Uri) { if (!lhs && !rhs) return true; if ((lhs && !rhs) || (!lhs && rhs)) return false; return lhs.scheme === rhs.scheme && lhs.fsPath === rhs.fsPath; } } class TextDocumentComparer extends Comparer { equals(lhs: TextDocument, rhs: TextDocument) { if (!lhs && !rhs) return true; if ((lhs && !rhs) || (!lhs && rhs)) return false; return uriComparer.equals(lhs.uri, rhs.uri); } } class TextEditorComparer extends Comparer { equals(lhs: TextEditor, rhs: TextEditor, options: { useId: boolean, usePosition: boolean } = { useId: false, usePosition: false }) { if (!lhs && !rhs) return true; if ((lhs && !rhs) || (!lhs && rhs)) return false; if (options.usePosition && (lhs.viewColumn !== rhs.viewColumn)) return false; if (options.useId && (!lhs.document || !rhs.document)) { if ((lhs as any)._id !== (rhs as any)._id) return false; return true; } return textDocumentComparer.equals(lhs.document, rhs.document); } } const textDocumentComparer = new TextDocumentComparer(); const textEditorComparer = new TextEditorComparer(); const uriComparer = new UriComparer(); export { textDocumentComparer as TextDocumentComparer, textEditorComparer as TextEditorComparer, uriComparer as UriComparer };