From a1d60e7f20faebb4e2ee76848e47a08b01203509 Mon Sep 17 00:00:00 2001 From: 43081j <43081j@users.noreply.github.com> Date: Wed, 29 Aug 2018 22:14:48 +0100 Subject: [PATCH] analyzer: merge property info from constructors --- packages/analyzer/CHANGELOG.md | 5 +++-- .../analyzer/src/javascript/class-scanner.ts | 19 ++++++++++++++++++- .../src/test/javascript/class-scanner_test.ts | 8 ++++++++ .../src/test/static/class/class-properties.js | 4 ++++ 4 files changed, 33 insertions(+), 3 deletions(-) diff --git a/packages/analyzer/CHANGELOG.md b/packages/analyzer/CHANGELOG.md index 7e66c4768..421799052 100644 --- a/packages/analyzer/CHANGELOG.md +++ b/packages/analyzer/CHANGELOG.md @@ -5,8 +5,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). - - +## Unreleased +* Merge property information from constructors into associated scanned + properties when scanning classes ## [3.1.3] - 2018-10-15 * Make `HtmlDocument#stringify()` faster by only cloning the ast and stringifing diff --git a/packages/analyzer/src/javascript/class-scanner.ts b/packages/analyzer/src/javascript/class-scanner.ts index 0beb3002f..e37d274e9 100644 --- a/packages/analyzer/src/javascript/class-scanner.ts +++ b/packages/analyzer/src/javascript/class-scanner.ts @@ -916,7 +916,24 @@ export function extractPropertiesFromClass( for (const prop of esutil .extractPropertiesFromClassOrObjectBody(astNode, document) .values()) { - properties.set(prop.name, prop); + const existing = properties.get(prop.name); + + if (!existing) { + properties.set(prop.name, prop); + } else { + properties.set(prop.name, { + name: prop.name, + astNode: prop.astNode, + type: prop.type || existing.type, + jsdoc: prop.jsdoc, + sourceRange: prop.sourceRange, + description: prop.description || existing.description, + privacy: prop.privacy || existing.privacy, + warnings: prop.warnings, + readOnly: prop.readOnly === undefined ? + existing.readOnly : prop.readOnly + }); + } } return properties; diff --git a/packages/analyzer/src/test/javascript/class-scanner_test.ts b/packages/analyzer/src/test/javascript/class-scanner_test.ts index 48c9788d1..cde70b1c2 100644 --- a/packages/analyzer/src/test/javascript/class-scanner_test.ts +++ b/packages/analyzer/src/test/javascript/class-scanner_test.ts @@ -224,6 +224,13 @@ suite('Class', () => { cls.properties.get('__customPropertyOnProtoPrivate'), {name: '__customPropertyOnProtoPrivate', privacy: 'private'}); + assert.deepInclude( + cls.properties.get('constructorJSDocGetter'), + { + name: 'constructorJSDocGetter', + description: 'a getter with constructor jsdoc' + }); + assert.deepEqual(await getTestProps(cls), { name: 'Class', constructorMethod: {description: '', name: 'constructor'}, @@ -232,6 +239,7 @@ suite('Class', () => { properties: [ {name: 'customPropertyWithValue'}, {name: 'customPropertyWithJSDoc'}, + {name: 'constructorJSDocGetter'}, {name: 'customPropertyGetter'}, {name: 'customPropertyGetterType'}, {name: 'customPropertyWithGetterSetter'}, diff --git a/packages/analyzer/src/test/static/class/class-properties.js b/packages/analyzer/src/test/static/class/class-properties.js index 9da6756fa..5e6f7aab4 100644 --- a/packages/analyzer/src/test/static/class/class-properties.js +++ b/packages/analyzer/src/test/static/class/class-properties.js @@ -45,7 +45,11 @@ class Class { this.customPropertyWithValue = 5; /** @public a jsdoc property */ this.customPropertyWithJSDoc; + /** @public a getter with constructor jsdoc */ + this.constructorJSDocGetter; } + + get constructorJSDocGetter() { return true; } } /** @type {string} */