UNPKG

3.46 kBJavaScriptView Raw
1/**
2 A collection of functions relating to resolving @borrows tags in JSDoc symbols.
3 @module jsdoc/borrow
4 @author Michael Mathews <micmath@gmail.com>
5 @license Apache License 2.0 - See file 'LICENSE.md' in this project.
6 */
7'use strict';
8
9var doop = require('jsdoc/util/doop');
10var logger = require('jsdoc/util/logger');
11var SCOPE = require('jsdoc/name').SCOPE;
12
13var hasOwnProp = Object.prototype.hasOwnProperty;
14
15// TODO: add the index at parse time, so we don't have to iterate over all the doclets again
16exports.indexAll = function(doclets) {
17 var borrowed = [];
18 var doclet;
19 var documented = {};
20 var longname = {};
21
22 for (var i = 0, l = doclets.length; i < l; i++) {
23 doclet = doclets[i];
24
25 // track all doclets by longname
26 if ( !hasOwnProp.call(longname, doclet.longname) ) {
27 longname[doclet.longname] = [];
28 }
29 longname[doclet.longname].push(doclet);
30
31 // track longnames of documented symbols
32 if (!doclet.undocumented) {
33 if ( !hasOwnProp.call(documented, doclet.longname) ) {
34 documented[doclet.longname] = [];
35 }
36 documented[doclet.longname].push(doclet);
37 }
38
39 // track doclets with a `borrowed` property
40 if ( hasOwnProp.call(doclet, 'borrowed') ) {
41 borrowed.push(doclet);
42 }
43 }
44
45 doclets.index = {
46 borrowed: borrowed,
47 documented: documented,
48 longname: longname
49 };
50};
51
52function cloneBorrowedDoclets(doclet, doclets) {
53 doclet.borrowed.forEach(function(borrowed) {
54 var borrowedDoclets = doclets.index.longname[borrowed.from];
55 var borrowedAs = borrowed.as || borrowed.from;
56 var clonedDoclets;
57 var parts;
58 var scopePunc;
59
60 if (borrowedDoclets) {
61 borrowedAs = borrowedAs.replace(/^prototype\./, SCOPE.PUNC.INSTANCE);
62 clonedDoclets = doop(borrowedDoclets).forEach(function(clone) {
63 // TODO: this will fail on longnames like '"Foo#bar".baz'
64 parts = borrowedAs.split(SCOPE.PUNC.INSTANCE);
65
66 if (parts.length === 2) {
67 clone.scope = SCOPE.NAMES.INSTANCE;
68 scopePunc = SCOPE.PUNC.INSTANCE;
69 }
70 else {
71 clone.scope = SCOPE.NAMES.STATIC;
72 scopePunc = SCOPE.PUNC.STATIC;
73 }
74
75 clone.name = parts.pop();
76 clone.memberof = doclet.longname;
77 clone.longname = clone.memberof + scopePunc + clone.name;
78 doclets.push(clone);
79 });
80 }
81 });
82}
83
84// requires docs to have been indexed: docs.index must be defined here
85/**
86 Take a copy of the docs for borrowed symbols and attach them to the
87 docs for the borrowing symbol. This process changes the symbols involved,
88 moving docs from the "borrowed" array and into the general docs, then
89 deleting the "borrowed" array.
90 */
91exports.resolveBorrows = function(doclets) {
92 var doclet;
93
94 if (!doclets.index) {
95 logger.error('Unable to resolve borrowed symbols, because the docs have not been indexed.');
96 return;
97 }
98
99 for (var i = 0, l = doclets.index.borrowed.length; i < l; i++) {
100 doclet = doclets.index.borrowed[i];
101
102 cloneBorrowedDoclets(doclet, doclets);
103 delete doclet.borrowed;
104 }
105
106 doclets.index.borrowed = [];
107};