From a58b7989ee437471b49311fc622041f62f9bcb80 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Thu, 20 Jan 2011 22:11:36 -0500 Subject: [PATCH] Throws TypeError if multiple visibility keywords are given to member builder --- lib/member_builder.js | 35 ++++++++++++++++++++++++++++---- test/test-member_builder-prop.js | 28 +++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/lib/member_builder.js b/lib/member_builder.js index 783a9ab..0b50692 100644 --- a/lib/member_builder.js +++ b/lib/member_builder.js @@ -39,19 +39,46 @@ */ exports.buildProp = function( members, meta, name, value, keywords ) { + getMemberVisibility( members, keywords )[ name ] = value; +}; + + +/** + * Returns member prototype to use for the requested visibility + * + * @param {{public: Object, protected: Object, private: Object}} members + * + * @param {Object.} keywords parsed keywords + * + * @return {Object} reference to visibility of members argument to use + */ +function getMemberVisibility( members, keywords ) +{ + var viserr = function() + { + throw TypeError( + "Only one of public, protected or private may be used" + ); + } + + // there's cleaner ways of doing this, but consider it loop unrolling for + // performance if ( keywords[ 'private' ] ) { - members[ 'private' ][ name ] = value; + ( keywords[ 'public' ] || keywords[ 'protected' ] ) && viserr(); + return members[ 'private' ]; } else if ( keywords[ 'protected' ] ) { - members[ 'protected' ][ name ] = value; + ( keywords[ 'public' ] || keywords[ 'private' ] ) && viserr(); + return members[ 'protected' ]; } else { // public keyword is the default, so explicitly specifying it is only // for clarity - members[ 'public' ][ name ] = value; + ( keywords[ 'private' ] || keywords[ 'protected' ] ) && viserr(); + return members[ 'public' ]; } -}; +} diff --git a/test/test-member_builder-prop.js b/test/test-member_builder-prop.js index e2ad6fd..3555d0b 100644 --- a/test/test-member_builder-prop.js +++ b/test/test-member_builder-prop.js @@ -94,3 +94,31 @@ function buildPropQuick( keywords ) ); } )(); + +( function testThrowsTypeErrorIfMultipleVisibilityKeywordsAreGiven() +{ + assert.throws( function() + { + buildPropQuick( { + 'public': true, + 'protected': true, + } ); + }, TypeError, "Cannot specify multiple visibility keywords (0)" ); + + assert.throws( function() + { + buildPropQuick( { + 'public': true, + 'private': true, + } ); + }, TypeError, "Cannot specify multiple visibility keywords (1)" ); + + assert.throws( function() + { + buildPropQuick( { + 'protected': true, + 'private': true, + } ); + }, TypeError, "Cannot specify multiple visibility keywords (2)" ); +} )(); +