diff --git a/lib/ClassBuilder.js b/lib/ClassBuilder.js index 6293e60..b7d9d58 100644 --- a/lib/ClassBuilder.js +++ b/lib/ClassBuilder.js @@ -469,12 +469,8 @@ exports.prototype.buildMembers = function buildMembers( { var dest = ( keywordStatic( keywords ) ) ? smethods : members; - _self._memberBuilder.buildGetter( - dest, null, name, get, keywords, base - ); - - _self._memberBuilder.buildSetter( - dest, null, name, set, keywords, base + _self._memberBuilder.buildGetterSetter( + dest, null, name, get, set, keywords, base ); }, diff --git a/lib/FallbackMemberBuilder.js b/lib/FallbackMemberBuilder.js index 5408268..cfbe097 100644 --- a/lib/FallbackMemberBuilder.js +++ b/lib/FallbackMemberBuilder.js @@ -52,26 +52,13 @@ module.exports.constructor = module.exports; /** - * Getters are unsupported in a pre-ES5 environment + * Getters/setters are unsupported in a pre-ES5 environment * * Simply throw an exception, as it clearly represents that the developer did * not account for the possibility that their software may have been executed in * a pre-ES5 environment. */ -exports.prototype.buildGetter = function() +exports.prototype.buildGetterSetter = function() { - throw Error( 'Getters are unsupported in this environment' ); -}; - - -/** - * Setters are unsupported in a pre-ES5 environment - * - * Simply throw an exception, as it clearly represents that the developer did - * not account for the possibility that their software may have been executed in - * a pre-ES5 environment. - */ -exports.prototype.buildSetter = function() -{ - throw Error( 'Setters are unsupported in this environment' ); + throw Error( 'Getters/setters are unsupported in this environment' ); }; diff --git a/lib/MemberBuilder.js b/lib/MemberBuilder.js index d59b4b7..a61dba1 100644 --- a/lib/MemberBuilder.js +++ b/lib/MemberBuilder.js @@ -187,72 +187,16 @@ exports.buildProp = function( members, meta, name, value, keywords, base ) }; -/** - * Copies a getter to the appropriate member prototype, depending on - * visibility, and assigns necessary metadata from keywords - * - * XXX: Combine with buildSetter for performance benefit - * - * @param {{public: Object, protected: Object, private: Object}} members - * - * @param {Object} meta metadata container - * @param {string} name getter name - * @param {*} value getter value - * - * @param {Object.} keywords parsed keywords - * - * @param {Object=} base optional base object to scan - * - * @return {undefined} - */ -exports.buildGetter = function( members, meta, name, value, keywords, base ) -{ - - this._buildGetterSetter( - 'get', members, meta, name, value, keywords, base - ); -}; - - -/** - * Copies a setter to the appropriate member prototype, depending on - * visibility, and assigns necessary metadata from keywords - * - * XXX: Combine with buildGetter for performance benefit - * - * @param {{public: Object, protected: Object, private: Object}} members - * - * @param {Object} meta metadata container - * @param {string} name setter name - * @param {*} value setter value - * - * @param {Object.} keywords parsed keywords - * - * @param {Object=} base optional base object to scan - * - * @return {undefined} - */ -exports.buildSetter = function( members, meta, name, value, keywords, base ) -{ - this._buildGetterSetter( - 'set', members, meta, name, value, keywords, base - ); -}; - - /** * Copies a getter/setter to the appropriate member prototype, depending on * visibility, and assigns necessary metadata from keywords * - * XXX: Combine getter/setter operations for performance benefit - * - * @param {string} type get/set - * * @param {{public: Object, protected: Object, private: Object}} members * - * @param {Object} meta metadata container - * @param {string} name getter name - * @param {*} value getter value + * @param {Object} meta metadata container + * @param {string} name getter name + * @param {*} get getter value + * @param {*} set setter value * * @param {Object.} keywords parsed keywords * @@ -260,8 +204,8 @@ exports.buildSetter = function( members, meta, name, value, keywords, base ) * * @return {undefined} */ -exports._buildGetterSetter = function( - type, members, meta, name, value, keywords, base +exports.buildGetterSetter = function( + members, meta, name, get, set, keywords, base ) { var prev_data = scanMembers( members, name, base ); @@ -270,21 +214,15 @@ exports._buildGetterSetter = function( name, keywords, prev_data ); - // the actual data to be set - var data = { - enumerable: true, - - // otherwise we can't add a getter to this - configurable: true, - }; - - // set getter/setter appropriately, depending on the provided type - data[ type ] = value; - Object.defineProperty( getMemberVisibility( members, keywords, name ), name, - data + { + get: get, + set: set, + enumerable: true, + configurable: false, + } ); }; diff --git a/test/FallbackMemberBuilderTest.js b/test/FallbackMemberBuilderTest.js index c719177..6435f9b 100644 --- a/test/FallbackMemberBuilderTest.js +++ b/test/FallbackMemberBuilderTest.js @@ -50,33 +50,19 @@ require( './common' ).testCase( /** * Getters and setters are unsupported in pre-ES5 environments */ - 'buildGetter() and buildSetter() methods throw exceptions': function() + 'buildGetterSetter() method throws an exception': function() { // getter test try { - this.sut.buildGetter(); - this.fail( 'Exception should have been called (getter)' ); + this.sut.buildGetterSetter(); + this.fail( 'Exception should have been called (getter/setter)' ); } catch ( e ) { this.assertOk( e.message.match( /unsupported/ ), - 'Incorrect exception thrown (getter)' - ); - } - - // setter test - try - { - this.sut.buildSetter(); - this.fail( 'Exception should have been called (getter)' ); - } - catch ( e ) - { - this.assertOk( - e.message.match( /unsupported/ ), - 'Incorrect exception thrown (setter)' + 'Incorrect exception thrown (getter/setter)' ); } }, diff --git a/test/MemberBuilder/VisibilityTest.js b/test/MemberBuilder/VisibilityTest.js index 9cf0acf..2e282f0 100644 --- a/test/MemberBuilder/VisibilityTest.js +++ b/test/MemberBuilder/VisibilityTest.js @@ -62,22 +62,16 @@ require( 'common' ).testCase( }; - this.buildStubGetterSetter = function( name, val, visibility, type ) + this.buildStubGetterSetter = function( name, get, set, visibility ) { - var keywords = {}, - - // we can use bind() here because these tests will only be run - // in an ES5 environment (since pre-ES5 doesn't support - // getters/setters) - method = ( ( type === 'get' ) - ? _self.sut.buildGetter.bind( _self.sut ) - : _self.sut.buildSetter.bind( _self.sut ) - ) - ; + var keywords = {}; // set visibility level using access modifier keywords[ visibility ] = true; - method( _self.members, {}, name, val, keywords, {} ); + + _self.sut.buildGetterSetter( + _self.members, {}, name, get, set, keywords, {} + ); }; @@ -152,8 +146,7 @@ require( 'common' ).testCase( ; // build both the getter and the setter - _self.buildStubGetterSetter( name, getval, vis, 'get' ); - _self.buildStubGetterSetter( name, setval, vis, 'set' ); + _self.buildStubGetterSetter( name, getval, setval, vis, 'get' ); // get the getter/setter var data = Object.getOwnPropertyDescriptor( @@ -320,8 +313,9 @@ require( 'common' ).testCase( // getter/setter if supported if ( gst ) { - this.sut.buildGetter( this.members, {}, name_gs, getval, {}, {} ); - this.sut.buildSetter( this.members, {}, name_gs, setval, {}, {} ); + this.sut.buildGetterSetter( + this.members, {}, name_gs, getval, setval, {}, {} + ); } this.assertStrictEqual( @@ -382,7 +376,7 @@ require( 'common' ).testCase( }, - 'Only one access modifier may be used per getter': function() + 'Only one access modifier may be used per getter/setter': function() { if ( !gst ) return; @@ -390,23 +384,9 @@ require( 'common' ).testCase( this.multiVisFailureTest( function( name, keywords ) { - _self.sut.buildGetter( - _self.members, {}, name, function() {}, keywords, {} - ); - } ); - }, - - - 'Only one access modifier may be used per setter': function() - { - if ( !gst ) return; - - var _self = this; - - this.multiVisFailureTest( function( name, keywords ) - { - _self.sut.buildSetter( - _self.members, {}, name, function() {}, keywords, {} + _self.sut.buildGetterSetter( + _self.members, {}, name, + function() {}, function() {}, keywords, {} ); } ); },