Address the issue that arrow function doesn't have arguments objects

This commit is contained in:
Yui T 2015-01-28 16:10:15 -08:00
parent 2e2559b097
commit ca3c1ed543
5 changed files with 1924 additions and 1909 deletions

View file

@ -4836,6 +4836,16 @@ module ts {
function checkIdentifier(node: Identifier): Type {
var symbol = getResolvedSymbol(node);
// As noted in ECMAScript 6 language spec, arrow functions never have an arguments objects.
// Although in down-level emit of arrow function, we emit it using function expression which means that
// arguments objects will be inner bound while emitting arrow function natively in ES6, arguments objects
// will be bound to non-arrow function that contain this arrow function. This results in inconsistent bahaviour.
// To avoid that we will give an error to users if they use arguments objects in arrow function so that they
// can explicitly bound arguments objects
if (symbol === argumentsSymbol && getContainingFunction(node).kind === SyntaxKind.ArrowFunction) {
error(node, Diagnostics.An_argument_object_has_different_behaviour_across_Javascript_versions_Use_function_expression_or_rest_parameters_instead);
}
if (symbol.flags & SymbolFlags.Import) {
var symbolLinks = getSymbolLinks(symbol);
if (!symbolLinks.referenced) {

View file

@ -452,5 +452,6 @@ module ts {
You_cannot_rename_this_element: { code: 8000, category: DiagnosticCategory.Error, key: "You cannot rename this element." },
yield_expressions_are_not_currently_supported: { code: 9000, category: DiagnosticCategory.Error, key: "'yield' expressions are not currently supported.", isEarly: true },
Generators_are_not_currently_supported: { code: 9001, category: DiagnosticCategory.Error, key: "Generators are not currently supported.", isEarly: true },
An_argument_object_has_different_behaviour_across_Javascript_versions_Use_function_expression_or_rest_parameters_instead: { code: 9002, category: DiagnosticCategory.Error, key: "An argument object has different behaviour across Javascript versions. Use function expression or rest parameters instead" },
};
}

File diff suppressed because it is too large Load diff

View file

@ -107,7 +107,7 @@ module Utils {
export function memoize<T extends Function>(f: T): T {
var cache: { [idx: string]: any } = {};
return <any>(() => {
return <any>(function () {
var key = Array.prototype.join.call(arguments);
var cachedResult = cache[key];
if (cachedResult) {

View file

@ -138,7 +138,7 @@ module Playback {
function recordReplay<T extends Function>(original: T, underlying: any) {
function createWrapper(record: T, replay: T): T {
return <any>(() => {
return <any>(function () {
if (replayLog !== undefined) {
return replay.apply(undefined, arguments);
} else if (recordLog !== undefined) {