From 17047b53e9a43a6ef0267feecdc7c1cf30d51283 Mon Sep 17 00:00:00 2001 From: Mike Gerwitz Date: Thu, 22 Dec 2011 23:32:45 -0500 Subject: [PATCH] Getters/setters will now trigger warnings if attempting to override without super getter/setter --- lib/MemberBuilderValidator.js | 9 ++++ .../GetterSetterTest.js | 43 ++++++++++++++++++- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/MemberBuilderValidator.js b/lib/MemberBuilderValidator.js index 5960f81..875e6ad 100644 --- a/lib/MemberBuilderValidator.js +++ b/lib/MemberBuilderValidator.js @@ -355,6 +355,15 @@ exports.prototype.validateGetterSetter = function( ); } } + else if ( keywords[ 'override' ] ) + { + // using the override keyword without a super method may indicate a bug + // in the user's code + this._warningHandler( Error( + "Getter/setter '" + name + + "' using 'override' keyword without super getter/setter" + ) ); + } } diff --git a/test/MemberBuilderValidator/GetterSetterTest.js b/test/MemberBuilderValidator/GetterSetterTest.js index db1f4eb..37c4d6d 100644 --- a/test/MemberBuilderValidator/GetterSetterTest.js +++ b/test/MemberBuilderValidator/GetterSetterTest.js @@ -67,7 +67,17 @@ require( 'common' ).testCase( setUp: function() { - this.sut = this.require( 'MemberBuilderValidator' )(); + var _self = this; + + // can be used to intercept warnings; redefine in test + this.warningHandler = function( warning ) {}; + + this.sut = this.require( 'MemberBuilderValidator' )( + function( warning ) + { + _self.warningHandler( warning ); + } + ); }, @@ -214,4 +224,35 @@ require( 'common' ).testCase( { this.quickKeywordTest( [ 'static', 'virtual' ], 'static' ); }, + + + /** + * If a developer uses the 'override' keyword when there is no super member + * to override, this could hint at a number of problems (see MethodTest for + * further discussion). + */ + 'Throws warning when using override with no super getter/setter': function() + { + var given = null; + + this.warningHandler = function( warning ) + { + given = warning; + }; + + // trigger warning (override keyword with no super method) + this.quickKeywordTest( [ 'override' ] ); + + this.assertNotEqual( null, given, + 'No warning was provided' + ); + + this.assertOk( given instanceof Error, + 'Provided warning is not of type Error' + ); + + this.assertOk( ( given.message.search( shared.testName ) > -1 ), + 'Override warning should contain getter/setter name' + ); + }, } );