4 public class SymbolSet : Object {
6 private Gee.HashMap<string,Symbol> __index = null;
8 public Gee.HashMap<string,Symbol> _index {
10 if (this.__index == null) {
11 GLib.debug("Creating new Symbolset array");
12 this.__index = new Gee.HashMap<string,Symbol>();
24 public Gee.ArrayList<string> keys()
26 var r= new Gee.ArrayList<string>();
27 foreach(var k in this._index.keys) {
33 public Gee.ArrayList<Symbol> values()
35 var r= new Gee.ArrayList<Symbol>();
36 foreach(var k in this._index.values) {
43 public bool hasSymbol(string alias)
45 return this._index.has_key(alias);
46 //return this.keys().indexOf(alias) > -1;
49 public void addSymbol (Symbol symbol) {
50 GLib.debug("ADDING SYMBOL: %s",symbol.alias);
53 if (this.hasSymbol(symbol.alias)) {
54 GLib.warning("Overwriting symbol documentation for: %s.",symbol.alias);
56 this._index.set(symbol.alias, symbol);
59 public Symbol? getSymbol (string alias) {
61 if (this.hasSymbol(alias)) return this._index.get(alias);
65 toArray : function() {
67 for (var p in this._index) {
68 found.push(this._index[p]);
78 '*object' : 'SymbolSet',
85 public void deleteSymbol (string alias) {
86 if (!this.hasSymbol(alias)) return;
87 this._index.unset(alias);
90 public string renameSymbol (string oldName, string newName) {
91 // todo: should check if oldname or newname already exist
92 if (!this.hasSymbol(oldName)) {
93 GLib.error("Cant rename " + oldName + " to " + newName + " As it doesnt exist");
95 this._index.set(newName, this._index.get(oldName));
96 this.deleteSymbol(oldName);
97 this._index.get(newName).alias = newName;
103 GLib.debug("RELATE called");
104 foreach(var s in this._index.keys) {
105 GLib.debug("%s", this._index.get(s).asString());
107 this.resolveBorrows();
108 this.resolveMemberOf();
109 this.resolveAugments();
110 GLib.debug("AFTER RELATE called");
111 foreach(var s in this._index.keys) {
112 GLib.debug("%s", this._index.get(s).asString());
116 void resolveBorrows()
119 return; // this code is not needed- we do not use @inherits
121 foreach (var p in this._index.keys) {
122 var symbol = this._index.get(p);
126 if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
128 var borrows = symbol.inherits;
129 for (var i = 0; i < borrows.size; i++) {
130 var borrowed = this.getSymbol(borrows.get(i).alias);
132 imports.BuildDocs.Options.LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
136 var borrowAsName = borrows[i].as;
137 var borrowAsAlias = borrowAsName;
139 imports.BuildDocs.Options.LOG.warn("Malformed @borrow, 'as' is required.");
143 if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
144 borrowAsName = borrowAsName.replace(borrowed.alias, "");
148 if (borrowAsName.charAt(0) != "#") joiner = ".";
149 borrowAsAlias = borrowed.alias + joiner + borrowAsName;
152 borrowAsName = borrowAsName.replace(/^[#.]/, "");
154 if (this.hasSymbol(borrowAsAlias)) continue;
156 var clone = borrowed.clone();
157 clone.name = borrowAsName;
158 clone.alias = borrowAsAlias;
159 this.addSymbol(clone);
165 void resolveMemberOf ()
167 if (this._index.keys.size < 1) {
170 foreach (var p in this.keys()) {
171 var symbol = this.getSymbol(p);
173 if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
175 // the memberOf value was provided in the @memberOf tag
176 else if (symbol.memberOf.length > 0) {
177 var regex = new GLib.Regex("^("+symbol.memberOf+"[.#-])(.+)$");
178 GLib.MatchInfo minfo;
179 var parts = regex.match_full(symbol.alias, -1, 0, 0 , out minfo);
181 // like foo.bar is a memberOf foo
184 symbol.memberOf = minfo.fetch(1);
185 symbol.private_name = minfo.fetch(2);
187 // like bar is a memberOf foo
189 var joiner = symbol.memberOf.substring(symbol.memberOf.length-1);
190 if (!/[.#-]/.match(joiner)) symbol.memberOf += ".";
192 this.renameSymbol(p, symbol.memberOf + symbol.name);
195 // the memberOf must be calculated
197 GLib.MatchInfo minfo;
198 var parts = /^(.*[.#-])([^.#-]+)$/.match_full(symbol.alias, -1, 0, 0 , out minfo);
201 symbol.memberOf = minfo.fetch(1);
202 symbol.private_name = minfo.fetch(2);
206 // set isStatic, isInner
207 if (symbol.memberOf.length > 0) {
208 switch (symbol.memberOf[symbol.memberOf.length-1]) {
210 symbol.isStatic = false;
211 symbol.isInner = false;
215 symbol.isStatic = true;
216 symbol.isInner = false;
220 symbol.isStatic = false;
221 symbol.isInner = true;
227 // unowned methods and fields belong to the global object
228 if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
229 symbol.memberOf = "_global_";
233 if (/[.#-]$/.match(symbol.memberOf)) {
234 symbol.memberOf = symbol.memberOf.substring(0, symbol.memberOf.length-1);
236 //print("looking for memberOf: " + symbol.memberOf + " FOR " + symbol.alias);
237 // add to parent's methods or properties list
238 if (symbol.memberOf.length > 0) {
239 var container = this.getSymbol(symbol.memberOf);
240 if (container == null) {
241 if (SymbolSet.isBuiltin(symbol.memberOf)) {
242 container = DocParser.addBuiltin(symbol.memberOf);
245 // print("symbol NOT a BUILT IN - createing a container");
246 // Eg. Ext.y.z (missing y)
247 // we need to add in the missing symbol...
248 container = new Symbol.new_populate_with_args(
249 symbol.memberOf, new Gee.ArrayList<string>(),
250 "OBJECT", new DocComment(""));
251 container.isNamespace = true;
252 this.addSymbol( container );
253 // print(container.toSource());
254 //container = this.getSymbol(symbol.memberOf);
255 // fake container ... so dont ad symbols to it..
258 //LOG.warn("Can't document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
259 //LOG.warn("We only have the following symbols: \n" +
260 // this.keys.toSource());
264 if (container != null && !container.isNamespace) {
265 container.addMember(symbol);
272 void resolveAugments ()
274 // does this sort out multiple extends???
276 foreach (var p in this._index.keys) {
277 var symbol = this.getSymbol(p);
278 this.buildAugmentsList(symbol); /// build heirachy of inheritance...
279 if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
281 var augments = symbol.augments;
282 for(var ii = 0, il = augments.size; ii < il; ii++) {
283 var contributer = this.getSymbol(augments[ii]);
286 if (contributer != null) {
287 contributer.childClasses.add(symbol.alias);
288 symbol.inheritsFrom.add(contributer.alias);
289 //if (!isUnique(symbol.inheritsFrom)) {
290 // imports.BuildDocs.Options.LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
293 var cmethods = contributer.methods;
294 var cproperties = contributer.properties;
295 var cfgs = contributer.cfgs;
296 for (var ci = 0, cl = cmethods.size; ci < cl; ci++) {
297 symbol.inherit(cmethods[ci]);
299 for (var ci = 0, cl = cproperties.size; ci < cl; ci++) {
300 symbol.inherit(cproperties[ci]);
302 foreach (var ci in cfgs.keys) {
303 symbol.addConfig(cfgs[ci]);
310 GLib.warning("Can't augment contributer: '%s', not found. FOR: %s",
311 augments[ii], symbol.alias
313 //LOG.warn("We only have the following symbols: \n" +
314 // this.keys().toSource().split(",").join(", \n"));
323 void addAugments (Symbol symbol, Gee.ArrayList<string> alist, bool forceit)
324 { // returns number added..
325 if (alist.size < 1) {
328 //print("buildAugmentsList:addAugments" + alist.length);
330 for(var ii = 0; ii < alist.size; ii++) {
331 //print("getAlias:" + alist[ii]);
332 if (alist[ii] == symbol.alias) {
335 var contributer = this.getSymbol(alist[ii]);
336 if (contributer == null) {
340 if (!forceit && symbol.augments.contains(alist[ii])) {
343 if (symbol.augments.index_of(alist[ii]) < 0) {
344 symbol.augments.add(alist[ii]);
348 this.addAugments(symbol, contributer.augments,false);
352 // print("buildAugmentsList: ADDED:" + rval);
356 void buildAugmentsList (Symbol symbol)
359 this.addAugments(symbol, symbol.augments, true);
364 public static bool isBuiltin(string name)
366 for (var i =0 ; i < SymbolSet.coreObjects.length; i++ ){
367 if (name == SymbolSet.coreObjects[i]) {
373 static string[] coreObjects = {
374 "_global_", "Array" , "Boolean", "Date", "Function",
375 "Math", "Number", "Object", "RegExp", "String"