Skip to content

Commit 6cf2abd

Browse files
committed
Add unit-test, inference for ES5 classes
1 parent d35d490 commit 6cf2abd

File tree

4 files changed

+100
-27
lines changed

4 files changed

+100
-27
lines changed

packages/webdoc-parser/src/symbols-babel/extract-symbol.js

Lines changed: 46 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ import {
5555
extractReturns,
5656
extractType,
5757
} from "./extract-metadata";
58+
import type {DataType} from "@webdoc/types";
5859
import {createSimpleKeywordType} from "@webdoc/model";
5960

6061
// + Extract the symbol name, type from the Node
@@ -115,32 +116,13 @@ export default function extractSymbol(
115116
nodeSymbol.meta.scope = node.static ? "static" : "instance";
116117
nodeSymbol.meta.type = "PropertyDoc";
117118

118-
if (isLiteral(node.value)) {
119-
if (isStringLiteral(node.value)) {
120-
// Quotes for strings
121-
nodeSymbol.meta.defaultValue = `"${node.value.value}"`;
119+
const [defaultValue, dataType] = resolveDefaultValue(node.value);
122120

123-
if (!nodeSymbol.meta.dataType) {
124-
nodeSymbol.meta.dataType = createSimpleKeywordType("string");
125-
}
126-
} else {
127-
nodeSymbol.meta.defaultValue = `${node.value.value}`;
121+
if (typeof defaultValue === "string") {
122+
nodeSymbol.meta.defaultValue = defaultValue;
128123

129-
if (!nodeSymbol.meta.dataType && isNumericLiteral(node.value)) {
130-
nodeSymbol.meta.dataType = createSimpleKeywordType("number");
131-
} else if (!nodeSymbol.meta.dataType && isBooleanLiteral(node.value)) {
132-
nodeSymbol.meta.dataType = createSimpleKeywordType("boolean");
133-
}
134-
}
135-
} else if (isExpression(node.value)) {
136-
const defaultValue = resolveExpression(node.value);
137-
138-
if (typeof defaultValue === "string") {
139-
nodeSymbol.meta.defaultValue = defaultValue;
140-
141-
if (!isNaN(parseFloat(defaultValue))) {
142-
nodeSymbol.meta.dataType = createSimpleKeywordType("number");
143-
}
124+
if (!nodeSymbol.meta.dataType) {
125+
nodeSymbol.meta.dataType = dataType;
144126
}
145127
}
146128
} else if (isClassDeclaration(node) || isClassExpression(node)) {
@@ -229,6 +211,14 @@ export default function extractSymbol(
229211
nodeSymbol.meta.type = "PropertyDoc";
230212
}
231213

214+
// Resolve property default
215+
if (!isInit && init) {
216+
const [defaultValue, dataType] = resolveDefaultValue(init);
217+
218+
nodeSymbol.meta.defaultValue = defaultValue;
219+
nodeSymbol.meta.dataType = dataType;
220+
}
221+
232222
let isExpression = false;
233223

234224
if (isExpressionStatement(node)) {
@@ -424,6 +414,38 @@ function resolveExpression(expression: BabelNodeExpression): string | void {
424414
}
425415
}
426416

417+
function resolveDefaultValue(node: BabelNodeExpression): [?string, ?DataType] {
418+
let defaultValue: ?string;
419+
let dataType: ?DataType;
420+
421+
if (isLiteral(node)) {
422+
if (isStringLiteral(node)) {
423+
// Quotes for strings
424+
defaultValue = `"${node.value}"`;
425+
426+
dataType = createSimpleKeywordType("string");
427+
} else {
428+
defaultValue = `${node.value}`;
429+
430+
if (isNumericLiteral(node)) {
431+
dataType = createSimpleKeywordType("number");
432+
} else if (isBooleanLiteral(node)) {
433+
dataType = createSimpleKeywordType("boolean");
434+
}
435+
}
436+
} else if (isExpression(node)) {
437+
defaultValue = resolveExpression(node);
438+
439+
if (typeof defaultValue === "string") {
440+
if (!isNaN(parseFloat(defaultValue))) {
441+
dataType = createSimpleKeywordType("number");
442+
}
443+
}
444+
}
445+
446+
return [defaultValue, dataType];
447+
}
448+
427449
// Whether the member expression assigns to this, e.g.
428450
// this.member.inside.deep -> true
429451
// top.inside -> false

packages/webdoc-parser/test/lang-ts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ describe("@webdoc/parser.LanguageIntegration{@lang ts}", function() {
4747
expect(symbolInitProperty.meta.dataType).to.not.equal(undefined);
4848
expect(symbolInitProperty.meta.dataType[0]).to.equal("number");
4949
expect(symbolInitProperty.meta.access).to.equal("private");
50-
expect(symbolInitProperty.meta.defaultValue).to.equal("-11");
50+
expect(symbolInitProperty.meta.defaultValue).to.equal("9");
5151
expect(symbolInitProperty.comment).to.not.equal("");
5252
expect(symbolInitProperty.meta.readonly).to.equal(true);
5353
});
Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,58 @@
1+
const {findDoc} = require("@webdoc/model");
12
const {parse} = require("../lib/parse");
23

4+
const expect = require("chai").expect;
5+
36
describe("@webdoc/parser.parse (ES5 classes)", function() {
47
it("should correctly infer ES5 classes", function() {
8+
const docTree = parse(`
9+
/**
10+
* ES5 constructor
11+
* @classdesc
12+
* Example ES5 class
13+
* @class
14+
*/
15+
function ES5Class() {
16+
}
17+
18+
/** ES5 method (ironic arrow fn) */
19+
ES5Class.prototype.es5Method = () => {};
20+
21+
/** ES5 static method */
22+
ES5Class.es5StaticMethod = function() {};
23+
24+
/** ES5 property */
25+
ES5Class.prototype.es5Property = "value";
26+
27+
/** ES5 static property */
28+
ES5Class.es5StaticProperty = "static-value";
29+
`);
30+
31+
const es5Class = findDoc("ES5Class", docTree);
32+
const es5Constructor = findDoc("ES5Class.constructor", docTree);
33+
34+
expect(es5Class.description).to.not.include("ES5 constructor");
35+
expect(es5Class.description).to.include("ES5 class");
36+
expect(es5Constructor.description).to.not.include("ES5 class");
37+
expect(es5Constructor.description).to.include("ES5 constructor");
38+
39+
const es5Method = findDoc("ES5Class.es5Method", docTree);
40+
const es5StaticMethod = findDoc("ES5Class.es5StaticMethod", docTree);
41+
const es5Property = findDoc("ES5Class.es5Property", docTree);
42+
const es5StaticProperty = findDoc("ES5Class.es5StaticProperty", docTree);
43+
44+
expect(es5Method.scope).to.equal("instance");
45+
expect(es5Method.type).to.equal("MethodDoc");
46+
47+
expect(es5StaticMethod.scope).to.equal("static");
48+
expect(es5StaticMethod.type).to.equal("MethodDoc");
49+
50+
expect(es5Property.defaultValue).to.equal("\"value\"");
51+
expect(es5Property.scope).to.equal("instance");
52+
expect(es5Property.type).to.equal("PropertyDoc");
553

6-
})
54+
expect(es5StaticProperty.defaultValue).to.equal("\"static-value\"");
55+
expect(es5StaticProperty.scope).to.equal("static");
56+
expect(es5StaticProperty.type).to.equal("PropertyDoc");
57+
});
758
});

packages/webdoc-parser/test/parse-ts.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ describe("@webdoc/parser.parse (Typescript)", function() {
2121
}]);
2222

2323
expect(docs.members.length).to.equal(1);
24-
expect(docs.members[0].members.length).to.equal(1);
24+
expect(docs.members[0].members.length).to.be.gte(1);
2525

2626
const fieldDoc = docs.members[0].members[0];
2727

0 commit comments

Comments
 (0)