Skip to content

Commit 75075ed

Browse files
committed
Make the rest of flatteners functional in anticipation of #381
1 parent 70f92db commit 75075ed

File tree

2 files changed

+170
-175
lines changed

2 files changed

+170
-175
lines changed

lib/flatteners.js

Lines changed: 169 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,169 @@
1+
var flatteners = {
2+
'abstract': flattenBoolean,
3+
'access': propKey('access', 'access'),
4+
'alias': prop('name'),
5+
'arg': synonym('param'),
6+
'argument': synonym('param'),
7+
'augments': collect('augments'),
8+
'author': prop('description'),
9+
'borrows': todo,
10+
'callback': prop('description'),
11+
'class': flattenTypedName,
12+
'classdesc': prop('description'),
13+
'const': synonym('constant'),
14+
'constant': flattenTypedName,
15+
'constructor': synonym('class'),
16+
'constructs': todo,
17+
'copyright': prop('description'),
18+
'default': todo,
19+
'defaultvalue': synonym('default'),
20+
'deprecated': prop('description'),
21+
'desc': synonym('description'),
22+
'description': prop('description'),
23+
'emits': synonym('fires'),
24+
'enum': todo,
25+
'event': prop('description'),
26+
'example': function (result, tag) {
27+
if (!tag.description) {
28+
result.errors.push({
29+
message: '@example without code',
30+
commentLineNumber: tag.lineNumber
31+
});
32+
return;
33+
}
34+
35+
if (!result.examples) {
36+
result.examples = [];
37+
}
38+
39+
var example = {
40+
description: tag.description
41+
};
42+
43+
if (tag.caption) {
44+
example.caption = tag.caption;
45+
}
46+
47+
result.examples.push(example);
48+
},
49+
'exception': synonym('throws'),
50+
'exports': todo,
51+
'extends': synonym('augments'),
52+
'external': prop('description'),
53+
'file': prop('description'),
54+
'fileoverview': synonym('file'),
55+
'fires': todo,
56+
'func': synonym('function'),
57+
'function': prop('name'),
58+
'global': propKey('title', 'scope'),
59+
'host': synonym('external'),
60+
'ignore': flattenBoolean,
61+
'implements': todo,
62+
'inheritdoc': todo,
63+
'inner': propKey('title', 'scope'),
64+
'instance': propKey('title', 'scope'),
65+
'interface': function (result, tag) {
66+
result.interface = true;
67+
if (tag.description) {
68+
result.name = tag.description;
69+
}
70+
},
71+
'kind': propKey('kind', 'kind'),
72+
'lends': prop('description'),
73+
'license': prop('description'),
74+
'linkcode': synonym('link'),
75+
'linkplain': synonym('link'),
76+
'listens': todo,
77+
'member': flattenTypedName,
78+
'memberof': prop('description'),
79+
'method': synonym('function'),
80+
'mixes': todo,
81+
'mixin': prop('name'),
82+
'module': flattenTypedName,
83+
'name': prop('name'),
84+
'namespace': flattenTypedName,
85+
'override': flattenBoolean,
86+
'overview': synonym('file'),
87+
'param': collect('params'),
88+
'private': propKey('title', 'access'),
89+
'prop': synonym('property'),
90+
'property': collect('properties'),
91+
'protected': propKey('title', 'access'),
92+
'public': propKey('title', 'access'),
93+
'readonly': flattenBoolean,
94+
'requires': todo,
95+
'return': synonym('returns'),
96+
'returns': collect('returns'),
97+
'see': collect('sees', true),
98+
'since': prop('description'),
99+
'static': propKey('title', 'scope'),
100+
'summary': prop('description'),
101+
'this': todo,
102+
'throws': collect('throws'),
103+
'todo': collect('todos', true),
104+
'tutorial': todo,
105+
'type': todo,
106+
'typedef': flattenTypedName,
107+
'var': synonym('member'),
108+
'variation': propKey('variation', 'variation'),
109+
'version': prop('description'),
110+
'virtual': synonym('abstract')
111+
};
112+
113+
function todo() {}
114+
115+
function collect(key, description) {
116+
function flattenCollect(result, tag) {
117+
if (!result[key]) {
118+
result[key] = [];
119+
}
120+
if (description) {
121+
result[key].push(tag.description);
122+
} else {
123+
result[key].push(tag);
124+
}
125+
}
126+
return flattenCollect;
127+
}
128+
129+
function synonym(key) {
130+
function flattenSynonym(result, tag) {
131+
return flatteners[key](result, tag, key);
132+
}
133+
return flattenSynonym;
134+
}
135+
136+
function flattenBoolean(result, tag, key) {
137+
result[key] = true;
138+
}
139+
flattenBoolean.singleUse = true;
140+
141+
function prop(prop) {
142+
function flattenProp(result, tag, key) {
143+
result[key] = tag[prop];
144+
}
145+
flattenProp.singleUse = true;
146+
return flattenProp;
147+
}
148+
prop.singleUse = true;
149+
150+
function propKey(prop, key) {
151+
function flattenProp(result, tag) {
152+
result[key] = tag[prop];
153+
}
154+
flattenProp.singleUse = true;
155+
return flattenProp;
156+
}
157+
propKey.singleUse = true;
158+
159+
function flattenTypedName(result, tag, key) {
160+
result[key] = {
161+
name: tag.name
162+
};
163+
164+
if (tag.type) {
165+
result[key].type = tag.type;
166+
}
167+
}
168+
169+
module.exports = flatteners;

lib/parse.js

Lines changed: 1 addition & 175 deletions
Original file line numberDiff line numberDiff line change
@@ -1,181 +1,7 @@
11
'use strict';
22

33
var doctrine = require('doctrine');
4-
5-
var flatteners = {
6-
'abstract': flattenBoolean,
7-
'access': function (result, tag) {
8-
result.access = tag.access;
9-
},
10-
'alias': flattenName,
11-
'arg': synonym('param'),
12-
'argument': synonym('param'),
13-
'augments': collect('augments'),
14-
'author': flattenDescription,
15-
'borrows': todo,
16-
'callback': flattenDescription,
17-
'class': flattenTypedName,
18-
'classdesc': flattenDescription,
19-
'const': synonym('constant'),
20-
'constant': flattenTypedName,
21-
'constructor': synonym('class'),
22-
'constructs': todo,
23-
'copyright': flattenDescription,
24-
'default': todo,
25-
'defaultvalue': synonym('default'),
26-
'deprecated': flattenDescription,
27-
'desc': synonym('description'),
28-
'description': flattenDescription,
29-
'emits': synonym('fires'),
30-
'enum': todo,
31-
'event': flattenDescription,
32-
'example': function (result, tag) {
33-
if (!tag.description) {
34-
result.errors.push({
35-
message: '@example without code',
36-
commentLineNumber: tag.lineNumber
37-
});
38-
return;
39-
}
40-
41-
if (!result.examples) {
42-
result.examples = [];
43-
}
44-
45-
var example = {
46-
description: tag.description
47-
};
48-
49-
if (tag.caption) {
50-
example.caption = tag.caption;
51-
}
52-
53-
result.examples.push(example);
54-
},
55-
'exception': synonym('throws'),
56-
'exports': todo,
57-
'extends': synonym('augments'),
58-
'external': flattenDescription,
59-
'file': flattenDescription,
60-
'fileoverview': synonym('file'),
61-
'fires': todo,
62-
'func': synonym('function'),
63-
'function': flattenName,
64-
'global': function (result) {
65-
result.scope = 'global';
66-
},
67-
'host': synonym('external'),
68-
'ignore': flattenBoolean,
69-
'implements': todo,
70-
'inheritdoc': todo,
71-
'inner': function (result) {
72-
result.scope = 'inner';
73-
},
74-
'instance': function (result) {
75-
result.scope = 'instance';
76-
},
77-
'interface': function (result, tag) {
78-
result.interface = true;
79-
if (tag.description) {
80-
result.name = tag.description;
81-
}
82-
},
83-
'kind': function (result, tag) {
84-
result.kind = tag.kind;
85-
},
86-
'lends': flattenDescription,
87-
'license': flattenDescription,
88-
'linkcode': synonym('link'),
89-
'linkplain': synonym('link'),
90-
'listens': todo,
91-
'member': flattenTypedName,
92-
'memberof': flattenDescription,
93-
'method': synonym('function'),
94-
'mixes': todo,
95-
'mixin': flattenName,
96-
'module': flattenTypedName,
97-
'name': flattenName,
98-
'namespace': flattenTypedName,
99-
'override': flattenBoolean,
100-
'overview': synonym('file'),
101-
'param': collect('params'),
102-
'private': function (result) {
103-
result.access = 'private';
104-
},
105-
'prop': synonym('property'),
106-
'property': collect('properties'),
107-
'protected': function (result) {
108-
result.access = 'protected';
109-
},
110-
'public': function (result) {
111-
result.access = 'public';
112-
},
113-
'readonly': flattenBoolean,
114-
'requires': todo,
115-
'return': synonym('returns'),
116-
'returns': collect('returns'),
117-
'see': collect('sees', true),
118-
'since': flattenDescription,
119-
'static': function (result) {
120-
result.scope = 'static';
121-
},
122-
'summary': flattenDescription,
123-
'this': todo,
124-
'throws': collect('throws'),
125-
'todo': collect('todos', true),
126-
'tutorial': todo,
127-
'type': todo,
128-
'typedef': flattenTypedName,
129-
'var': synonym('member'),
130-
'variation': function (result, tag) {
131-
result.variation = tag.variation;
132-
},
133-
'version': flattenDescription,
134-
'virtual': synonym('abstract')
135-
};
136-
137-
function todo() {}
138-
139-
function collect(key, description) {
140-
return function (result, tag) {
141-
if (!result[key]) {
142-
result[key] = [];
143-
}
144-
if (description) {
145-
result[key].push(tag.description);
146-
} else {
147-
result[key].push(tag);
148-
}
149-
};
150-
}
151-
152-
function synonym(key) {
153-
return function (result, tag) {
154-
return flatteners[key](result, tag, key);
155-
};
156-
}
157-
158-
function flattenBoolean(result, tag, key) {
159-
result[key] = true;
160-
}
161-
162-
function flattenName(result, tag, key) {
163-
result[key] = tag.name;
164-
}
165-
166-
function flattenDescription(result, tag, key) {
167-
result[key] = tag.description;
168-
}
169-
170-
function flattenTypedName(result, tag, key) {
171-
result[key] = {
172-
name: tag.name
173-
};
174-
175-
if (tag.type) {
176-
result[key].type = tag.type;
177-
}
178-
}
4+
var flatteners = require('./flatteners');
1795

1806
/**
1817
* Parse a comment with doctrine, decorate the result with file position and code

0 commit comments

Comments
 (0)