diff --git a/Gulpfile.ts b/Gulpfile.ts index e8bd7a990fe..0044ff32339 100644 --- a/Gulpfile.ts +++ b/Gulpfile.ts @@ -143,7 +143,7 @@ const es2017LibrarySource = [ const es2017LibrarySourceMap = es2017LibrarySource.map(source => ({ target: "lib." + source, sources: ["header.d.ts", source] })); -const es2018LibrarySource = []; +const es2018LibrarySource = ["es2018.regexp.d.ts"]; const es2018LibrarySourceMap = es2018LibrarySource.map(source => ({ target: "lib." + source, sources: ["header.d.ts", source] })); diff --git a/Jakefile.js b/Jakefile.js index 9935b6b0f13..e10517de00c 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -206,7 +206,7 @@ var es2017LibrarySourceMap = es2017LibrarySource.map(function (source) { return { target: "lib." + source, sources: ["header.d.ts", source] }; }); -var es2018LibrarySource = []; +var es2018LibrarySource = ["es2018.regexp.d.ts"]; var es2018LibrarySourceMap = es2018LibrarySource.map(function (source) { return { target: "lib." + source, sources: ["header.d.ts", source] }; diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index f61efe57cac..89e6961e455 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -151,6 +151,7 @@ namespace ts { "es2017.string": "lib.es2017.string.d.ts", "es2017.intl": "lib.es2017.intl.d.ts", "es2017.typedarrays": "lib.es2017.typedarrays.d.ts", + "es2018.regexp": "lib.es2018.regexp.d.ts", "esnext.array": "lib.esnext.array.d.ts", "esnext.asynciterable": "lib.esnext.asynciterable.d.ts", "esnext.promise": "lib.esnext.promise.d.ts", diff --git a/src/harness/unittests/commandLineParsing.ts b/src/harness/unittests/commandLineParsing.ts index 050178f63b3..eebbf4a7a24 100644 --- a/src/harness/unittests/commandLineParsing.ts +++ b/src/harness/unittests/commandLineParsing.ts @@ -60,7 +60,7 @@ namespace ts { assertParseResult(["--lib", "es5,invalidOption", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", category: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.code, @@ -263,7 +263,7 @@ namespace ts { assertParseResult(["--lib", "es5,", "es7", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", category: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.code, @@ -283,7 +283,7 @@ namespace ts { assertParseResult(["--lib", "es5, ", "es7", "0.ts"], { errors: [{ - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", category: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.category, code: ts.Diagnostics.Argument_for_0_option_must_be_Colon_1.code, diff --git a/src/harness/unittests/convertCompilerOptionsFromJson.ts b/src/harness/unittests/convertCompilerOptionsFromJson.ts index 6a88f2ba67e..90bd12d4120 100644 --- a/src/harness/unittests/convertCompilerOptionsFromJson.ts +++ b/src/harness/unittests/convertCompilerOptionsFromJson.ts @@ -266,7 +266,7 @@ namespace ts { file: undefined, start: 0, length: 0, - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category }] @@ -297,7 +297,7 @@ namespace ts { file: undefined, start: 0, length: 0, - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category }] @@ -328,7 +328,7 @@ namespace ts { file: undefined, start: 0, length: 0, - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category }] @@ -359,7 +359,7 @@ namespace ts { file: undefined, start: 0, length: 0, - messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", + messageText: "Argument for '--lib' option must be: 'es5', 'es6', 'es2015', 'es7', 'es2016', 'es2017', 'es2018', 'esnext', 'dom', 'dom.iterable', 'webworker', 'scripthost', 'es2015.core', 'es2015.collection', 'es2015.generator', 'es2015.iterable', 'es2015.promise', 'es2015.proxy', 'es2015.reflect', 'es2015.symbol', 'es2015.symbol.wellknown', 'es2016.array.include', 'es2017.object', 'es2017.sharedmemory', 'es2017.string', 'es2017.intl', 'es2017.typedarrays', 'es2018.regexp', 'esnext.array', 'esnext.asynciterable', 'esnext.promise'.", code: Diagnostics.Argument_for_0_option_must_be_Colon_1.code, category: Diagnostics.Argument_for_0_option_must_be_Colon_1.category }] diff --git a/src/lib/es2018.d.ts b/src/lib/es2018.d.ts index 90f6d4931f4..4f9d4d3a56c 100644 --- a/src/lib/es2018.d.ts +++ b/src/lib/es2018.d.ts @@ -1 +1,2 @@ /// +/// \ No newline at end of file diff --git a/src/lib/es2018.regexp.d.ts b/src/lib/es2018.regexp.d.ts new file mode 100644 index 00000000000..85e1bc909b5 --- /dev/null +++ b/src/lib/es2018.regexp.d.ts @@ -0,0 +1,11 @@ +interface RegExpMatchArray { + groups?: { + [key: string]: string + } +} + +interface RegExpExecArray { + groups?: { + [key: string]: string + } +} \ No newline at end of file diff --git a/tests/baselines/reference/useRegexpGroups.js b/tests/baselines/reference/useRegexpGroups.js new file mode 100644 index 00000000000..999cb432af2 --- /dev/null +++ b/tests/baselines/reference/useRegexpGroups.js @@ -0,0 +1,28 @@ +//// [useRegexpGroups.ts] +let re = /(?\d{4})-(?\d{2})-(?\d{2})/u; +let result = re.exec("2015-01-02"); + +let date = result[0]; + +let year1 = result.groups.year; +let year2 = result[1]; + +let month1 = result.groups.month; +let month2 = result[2]; + +let day1 = result.groups.day; +let day2 = result[3]; + +let foo = "foo".match(/(?foo)/)!.groups.foo; + +//// [useRegexpGroups.js] +var re = /(?\d{4})-(?\d{2})-(?\d{2})/u; +var result = re.exec("2015-01-02"); +var date = result[0]; +var year1 = result.groups.year; +var year2 = result[1]; +var month1 = result.groups.month; +var month2 = result[2]; +var day1 = result.groups.day; +var day2 = result[3]; +var foo = "foo".match(/(?foo)/).groups.foo; diff --git a/tests/baselines/reference/useRegexpGroups.symbols b/tests/baselines/reference/useRegexpGroups.symbols new file mode 100644 index 00000000000..ebfa86f6c2c --- /dev/null +++ b/tests/baselines/reference/useRegexpGroups.symbols @@ -0,0 +1,51 @@ +=== tests/cases/conformance/es2018/useRegexpGroups.ts === +let re = /(?\d{4})-(?\d{2})-(?\d{2})/u; +>re : Symbol(re, Decl(useRegexpGroups.ts, 0, 3)) + +let result = re.exec("2015-01-02"); +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) +>re.exec : Symbol(RegExp.exec, Decl(lib.es5.d.ts, --, --)) +>re : Symbol(re, Decl(useRegexpGroups.ts, 0, 3)) +>exec : Symbol(RegExp.exec, Decl(lib.es5.d.ts, --, --)) + +let date = result[0]; +>date : Symbol(date, Decl(useRegexpGroups.ts, 3, 3)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) + +let year1 = result.groups.year; +>year1 : Symbol(year1, Decl(useRegexpGroups.ts, 5, 3)) +>result.groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) +>groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) + +let year2 = result[1]; +>year2 : Symbol(year2, Decl(useRegexpGroups.ts, 6, 3)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) + +let month1 = result.groups.month; +>month1 : Symbol(month1, Decl(useRegexpGroups.ts, 8, 3)) +>result.groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) +>groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) + +let month2 = result[2]; +>month2 : Symbol(month2, Decl(useRegexpGroups.ts, 9, 3)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) + +let day1 = result.groups.day; +>day1 : Symbol(day1, Decl(useRegexpGroups.ts, 11, 3)) +>result.groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) +>groups : Symbol(RegExpExecArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) + +let day2 = result[3]; +>day2 : Symbol(day2, Decl(useRegexpGroups.ts, 12, 3)) +>result : Symbol(result, Decl(useRegexpGroups.ts, 1, 3)) + +let foo = "foo".match(/(?foo)/)!.groups.foo; +>foo : Symbol(foo, Decl(useRegexpGroups.ts, 14, 3)) +>"foo".match(/(?foo)/)!.groups : Symbol(RegExpMatchArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) +>"foo".match : Symbol(String.match, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>match : Symbol(String.match, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --)) +>groups : Symbol(RegExpMatchArray.groups, Decl(lib.es2018.regexp.d.ts, --, --)) + diff --git a/tests/baselines/reference/useRegexpGroups.types b/tests/baselines/reference/useRegexpGroups.types new file mode 100644 index 00000000000..7e4ab00ed42 --- /dev/null +++ b/tests/baselines/reference/useRegexpGroups.types @@ -0,0 +1,74 @@ +=== tests/cases/conformance/es2018/useRegexpGroups.ts === +let re = /(?\d{4})-(?\d{2})-(?\d{2})/u; +>re : RegExp +>/(?\d{4})-(?\d{2})-(?\d{2})/u : RegExp + +let result = re.exec("2015-01-02"); +>result : RegExpExecArray +>re.exec("2015-01-02") : RegExpExecArray +>re.exec : (string: string) => RegExpExecArray +>re : RegExp +>exec : (string: string) => RegExpExecArray +>"2015-01-02" : "2015-01-02" + +let date = result[0]; +>date : string +>result[0] : string +>result : RegExpExecArray +>0 : 0 + +let year1 = result.groups.year; +>year1 : string +>result.groups.year : string +>result.groups : { [key: string]: string; } +>result : RegExpExecArray +>groups : { [key: string]: string; } +>year : string + +let year2 = result[1]; +>year2 : string +>result[1] : string +>result : RegExpExecArray +>1 : 1 + +let month1 = result.groups.month; +>month1 : string +>result.groups.month : string +>result.groups : { [key: string]: string; } +>result : RegExpExecArray +>groups : { [key: string]: string; } +>month : string + +let month2 = result[2]; +>month2 : string +>result[2] : string +>result : RegExpExecArray +>2 : 2 + +let day1 = result.groups.day; +>day1 : string +>result.groups.day : string +>result.groups : { [key: string]: string; } +>result : RegExpExecArray +>groups : { [key: string]: string; } +>day : string + +let day2 = result[3]; +>day2 : string +>result[3] : string +>result : RegExpExecArray +>3 : 3 + +let foo = "foo".match(/(?foo)/)!.groups.foo; +>foo : string +>"foo".match(/(?foo)/)!.groups.foo : string +>"foo".match(/(?foo)/)!.groups : { [key: string]: string; } +>"foo".match(/(?foo)/)! : RegExpMatchArray +>"foo".match(/(?foo)/) : RegExpMatchArray +>"foo".match : { (regexp: string | RegExp): RegExpMatchArray; (matcher: { [Symbol.match](string: string): RegExpMatchArray; }): RegExpMatchArray; } +>"foo" : "foo" +>match : { (regexp: string | RegExp): RegExpMatchArray; (matcher: { [Symbol.match](string: string): RegExpMatchArray; }): RegExpMatchArray; } +>/(?foo)/ : RegExp +>groups : { [key: string]: string; } +>foo : string + diff --git a/tests/cases/conformance/es2018/useRegexpGroups.ts b/tests/cases/conformance/es2018/useRegexpGroups.ts new file mode 100644 index 00000000000..65d3be9fbfd --- /dev/null +++ b/tests/cases/conformance/es2018/useRegexpGroups.ts @@ -0,0 +1,18 @@ +// @target: es5 +// @lib: es6,es2018 + +let re = /(?\d{4})-(?\d{2})-(?\d{2})/u; +let result = re.exec("2015-01-02"); + +let date = result[0]; + +let year1 = result.groups.year; +let year2 = result[1]; + +let month1 = result.groups.month; +let month2 = result[2]; + +let day1 = result.groups.day; +let day2 = result[3]; + +let foo = "foo".match(/(?foo)/)!.groups.foo; \ No newline at end of file