From 1e5c4ddb399210252be7f41701a07626b82eb425 Mon Sep 17 00:00:00 2001 From: Shukant Pal Date: Mon, 6 Jun 2022 00:28:31 -0400 Subject: [PATCH] Fix: Handle string literals being used as keys in enums (#164) --- .../src/symbols-babel/extract-symbol.js | 7 +++--- .../src/transformer/symbol-to-doc.js | 2 +- packages/webdoc-parser/test/parse.js | 25 +++++++++++++++++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/packages/webdoc-parser/src/symbols-babel/extract-symbol.js b/packages/webdoc-parser/src/symbols-babel/extract-symbol.js index 958512ec..4afda926 100644 --- a/packages/webdoc-parser/src/symbols-babel/extract-symbol.js +++ b/packages/webdoc-parser/src/symbols-babel/extract-symbol.js @@ -29,6 +29,7 @@ import { isObjectMethod, isObjectProperty, isReturnStatement, + isStringLiteral, isTSAsExpression, isTSDeclareFunction, isTSDeclareMethod, @@ -39,8 +40,7 @@ import { isTSParameterProperty, isTSPropertySignature, isTSTypeElement, - isThisExpression, - isVariableDeclarator, + isThisExpression, isVariableDeclarator, } from "@babel/types"; import {OBLIGATE_LEAF, PASS_THROUGH, type Symbol, VIRTUAL, isVirtual} from "../types/Symbol"; @@ -184,6 +184,7 @@ export default function extractSymbol( // let symbolName = (() => | | | , + // "propertyName": | | , // NOTE: If this type of symbol is initialized to a or , // it treated as a virtual symbol so that the assigned class/function (i.e. initially a child @@ -214,7 +215,7 @@ export default function extractSymbol( nodeSymbol.meta.readonly = true; } } else {// ObjectProperty - name = node.key.name; + name = isStringLiteral(node.key) ? node.key.value : node.key.name; init = node.value; } diff --git a/packages/webdoc-parser/src/transformer/symbol-to-doc.js b/packages/webdoc-parser/src/transformer/symbol-to-doc.js index 620d2781..201b69de 100644 --- a/packages/webdoc-parser/src/transformer/symbol-to-doc.js +++ b/packages/webdoc-parser/src/transformer/symbol-to-doc.js @@ -115,7 +115,7 @@ const TAG_PARSERS: { [id: string]: TagParser } = { const TAG_OVERRIDES: { [id: string]: string | any } = { // replace any, no lazy "class": "ClassDoc", "interface": "InterfaceDoc", - // "enum": "PropertyDoc", + "enum": "EnumDoc", "member": "PropertyDoc", "method": "MethodDoc", "mixin": "MixinDoc", diff --git a/packages/webdoc-parser/test/parse.js b/packages/webdoc-parser/test/parse.js index 2c55eb38..6895269a 100644 --- a/packages/webdoc-parser/test/parse.js +++ b/packages/webdoc-parser/test/parse.js @@ -185,4 +185,29 @@ describe("@webdoc/parser.parse", function() { expect(engineClass.description).to.include("Good evening!"); expect(engineClass.description).to.include("Hello world!"); }); + + it("should resolve objects properties using string literals as keys correctly", async function() { + const documentTree = await parse(` + /** @namespace input */ + /** + * standard keyboard constants + * @public + * @enum {number} + * @namespace KEY + * @memberof input + */ + const KEY = { + /** @memberof input.KEY */ + "BACKSPACE" : 8, + /** @memberof input.KEY */ + "TAB" : 9, + /** @memberof input.KEY */ + "ENTER" : 13, + }; + `); + + const docKeyEnum = findDoc("input.KEY", documentTree); + + expect(docKeyEnum.members.length).to.equal(3); + }); });