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.pr_index.keys) {
13 ret.set_object_member(k, this.pr_index.get(k).toJson());
19 public Gee.HashMap<string,Symbol> pr_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.pr_index.keys) {
44 public Gee.ArrayList<Symbol> values()
46 var r= new Gee.ArrayList<Symbol>();
47 foreach(var k in this.pr_index.values) {
54 public bool hasSymbol(string alias)
56 return this.pr_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("Skip Overwriting symbol documentation for: %s.",symbol.alias);
68 this.pr_index.set(symbol.alias, symbol);
71 public Symbol? getSymbol (string alias) {
73 if (this.hasSymbol(alias)) return this.pr_index.get(alias);
77 toArray : function() {
79 for (var p in this._index) {
80 found.push(this._index[p]);
90 '*object' : 'SymbolSet',
97 public void deleteSymbol (string alias) {
98 if (!this.hasSymbol(alias)) return;
99 this.pr_index.unset(alias);
102 public string renameSymbol (string oldName, string newName) {
103 // todo: should check if oldname or newname already exist
104 if (!this.hasSymbol(oldName)) {
105 GLib.error("Cant rename " + oldName + " to " + newName + " As it doesnt exist");
107 this.pr_index.set(newName, this.pr_index.get(oldName));
108 this.deleteSymbol(oldName);
109 this.pr_index.get(newName).alias = newName;
115 GLib.debug("RELATE called");
116 foreach(var s in this.pr_index.keys) {
117 GLib.debug("%s", this.pr_index.get(s).asString());
119 this.resolveBorrows();
120 this.resolveMemberOf();
121 this.resolveAugments();
122 GLib.debug("AFTER RELATE called");
123 foreach(var s in this.pr_index.keys) {
124 GLib.debug("%s", this.pr_index.get(s).asString());
128 void resolveBorrows()
131 return; // this code is not needed- we do not use @inherits
133 foreach (var p in this._index.keys) {
134 var symbol = this._index.get(p);
138 if (symbol.is("FILE") || symbol.is("GLOBAL")) continue;
140 var borrows = symbol.inherits;
141 for (var i = 0; i < borrows.size; i++) {
142 var borrowed = this.getSymbol(borrows.get(i).alias);
144 imports.BuildDocs.Options.LOG.warn("Can't borrow undocumented "+borrows[i].alias+".");
148 var borrowAsName = borrows[i].as;
149 var borrowAsAlias = borrowAsName;
151 imports.BuildDocs.Options.LOG.warn("Malformed @borrow, 'as' is required.");
155 if (borrowAsName.length > symbol.alias.length && borrowAsName.indexOf(symbol.alias) == 0) {
156 borrowAsName = borrowAsName.replace(borrowed.alias, "");
160 if (borrowAsName.charAt(0) != "#") joiner = ".";
161 borrowAsAlias = borrowed.alias + joiner + borrowAsName;
164 borrowAsName = borrowAsName.replace(/^[#.]/, "");
166 if (this.hasSymbol(borrowAsAlias)) continue;
168 var clone = borrowed.clone();
169 clone.name = borrowAsName;
170 clone.alias = borrowAsAlias;
171 this.addSymbol(clone);
177 void resolveMemberOf ()
179 if (this.pr_index.keys.size < 1) {
182 foreach (var p in this.keys()) {
183 var symbol = this.getSymbol(p);
185 if (symbol.is("FILE") || symbol.is("GLOBAL")) {
189 // the memberOf value was provided in the @memberOf tag
191 GLib.debug("Resolve: %s memberOf=%s", symbol.alias, symbol.memberOf);
192 if (symbol.memberOf.length > 0) {
193 var regex = new GLib.Regex("^("+symbol.memberOf+"[.#-])(.+)$");
194 GLib.MatchInfo minfo;
195 var parts = regex.match_full(symbol.alias, -1, 0, 0 , out minfo);
197 // like foo.bar is a memberOf foo
199 symbol.memberOf = minfo.fetch(1);
200 symbol.private_name = minfo.fetch(2);
202 // like bar is a memberOf foo
204 var joiner = symbol.memberOf.substring(symbol.memberOf.length-1);
205 if (!/[.#-]/.match(joiner)) symbol.memberOf += ".";
207 this.renameSymbol(p, symbol.memberOf + symbol.name);
210 // the memberOf must be calculated
212 GLib.MatchInfo minfo;
213 var parts = /^(.*[.#-])([^.#-]+)$/.match_full(symbol.alias, -1, 0, 0 , out minfo);
216 symbol.memberOf = minfo.fetch(1);
217 symbol.private_name = minfo.fetch(2);
221 // set isStatic, isInner
222 if (symbol.memberOf.length > 0 && !symbol.is("CONSTRUCTOR")) {
223 switch (symbol.memberOf[symbol.memberOf.length-1]) {
225 symbol.isStatic = false;
226 symbol.isInner = false;
230 symbol.isStatic = true;
231 symbol.isInner = false;
235 symbol.isStatic = false;
236 symbol.isInner = true;
242 // unowned methods and fields belong to the global object
243 if (!symbol.is("CONSTRUCTOR") && !symbol.isNamespace && symbol.memberOf == "") {
244 symbol.memberOf = "_global_";
248 if (/[.#-]$/.match(symbol.memberOf)) {
249 symbol.memberOf = symbol.memberOf.substring(0, symbol.memberOf.length-1);
251 //print("looking for memberOf: " + symbol.memberOf + " FOR " + symbol.alias);
252 // add to parent's methods or properties list
253 GLib.debug("Trying to add '%s' to '%s'", symbol.alias, symbol.memberOf);
255 if (symbol.memberOf.length > 0) {
256 var container = this.getSymbol(symbol.memberOf);
257 if (container == null) {
258 GLib.debug("Could not find container for '%s'", symbol.memberOf);
259 if (SymbolSet.isBuiltin(symbol.memberOf)) {
260 container = DocParser.addBuiltin(symbol.memberOf);
263 // print("symbol NOT a BUILT IN - createing a container");
264 // Eg. Ext.y.z (missing y)
265 // we need to add in the missing symbol...
266 container = new Symbol.new_populate_with_args(
267 symbol.memberOf, new Gee.ArrayList<string>(),
268 "OBJECT", new DocComment(""));
269 container.isNamespace = true;
270 this.addSymbol( container );
271 // print(container.toSource());
272 //container = this.getSymbol(symbol.memberOf);
273 // fake container ... so dont ad symbols to it..
276 //LOG.warn("Can't document "+symbol.name +" as a member of undocumented symbol "+symbol.memberOf+".");
277 //LOG.warn("We only have the following symbols: \n" +
278 // this.keys.toSource());
282 if (container != null && (!container.isNamespace || container.isStatic)) {
283 GLib.debug("Calling addMember for '%s' onto '%s'", symbol.alias, container.alias);
284 container.addMember(symbol);
291 void resolveAugments ()
293 // does this sort out multiple extends???
295 foreach (var p in this.pr_index.keys) {
296 var symbol = this.getSymbol(p);
297 this.buildAugmentsList(symbol); /// build heirachy of inheritance...
298 if (symbol.alias == "_global_" || symbol.is("FILE")) continue;
300 var augments = symbol.augments;
301 for(var ii = 0, il = augments.size; ii < il; ii++) {
302 var contributer = this.getSymbol(augments[ii]);
305 if (contributer != null) {
306 //contributer.childClasses.add(symbol.alias); << removed we do this in one go later.
307 symbol.inheritsFrom.add(contributer.alias);
308 //if (!isUnique(symbol.inheritsFrom)) {
309 // imports.BuildDocs.Options.LOG.warn("Can't resolve augments: Circular reference: "+symbol.alias+" inherits from "+contributer.alias+" more than once.");
312 var cmethods = contributer.methods;
313 var cproperties = contributer.properties;
314 var cfgs = contributer.cfgs;
315 for (var ci = 0, cl = cmethods.size; ci < cl; ci++) {
316 symbol.inherit(cmethods[ci]);
318 for (var ci = 0, cl = cproperties.size; ci < cl; ci++) {
319 symbol.inherit(cproperties[ci]);
321 foreach (var ci in cfgs.keys) {
322 symbol.addConfig(cfgs[ci]);
329 GLib.warning("Can't augment contributer: '%s', not found. FOR: %s",
330 augments[ii], symbol.alias
332 //LOG.warn("We only have the following symbols: \n" +
333 // this.keys().toSource().split(",").join(", \n"));
342 void addAugments (Symbol symbol, Gee.ArrayList<string> alist, bool forceit)
343 { // returns number added..
344 if (alist.size < 1) {
347 //print("buildAugmentsList:addAugments" + alist.length);
349 for(var ii = 0; ii < alist.size; ii++) {
350 //print("getAlias:" + alist[ii]);
351 if (alist[ii] == symbol.alias) {
354 var contributer = this.getSymbol(alist[ii]);
355 if (contributer == null) {
359 if (!forceit && symbol.augments.contains(alist[ii])) {
362 if (symbol.augments.index_of(alist[ii]) < 0) {
363 symbol.augments.add(alist[ii]);
367 this.addAugments(symbol, contributer.augments,false);
371 // print("buildAugmentsList: ADDED:" + rval);
375 void buildAugmentsList (Symbol symbol)
378 this.addAugments(symbol, symbol.augments, true);
383 public static bool isBuiltin(string name)
385 for (var i =0 ; i < SymbolSet.coreObjects.length; i++ ){
386 if (name == SymbolSet.coreObjects[i]) {
392 static string[] coreObjects = {
393 "_global_", "Array" , "Boolean", "Date", "Function",
394 "Math", "Number", "Object", "RegExp", "String"