From 2f4f5718d84fb0623954b93a58a0a5e5746d3137 Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Fri, 11 Mar 2016 15:39:58 +0100 Subject: [PATCH] perf - less object and validation when creating URI objects --- src/vs/base/common/uri.ts | 80 +++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 33 deletions(-) diff --git a/src/vs/base/common/uri.ts b/src/vs/base/common/uri.ts index fc1fa92fa5c..906cd70cc8c 100644 --- a/src/vs/base/common/uri.ts +++ b/src/vs/base/common/uri.ts @@ -152,13 +152,14 @@ export default class URI { // ---- parse & validate ------------------------ public static parse(value: string): URI { - var ret = URI._parse(value); - ret = ret.with(undefined, - decodeURIComponent(ret.authority), - decodeURIComponent(ret.path), - decodeURIComponent(ret.query), - decodeURIComponent(ret.fragment)); - + const ret = new URI(); + const data = URI._parseComponents(value); + ret._scheme = data.scheme; + ret._authority = decodeURIComponent(data.authority); + ret._path = decodeURIComponent(data.path); + ret._query = decodeURIComponent(data.query); + ret._fragment = decodeURIComponent(data.fragment); + URI._validate(ret); return ret; } @@ -173,29 +174,39 @@ export default class URI { ? '/' + path : path; - var ret = URI._parse(path); - if (ret.scheme || ret.fragment || ret.query) { + const data = URI._parseComponents(path); + if (data.scheme || data.fragment || data.query) { throw new Error('Path contains a scheme, fragment or a query. Can not convert it to a file uri.'); } - ret = ret.with('file', undefined, - decodeURIComponent(ret.path[0] === '/' ? ret.path : '/' + ret.path), // path starts with slash - undefined, undefined); - + const ret = new URI(); + ret._scheme = 'file'; + ret._authority = data.authority; + ret._path = decodeURIComponent(data.path[0] === '/' ? data.path : '/' + data.path); // path starts with slash + ret._query = data.query; + ret._fragment = data.fragment; + URI._validate(ret); return ret; } - private static _parse(value: string): URI { - var ret = new URI(); - var match = URI._regexp.exec(value); + private static _parseComponents(value: string): UriComponents { + + const ret: UriComponents = { + scheme: URI._empty, + authority: URI._empty, + path: URI._empty, + query: URI._empty, + fragment: URI._empty, + }; + + const match = URI._regexp.exec(value); if (match) { - ret._scheme = match[2] || ret._scheme; - ret._authority = match[4] || ret._authority; - ret._path = match[5] || ret._path; - ret._query = match[7] || ret._query; - ret._fragment = match[9] || ret._fragment; + ret.scheme = match[2] || ret.scheme; + ret.authority = match[4] || ret.authority; + ret.path = match[5] || ret.path; + ret.query = match[7] || ret.query; + ret.fragment = match[9] || ret.fragment; } - URI._validate(ret); return ret; } @@ -284,7 +295,7 @@ export default class URI { } public toJSON(): any { - return { + return { scheme: this.scheme, authority: this.authority, path: this.path, @@ -298,25 +309,28 @@ export default class URI { static revive(data: any): URI { let result = new URI(); - result._scheme = ( data).scheme; - result._authority = ( data).authority; - result._path = ( data).path; - result._query = ( data).query; - result._fragment = ( data).fragment; - result._fsPath = ( data).fsPath; - result._formatted = (data).external; + result._scheme = ( data).scheme; + result._authority = ( data).authority; + result._path = ( data).path; + result._query = ( data).query; + result._fragment = ( data).fragment; + result._fsPath = ( data).fsPath; + result._formatted = (data).external; URI._validate(result); return result; } } -interface URIComponents { - $mid: number; +interface UriComponents { scheme: string; authority: string; path: string; - fsPath: string; query: string; fragment: string; +} + +interface UriState extends UriComponents { + $mid: number; + fsPath: string; external: string; } -- GitLab