8e3a2ebf690e2cbb03d653b198a2f4e2b692856f
2 JSDOC
.SymbolSet
= function() {
6 JSDOC
.SymbolSet
.prototype.init
= function() {
7 this._index
= new Hash();
10 JSDOC
.SymbolSet
.prototype.keys
= function() {
11 return this._index
.keys();
14 JSDOC
.SymbolSet
.prototype.hasSymbol
= function(alias
) {
15 return this._index
.hasKey(alias
);
18 JSDOC
.SymbolSet
.prototype.addSymbol
= function(symbol
) {
19 if (JSDOC
.opt
.a
&& this.hasSymbol(symbol
.alias
)) {
20 LOG
.warn("Overwriting symbol documentation for: " + symbol
.alias
+ ".");
21 this.deleteSymbol(symbol
.alias
);
23 this._index
.set(symbol
.alias
, symbol
);
26 JSDOC
.SymbolSet
.prototype.getSymbol
= function(alias
) {
27 if (this.hasSymbol(alias
)) return this._index
.get(alias
);
30 JSDOC
.SymbolSet
.prototype.getSymbolByName
= function(name
) {
31 for (var p
= this._index
.first(); p
; p
= this._index
.next()) {
33 if (symbol
.name
== name
) return symbol
;
37 JSDOC
.SymbolSet
.prototype.toArray
= function() {
38 return this._index
.values();
41 JSDOC
.SymbolSet
.prototype.deleteSymbol
= function(alias
) {
42 if (!this.hasSymbol(alias
)) return;
43 this._index
.drop(alias
);
46 JSDOC
.SymbolSet
.prototype.renameSymbol
= function(oldName
, newName
) {
47 // todo: should check if oldname or newname already exist
48 this._index
.replace(oldName
, newName
);
49 this._index
.get(newName
).alias
= newName
;
53 JSDOC
.SymbolSet
.prototype.relate
= function() {
54 this.resolveBorrows();
55 this.resolveMemberOf();
56 this.resolveAugments();
59 JSDOC
.SymbolSet
.prototype.resolveBorrows
= function() {
60 for (var p
= this._index
.first(); p
; p
= this._index
.next()) {
62 if (symbol
.is("FILE") || symbol
.is("GLOBAL")) continue;
64 var borrows
= symbol
.inherits
;
65 for (var i
= 0; i
< borrows
.length
; i
++) {
67 if (/#$/.test(borrows
[i
].alias
)) {
68 LOG
.warn("Attempted to borrow entire instance of "+borrows
[i
].alias
+" but that feature is not yet implemented.");
71 var borrowed
= this.getSymbol(borrows
[i
].alias
);
74 LOG
.warn("Can't borrow undocumented "+borrows
[i
].alias
+".");
78 if (borrows
[i
].as
== borrowed
.alias
) {
79 var assumedName
= borrowed
.name
.split(/([#.-])/).pop();
80 borrows
[i
].as
= symbol
.name
+RegExp
.$1+assumedName
;
81 LOG
.inform("Assuming borrowed as name is "+borrows
[i
].as
+" but that feature is experimental.");
84 var borrowAsName
= borrows
[i
].as
;
85 var borrowAsAlias
= borrowAsName
;
87 LOG
.warn("Malformed @borrow, 'as' is required.");
91 if (borrowAsName
.length
> symbol
.alias
.length
&& borrowAsName
.indexOf(symbol
.alias
) == 0) {
92 borrowAsName
= borrowAsName
.replace(borrowed
.alias
, "")
96 if (borrowAsName
.charAt(0) != "#") joiner
= ".";
97 borrowAsAlias
= borrowed
.alias
+ joiner
+ borrowAsName
;
100 borrowAsName
= borrowAsName
.replace(/^[#.]/, "");
102 if (this.hasSymbol(borrowAsAlias
)) continue;
104 var clone
= borrowed
.clone();
105 clone
.name
= borrowAsName
;
106 clone
.alias
= borrowAsAlias
;
107 this.addSymbol(clone
);
112 JSDOC
.SymbolSet
.prototype.resolveMemberOf
= function() {
113 for (var p
= this._index
.first(); p
; p
= this._index
.next()) {
114 var symbol
= p
.value
;
116 if (symbol
.is("FILE") || symbol
.is("GLOBAL")) continue;
118 // the memberOf value was provided in the @memberOf tag
119 else if (symbol
.memberOf
) {
120 // like foo.bar is a memberOf foo
121 if (symbol
.alias
.indexOf(symbol
.memberOf
) == 0) {
122 var memberMatch
= new RegExp("^("+symbol
.memberOf
+")[.#-]?(.+)$");
123 var aliasParts
= symbol
.alias
.match(memberMatch
);
126 symbol
.memberOf
= aliasParts
[1];
127 symbol
.name
= aliasParts
[2];
130 var nameParts
= symbol
.name
.match(memberMatch
);
133 symbol
.name
= nameParts
[2];
136 // like bar is a memberOf foo
138 var joiner
= symbol
.memberOf
.charAt(symbol
.memberOf
.length
-1);
139 if (!/[.#-]/.test(joiner
)) symbol
.memberOf
+= ".";
140 this.renameSymbol(symbol
.alias
, symbol
.memberOf
+ symbol
.name
);
143 // the memberOf must be calculated
145 var parts
= symbol
.alias
.match(/^(.*[.#-])([^.#-]+)$/);
148 symbol
.memberOf
= parts
[1];
149 symbol
.name
= parts
[2];
153 // set isStatic, isInner
154 if (symbol
.memberOf
) {
155 switch (symbol
.memberOf
.charAt(symbol
.memberOf
.length
-1)) {
157 symbol
.isStatic
= false;
158 symbol
.isInner
= false;
161 symbol
.isStatic
= true;
162 symbol
.isInner
= false;
165 symbol
.isStatic
= false;
166 symbol
.isInner
= true;
168 default: // memberOf ends in none of the above
169 symbol
.isStatic
= true;
174 // unowned methods and fields belong to the global object
175 if (!symbol
.is("CONSTRUCTOR") && !symbol
.isNamespace
&& symbol
.memberOf
== "") {
176 symbol
.memberOf
= "_global_";
180 if (symbol
.memberOf
.match(/[.#-]$/)) {
181 symbol
.memberOf
= symbol
.memberOf
.substr(0, symbol
.memberOf
.length
-1);
183 // add to parent's methods or properties list
184 if (symbol
.memberOf
) {
186 var container
= this.getSymbol(symbol
.memberOf
);
188 if (JSDOC
.Lang
.isBuiltin(symbol
.memberOf
)) container
= JSDOC
.Parser
.addBuiltin(symbol
.memberOf
);
190 LOG
.warn("Trying to document "+symbol
.name
+" as a member of undocumented symbol "+symbol
.memberOf
+".");
194 if (container
) container
.addMember(symbol
);
199 JSDOC
.SymbolSet
.prototype.resolveAugments
= function() {
200 for (var p
= this._index
.first(); p
; p
= this._index
.next()) {
201 var symbol
= p
.value
;
203 if (symbol
.alias
== "_global_" || symbol
.is("FILE")) continue;
204 JSDOC
.SymbolSet
.prototype.walk
.apply(this, [symbol
]);
208 JSDOC
.SymbolSet
.prototype.walk
= function(symbol
) {
209 var augments
= symbol
.augments
;
210 for(var i
= 0; i
< augments
.length
; i
++) {
211 var contributer
= this.getSymbol(augments
[i
]);
212 if (!contributer
&& JSDOC
.Lang
.isBuiltin(''+augments
[i
])) {
213 contributer
= new JSDOC
.Symbol("_global_."+augments
[i
], [], augments
[i
], new JSDOC
.DocComment("Built in."));
214 contributer
.isNamespace
= true;
215 contributer
.srcFile
= "";
216 contributer
.isPrivate
= false;
217 JSDOC
.Parser
.addSymbol(contributer
);
221 if (contributer
.augments
.length
) {
222 JSDOC
.SymbolSet
.prototype.walk
.apply(this, [contributer
]);
225 symbol
.inheritsFrom
.push(contributer
.alias
);
226 //if (!isUnique(symbol.inheritsFrom)) {
227 // LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
230 var cmethods
= contributer
.methods
;
231 var cproperties
= contributer
.properties
;
233 for (var ci
= 0, cl
= cmethods
.length
; ci
< cl
; ci
++) {
234 if (!cmethods
[ci
].isStatic
) symbol
.inherit(cmethods
[ci
]);
236 for (var ci
= 0, cl
= cproperties
.length
; ci
< cl
; ci
++) {
237 if (!cproperties
[ci
].isStatic
) symbol
.inherit(cproperties
[ci
]);
241 else LOG
.warn("Can't augment contributer: "+augments
[i
]+", not found.");