Skip to content

Commit f3b2e86

Browse files
authored
Merge pull request #74 from webdoc-labs/feature/type-inference
Feature: Add type interference for strings, numbers, and booleans.
2 parents cbf2006 + f1c3243 commit f3b2e86

File tree

4 files changed

+34
-2
lines changed

4 files changed

+34
-2
lines changed

common/config/rush/pnpm-lock.yaml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
type VariableDeclarator,
1313
isArrowFunctionExpression,
1414
isAssignmentExpression,
15+
isBooleanLiteral,
1516
isCallExpression,
1617
isClassDeclaration,
1718
isClassExpression,
@@ -23,6 +24,7 @@ import {
2324
isInterfaceDeclaration,
2425
isLiteral,
2526
isMemberExpression,
27+
isNumericLiteral,
2628
isObjectExpression,
2729
isObjectMethod,
2830
isObjectProperty,
@@ -50,6 +52,7 @@ import {
5052
extractReturns,
5153
extractType,
5254
} from "./extract-metadata";
55+
import {createSimpleKeywordType} from "@webdoc/model";
5356

5457
// + Extract the symbol name, type from the Node
5558
// + Set the appopriate flags
@@ -113,8 +116,18 @@ export default function extractSymbol(
113116
if (isStringLiteral(node.value)) {
114117
// Quotes for strings
115118
nodeSymbol.meta.defaultValue = `"${node.value.value}"`;
119+
120+
if (!nodeSymbol.meta.dataType) {
121+
nodeSymbol.meta.dataType = createSimpleKeywordType("string");
122+
}
116123
} else {
117124
nodeSymbol.meta.defaultValue = node.value.value;
125+
126+
if (!nodeSymbol.meta.dataType && isNumericLiteral(node.value)) {
127+
nodeSymbol.meta.dataType = createSimpleKeywordType("number");
128+
} else if (!nodeSymbol.meta.dataType && isBooleanLiteral(node.value)) {
129+
nodeSymbol.meta.dataType = createSimpleKeywordType("boolean");
130+
}
118131
}
119132
}
120133
} else if (isClassDeclaration(node) || isClassExpression(node)) {

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,13 @@ describe("@webdoc/parser.LanguageIntegration{@lang js}", function() {
2727

2828
expect(symClassName.members.length).to.equal(6);
2929

30+
const symInitProperty = findSymbol("ClassName.initProperty", symtree);
31+
3032
expect(findSymbol("ClassName.constructor", symtree)).to.not.equal(undefined);
3133
expect(findSymbol("ClassName.classProperty", symtree)).to.not.equal(undefined);
3234
expect(findSymbol("ClassName.classMethod", symtree)).to.not.equal(undefined);
33-
expect(findSymbol("ClassName.initProperty", symtree)).to.not.equal(undefined);
35+
expect(symInitProperty).to.not.equal(undefined);
36+
expect(symInitProperty.meta.defaultValue).to.equal(9);
3437
});
3538

3639
it("should parse assigned members properly", function() {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,4 +107,20 @@ describe("@webdoc/parser.LanguageIntegration{@lang ts}", function() {
107107

108108
expect(symbolObjectName.meta.object).to.equal("this.objectName");
109109
});
110+
111+
it("should infer simple types", function() {
112+
const symtree = buildSymbolTree(`
113+
class ClassName {
114+
bool = true;
115+
num = 1;
116+
str = "string";
117+
}
118+
`);
119+
120+
const [bool, num, str] = symtree.members[0].members;
121+
122+
expect(bool.meta.dataType[0]).to.equal("boolean");
123+
expect(num.meta.dataType[0]).to.equal("number");
124+
expect(str.meta.dataType[0]).to.equal("string");
125+
});
110126
});

0 commit comments

Comments
 (0)