diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index 2ff32171a3d..70c1dbee6ac 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -831,34 +831,46 @@ module ts { if (token === SyntaxKind.SlashToken || token === SyntaxKind.SlashEqualsToken) { var p = tokenPos + 1; var inEscape = false; - var inClass = false; + var inCharacterClass = false; while (true) { + // If we've hit EOF without closing off the regex, + // simply return the token we originally parsed. if (p >= len) { return token; } + var ch = text.charCodeAt(p); + + // Line breaks are not permissible in the middle of a RegExp. if (isLineBreak(ch)) { return token; } + if (inEscape) { + // Parsing an escape character; + // reset the flag and just advance to the next char. inEscape = false; } - else if (ch === CharacterCodes.slash) { + else if (ch === CharacterCodes.slash && !inCharacterClass) { + // A slash within a character class is permissible, + // but in general it signals the end of the regexp literal. break; } else if (ch === CharacterCodes.openBracket) { - inClass = true; + inCharacterClass = true; } else if (ch === CharacterCodes.backslash) { inEscape = true; } else if (ch === CharacterCodes.closeBracket) { - inClass = false; + inCharacterClass = false; } p++; } p++; - while (isIdentifierPart(text.charCodeAt(p))) p++; + while (isIdentifierPart(text.charCodeAt(p))) { + p++; + } pos = p; tokenValue = text.substring(tokenPos, pos); token = SyntaxKind.RegularExpressionLiteral; diff --git a/tests/baselines/reference/parser596700.errors.txt b/tests/baselines/reference/parser596700.errors.txt deleted file mode 100644 index a642ebf5e6d..00000000000 --- a/tests/baselines/reference/parser596700.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -==== tests/cases/conformance/parser/ecmascript5/RegressionTests/parser596700.ts (3 errors) ==== - var regex2 = /[a-z/]$/i; - ~ -!!! ',' expected. - ~ -!!! '=' expected. - ~ -!!! Cannot find name 'i'. \ No newline at end of file diff --git a/tests/baselines/reference/parser596700.js b/tests/baselines/reference/parser596700.js new file mode 100644 index 00000000000..59d76da960b --- /dev/null +++ b/tests/baselines/reference/parser596700.js @@ -0,0 +1,5 @@ +//// [parser596700.ts] +var regex2 = /[a-z/]$/i; + +//// [parser596700.js] +var regex2 = /[a-z/]$/i; diff --git a/tests/baselines/reference/parser630933.errors.txt b/tests/baselines/reference/parser630933.errors.txt deleted file mode 100644 index c639ee832e3..00000000000 --- a/tests/baselines/reference/parser630933.errors.txt +++ /dev/null @@ -1,12 +0,0 @@ -==== tests/cases/conformance/parser/ecmascript5/RegressionTests/parser630933.ts (4 errors) ==== - var a = "Hello"; - var b = a.match(/\/ver=([^/]+)/); - ~ -!!! ',' expected. - ~ -!!! Expression expected. - ~ -!!! Expression expected. - ~~~~~~~~~~~~~~~~~~~~~~ -!!! Supplied parameters do not match any signature of call target. - \ No newline at end of file diff --git a/tests/baselines/reference/parser630933.js b/tests/baselines/reference/parser630933.js new file mode 100644 index 00000000000..8adc29c0707 --- /dev/null +++ b/tests/baselines/reference/parser630933.js @@ -0,0 +1,8 @@ +//// [parser630933.ts] +var a = "Hello"; +var b = a.match(/\/ver=([^/]+)/); + + +//// [parser630933.js] +var a = "Hello"; +var b = a.match(/\/ver=([^/]+)/); diff --git a/tests/baselines/reference/parser645086_3.errors.txt b/tests/baselines/reference/parser645086_3.errors.txt deleted file mode 100644 index 4340518afe3..00000000000 --- a/tests/baselines/reference/parser645086_3.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -==== tests/cases/conformance/parser/ecmascript5/RegressionTests/parser645086_3.ts (3 errors) ==== - var v = /[\]/]/ - ~ -!!! ',' expected. - ~ -!!! Variable declaration expected. - -!!! Expression expected. \ No newline at end of file diff --git a/tests/baselines/reference/parser645086_3.js b/tests/baselines/reference/parser645086_3.js new file mode 100644 index 00000000000..3ce11e46f1c --- /dev/null +++ b/tests/baselines/reference/parser645086_3.js @@ -0,0 +1,5 @@ +//// [parser645086_3.ts] +var v = /[\]/]/ + +//// [parser645086_3.js] +var v = /[\]/]/; diff --git a/tests/baselines/reference/parser645086_4.errors.txt b/tests/baselines/reference/parser645086_4.errors.txt deleted file mode 100644 index 2f3094313a7..00000000000 --- a/tests/baselines/reference/parser645086_4.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -==== tests/cases/conformance/parser/ecmascript5/RegressionTests/parser645086_4.ts (3 errors) ==== - var v = /[^\]/]/ - ~ -!!! ',' expected. - ~ -!!! Variable declaration expected. - -!!! Expression expected. \ No newline at end of file diff --git a/tests/baselines/reference/parser645086_4.js b/tests/baselines/reference/parser645086_4.js new file mode 100644 index 00000000000..22301dc8a12 --- /dev/null +++ b/tests/baselines/reference/parser645086_4.js @@ -0,0 +1,5 @@ +//// [parser645086_4.ts] +var v = /[^\]/]/ + +//// [parser645086_4.js] +var v = /[^\]/]/; diff --git a/tests/baselines/reference/parserRegularExpression2.errors.txt b/tests/baselines/reference/parserRegularExpression2.errors.txt index c53fee352bb..7739ff67cf0 100644 --- a/tests/baselines/reference/parserRegularExpression2.errors.txt +++ b/tests/baselines/reference/parserRegularExpression2.errors.txt @@ -1,10 +1,4 @@ -==== tests/cases/conformance/parser/ecmascript5/RegularExpressions/parserRegularExpression2.ts (4 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/RegularExpressions/parserRegularExpression2.ts (1 errors) ==== href.match(/:\/\/(.[^/]+)/)[1]; - ~ -!!! ',' expected. - ~ -!!! Expression expected. - ~ -!!! Expression expected. ~~~~ !!! Cannot find name 'href'. \ No newline at end of file diff --git a/tests/baselines/reference/parserRegularExpression2.js b/tests/baselines/reference/parserRegularExpression2.js new file mode 100644 index 00000000000..5b8ca3b5c6a --- /dev/null +++ b/tests/baselines/reference/parserRegularExpression2.js @@ -0,0 +1,5 @@ +//// [parserRegularExpression2.ts] +href.match(/:\/\/(.[^/]+)/)[1]; + +//// [parserRegularExpression2.js] +href.match(/:\/\/(.[^/]+)/)[1]; diff --git a/tests/baselines/reference/regExpWithSlashInCharClass.js b/tests/baselines/reference/regExpWithSlashInCharClass.js new file mode 100644 index 00000000000..e96b6165a97 --- /dev/null +++ b/tests/baselines/reference/regExpWithSlashInCharClass.js @@ -0,0 +1,10 @@ +//// [regExpWithSlashInCharClass.ts] +var foo1 = "a/".replace(/.[/]/, ""); +var foo2 = "a//".replace(/.[//]/g, ""); +var foo3 = "a/".replace(/.[/no sleep /till/]/, "bugfix"); + + +//// [regExpWithSlashInCharClass.js] +var foo1 = "a/".replace(/.[/]/, ""); +var foo2 = "a//".replace(/.[//]/g, ""); +var foo3 = "a/".replace(/.[/no sleep /till/]/, "bugfix"); diff --git a/tests/baselines/reference/validRegexp.errors.txt b/tests/baselines/reference/validRegexp.errors.txt index b65654f33c3..e76d5df5117 100644 --- a/tests/baselines/reference/validRegexp.errors.txt +++ b/tests/baselines/reference/validRegexp.errors.txt @@ -1,22 +1,6 @@ -==== tests/cases/compiler/validRegexp.ts (9 errors) ==== +==== tests/cases/compiler/validRegexp.ts (1 errors) ==== var x = / [a - z /]$ / i; - ~ -!!! ',' expected. - ~ -!!! '=' expected. ~ -!!! Cannot find name 'i'. +!!! ',' expected. var x1 = /[a-z/]$/i; - ~ -!!! ',' expected. - ~ -!!! '=' expected. - ~ -!!! Cannot find name 'i'. - var x2 = /[a-z/]$ /i; - ~ -!!! ',' expected. - ~ -!!! '=' expected. - ~ -!!! Cannot find name 'i'. \ No newline at end of file + var x2 = /[a-z/]$ /i; \ No newline at end of file diff --git a/tests/cases/compiler/regExpWithSlashInCharClass.ts b/tests/cases/compiler/regExpWithSlashInCharClass.ts new file mode 100644 index 00000000000..6d54f8779e0 --- /dev/null +++ b/tests/cases/compiler/regExpWithSlashInCharClass.ts @@ -0,0 +1,3 @@ +var foo1 = "a/".replace(/.[/]/, ""); +var foo2 = "a//".replace(/.[//]/g, ""); +var foo3 = "a/".replace(/.[/no sleep /till/]/, "bugfix");