jsdoc-rails 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (213) hide show
  1. data/.gitignore +8 -0
  2. data/Gemfile +5 -0
  3. data/MIT-LICENSE +20 -0
  4. data/README.rdoc +94 -0
  5. data/Rakefile +29 -0
  6. data/app/controllers/jsdoc/documentation_controller.rb +48 -0
  7. data/app/helpers/jsdoc/documentation_helper.rb +50 -0
  8. data/app/models/jsdoc/borrowed_function.rb +7 -0
  9. data/app/models/jsdoc/borrowed_property.rb +7 -0
  10. data/app/models/jsdoc/example.rb +5 -0
  11. data/app/models/jsdoc/function.rb +21 -0
  12. data/app/models/jsdoc/param.rb +7 -0
  13. data/app/models/jsdoc/property.rb +13 -0
  14. data/app/models/jsdoc/require.rb +5 -0
  15. data/app/models/jsdoc/return.rb +5 -0
  16. data/app/models/jsdoc/see.rb +4 -0
  17. data/app/models/jsdoc/symbol.rb +58 -0
  18. data/app/models/jsdoc/throw.rb +4 -0
  19. data/app/views/jsdoc/documentation/_inheritance_tree_branch.html.erb +12 -0
  20. data/app/views/jsdoc/documentation/_members_table.html.erb +38 -0
  21. data/app/views/jsdoc/documentation/_param_list.html.erb +11 -0
  22. data/app/views/jsdoc/documentation/index.html.erb +7 -0
  23. data/app/views/jsdoc/documentation/source.html.erb +11 -0
  24. data/app/views/jsdoc/documentation/symbol.html.erb +111 -0
  25. data/app/views/layouts/jsdoc/_aside_symbol_list.html.erb +12 -0
  26. data/app/views/layouts/jsdoc/_header.html.erb +1 -0
  27. data/app/views/layouts/jsdoc/_symbol_tree_branch.html.erb +3 -0
  28. data/app/views/layouts/jsdoc/documentation.html.erb +44 -0
  29. data/app/views/layouts/jsdoc/documentation_wrapper.html.erb +2 -0
  30. data/config/routes.rb +8 -0
  31. data/jsdoc-rails.gemspec +25 -0
  32. data/jsdoc-toolkit/README.txt +183 -0
  33. data/jsdoc-toolkit/app/frame.js +33 -0
  34. data/jsdoc-toolkit/app/frame/Chain.js +102 -0
  35. data/jsdoc-toolkit/app/frame/Dumper.js +144 -0
  36. data/jsdoc-toolkit/app/frame/Hash.js +84 -0
  37. data/jsdoc-toolkit/app/frame/Link.js +173 -0
  38. data/jsdoc-toolkit/app/frame/Namespace.js +10 -0
  39. data/jsdoc-toolkit/app/frame/Opt.js +134 -0
  40. data/jsdoc-toolkit/app/frame/Reflection.js +26 -0
  41. data/jsdoc-toolkit/app/frame/String.js +93 -0
  42. data/jsdoc-toolkit/app/frame/Testrun.js +129 -0
  43. data/jsdoc-toolkit/app/handlers/FOODOC.js +26 -0
  44. data/jsdoc-toolkit/app/handlers/XMLDOC.js +26 -0
  45. data/jsdoc-toolkit/app/handlers/XMLDOC/DomReader.js +159 -0
  46. data/jsdoc-toolkit/app/handlers/XMLDOC/XMLDoc.js +16 -0
  47. data/jsdoc-toolkit/app/handlers/XMLDOC/XMLParse.js +292 -0
  48. data/jsdoc-toolkit/app/lib/JSDOC.js +106 -0
  49. data/jsdoc-toolkit/app/lib/JSDOC/DocComment.js +204 -0
  50. data/jsdoc-toolkit/app/lib/JSDOC/DocTag.js +294 -0
  51. data/jsdoc-toolkit/app/lib/JSDOC/JsDoc.js +140 -0
  52. data/jsdoc-toolkit/app/lib/JSDOC/JsPlate.js +109 -0
  53. data/jsdoc-toolkit/app/lib/JSDOC/Lang.js +144 -0
  54. data/jsdoc-toolkit/app/lib/JSDOC/Parser.js +146 -0
  55. data/jsdoc-toolkit/app/lib/JSDOC/PluginManager.js +33 -0
  56. data/jsdoc-toolkit/app/lib/JSDOC/Symbol.js +646 -0
  57. data/jsdoc-toolkit/app/lib/JSDOC/SymbolSet.js +243 -0
  58. data/jsdoc-toolkit/app/lib/JSDOC/TextStream.js +41 -0
  59. data/jsdoc-toolkit/app/lib/JSDOC/Token.js +18 -0
  60. data/jsdoc-toolkit/app/lib/JSDOC/TokenReader.js +332 -0
  61. data/jsdoc-toolkit/app/lib/JSDOC/TokenStream.js +133 -0
  62. data/jsdoc-toolkit/app/lib/JSDOC/Util.js +32 -0
  63. data/jsdoc-toolkit/app/lib/JSDOC/Walker.js +557 -0
  64. data/jsdoc-toolkit/app/main.js +111 -0
  65. data/jsdoc-toolkit/app/plugins/commentSrcJson.js +20 -0
  66. data/jsdoc-toolkit/app/plugins/frameworkPrototype.js +16 -0
  67. data/jsdoc-toolkit/app/plugins/functionCall.js +10 -0
  68. data/jsdoc-toolkit/app/plugins/publishSrcHilite.js +62 -0
  69. data/jsdoc-toolkit/app/plugins/symbolLink.js +10 -0
  70. data/jsdoc-toolkit/app/plugins/tagParamConfig.js +31 -0
  71. data/jsdoc-toolkit/app/plugins/tagSynonyms.js +45 -0
  72. data/jsdoc-toolkit/app/run.js +348 -0
  73. data/jsdoc-toolkit/app/t/TestDoc.js +144 -0
  74. data/jsdoc-toolkit/app/t/runner.js +13 -0
  75. data/jsdoc-toolkit/app/test.js +342 -0
  76. data/jsdoc-toolkit/app/test/addon.js +24 -0
  77. data/jsdoc-toolkit/app/test/anon_inner.js +14 -0
  78. data/jsdoc-toolkit/app/test/augments.js +31 -0
  79. data/jsdoc-toolkit/app/test/augments2.js +26 -0
  80. data/jsdoc-toolkit/app/test/borrows.js +46 -0
  81. data/jsdoc-toolkit/app/test/borrows2.js +23 -0
  82. data/jsdoc-toolkit/app/test/config.js +22 -0
  83. data/jsdoc-toolkit/app/test/constructs.js +18 -0
  84. data/jsdoc-toolkit/app/test/encoding.js +10 -0
  85. data/jsdoc-toolkit/app/test/encoding_other.js +12 -0
  86. data/jsdoc-toolkit/app/test/event.js +54 -0
  87. data/jsdoc-toolkit/app/test/exports.js +14 -0
  88. data/jsdoc-toolkit/app/test/functions_anon.js +39 -0
  89. data/jsdoc-toolkit/app/test/functions_nested.js +33 -0
  90. data/jsdoc-toolkit/app/test/global.js +13 -0
  91. data/jsdoc-toolkit/app/test/globals.js +25 -0
  92. data/jsdoc-toolkit/app/test/ignore.js +10 -0
  93. data/jsdoc-toolkit/app/test/inner.js +16 -0
  94. data/jsdoc-toolkit/app/test/jsdoc_test.js +477 -0
  95. data/jsdoc-toolkit/app/test/lend.js +33 -0
  96. data/jsdoc-toolkit/app/test/memberof.js +19 -0
  97. data/jsdoc-toolkit/app/test/memberof2.js +38 -0
  98. data/jsdoc-toolkit/app/test/memberof3.js +33 -0
  99. data/jsdoc-toolkit/app/test/memberof_constructor.js +17 -0
  100. data/jsdoc-toolkit/app/test/module.js +17 -0
  101. data/jsdoc-toolkit/app/test/multi_methods.js +25 -0
  102. data/jsdoc-toolkit/app/test/name.js +19 -0
  103. data/jsdoc-toolkit/app/test/namespace_nested.js +23 -0
  104. data/jsdoc-toolkit/app/test/nocode.js +13 -0
  105. data/jsdoc-toolkit/app/test/oblit_anon.js +20 -0
  106. data/jsdoc-toolkit/app/test/overview.js +20 -0
  107. data/jsdoc-toolkit/app/test/param_inline.js +37 -0
  108. data/jsdoc-toolkit/app/test/params_optional.js +8 -0
  109. data/jsdoc-toolkit/app/test/prototype.js +17 -0
  110. data/jsdoc-toolkit/app/test/prototype_nested.js +9 -0
  111. data/jsdoc-toolkit/app/test/prototype_oblit.js +13 -0
  112. data/jsdoc-toolkit/app/test/prototype_oblit_constructor.js +24 -0
  113. data/jsdoc-toolkit/app/test/public.js +10 -0
  114. data/jsdoc-toolkit/app/test/scripts/code.js +5 -0
  115. data/jsdoc-toolkit/app/test/scripts/notcode.txt +5 -0
  116. data/jsdoc-toolkit/app/test/shared.js +42 -0
  117. data/jsdoc-toolkit/app/test/shared2.js +2 -0
  118. data/jsdoc-toolkit/app/test/shortcuts.js +22 -0
  119. data/jsdoc-toolkit/app/test/static_this.js +13 -0
  120. data/jsdoc-toolkit/app/test/synonyms.js +31 -0
  121. data/jsdoc-toolkit/app/test/tosource.js +23 -0
  122. data/jsdoc-toolkit/app/test/variable_redefine.js +14 -0
  123. data/jsdoc-toolkit/changes.txt +124 -0
  124. data/jsdoc-toolkit/conf/sample.conf +31 -0
  125. data/jsdoc-toolkit/java/build.xml +36 -0
  126. data/jsdoc-toolkit/java/build_1.4.xml +36 -0
  127. data/jsdoc-toolkit/java/classes/js.jar +0 -0
  128. data/jsdoc-toolkit/java/src/JsDebugRun.java +21 -0
  129. data/jsdoc-toolkit/java/src/JsRun.java +21 -0
  130. data/jsdoc-toolkit/jsdebug.jar +0 -0
  131. data/jsdoc-toolkit/jsrun.jar +0 -0
  132. data/jsdoc-toolkit/jsrun.sh +52 -0
  133. data/jsdoc-toolkit/templates/jsdoc-rails/publish.js +202 -0
  134. data/jsdoc-toolkit/templates/jsdoc-rails/seeds.tmpl +449 -0
  135. data/jsdoc-toolkit/templates/jsdoc/allclasses.tmpl +17 -0
  136. data/jsdoc-toolkit/templates/jsdoc/allfiles.tmpl +56 -0
  137. data/jsdoc-toolkit/templates/jsdoc/class.tmpl +649 -0
  138. data/jsdoc-toolkit/templates/jsdoc/index.tmpl +39 -0
  139. data/jsdoc-toolkit/templates/jsdoc/publish.js +201 -0
  140. data/jsdoc-toolkit/templates/jsdoc/static/default.css +162 -0
  141. data/jsdoc-toolkit/templates/jsdoc/static/header.html +2 -0
  142. data/jsdoc-toolkit/templates/jsdoc/static/index.html +19 -0
  143. data/jsdoc-toolkit/templates/jsdoc/symbol.tmpl +35 -0
  144. data/lib/generators/jsdoc/jsdoc_generator.rb +71 -0
  145. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_borrowed_functions_table.rb +19 -0
  146. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_borrowed_properties_table.rb +19 -0
  147. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_examples_table.rb +18 -0
  148. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_functions_table.rb +33 -0
  149. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_params_table.rb +24 -0
  150. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_properties_table.rb +37 -0
  151. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_requires_table.rb +16 -0
  152. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_returns_table.rb +18 -0
  153. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_sees_table.rb +18 -0
  154. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_symbols_table.rb +31 -0
  155. data/lib/generators/jsdoc/templates/migrations/jsdoc_create_throws_table.rb +18 -0
  156. data/lib/jsdoc.rb +3 -0
  157. data/lib/jsdoc/engine.rb +30 -0
  158. data/lib/jsdoc/railties/tasks.rake +89 -0
  159. data/lib/jsdoc/version.rb +3 -0
  160. data/public/images/jsdoc/icons/class.gif +0 -0
  161. data/public/images/jsdoc/icons/cmp.gif +0 -0
  162. data/public/images/jsdoc/icons/docs.gif +0 -0
  163. data/public/images/jsdoc/icons/elbow-end.gif +0 -0
  164. data/public/images/jsdoc/icons/elbow-minus.gif +0 -0
  165. data/public/images/jsdoc/icons/elbow-plus.gif +0 -0
  166. data/public/images/jsdoc/icons/elbow.gif +0 -0
  167. data/public/images/jsdoc/icons/event.gif +0 -0
  168. data/public/images/jsdoc/icons/inherited.gif +0 -0
  169. data/public/images/jsdoc/icons/method.gif +0 -0
  170. data/public/images/jsdoc/icons/pkg.gif +0 -0
  171. data/public/images/jsdoc/icons/prop.gif +0 -0
  172. data/public/images/jsdoc/icons/static.gif +0 -0
  173. data/public/javascripts/jsdoc/jsdoc.js +52 -0
  174. data/public/stylesheets/jsdoc/documentation.css +483 -0
  175. data/test/dummy/.gitignore +4 -0
  176. data/test/dummy/Rakefile +7 -0
  177. data/test/dummy/app/controllers/application_controller.rb +3 -0
  178. data/test/dummy/app/helpers/application_helper.rb +2 -0
  179. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  180. data/test/dummy/config.ru +4 -0
  181. data/test/dummy/config/application.rb +45 -0
  182. data/test/dummy/config/boot.rb +10 -0
  183. data/test/dummy/config/database.yml +22 -0
  184. data/test/dummy/config/environment.rb +5 -0
  185. data/test/dummy/config/environments/development.rb +26 -0
  186. data/test/dummy/config/environments/production.rb +49 -0
  187. data/test/dummy/config/environments/test.rb +35 -0
  188. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  189. data/test/dummy/config/initializers/inflections.rb +10 -0
  190. data/test/dummy/config/initializers/jsdoc.rb +5 -0
  191. data/test/dummy/config/initializers/mime_types.rb +5 -0
  192. data/test/dummy/config/initializers/secret_token.rb +7 -0
  193. data/test/dummy/config/initializers/session_store.rb +8 -0
  194. data/test/dummy/config/locales/en.yml +5 -0
  195. data/test/dummy/config/routes.rb +58 -0
  196. data/test/dummy/db/.gitkeep +0 -0
  197. data/test/dummy/public/404.html +26 -0
  198. data/test/dummy/public/422.html +26 -0
  199. data/test/dummy/public/500.html +26 -0
  200. data/test/dummy/public/favicon.ico +0 -0
  201. data/test/dummy/public/javascripts/application.js +2 -0
  202. data/test/dummy/public/javascripts/controls.js +965 -0
  203. data/test/dummy/public/javascripts/dragdrop.js +974 -0
  204. data/test/dummy/public/javascripts/effects.js +1123 -0
  205. data/test/dummy/public/javascripts/prototype.js +6001 -0
  206. data/test/dummy/public/javascripts/rails.js +175 -0
  207. data/test/dummy/public/stylesheets/.gitkeep +0 -0
  208. data/test/dummy/script/rails +6 -0
  209. data/test/integration/navigation_test.rb +7 -0
  210. data/test/jsdoc_test.rb +7 -0
  211. data/test/support/integration_case.rb +5 -0
  212. data/test/test_helper.rb +22 -0
  213. metadata +297 -0
@@ -0,0 +1,133 @@
1
+ if (typeof JSDOC == "undefined") JSDOC = {};
2
+
3
+ /**
4
+ @constructor
5
+ */
6
+ JSDOC.TokenStream = function(tokens) {
7
+ this.tokens = (tokens || []);
8
+ this.rewind();
9
+ }
10
+
11
+ /**
12
+ @constructor
13
+ @private
14
+ */
15
+ function VoidToken(/**String*/type) {
16
+ this.toString = function() {return "<VOID type=\""+type+"\">"};
17
+ this.is = function(){return false;}
18
+ }
19
+
20
+ JSDOC.TokenStream.prototype.rewind = function() {
21
+ this.cursor = -1;
22
+ }
23
+
24
+ /**
25
+ @type JSDOC.Token
26
+ */
27
+ JSDOC.TokenStream.prototype.look = function(/**Number*/n, /**Boolean*/considerWhitespace) {
28
+ if (typeof n == "undefined") n = 0;
29
+
30
+ if (considerWhitespace == true) {
31
+ if (this.cursor+n < 0 || this.cursor+n > this.tokens.length) return {};
32
+ return this.tokens[this.cursor+n];
33
+ }
34
+ else {
35
+ var count = 0;
36
+ var i = this.cursor;
37
+
38
+ while (true) {
39
+ if (i < 0) return new JSDOC.Token("", "VOID", "START_OF_STREAM");
40
+ else if (i > this.tokens.length) return new JSDOC.Token("", "VOID", "END_OF_STREAM");
41
+
42
+ if (i != this.cursor && (this.tokens[i] === undefined || this.tokens[i].is("WHIT"))) {
43
+ if (n < 0) i--; else i++;
44
+ continue;
45
+ }
46
+
47
+ if (count == Math.abs(n)) {
48
+ return this.tokens[i];
49
+ }
50
+ count++;
51
+ (n < 0)? i-- : i++;
52
+ }
53
+
54
+ return new JSDOC.Token("", "VOID", "STREAM_ERROR"); // because null isn't an object and caller always expects an object
55
+ }
56
+ }
57
+
58
+ /**
59
+ @type JSDOC.Token|JSDOC.Token[]
60
+ */
61
+ JSDOC.TokenStream.prototype.next = function(/**Number*/howMany) {
62
+ if (typeof howMany == "undefined") howMany = 1;
63
+ if (howMany < 1) return null;
64
+ var got = [];
65
+
66
+ for (var i = 1; i <= howMany; i++) {
67
+ if (this.cursor+i >= this.tokens.length) {
68
+ return null;
69
+ }
70
+ got.push(this.tokens[this.cursor+i]);
71
+ }
72
+ this.cursor += howMany;
73
+
74
+ if (howMany == 1) {
75
+ return got[0];
76
+ }
77
+ else return got;
78
+ }
79
+
80
+ /**
81
+ @type JSDOC.Token[]
82
+ */
83
+ JSDOC.TokenStream.prototype.balance = function(/**String*/start, /**String*/stop) {
84
+ if (!stop) stop = JSDOC.Lang.matching(start);
85
+
86
+ var depth = 0;
87
+ var got = [];
88
+ var started = false;
89
+
90
+ while ((token = this.look())) {
91
+ if (token.is(start)) {
92
+ depth++;
93
+ started = true;
94
+ }
95
+
96
+ if (started) {
97
+ got.push(token);
98
+ }
99
+
100
+ if (token.is(stop)) {
101
+ depth--;
102
+ if (depth == 0) return got;
103
+ }
104
+ if (!this.next()) break;
105
+ }
106
+ }
107
+
108
+ JSDOC.TokenStream.prototype.getMatchingToken = function(/**String*/start, /**String*/stop) {
109
+ var depth = 0;
110
+ var cursor = this.cursor;
111
+
112
+ if (!start) {
113
+ start = JSDOC.Lang.matching(stop);
114
+ depth = 1;
115
+ }
116
+ if (!stop) stop = JSDOC.Lang.matching(start);
117
+
118
+ while ((token = this.tokens[cursor])) {
119
+ if (token.is(start)) {
120
+ depth++;
121
+ }
122
+
123
+ if (token.is(stop) && cursor) {
124
+ depth--;
125
+ if (depth == 0) return this.tokens[cursor];
126
+ }
127
+ cursor++;
128
+ }
129
+ }
130
+
131
+ JSDOC.TokenStream.prototype.insertAhead = function(/**JSDOC.Token*/token) {
132
+ this.tokens.splice(this.cursor+1, 0, token);
133
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * @namespace
3
+ * @deprecated Use {@link FilePath} instead.
4
+ */
5
+ JSDOC.Util = {
6
+ }
7
+
8
+ /**
9
+ * @deprecated Use {@link FilePath.fileName} instead.
10
+ */
11
+ JSDOC.Util.fileName = function(path) {
12
+ LOG.warn("JSDOC.Util.fileName is deprecated. Use FilePath.fileName instead.");
13
+ var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
14
+ return path.substring(nameStart);
15
+ }
16
+
17
+ /**
18
+ * @deprecated Use {@link FilePath.fileExtension} instead.
19
+ */
20
+ JSDOC.Util.fileExtension = function(filename) {
21
+ LOG.warn("JSDOC.Util.fileExtension is deprecated. Use FilePath.fileExtension instead.");
22
+ return filename.split(".").pop().toLowerCase();
23
+ };
24
+
25
+ /**
26
+ * @deprecated Use {@link FilePath.dir} instead.
27
+ */
28
+ JSDOC.Util.dir = function(path) {
29
+ LOG.warn("JSDOC.Util.dir is deprecated. Use FilePath.dir instead.");
30
+ var nameStart = Math.max(path.lastIndexOf("/")+1, path.lastIndexOf("\\")+1, 0);
31
+ return path.substring(0, nameStart-1);
32
+ }
@@ -0,0 +1,557 @@
1
+ if (typeof JSDOC == "undefined") JSDOC = {};
2
+
3
+ /** @constructor */
4
+ JSDOC.Walker = function(/**JSDOC.TokenStream*/ts) {
5
+ this.init();
6
+ if (typeof ts != "undefined") {
7
+ this.walk(ts);
8
+ }
9
+ }
10
+
11
+ JSDOC.Walker.prototype.init = function() {
12
+ this.ts = null;
13
+
14
+ var globalSymbol = new JSDOC.Symbol("_global_", [], "GLOBAL", new JSDOC.DocComment(""));
15
+ globalSymbol.isNamespace = true;
16
+ globalSymbol.srcFile = "";
17
+ globalSymbol.isPrivate = false;
18
+ JSDOC.Parser.addSymbol(globalSymbol);
19
+ this.lastDoc = null;
20
+ this.token = null;
21
+
22
+ /**
23
+ The chain of symbols under which we are currently nested.
24
+ @type Array
25
+ */
26
+ this.namescope = [globalSymbol];
27
+ this.namescope.last = function(n){ if (!n) n = 0; return this[this.length-(1+n)] || "" };
28
+ }
29
+
30
+ JSDOC.Walker.prototype.walk = function(/**JSDOC.TokenStream*/ts) {
31
+ this.ts = ts;
32
+ while (this.token = this.ts.look()) {
33
+ if (this.token.popNamescope) {
34
+
35
+ var symbol = this.namescope.pop();
36
+ if (symbol.is("FUNCTION")) {
37
+ if (this.ts.look(1).is("LEFT_PAREN") && symbol.comment.getTag("function").length == 0) {
38
+ symbol.isa = "OBJECT";
39
+ }
40
+ }
41
+ }
42
+ this.step();
43
+ if (!this.ts.next()) break;
44
+ }
45
+ }
46
+
47
+ JSDOC.Walker.prototype.step = function() {
48
+ if (this.token.is("JSDOC")) { // it's a doc comment
49
+
50
+ var doc = new JSDOC.DocComment(this.token.data);
51
+
52
+
53
+ if (doc.getTag("exports").length > 0) {
54
+ var exports = doc.getTag("exports")[0];
55
+
56
+ exports.desc.match(/(\S+) as (\S+)/i);
57
+ var n1 = RegExp.$1;
58
+ var n2 = RegExp.$2;
59
+
60
+ if (!n1 && n2) throw "@exports tag requires a value like: 'name as ns.name'";
61
+
62
+ JSDOC.Parser.rename = (JSDOC.Parser.rename || {});
63
+ JSDOC.Parser.rename[n1] = n2
64
+ }
65
+
66
+ // Add support for @getter and @setter - A little to tricky to do in a plugin.
67
+ if (doc.getTag("getter").length > 0) {
68
+ var tag = doc.getTag("getter")[0];
69
+
70
+ doc.tags.push(new JSDOC.DocTag('field'));
71
+
72
+ // If symbol already exists then just update permissions on it
73
+ var prevSymbol = JSDOC.Parser.symbols.getSymbol(this.namescope.last().alias + tag.desc);
74
+ if (prevSymbol) {
75
+ prevSymbol.isReadable = true;
76
+ doc.tags.push(new JSDOC.DocTag('ignore'));
77
+ } else {
78
+ if (!this._getterSetterData) this._getterSetterData = {};
79
+ this._getterSetterData.readable = true;
80
+ this._getterSetterData.name = tag.desc;
81
+ }
82
+
83
+ }
84
+ if (doc.getTag("setter").length > 0) {
85
+ var tag = doc.getTag("setter")[0];
86
+
87
+ doc.tags.push(new JSDOC.DocTag('field'));
88
+
89
+ // If symbol already exists then just update permissions on it
90
+ var prevSymbol = JSDOC.Parser.symbols.getSymbol(this.namescope.last().alias + tag.desc);
91
+ if (prevSymbol) {
92
+ prevSymbol.isWritable = true
93
+ doc.tags.push(new JSDOC.DocTag('ignore'));
94
+ } else {
95
+ if (!this._getterSetterData) this._getterSetterData = {};
96
+ this._getterSetterData.writable = true;
97
+ this._getterSetterData.name = tag.desc;
98
+ }
99
+ }
100
+
101
+ if (doc.getTag("lends").length > 0) {
102
+ var lends = doc.getTag("lends")[0];
103
+
104
+ var name = lends.desc
105
+ if (!name) throw "@lends tag requires a value.";
106
+
107
+ var symbol = new JSDOC.Symbol(name, [], "OBJECT", doc);
108
+
109
+ this.namescope.push(symbol);
110
+
111
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
112
+ if (matching) matching.popNamescope = name;
113
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
114
+
115
+ this.lastDoc = null;
116
+ return true;
117
+ }
118
+ else if (doc.getTag("name").length > 0 && doc.getTag("overview").length == 0) { // it's a virtual symbol
119
+ var virtualName = doc.getTag("name")[0].desc;
120
+ if (!virtualName) throw "@name tag requires a value.";
121
+
122
+ if (doc.getTag("memberOf").length > 0) {
123
+ virtualName = (doc.getTag("memberOf")[0] + "." + virtualName)
124
+ .replace(/([#.])\./, "$1");
125
+ doc.deleteTag("memberOf");
126
+ }
127
+
128
+ var symbol = new JSDOC.Symbol(virtualName, [], "VIRTUAL", doc);
129
+
130
+ JSDOC.Parser.addSymbol(symbol);
131
+
132
+ this.lastDoc = null;
133
+ return true;
134
+ }
135
+ else if (doc.meta) { // it's a meta doclet
136
+ if (doc.meta == "@+") JSDOC.DocComment.shared = doc.src;
137
+ else if (doc.meta == "@-") JSDOC.DocComment.shared = "";
138
+ else if (doc.meta == "nocode+") JSDOC.Parser.conf.ignoreCode = true;
139
+ else if (doc.meta == "nocode-") JSDOC.Parser.conf.ignoreCode = JSDOC.opt.n;
140
+ else throw "Unrecognized meta comment: "+doc.meta;
141
+
142
+ this.lastDoc = null;
143
+ return true;
144
+ }
145
+ else if (doc.getTag("overview").length > 0) { // it's a file overview
146
+ symbol = new JSDOC.Symbol("", [], "FILE", doc);
147
+
148
+ JSDOC.Parser.addSymbol(symbol);
149
+
150
+ this.lastDoc = null;
151
+ return true;
152
+ }
153
+ else {
154
+ this.lastDoc = doc;
155
+ return false;
156
+ }
157
+ }
158
+ else if (!JSDOC.Parser.conf.ignoreCode) { // it's code
159
+ if (this.token.is("NAME")) { // it's the name of something
160
+ var symbol;
161
+ var name = this.token.data;
162
+ var doc = null; if (this.lastDoc) doc = this.lastDoc;
163
+ var params = [];
164
+ var readable = true;
165
+ var writable = true;
166
+
167
+ // Update setter/getter values
168
+ if (this._getterSetterData) {
169
+ name = this._getterSetterData.name;
170
+ readable = !!this._getterSetterData.readable;
171
+ writable = !!this._getterSetterData.writable;
172
+ delete this._getterSetterData;
173
+ }
174
+
175
+ // it's inside an anonymous object
176
+ if (this.ts.look(1).is("COLON") && this.ts.look(-1).is("LEFT_CURLY") && !(this.ts.look(-2).is("JSDOC") || this.namescope.last().comment.getTag("lends").length || this.ts.look(-2).is("ASSIGN") || this.ts.look(-2).is("COLON"))) {
177
+ name = "$anonymous";
178
+ name = this.namescope.last().alias+"-"+name
179
+
180
+ params = [];
181
+
182
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
183
+
184
+ JSDOC.Parser.addSymbol(symbol);
185
+
186
+ this.namescope.push(symbol);
187
+
188
+ var matching = this.ts.getMatchingToken(null, "RIGHT_CURLY");
189
+ if (matching) matching.popNamescope = name;
190
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
191
+ }
192
+ // function foo() {}
193
+ else if (this.ts.look(-1).is("FUNCTION") && this.ts.look(1).is("LEFT_PAREN")) {
194
+ var isInner;
195
+
196
+ if (this.lastDoc) doc = this.lastDoc;
197
+
198
+ if (doc && doc.getTag("memberOf").length > 0) {
199
+ name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
200
+ doc.deleteTag("memberOf");
201
+ }
202
+ else {
203
+ name = this.namescope.last().alias+"-"+name;
204
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
205
+ }
206
+
207
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
208
+
209
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
210
+
211
+ symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
212
+ if (isInner) symbol.isInner = true;
213
+
214
+ if (this.ts.look(1).is("JSDOC")) {
215
+ var inlineReturn = ""+this.ts.look(1).data;
216
+ inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
217
+ symbol.type = inlineReturn;
218
+ }
219
+
220
+ JSDOC.Parser.addSymbol(symbol);
221
+
222
+ this.namescope.push(symbol);
223
+
224
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
225
+ if (matching) matching.popNamescope = name;
226
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
227
+ }
228
+ // foo = function() {}
229
+ else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("FUNCTION")) {
230
+ var constructs;
231
+ var isConstructor = false;
232
+ if (doc && (constructs = doc.getTag("constructs")) && constructs.length) {
233
+ if (constructs[0].desc) {
234
+ name = constructs[0].desc;
235
+ isConstructor = true;
236
+ }
237
+ }
238
+
239
+ var isInner;
240
+ if (this.ts.look(-1).is("VAR") || this.isInner) {
241
+ if (doc && doc.getTag("memberOf").length > 0) {
242
+ name = (doc.getTag("memberOf")[0]+"."+name).replace("#.", "#");
243
+ doc.deleteTag("memberOf");
244
+ }
245
+ else {
246
+ name = this.namescope.last().alias+"-"+name;
247
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
248
+ }
249
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
250
+ }
251
+ else if (name.indexOf("this.") == 0) {
252
+ name = this.resolveThis(name);
253
+ }
254
+
255
+ if (this.lastDoc) doc = this.lastDoc;
256
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
257
+
258
+ symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
259
+
260
+ if (isInner) symbol.isInner = true;
261
+ if (isConstructor) symbol.isa = "CONSTRUCTOR";
262
+
263
+ if (this.ts.look(1).is("JSDOC")) {
264
+ var inlineReturn = ""+this.ts.look(1).data;
265
+ inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
266
+ symbol.type = inlineReturn;
267
+ }
268
+
269
+ JSDOC.Parser.addSymbol(symbol);
270
+
271
+ this.namescope.push(symbol);
272
+
273
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
274
+ if (matching) matching.popNamescope = name;
275
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
276
+ }
277
+ // foo = new function() {} or foo = (function() {}
278
+ else if (this.ts.look(1).is("ASSIGN") && (this.ts.look(2).is("NEW") || this.ts.look(2).is("LEFT_PAREN")) && this.ts.look(3).is("FUNCTION")) {
279
+ var isInner;
280
+ if (this.ts.look(-1).is("VAR") || this.isInner) {
281
+ name = this.namescope.last().alias+"-"+name
282
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
283
+ }
284
+ else if (name.indexOf("this.") == 0) {
285
+ name = this.resolveThis(name);
286
+ }
287
+
288
+ this.ts.next(3); // advance past the "new" or "("
289
+
290
+ if (this.lastDoc) doc = this.lastDoc;
291
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
292
+
293
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
294
+ if (isInner) symbol.isInner = true;
295
+
296
+ if (this.ts.look(1).is("JSDOC")) {
297
+ var inlineReturn = ""+this.ts.look(1).data;
298
+ inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
299
+ symbol.type = inlineReturn;
300
+ }
301
+
302
+ JSDOC.Parser.addSymbol(symbol);
303
+
304
+ symbol.scopeType = "INSTANCE";
305
+ this.namescope.push(symbol);
306
+
307
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
308
+ if (matching) matching.popNamescope = name;
309
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
310
+ }
311
+ // foo: function() {}
312
+ else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("FUNCTION")) {
313
+ name = (this.namescope.last().alias+"."+name).replace("#.", "#");
314
+
315
+ if (this.lastDoc) doc = this.lastDoc;
316
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
317
+
318
+ if (doc && doc.getTag("constructs").length) {
319
+ name = name.replace(/\.prototype(\.|$)/, "#");
320
+
321
+ if (name.indexOf("#") > -1) name = name.match(/(^[^#]+)/)[0];
322
+ else name = this.namescope.last().alias;
323
+
324
+ symbol = new JSDOC.Symbol(name, params, "CONSTRUCTOR", doc);
325
+ }
326
+ else {
327
+ symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
328
+ }
329
+
330
+ if (this.ts.look(1).is("JSDOC")) {
331
+ var inlineReturn = ""+this.ts.look(1).data;
332
+ inlineReturn = inlineReturn.replace(/(^\/\*\* *| *\*\/$)/g, "");
333
+ symbol.type = inlineReturn;
334
+ }
335
+
336
+ JSDOC.Parser.addSymbol(symbol);
337
+
338
+ this.namescope.push(symbol);
339
+
340
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
341
+ if (matching) matching.popNamescope = name;
342
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
343
+ }
344
+ // foo = {}
345
+ else if (this.ts.look(1).is("ASSIGN") && this.ts.look(2).is("LEFT_CURLY")) {
346
+ var isInner;
347
+ if (this.ts.look(-1).is("VAR") || this.isInner) {
348
+ name = this.namescope.last().alias+"-"+name
349
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
350
+ }
351
+ else if (name.indexOf("this.") == 0) {
352
+ name = this.resolveThis(name);
353
+ }
354
+
355
+ if (this.lastDoc) doc = this.lastDoc;
356
+
357
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
358
+ if (isInner) symbol.isInner = true;
359
+
360
+
361
+ if (doc) JSDOC.Parser.addSymbol(symbol);
362
+
363
+ this.namescope.push(symbol);
364
+
365
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
366
+ if (matching) matching.popNamescope = name;
367
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
368
+ }
369
+ // var foo;
370
+ else if (this.ts.look(1).is("SEMICOLON")) {
371
+ var isInner;
372
+
373
+ if (this.ts.look(-1).is("VAR") || this.isInner) {
374
+ name = this.namescope.last().alias+"-"+name
375
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
376
+
377
+ if (this.lastDoc) doc = this.lastDoc;
378
+
379
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
380
+ if (isInner) symbol.isInner = true;
381
+
382
+
383
+ if (doc) JSDOC.Parser.addSymbol(symbol);
384
+ }
385
+ }
386
+ // foo = x
387
+ else if (this.ts.look(1).is("ASSIGN")) {
388
+ var isInner;
389
+ if (this.ts.look(-1).is("VAR") || this.isInner) {
390
+ name = this.namescope.last().alias+"-"+name
391
+ if (!this.namescope.last().is("GLOBAL")) isInner = true;
392
+ }
393
+ else if (name.indexOf("this.") == 0) {
394
+ name = this.resolveThis(name);
395
+ }
396
+
397
+ if (this.lastDoc) doc = this.lastDoc;
398
+
399
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
400
+ if (isInner) symbol.isInner = true;
401
+
402
+
403
+ if (doc) JSDOC.Parser.addSymbol(symbol);
404
+ }
405
+ // foo: {}
406
+ else if (this.ts.look(1).is("COLON") && this.ts.look(2).is("LEFT_CURLY")) {
407
+ name = (this.namescope.last().alias+"."+name).replace("#.", "#");
408
+
409
+ if (this.lastDoc) doc = this.lastDoc;
410
+
411
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
412
+
413
+
414
+ if (doc) JSDOC.Parser.addSymbol(symbol);
415
+
416
+ this.namescope.push(symbol);
417
+
418
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
419
+ if (matching) matching.popNamescope = name;
420
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
421
+ }
422
+ // foo: x
423
+ else if (this.ts.look(1).is("COLON")) {
424
+ name = (this.namescope.last().alias+"."+name).replace("#.", "#");;
425
+
426
+ if (this.lastDoc) doc = this.lastDoc;
427
+
428
+ symbol = new JSDOC.Symbol(name, params, "OBJECT", doc);
429
+
430
+
431
+ if (doc) JSDOC.Parser.addSymbol(symbol);
432
+ }
433
+ // foo(...)
434
+ else if (this.ts.look(1).is("LEFT_PAREN")) {
435
+ if (typeof JSDOC.PluginManager != "undefined") {
436
+ var functionCall = {name: name};
437
+
438
+ var cursor = this.ts.cursor;
439
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
440
+ this.ts.cursor = cursor;
441
+
442
+ for (var i = 0; i < params.length; i++)
443
+ functionCall["arg" + (i + 1)] = params[i].name;
444
+
445
+ JSDOC.PluginManager.run("onFunctionCall", functionCall);
446
+ if (functionCall.doc) {
447
+ this.ts.insertAhead(new JSDOC.Token(functionCall.doc, "COMM", "JSDOC"));
448
+ }
449
+ }
450
+ }
451
+ this.lastDoc = null;
452
+ }
453
+ else if (this.token.is("FUNCTION")) { // it's an anonymous function
454
+ if (
455
+ (!this.ts.look(-1).is("COLON") || !this.ts.look(-1).is("ASSIGN"))
456
+ && !this.ts.look(1).is("NAME")
457
+ ) {
458
+ if (this.lastDoc) doc = this.lastDoc;
459
+
460
+ name = "$anonymous";
461
+ name = this.namescope.last().alias+"-"+name
462
+
463
+ params = JSDOC.Walker.onParamList(this.ts.balance("LEFT_PAREN"));
464
+
465
+ symbol = new JSDOC.Symbol(name, params, "FUNCTION", doc);
466
+
467
+ JSDOC.Parser.addSymbol(symbol);
468
+
469
+ this.namescope.push(symbol);
470
+
471
+ var matching = this.ts.getMatchingToken("LEFT_CURLY");
472
+ if (matching) matching.popNamescope = name;
473
+ else LOG.warn("Mismatched } character. Can't parse code in file " + symbol.srcFile + ".");
474
+ }
475
+ }
476
+
477
+ if (symbol) {
478
+ symbol.isReadable = readable;
479
+ symbol.isWritable = writable;
480
+ }
481
+ }
482
+ return true;
483
+ }
484
+
485
+ /**
486
+ Resolves what "this." means when it appears in a name.
487
+ @param name The name that starts with "this.".
488
+ @returns The name with "this." resolved.
489
+ */
490
+ JSDOC.Walker.prototype.resolveThis = function(name) {
491
+ name.match(/^this\.(.+)$/)
492
+ var nameFragment = RegExp.$1;
493
+ if (!nameFragment) return name;
494
+
495
+ var symbol = this.namescope.last();
496
+ var scopeType = symbol.scopeType || symbol.isa;
497
+
498
+ // if we are in a constructor function, `this` means the instance
499
+ if (scopeType == "CONSTRUCTOR") {
500
+ name = symbol.alias+"#"+nameFragment;
501
+ }
502
+
503
+ // if we are in an anonymous constructor function, `this` means the instance
504
+ else if (scopeType == "INSTANCE") {
505
+ name = symbol.alias+"."+nameFragment;
506
+ }
507
+
508
+ // if we are in a function, `this` means the container (possibly the global)
509
+ else if (scopeType == "FUNCTION") {
510
+ // in a method of a prototype, so `this` means the constructor
511
+ if (symbol.alias.match(/(^.*)[#.-][^#.-]+/)) {
512
+ var parentName = RegExp.$1;
513
+ var parent = JSDOC.Parser.symbols.getSymbol(parentName);
514
+
515
+ if (!parent) {
516
+ if (JSDOC.Lang.isBuiltin(parentName)) parent = JSDOC.Parser.addBuiltin(parentName);
517
+ else {
518
+ if (symbol.alias.indexOf("$anonymous") < 0) // these will be ignored eventually
519
+ LOG.warn("Trying to document "+symbol.alias+" without first documenting "+parentName+".");
520
+ }
521
+ }
522
+ if (parent) name = parentName+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
523
+ }
524
+ else {
525
+ parent = this.namescope.last(1);
526
+ name = parent.alias+(parent.is("CONSTRUCTOR")?"#":".")+nameFragment;
527
+ }
528
+ }
529
+ // otherwise it means the global
530
+ else {
531
+ name = nameFragment;
532
+ }
533
+
534
+ return name;
535
+ }
536
+
537
+ JSDOC.Walker.onParamList = function(/**Array*/paramTokens) {
538
+ if (!paramTokens) {
539
+ LOG.warn("Malformed parameter list. Can't parse code.");
540
+ return [];
541
+ }
542
+ var params = [];
543
+ for (var i = 0, l = paramTokens.length; i < l; i++) {
544
+ if (paramTokens[i].is("JSDOC")) {
545
+ var paramType = paramTokens[i].data.replace(/(^\/\*\* *| *\*\/$)/g, "");
546
+
547
+ if (paramTokens[i+1] && paramTokens[i+1].is("NAME")) {
548
+ i++;
549
+ params.push({type: paramType, name: paramTokens[i].data});
550
+ }
551
+ }
552
+ else if (paramTokens[i].is("NAME")) {
553
+ params.push({name: paramTokens[i].data});
554
+ }
555
+ }
556
+ return params;
557
+ }