// Copyright 2015 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Flags: --harmony-function-name (function testVariableDeclarationsFunction() { 'use strict'; var a = function(){}; assertEquals('a', a.name); let b = () => {}; assertEquals('b', b.name); const c = ((function(){})); assertEquals('c', c.name); var x = function(){}, y = () => {}, z = function withName() {}; assertEquals('x', x.name); assertEquals('y', y.name); assertEquals('withName', z.name); })(); (function testVariableDeclarationsClass() { 'use strict'; var a = class {}; assertEquals('a', a.name); let b = ((class {})); assertEquals('b', b.name); // Should not overwrite name property. const c = class { static name() { } } assertEquals('function', typeof c.name); var x = class {}, y = class NamedClass {}; assertEquals('x', x.name); assertEquals('NamedClass', y.name); })(); (function testObjectProperties() { 'use strict'; var obj = { a: function() {}, b: () => {}, c() { }, get d() { }, set d(val) { }, x: function withName() { }, y: class { }, z: class ClassName { }, 42: function() {}, 4.2: function() {}, __proto__: function() {}, }; assertEquals('a', obj.a.name); assertEquals('b', obj.b.name); assertEquals('c', obj.c.name); var dDescriptor = Object.getOwnPropertyDescriptor(obj, 'd'); assertEquals('get d', dDescriptor.get.name); assertEquals('set d', dDescriptor.set.name); assertEquals('withName', obj.x.name); assertEquals('y', obj.y.name); assertEquals('ClassName', obj.z.name); assertEquals('42', obj[42].name); assertEquals('4.2', obj[4.2].name); assertEquals('', obj.__proto__.name); })(); (function testClassProperties() { 'use strict'; class C { a() { } static b() { } get c() { } set c(val) { } 42() { } static 43() { } get 44() { } set 44(val) { } }; assertEquals('a', C.prototype.a.name); assertEquals('b', C.b.name); var descriptor = Object.getOwnPropertyDescriptor(C.prototype, 'c'); assertEquals('get c', descriptor.get.name); assertEquals('set c', descriptor.set.name); assertEquals('42', C.prototype[42].name); assertEquals('43', C[43].name); var descriptor = Object.getOwnPropertyDescriptor(C.prototype, '44'); assertEquals('get 44', descriptor.get.name); assertEquals('set 44', descriptor.set.name); })(); // TODO(adamk): Make computed property names work. (function testComputedProperties() { 'use strict'; var a = 'a'; var sym1 = Symbol('1'); var sym2 = Symbol('2'); var obj = { [a]: function() {}, [sym1]: function() {}, [sym2]: function withName() {}, }; // Should be 'a' assertEquals('', obj[a].name); // Should be '[1]' assertEquals('', obj[sym1].name); assertEquals('withName', obj[sym2].name); class C { [a]() { } [sym1]() { } static [sym2]() { } } // Should be 'a' assertEquals('', C.prototype[a].name); // Should be '[1]' assertEquals('', C.prototype[sym1].name); // Should be '[2]' assertEquals('', C[sym2].name); })(); (function testAssignment() { var basicFn, arrowFn, generatorFn, classLit; basicFn = function() { return true; }; assertEquals('basicFn', basicFn.name); var basicFn2 = basicFn; assertEquals('basicFn', basicFn2.name); basicFn = function functionWithName() { }; assertEquals("functionWithName", basicFn.name); arrowFn = x => x; assertEquals('arrowFn', arrowFn.name); var arrowFn2 = arrowFn; assertEquals('arrowFn', arrowFn2.name); generatorFn = function*() { yield true; }; assertEquals('generatorFn', generatorFn.name); var generatorFn2 = generatorFn; assertEquals('generatorFn', generatorFn2.name); generatorFn = function* generatorWithName() { }; assertEquals("generatorWithName", generatorFn.name); classLit = class { constructor() {} }; assertEquals('classLit', classLit.name); var classLit2 = classLit; assertEquals('classLit', classLit2.name); classLit = class classWithName { constructor() {} }; assertEquals('classWithName', classLit.name); classLit = class { constructor() {} static name() {} }; assertEquals('function', typeof classLit.name); classLit = class { constructor() {} static get name() { return true; } }; assertTrue(classLit.name); classLit = class { constructor() {} static ['name']() {} }; assertEquals('function', typeof classLit.name); classLit = class { constructor() {} static get ['name']() { return true; } }; assertTrue(classLit.name); })();