提交 58588dcf 编写于 作者: J Johannes Rieken

Merge branch 'joh/next'

...@@ -7,28 +7,26 @@ import * as strings from 'vs/base/common/strings'; ...@@ -7,28 +7,26 @@ import * as strings from 'vs/base/common/strings';
import { sep } from 'vs/base/common/path'; import { sep } from 'vs/base/common/path';
import { IdleValue } from 'vs/base/common/async'; import { IdleValue } from 'vs/base/common/async';
let intlFileNameCollator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }>; const intlFileNameCollator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }> = new IdleValue(() => {
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
export function setFileNameComparer(collator: IdleValue<{ collator: Intl.Collator, collatorIsNumeric: boolean }>): void { return {
intlFileNameCollator = collator; collator: collator,
} collatorIsNumeric: collator.resolvedOptions().numeric
};
});
export function compareFileNames(one: string | null, other: string | null, caseSensitive = false): number { export function compareFileNames(one: string | null, other: string | null, caseSensitive = false): number {
if (intlFileNameCollator) { const a = one || '';
const a = one || ''; const b = other || '';
const b = other || ''; const result = intlFileNameCollator.getValue().collator.compare(a, b);
const result = intlFileNameCollator.getValue().collator.compare(a, b);
// Using the numeric option in the collator will
// Using the numeric option in the collator will // make compare(`foo1`, `foo01`) === 0. We must disambiguate.
// make compare(`foo1`, `foo01`) === 0. We must disambiguate. if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && a !== b) {
if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && a !== b) { return a < b ? -1 : 1;
return a < b ? -1 : 1;
}
return result;
} }
return noIntlCompareFileNames(one, other, caseSensitive); return result;
} }
const FileNameMatch = /^(.*?)(\.([^.]*))?$/; const FileNameMatch = /^(.*?)(\.([^.]*))?$/;
...@@ -54,46 +52,27 @@ export function noIntlCompareFileNames(one: string | null, other: string | null, ...@@ -54,46 +52,27 @@ export function noIntlCompareFileNames(one: string | null, other: string | null,
} }
export function compareFileExtensions(one: string | null, other: string | null): number { export function compareFileExtensions(one: string | null, other: string | null): number {
if (intlFileNameCollator) { const [oneName, oneExtension] = extractNameAndExtension(one);
const [oneName, oneExtension] = extractNameAndExtension(one); const [otherName, otherExtension] = extractNameAndExtension(other);
const [otherName, otherExtension] = extractNameAndExtension(other);
let result = intlFileNameCollator.getValue().collator.compare(oneExtension, otherExtension);
if (result === 0) {
// Using the numeric option in the collator will
// make compare(`foo1`, `foo01`) === 0. We must disambiguate.
if (intlFileNameCollator.getValue().collatorIsNumeric && oneExtension !== otherExtension) {
return oneExtension < otherExtension ? -1 : 1;
}
// Extensions are equal, compare filenames let result = intlFileNameCollator.getValue().collator.compare(oneExtension, otherExtension);
result = intlFileNameCollator.getValue().collator.compare(oneName, otherName);
if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && oneName !== otherName) { if (result === 0) {
return oneName < otherName ? -1 : 1; // Using the numeric option in the collator will
} // make compare(`foo1`, `foo01`) === 0. We must disambiguate.
if (intlFileNameCollator.getValue().collatorIsNumeric && oneExtension !== otherExtension) {
return oneExtension < otherExtension ? -1 : 1;
} }
return result; // Extensions are equal, compare filenames
} result = intlFileNameCollator.getValue().collator.compare(oneName, otherName);
return noIntlCompareFileExtensions(one, other);
}
function noIntlCompareFileExtensions(one: string | null, other: string | null): number {
const [oneName, oneExtension] = extractNameAndExtension(one && one.toLowerCase());
const [otherName, otherExtension] = extractNameAndExtension(other && other.toLowerCase());
if (oneExtension !== otherExtension) {
return oneExtension < otherExtension ? -1 : 1;
}
if (oneName === otherName) { if (intlFileNameCollator.getValue().collatorIsNumeric && result === 0 && oneName !== otherName) {
return 0; return oneName < otherName ? -1 : 1;
}
} }
return oneName < otherName ? -1 : 1; return result;
} }
function extractNameAndExtension(str?: string | null): [string, string] { function extractNameAndExtension(str?: string | null): [string, string] {
......
...@@ -3,23 +3,13 @@ ...@@ -3,23 +3,13 @@
* Licensed under the MIT License. See License.txt in the project root for license information. * Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/ *--------------------------------------------------------------------------------------------*/
import { compareFileNames, compareFileExtensions, setFileNameComparer } from 'vs/base/common/comparers'; import { compareFileNames, compareFileExtensions } from 'vs/base/common/comparers';
import * as assert from 'assert'; import * as assert from 'assert';
import { IdleValue } from 'vs/base/common/async';
suite('Comparers', () => { suite('Comparers', () => {
test('compareFileNames', () => { test('compareFileNames', () => {
// Setup Intl
setFileNameComparer(new IdleValue(() => {
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
return {
collator: collator,
collatorIsNumeric: collator.resolvedOptions().numeric
};
}));
assert(compareFileNames(null, null) === 0, 'null should be equal'); assert(compareFileNames(null, null) === 0, 'null should be equal');
assert(compareFileNames(null, 'abc') < 0, 'null should be come before real values'); assert(compareFileNames(null, 'abc') < 0, 'null should be come before real values');
assert(compareFileNames('', '') === 0, 'empty should be equal'); assert(compareFileNames('', '') === 0, 'empty should be equal');
...@@ -35,15 +25,6 @@ suite('Comparers', () => { ...@@ -35,15 +25,6 @@ suite('Comparers', () => {
test('compareFileExtensions', () => { test('compareFileExtensions', () => {
// Setup Intl
setFileNameComparer(new IdleValue(() => {
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
return {
collator: collator,
collatorIsNumeric: collator.resolvedOptions().numeric
};
}));
assert(compareFileExtensions(null, null) === 0, 'null should be equal'); assert(compareFileExtensions(null, null) === 0, 'null should be equal');
assert(compareFileExtensions(null, '.abc') < 0, 'null should come before real files'); assert(compareFileExtensions(null, '.abc') < 0, 'null should come before real files');
assert(compareFileExtensions(null, 'abc') < 0, 'null should come before real files without extension'); assert(compareFileExtensions(null, 'abc') < 0, 'null should come before real files without extension');
...@@ -66,4 +47,4 @@ suite('Comparers', () => { ...@@ -66,4 +47,4 @@ suite('Comparers', () => {
assert(compareFileExtensions('file2.ext2', 'file1.ext10') < 0, 'extensions with numbers should be in numerical order, not alphabetical order'); assert(compareFileExtensions('file2.ext2', 'file1.ext10') < 0, 'extensions with numbers should be in numerical order, not alphabetical order');
assert(compareFileExtensions('file.ext01', 'file.ext1') < 0, 'extensions with equal numbers should be in alphabetical order'); assert(compareFileExtensions('file.ext01', 'file.ext1') < 0, 'extensions with equal numbers should be in alphabetical order');
}); });
}); });
\ No newline at end of file
...@@ -44,11 +44,10 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace ...@@ -44,11 +44,10 @@ import { IWorkspaceContextService } from 'vs/platform/workspace/common/workspace
import { MenuService } from 'vs/platform/actions/common/menuService'; import { MenuService } from 'vs/platform/actions/common/menuService';
import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService'; import { IMarkerDecorationsService } from 'vs/editor/common/services/markersDecorationService';
import { MarkerDecorationsService } from 'vs/editor/common/services/markerDecorationsServiceImpl'; import { MarkerDecorationsService } from 'vs/editor/common/services/markerDecorationsServiceImpl';
import { ISuggestMemoryService, SuggestMemoryService } from 'vs/editor/contrib/suggest/suggestMemory';
import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility'; import { IAccessibilityService } from 'vs/platform/accessibility/common/accessibility';
import { BrowserAccessibilityService } from 'vs/platform/accessibility/common/accessibilityService'; import { BrowserAccessibilityService } from 'vs/platform/accessibility/common/accessibilityService';
import { ILayoutService } from 'vs/platform/layout/browser/layoutService'; import { ILayoutService } from 'vs/platform/layout/browser/layoutService';
import { ICodeLensCache, CodeLensCache } from 'vs/editor/contrib/codelens/codeLensCache'; import { getServices } from 'vs/platform/instantiation/common/extensions';
export interface IEditorOverrideServices { export interface IEditorOverrideServices {
[index: string]: any; [index: string]: any;
...@@ -100,6 +99,11 @@ export module StaticServices { ...@@ -100,6 +99,11 @@ export module StaticServices {
// Create a fresh service collection // Create a fresh service collection
let result = new ServiceCollection(); let result = new ServiceCollection();
// make sure to add all services that use `registerSingleton`
for (const { id, descriptor } of getServices()) {
result.set(id, descriptor);
}
// Initialize the service collection with the overrides // Initialize the service collection with the overrides
for (let serviceId in overrides) { for (let serviceId in overrides) {
if (overrides.hasOwnProperty(serviceId)) { if (overrides.hasOwnProperty(serviceId)) {
...@@ -157,10 +161,6 @@ export module StaticServices { ...@@ -157,10 +161,6 @@ export module StaticServices {
export const logService = define(ILogService, () => new NullLogService()); export const logService = define(ILogService, () => new NullLogService());
export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), resourceConfigurationService.get(o), logService.get(o))); export const editorWorkerService = define(IEditorWorkerService, (o) => new EditorWorkerServiceImpl(modelService.get(o), resourceConfigurationService.get(o), logService.get(o)));
export const suggestMemoryService = define(ISuggestMemoryService, (o) => new SuggestMemoryService(storageService.get(o), configurationService.get(o)));
export const codeLensCacheService = define(ICodeLensCache, (o) => new CodeLensCache(storageService.get(o)));
} }
export class DynamicStandaloneServices extends Disposable { export class DynamicStandaloneServices extends Disposable {
......
...@@ -6,10 +6,9 @@ ...@@ -6,10 +6,9 @@
import 'vs/workbench/browser/style'; import 'vs/workbench/browser/style';
import { localize } from 'vs/nls'; import { localize } from 'vs/nls';
import { setFileNameComparer } from 'vs/base/common/comparers';
import { Event, Emitter, setGlobalLeakWarningThreshold } from 'vs/base/common/event'; import { Event, Emitter, setGlobalLeakWarningThreshold } from 'vs/base/common/event';
import { addClasses, addClass, removeClasses } from 'vs/base/browser/dom'; import { addClasses, addClass, removeClasses } from 'vs/base/browser/dom';
import { runWhenIdle, IdleValue } from 'vs/base/common/async'; import { runWhenIdle } from 'vs/base/common/async';
import { getZoomLevel } from 'vs/base/browser/browser'; import { getZoomLevel } from 'vs/base/browser/browser';
import { mark } from 'vs/base/common/performance'; import { mark } from 'vs/base/common/performance';
import { onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors'; import { onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors';
...@@ -114,15 +113,6 @@ export class Workbench extends Layout { ...@@ -114,15 +113,6 @@ export class Workbench extends Layout {
// Configure emitter leak warning threshold // Configure emitter leak warning threshold
setGlobalLeakWarningThreshold(175); setGlobalLeakWarningThreshold(175);
// Setup Intl for comparers
setFileNameComparer(new IdleValue(() => {
const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
return {
collator: collator,
collatorIsNumeric: collator.resolvedOptions().numeric
};
}));
// ARIA // ARIA
setARIAContainer(document.body); setARIAContainer(document.body);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册