129 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
 | |
| /*!
 | |
|  * Stylus - Function
 | |
|  * Copyright (c) Automattic <developer.wordpress.com>
 | |
|  * MIT Licensed
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Module dependencies.
 | |
|  */
 | |
| 
 | |
| var Node = require('./node');
 | |
| 
 | |
| /**
 | |
|  * Initialize a new `Function` with `name`, `params`, and `body`.
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @param {Params|Function} params
 | |
|  * @param {Block} body
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| var Function = module.exports = function Function(name, params, body){
 | |
|   Node.call(this);
 | |
|   this.name = name;
 | |
|   this.params = params;
 | |
|   this.block = body;
 | |
|   if ('function' == typeof params) this.fn = params;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Check function arity.
 | |
|  *
 | |
|  * @return {Boolean}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Function.prototype.__defineGetter__('arity', function(){
 | |
|   return this.params.length;
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Inherit from `Node.prototype`.
 | |
|  */
 | |
| 
 | |
| Function.prototype.__proto__ = Node.prototype;
 | |
| 
 | |
| /**
 | |
|  * Return hash.
 | |
|  *
 | |
|  * @return {String}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Function.prototype.__defineGetter__('hash', function(){
 | |
|   return 'function ' + this.name;
 | |
| });
 | |
| 
 | |
| /**
 | |
|  * Return a clone of this node.
 | |
|  * 
 | |
|  * @return {Node}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Function.prototype.clone = function(parent){
 | |
|   if (this.fn) {
 | |
|     var clone = new Function(
 | |
|         this.name
 | |
|       , this.fn);
 | |
|   } else {
 | |
|     var clone = new Function(this.name);
 | |
|     clone.params = this.params.clone(parent, clone);
 | |
|     clone.block = this.block.clone(parent, clone);
 | |
|   }
 | |
|   clone.lineno = this.lineno;
 | |
|   clone.column = this.column;
 | |
|   clone.filename = this.filename;
 | |
|   return clone;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Return <name>(param1, param2, ...).
 | |
|  *
 | |
|  * @return {String}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Function.prototype.toString = function(){
 | |
|   if (this.fn) {
 | |
|     return this.name
 | |
|       + '('
 | |
|       + this.fn.toString()
 | |
|         .match(/^function *\w*\((.*?)\)/)
 | |
|         .slice(1)
 | |
|         .join(', ')
 | |
|       + ')';
 | |
|   } else {
 | |
|     return this.name
 | |
|       + '('
 | |
|       + this.params.nodes.join(', ')
 | |
|       + ')';
 | |
|   }
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Return a JSON representation of this node.
 | |
|  *
 | |
|  * @return {Object}
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Function.prototype.toJSON = function(){
 | |
|   var json = {
 | |
|     __type: 'Function',
 | |
|     name: this.name,
 | |
|     lineno: this.lineno,
 | |
|     column: this.column,
 | |
|     filename: this.filename
 | |
|   };
 | |
|   if (this.fn) {
 | |
|     json.fn = this.fn;
 | |
|   } else {
 | |
|     json.params = this.params;
 | |
|     json.block = this.block;
 | |
|   }
 | |
|   return json;
 | |
| };
 |