parent
77efd515de
commit
0228de6218
|
@ -177,6 +177,23 @@ function createNamedInterface( name, def )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Augment an exception with interface name and then throw
|
||||||
|
*
|
||||||
|
* @param {string} iname interface name or empty string
|
||||||
|
* @param {Error} e exception to augment
|
||||||
|
*/
|
||||||
|
function _ithrow( iname, e )
|
||||||
|
{
|
||||||
|
// alter the message to include our name
|
||||||
|
e.message = "Failed to define interface " +
|
||||||
|
( ( iname ) ? iname : '(anonymous)' ) + ": " + e.message
|
||||||
|
;
|
||||||
|
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
var extend = ( function( extending )
|
var extend = ( function( extending )
|
||||||
{
|
{
|
||||||
return function extend()
|
return function extend()
|
||||||
|
@ -211,50 +228,43 @@ var extend = ( function( extending )
|
||||||
|
|
||||||
var new_interface = createInterface( iname );
|
var new_interface = createInterface( iname );
|
||||||
|
|
||||||
try
|
util.propParse( props, {
|
||||||
{
|
assumeAbstract: true,
|
||||||
util.propParse( props, {
|
|
||||||
assumeAbstract: true,
|
|
||||||
|
|
||||||
property: function()
|
// override default exceptions from parser errors
|
||||||
|
_throw: function( e )
|
||||||
|
{
|
||||||
|
_ithrow( iname, e );
|
||||||
|
},
|
||||||
|
|
||||||
|
property: function()
|
||||||
|
{
|
||||||
|
// should never get to this point because of assumeAbstract
|
||||||
|
_ithrow( iname, TypeError( "Unexpected internal error" ) );
|
||||||
|
},
|
||||||
|
|
||||||
|
getset: function()
|
||||||
|
{
|
||||||
|
// should never get to this point because of assumeAbstract
|
||||||
|
_ithrow( iname, TypeError( "Unexpected internal error" ) );
|
||||||
|
},
|
||||||
|
|
||||||
|
method: function( name, value, is_abstract, keywords )
|
||||||
|
{
|
||||||
|
// all members must be public
|
||||||
|
if ( keywords[ 'protected' ] || keywords[ 'private' ] )
|
||||||
{
|
{
|
||||||
// should never get to this point because of assumeAbstract
|
_ithrow( iname, TypeError(
|
||||||
throw TypeError( 'Unexpected internal error' );
|
"Member " + name + " must be public"
|
||||||
},
|
) );
|
||||||
|
}
|
||||||
|
|
||||||
getset: function()
|
member_builder.buildMethod(
|
||||||
{
|
members, null, name, value, keywords,
|
||||||
// should never get to this point because of assumeAbstract
|
null, 0, {}, vstate
|
||||||
throw TypeError( 'Unexpected internal error' );
|
);
|
||||||
},
|
},
|
||||||
|
} );
|
||||||
method: function( name, value, is_abstract, keywords )
|
|
||||||
{
|
|
||||||
// all members must be public
|
|
||||||
if ( keywords[ 'protected' ] || keywords[ 'private' ] )
|
|
||||||
{
|
|
||||||
throw TypeError(
|
|
||||||
iname + " member " + name + " must be public"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
member_builder.buildMethod(
|
|
||||||
members, null, name, value, keywords,
|
|
||||||
null, 0, {}, vstate
|
|
||||||
);
|
|
||||||
},
|
|
||||||
} );
|
|
||||||
}
|
|
||||||
catch ( e )
|
|
||||||
{
|
|
||||||
// alter the message to include our name
|
|
||||||
e.message = "Failed to define interface " +
|
|
||||||
( ( iname ) ? iname : '(anonymous)' ) + ": " + e.message
|
|
||||||
;
|
|
||||||
|
|
||||||
// re-throw
|
|
||||||
throw e;
|
|
||||||
}
|
|
||||||
|
|
||||||
attachExtend( new_interface );
|
attachExtend( new_interface );
|
||||||
attachStringMethod( new_interface, iname );
|
attachStringMethod( new_interface, iname );
|
||||||
|
|
29
lib/util.js
29
lib/util.js
|
@ -246,6 +246,19 @@ exports.copyTo = function( dest, src, deep )
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throw an exception
|
||||||
|
*
|
||||||
|
* Yes, this function has purpose; see where it's used.
|
||||||
|
*
|
||||||
|
* @param {Error} e exception to throw
|
||||||
|
*/
|
||||||
|
function _throw( e )
|
||||||
|
{
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parses object properties to determine how they should be interpreted in an
|
* Parses object properties to determine how they should be interpreted in an
|
||||||
* Object Oriented manner
|
* Object Oriented manner
|
||||||
|
@ -268,6 +281,8 @@ exports.propParse = function( data, options, context )
|
||||||
callbackGetSet = options.getset || fvoid,
|
callbackGetSet = options.getset || fvoid,
|
||||||
keywordParser = options.keywordParser || propParseKeywords,
|
keywordParser = options.keywordParser || propParseKeywords,
|
||||||
|
|
||||||
|
throwf = options._throw || _throw,
|
||||||
|
|
||||||
hasOwn = Object.prototype.hasOwnProperty,
|
hasOwn = Object.prototype.hasOwnProperty,
|
||||||
|
|
||||||
parse_data = {},
|
parse_data = {},
|
||||||
|
@ -315,12 +330,12 @@ exports.propParse = function( data, options, context )
|
||||||
|
|
||||||
if ( !( value instanceof Array ) )
|
if ( !( value instanceof Array ) )
|
||||||
{
|
{
|
||||||
throw TypeError(
|
throwf( TypeError(
|
||||||
"Missing parameter list for abstract method: " + name
|
"Missing parameter list for abstract method: " + name
|
||||||
);
|
) );
|
||||||
}
|
}
|
||||||
|
|
||||||
verifyAbstractNames( name, value );
|
verifyAbstractNames( throwf, name, value );
|
||||||
value = exports.createAbstractMethod.apply( this, value );
|
value = exports.createAbstractMethod.apply( this, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -363,22 +378,24 @@ exports.propParse = function( data, options, context )
|
||||||
* In the future, we may add additional functionality, so it's important to
|
* In the future, we may add additional functionality, so it's important to
|
||||||
* restrict this as much as possible for the time being.
|
* restrict this as much as possible for the time being.
|
||||||
*
|
*
|
||||||
|
* @param {function(Error)} throwf function to call with error
|
||||||
|
*
|
||||||
* @param {string} name name of abstract member (for error)
|
* @param {string} name name of abstract member (for error)
|
||||||
* @param {Object} params parameter list to check
|
* @param {Object} params parameter list to check
|
||||||
*
|
*
|
||||||
* @return {undefined}
|
* @return {undefined}
|
||||||
*/
|
*/
|
||||||
function verifyAbstractNames( name, params )
|
function verifyAbstractNames( throwf, name, params )
|
||||||
{
|
{
|
||||||
var i = params.length;
|
var i = params.length;
|
||||||
while ( i-- )
|
while ( i-- )
|
||||||
{
|
{
|
||||||
if ( params[ i ].match( /^[a-z_][a-z0-9_]*$/i ) === null )
|
if ( params[ i ].match( /^[a-z_][a-z0-9_]*$/i ) === null )
|
||||||
{
|
{
|
||||||
throw SyntaxError(
|
throwf( SyntaxError(
|
||||||
"Member " + name + " contains invalid parameter '" +
|
"Member " + name + " contains invalid parameter '" +
|
||||||
params[ i ] + "'"
|
params[ i ] + "'"
|
||||||
);
|
) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue