2015-03-22 3 views
0

У меня есть функция $.publish опубликовать список функций связывания первого аргумента this, и я намерен использовать его для написания X.prototype, например:intellisense.annotate функции с динамически созданной аннотацией

X.prototype = (function() { 
    function privateFunction(me) { 
     /// <summary>privateFunction</summary> 
     /// <param name="me" type="X"></param> 
    } 
    return $.publish({ 
     publicFunction: function (me, a) { 
      /// <summary>publicFunction</summary> 
      /// <param name="me" type="X"></param> 
      /// <param name="a" type="Number"></param> 
     } 
    }) 
})(); 

Так что я могу использовать X как

var x = new X; 
x.publicFunction(0); 

реализация $.publish в файле lib.js является

publish: function (fs) { 
    return $.map(fs, function() { 
     var f = this; 
     return function() { 
      f.apply(/* irrelevant */); 
     } 
    }) 
} 

.

Проблема

Когда я печатаю x.publicFunction(, помощь подписи только скажите мне, что publicFunction(), не зная параметров a.

MSDN doc - Adding IntelliSense Annotations говорит, что мы можем аннотирование функции, как:

intellisense.annotate(someFunc, function (a) { 
    /// <signature> 
    /// <summary>Description of someFunc</summary> 
    /// <param name="a">Param a</param> 
    /// </signature> 
}); 

Так что я написал следующий код в lib.intellisense.js:

$.publish = function (fs) { 
    /// <summary>Publish a list of functions</summary> 
    /// <param name="fs" type="Object">List of functions to publish</param> 

    return $.map(fs, function() { 
     var f = this; 

     var published = function() { }; 
     //intellisense.redirectDefinition(published, f); 

     var funcSrc = f.toString(); 
     var vsdocPattern = /^([ \t]+)(\/{3} .*)/mg; 
     var indent = -1; 
     var vsdoc = ""; 
     for (var doc; (doc = vsdocPattern.exec(funcSrc)) != null;) { 
      if (indent < 0) { 
       indent = doc[1].length; 
      } else if (indent != doc[1].length) { 
       break; 
      } 
      if (doc[2].indexOf("<param name=\"me\"") > 0) { 
       continue; 
      } 

      vsdoc += doc[0] + "\n"; 
     } 
     if (vsdoc != "") { 
      vsdocPattern.lastIndex = 0; 
      var funcHeader = funcSrc.substr(0, funcSrc.search(vsdocPattern)); 
      funcHeader = funcHeader.replace(/(\(\s*)me(,)?/, "$1"); 

      var annotation = "(" + funcHeader + vsdoc + "})"; 
      //intellisense.annotate(published, eval(annotation)); 
      return eval(annotation); 
     } 

     return published; 
    }) 
} 

В результате я получаю здесь показываем параметры a при вводе x.publicFunction(, но документы в vsdoc отсутствуют. Мне нужна помощь подписи, чтобы показать документы, а также информацию о типе параметров, не повторяя меня копировать и корректировать документы от x.js до x.intellisense.js, как?

ответ

0

С целью скрытия первых нескольких аргументов в intellisense для DesignTime достаточно использовать Function.prototype.bind.

Так что мое решение обновить lib.intellisense.js со следующим кодом:

$.publish = function (fs) { 
    /// <summary>Publish a list of functions.</summary> 
    /// <param name="fs" type="Object">List of functions to publish</param> 

    return $.map(fs, function() { 
      var published = this.bind(null, null); 
      intellisense.redirectDefinition(published, this); 
      return published; 
    }) 
} 

Нет необходимости заботиться о том, чтобы комментировать опубликованную функцию сейчас, то M $ ребята сделали это для Function.prototype.bind уже.