From e03d5861bbc3f203a8d250dd1643b4608ffd0a1d Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Fri, 21 Jan 2011 22:19:22 -0500 Subject: [PATCH] Overridden methods must have >= length parameter lists --- lib/member_builder.js | 9 +++++++++ test/test-member_builder-method.js | 28 ++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/lib/member_builder.js b/lib/member_builder.js index decca44..891d9a7 100644 --- a/lib/member_builder.js +++ b/lib/member_builder.js @@ -73,6 +73,15 @@ exports.buildMethod = function( members, meta, name, value, keywords ) ); } + // ensure parameter list is at least the length of its supertype + if ( prev && (value.length < prev.length ) ) + { + throw new TypeError( + "Declaration of method '" + name + "' must be compatiable " + + "with that of its supertype" + ); + } + getMemberVisibility( members, keywords )[ name ] = value; }; diff --git a/test/test-member_builder-method.js b/test/test-member_builder-method.js index 69feefa..fabe858 100644 --- a/test/test-member_builder-method.js +++ b/test/test-member_builder-method.js @@ -61,3 +61,31 @@ mb_common.assertCommon(); }, TypeError, "Cannot override property with method" ); } )(); + +/** + * To ensure interfaces of subtypes remain compatible with that of their + * supertypes, the parameter lists must match and build upon each other. + */ +( function testMethodOverridesMustHaveEqualOrGreaterParameters() +{ + mb_common.value = function( one, two ) {}; + mb_common.buildMemberQuick(); + + assert.doesNotThrow( function() + { + mb_common.buildMemberQuick( {}, true ); + }, TypeError, "Method can have equal number of parameters" ); + + assert.doesNotThrow( function() + { + mb_common.value = function( one, two, three ) {}; + mb_common.buildMemberQuick( {}, true ); + }, TypeError, "Method can have greater number of parameters" ); + + assert.throws( function() + { + mb_common.value = function( one ) {}; + mb_common.buildMemberQuick( {}, true ); + }, TypeError, "Method cannot have lesser number of parameters" ); +} )(); +