4 public class SymbolSet : Object {
6 private Gee.HashMap<string,Symbol> __index = null;
9 public Json.Object toJson()
11 var ret = new Json.Object();
12 foreach(var k in this._index.keys) {
13 ret.set_object_member(k, this._index.get(k).toJson());
19 public Gee.HashMap<string,Symbol> _index {
21 if (this.__index == null) {
22 GLib.debug("Creating new Symbolset array");
23 this.__index = new Gee.HashMap<string,Symbol>();
28 // CTOR - do nothing..?
35 public Gee.ArrayList<string> keys()
37 var r= new Gee.ArrayList<string>();
38 foreach(var k in this._index.keys) {
44 public Gee.ArrayList<Symbol> values()
46 var r= new Gee.ArrayList<Symbol>();
47 foreach(var k in this._index.values) {
54 public bool hasSymbol(string alias)
56 return this._index.has_key(alias);
57 //return this.keys().indexOf(alias) > -1;
60 public void addSymbol (Symbol symbol) {
61 GLib.debug("ADDING SYMBOL: %s",symbol.alias);
64 if (this.hasSymbol(symbol.alias)) {
65 GLib.warning("Overwriting symbol documentation for: %s.",symbol.alias);
67 this._index.set(symbol.alias, symbol);
70 public Symbol? getSymbol (string alias) {
72 if (this.hasSymbol(alias)) return this._index.get(alias);
76 toArray : function() {
78 for (var p in this._index) {
79 found.push(this._index[p]);
89 '*object' : 'SymbolSet',
96 public void deleteSymbol (string alias) {
97 if (!this.hasSymbol(alias)) return;
98 this._index.unset(alias);
101 public string renameSymbol (string oldName, string newName) {
102 // todo: should check if oldname or newname already exist
103 if (!this.hasSymbol(oldName)) {
104 GLib.error("Cant rename " + oldName + " to " + newName + " As it doesnt exist");
106 this._index.set(newName, this._index.get(oldName));
107 this.deleteSymbol(oldName);
108 this._index.get(newName).alias = newName;
114 GLib.debug("RELATE called");
115 foreach(var s in this._index.keys) {
116 GLib.debug("%s", this._index.get(s).asString());
118 this.resolveBorrows();
119 this.resolveMemberOf();
120 this.resolveAugments();
121 GLib.debug("AFTER RELATE called");
122 foreach(var s in this._index.keys) {
123 GLib.debug("%s", this._index.get(s).asString());
127 void resolveBorrows()
130 return; // this code is not needed- we do not use @inherits
132 foreach (var p in this._index.keys) {
133 var symbol = this._index.get(p);
137 if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
139 var borrows = symbol.inherits;
140 for (var i = 0; i < borrows.size; i++) {
141 var borrowed = this.getSymbol(borrows.get(i).alias);
143 imports.BuildDocs.Options.LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
147 var borrowAsName = borrows[i].as;
148 var borrowAsAlias = borrowAsName;
150 imports.BuildDocs.Options.LOG.warn("Malformed @borrow, 'as' is required.");
154 if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
155 borrowAsName = borrowAsName.replace(borrowed.alias, "");
159 if (borrowAsName.charAt(0) != "#") joiner = ".";
160 borrowAsAlias = borrowed.alias + joiner + borrowAsName;
163 borrowAsName = borrowAsName.replace(/^[#.]/, "");
165 if (this.hasSymbol(borrowAsAlias)) continue;
167 var clone = borrowed.clone();
168 clone.name = borrowAsName;
169 clone.alias = borrowAsAlias;
170 this.addSymbol(clone);
176 void resolveMemberOf ()
178 if (this._index.keys.size < 1) {
181 foreach (var p in this.keys()) {
182 var symbol = this.getSymbol(p);
184 if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
186 // the memberOf value was provided in the @memberOf tag
187 else if (symbol.memberOf.length > 0) {
188 var regex = new GLib.Regex("^("+symbol.memberOf+"[.#-])(.+)$");
189 GLib.MatchInfo minfo;
190 var parts = regex.match_full(symbol.alias, -1, 0, 0 , out minfo);
192 // like foo.bar is a memberOf foo
195 symbol.memberOf = minfo.fetch(1);
196 symbol.private_name = minfo.fetch(2);
198 // like bar is a memberOf foo
200 var joiner = symbol.memberOf.substring(symbol.memberOf.length-1);
201 if (!/[.#-]/.match(joiner)) symbol.memberOf += ".";
203 this.renameSymbol(p, symbol.memberOf + symbol.name);
206 // the memberOf must be calculated
208 GLib.MatchInfo minfo;
209 var parts = /^(.*[.#-])([^.#-]+)$/.match_full(symbol.alias, -1, 0, 0 , out minfo);
212 symbol.memberOf = minfo.fetch(1);
213 symbol.private_name = minfo.fetch(2);
217 // set isStatic, isInner
218 if (symbol.memberOf.length > 0) {
219 switch (symbol.memberOf[symbol.memberOf.length-1]) {
221 symbol.isStatic = false;
222 symbol.isInner = false;
226 symbol.isStatic = true;
227 symbol.isInner = false;
231 symbol.isStatic = false;
232 symbol.isInner = true;
238 // unowned methods and fields belong to the global object
239 if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
240 symbol.memberOf = "_global_";
244 if (/[.#-]$/.match(symbol.memberOf)) {
245 symbol.memberOf = symbol.memberOf.substring(0, symbol.memberOf.length-1);
247 //print("looking for memberOf: " + symbol.memberOf + " FOR " + symbol.alias);
248 // add to parent's methods or properties list
249 GLib.debug("Trying to add '%s' to '%s'", symbol.alias, symbol.memberOf);
251 if (symbol.memberOf.length > 0) {
252 var container = this.getSymbol(symbol.memberOf);
253 if (container == null) {
254 GLib.debug("Could not find container for '%s'", symbol.memberOf);
255 if (SymbolSet.isBuiltin(symbol.memberOf)) {
256 container = DocParser.addBuiltin(symbol.memberOf);
259 // print("symbol NOT a BUILT IN - createing a container");
260 // Eg. Ext.y.z (missing y)
261 // we need to add in the missing symbol...
262 container = new Symbol.new_populate_with_args(
263 symbol.memberOf, new Gee.ArrayList<string>(),
264 "OBJECT", new DocComment(""));
265 container.isNamespace = true;
266 this.addSymbol( container );
267 // print(container.toSource());
268 //container = this.getSymbol(symbol.memberOf);
269 // fake container ... so dont ad symbols to it..
272 //LOG.warn("Can't document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
273 //LOG.warn("We only have the following symbols: \n" +
274 // this.keys.toSource());
278 if (container != null && (!container.isNamespace || container.isStatic)) {
279 GLib.debug("Calling addMember for '%s' onto '%s'", symbol.alias, container.alias);
280 container.addMember(symbol);
287 void resolveAugments ()
289 // does this sort out multiple extends???
291 foreach (var p in this._index.keys) {
292 var symbol = this.getSymbol(p);
293 this.buildAugmentsList(symbol); /// build heirachy of inheritance...
294 if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
296 var augments = symbol.augments;
297 for(var ii = 0, il = augments.size; ii < il; ii++) {
298 var contributer = this.getSymbol(augments[ii]);
301 if (contributer != null) {
302 //contributer.childClasses.add(symbol.alias); << removed we do this in one go later.
303 symbol.inheritsFrom.add(contributer.alias);
304 //if (!isUnique(symbol.inheritsFrom)) {
305 // imports.BuildDocs.Options.LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
308 var cmethods = contributer.methods;
309 var cproperties = contributer.properties;
310 var cfgs = contributer.cfgs;
311 for (var ci = 0, cl = cmethods.size; ci < cl; ci++) {
312 symbol.inherit(cmethods[ci]);
314 for (var ci = 0, cl = cproperties.size; ci < cl; ci++) {
315 symbol.inherit(cproperties[ci]);
317 foreach (var ci in cfgs.keys) {
318 symbol.addConfig(cfgs[ci]);
325 GLib.warning("Can't augment contributer: '%s', not found. FOR: %s",
326 augments[ii], symbol.alias
328 //LOG.warn("We only have the following symbols: \n" +
329 // this.keys().toSource().split(",").join(", \n"));
338 void addAugments (Symbol symbol, Gee.ArrayList<string> alist, bool forceit)
339 { // returns number added..
340 if (alist.size < 1) {
343 //print("buildAugmentsList:addAugments" + alist.length);
345 for(var ii = 0; ii < alist.size; ii++) {
346 //print("getAlias:" + alist[ii]);
347 if (alist[ii] == symbol.alias) {
350 var contributer = this.getSymbol(alist[ii]);
351 if (contributer == null) {
355 if (!forceit && symbol.augments.contains(alist[ii])) {
358 if (symbol.augments.index_of(alist[ii]) < 0) {
359 symbol.augments.add(alist[ii]);
363 this.addAugments(symbol, contributer.augments,false);
367 // print("buildAugmentsList: ADDED:" + rval);
371 void buildAugmentsList (Symbol symbol)
374 this.addAugments(symbol, symbol.augments, true);
379 public static bool isBuiltin(string name)
381 for (var i =0 ; i < SymbolSet.coreObjects.length; i++ ){
382 if (name == SymbolSet.coreObjects[i]) {
388 static string[] coreObjects = {
389 "_global_", "Array" , "Boolean", "Date", "Function",
390 "Math", "Number", "Object", "RegExp", "String"