From a5a21309877a9c5f9d685c3b5a6bc0a69799a7d3 Mon Sep 17 00:00:00 2001 From: Alexander Marks Date: Fri, 30 Nov 2018 21:55:27 -0800 Subject: [PATCH 1/3] Update gen-tsd polymer-2 fixtures. Demonstrates problem where analyzer does not detect mixin class properties that are added to the prototype. --- .../scripts/fixtures.txt | 2 +- .../goldens/polymer-2/lib/legacy/class.d.ts | 2 +- .../lib/legacy/legacy-data-mixin.d.ts | 93 +++++++++++++++++++ .../lib/legacy/legacy-element-mixin.d.ts | 2 - .../polymer-2/lib/mixins/element-mixin.d.ts | 14 +-- .../lib/mixins/properties-mixin.d.ts | 1 + .../goldens/polymer-2/lib/utils/debounce.d.ts | 1 - .../goldens/polymer-2/lib/utils/settings.d.ts | 7 ++ .../polymer-2/lib/utils/telemetry.d.ts | 24 +++++ .../polymer-2/lib/legacy/class.d.ts | 2 +- .../lib/legacy/legacy-data-mixin.d.ts | 93 +++++++++++++++++++ .../lib/legacy/legacy-element-mixin.d.ts | 2 - .../polymer-2/lib/mixins/element-mixin.d.ts | 14 +-- .../lib/mixins/properties-mixin.d.ts | 1 + .../polymer-2/lib/utils/debounce.d.ts | 1 - .../polymer-2/lib/utils/settings.d.ts | 7 ++ .../polymer-2/lib/utils/telemetry.d.ts | 24 +++++ 17 files changed, 255 insertions(+), 35 deletions(-) create mode 100644 packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-data-mixin.d.ts create mode 100644 packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/telemetry.d.ts create mode 100644 packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-data-mixin.d.ts create mode 100644 packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/telemetry.d.ts diff --git a/packages/gen-typescript-declarations/scripts/fixtures.txt b/packages/gen-typescript-declarations/scripts/fixtures.txt index 805a81bd3..7ab69c767 100644 --- a/packages/gen-typescript-declarations/scripts/fixtures.txt +++ b/packages/gen-typescript-declarations/scripts/fixtures.txt @@ -4,5 +4,5 @@ https://github.com/PolymerElements/paper-button.git v2.0.0 paper-button-2 https://github.com/PolymerElements/paper-button.git f644abdfc660f58b6535134ae9a0c16fa7ccaf16 paper-button-3 https://github.com/PolymerElements/paper-menu-button.git v2.0.0 paper-menu-button-2 https://github.com/PolymerElements/paper-menu-button.git ab4885daa67d09a929c8209972e20fbf56014543 paper-menu-button-3 -https://github.com/Polymer/polymer.git 50ba80b864d4843d4e59cfdddeab6efdf280a2ec polymer-2 +https://github.com/Polymer/polymer.git 646355bef43f4559006675452e4248560a614737 polymer-2 https://github.com/Polymer/polymer.git 7791ee9e8655b6a55ec6e65419d21e9e7eb0a581 polymer-3 diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/class.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/class.d.ts index aebfc10b2..2e3bbffe3 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/class.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/class.d.ts @@ -94,5 +94,5 @@ declare namespace Polymer { * * @returns Generated class */ - function Class(info: PolymerInit): {new(): HTMLElement}; + function Class(info: PolymerInit, mixin: (p0: T) => T): {new(): HTMLElement}; } diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-data-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-data-mixin.d.ts new file mode 100644 index 000000000..62d27aa0b --- /dev/null +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-data-mixin.d.ts @@ -0,0 +1,93 @@ +/** + * DO NOT EDIT + * + * This file was automatically generated by + * https://github.com/Polymer/tools/tree/master/packages/gen-typescript-declarations + * + * To modify these typings, edit the source file(s): + * lib/legacy/legacy-data-mixin.html + */ + + +// tslint:disable:variable-name Describing an API that's defined elsewhere. +// tslint:disable:no-any describes the API as best we are able today + +/// +/// +/// +/// + +declare class UndefinedArgumentError extends Error { + constructor(message: any, arg: any); +} + +declare namespace Polymer { + + + /** + * Mixin to selectively add back Polymer 1.x's `undefined` rules + * governing when observers & computing functions run based + * on all arguments being defined (reference https://www.polymer-project.org/1.0/docs/devguide/observers#multi-property-observers). + * + * When loaded, all legacy elements (defined with `Polymer({...})`) + * will have the mixin applied. The mixin only restores legacy data handling + * if `_legacyUndefinedCheck: true` is set on the element's prototype. + * + * This mixin is intended for use to help migration from Polymer 1.x to + * 2.x+ by allowing legacy code to work while identifying observers and + * computing functions that need undefined checks to work without + * the mixin in Polymer 2. + */ + function LegacyDataMixin {}>(base: T): T & LegacyDataMixinConstructor; + + interface LegacyDataMixinConstructor { + new(...args: any[]): LegacyDataMixin; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param templateInfo Template metadata to add effect to + * @param prop Property that should trigger the effect + * @param effect Effect metadata object + */ + _addTemplatePropertyEffect(templateInfo: object|null, prop: string, effect?: object|null): void; + } + + interface LegacyDataMixin { + readonly _legacyUndefinedCheck: any; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param property Property that should trigger the effect + * @param type Effect type, from this.PROPERTY_EFFECT_TYPES + * @param effect Effect metadata object + */ + _addPropertyEffect(property: string, type: string, effect?: object|null): void; + } +} + +declare class LegacyDataMixin extends superClass { + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param templateInfo Template metadata to add effect to + * @param prop Property that should trigger the effect + * @param effect Effect metadata object + */ + static _addTemplatePropertyEffect(templateInfo: object|null, prop: string, effect?: object|null): void; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param property Property that should trigger the effect + * @param type Effect type, from this.PROPERTY_EFFECT_TYPES + * @param effect Effect metadata object + */ + _addPropertyEffect(property: string, type: string, effect?: object|null): void; +} diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts index 01e8b1546..cc668601a 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts @@ -37,8 +37,6 @@ declare namespace Polymer { } interface LegacyElementMixin extends Polymer.ElementMixin, Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin, Polymer.GestureEventListeners { - isAttached: boolean; - _debouncers: {[key: string]: Function|null}; /** * Return the element whose local dom within which this element diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts index 72ce4b85b..aa7f962ce 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts @@ -104,6 +104,7 @@ declare namespace Polymer { * find the template. */ _finalizeClass(): void; + _prepareTemplate(): void; /** * Creates observers for the given `observers` array. @@ -137,12 +138,6 @@ declare namespace Polymer { } interface ElementMixin extends Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin { - _template: HTMLTemplateElement|null; - _importPath: string; - rootPath: string; - importPath: string; - root: StampedTemplate|HTMLElement|ShadowRoot|null; - $: {[key: string]: _Element}; /** * Stamps the element template. @@ -227,11 +222,4 @@ declare namespace Polymer { */ resolveUrl(url: string, base?: string): string; } - - /** - * Provides basic tracking of element definitions (registrations) and - * instance counts. - */ - namespace telemetry { - } } diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/properties-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/properties-mixin.d.ts index 313de4c82..2c4bb4a87 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/properties-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/properties-mixin.d.ts @@ -13,6 +13,7 @@ // tslint:disable:no-any describes the API as best we are able today /// +/// /// /// diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/debounce.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/debounce.d.ts index 3800afc4a..5e6748fbc 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/debounce.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/debounce.d.ts @@ -19,7 +19,6 @@ declare namespace Polymer { class Debouncer { - constructor(); /** * Creates a debouncer if no debouncer is passed as a parameter diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/settings.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/settings.d.ts index 89e201582..5b630b96c 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/settings.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/settings.d.ts @@ -41,4 +41,11 @@ declare namespace Polymer { * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures. */ function setPassiveTouchGestures(usePassive: boolean): void; + + + /** + * Sets `legacyOptimizations` globally for all elements. Enables + * optimizations when only legacy Polymer() style elements are used. + */ + function setLegacyOptimizations(useLegacyOptimizations: boolean): void; } diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/telemetry.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/telemetry.d.ts new file mode 100644 index 000000000..f5b4fd6b4 --- /dev/null +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/utils/telemetry.d.ts @@ -0,0 +1,24 @@ +/** + * DO NOT EDIT + * + * This file was automatically generated by + * https://github.com/Polymer/tools/tree/master/packages/gen-typescript-declarations + * + * To modify these typings, edit the source file(s): + * lib/utils/telemetry.html + */ + + +// tslint:disable:variable-name Describing an API that's defined elsewhere. + +/// + +declare namespace Polymer { + + /** + * Provides basic tracking of element definitions (registrations) and + * instance counts. + */ + namespace telemetry { + } +} diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/class.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/class.d.ts index aebfc10b2..2e3bbffe3 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/class.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/class.d.ts @@ -94,5 +94,5 @@ declare namespace Polymer { * * @returns Generated class */ - function Class(info: PolymerInit): {new(): HTMLElement}; + function Class(info: PolymerInit, mixin: (p0: T) => T): {new(): HTMLElement}; } diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-data-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-data-mixin.d.ts new file mode 100644 index 000000000..62d27aa0b --- /dev/null +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-data-mixin.d.ts @@ -0,0 +1,93 @@ +/** + * DO NOT EDIT + * + * This file was automatically generated by + * https://github.com/Polymer/tools/tree/master/packages/gen-typescript-declarations + * + * To modify these typings, edit the source file(s): + * lib/legacy/legacy-data-mixin.html + */ + + +// tslint:disable:variable-name Describing an API that's defined elsewhere. +// tslint:disable:no-any describes the API as best we are able today + +/// +/// +/// +/// + +declare class UndefinedArgumentError extends Error { + constructor(message: any, arg: any); +} + +declare namespace Polymer { + + + /** + * Mixin to selectively add back Polymer 1.x's `undefined` rules + * governing when observers & computing functions run based + * on all arguments being defined (reference https://www.polymer-project.org/1.0/docs/devguide/observers#multi-property-observers). + * + * When loaded, all legacy elements (defined with `Polymer({...})`) + * will have the mixin applied. The mixin only restores legacy data handling + * if `_legacyUndefinedCheck: true` is set on the element's prototype. + * + * This mixin is intended for use to help migration from Polymer 1.x to + * 2.x+ by allowing legacy code to work while identifying observers and + * computing functions that need undefined checks to work without + * the mixin in Polymer 2. + */ + function LegacyDataMixin {}>(base: T): T & LegacyDataMixinConstructor; + + interface LegacyDataMixinConstructor { + new(...args: any[]): LegacyDataMixin; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param templateInfo Template metadata to add effect to + * @param prop Property that should trigger the effect + * @param effect Effect metadata object + */ + _addTemplatePropertyEffect(templateInfo: object|null, prop: string, effect?: object|null): void; + } + + interface LegacyDataMixin { + readonly _legacyUndefinedCheck: any; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param property Property that should trigger the effect + * @param type Effect type, from this.PROPERTY_EFFECT_TYPES + * @param effect Effect metadata object + */ + _addPropertyEffect(property: string, type: string, effect?: object|null): void; + } +} + +declare class LegacyDataMixin extends superClass { + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param templateInfo Template metadata to add effect to + * @param prop Property that should trigger the effect + * @param effect Effect metadata object + */ + static _addTemplatePropertyEffect(templateInfo: object|null, prop: string, effect?: object|null): void; + + /** + * Overrides `Polyer.PropertyEffects` to wrap effect functions to + * catch `UndefinedArgumentError`s and warn. + * + * @param property Property that should trigger the effect + * @param type Effect type, from this.PROPERTY_EFFECT_TYPES + * @param effect Effect metadata object + */ + _addPropertyEffect(property: string, type: string, effect?: object|null): void; +} diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts index 01e8b1546..cc668601a 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts @@ -37,8 +37,6 @@ declare namespace Polymer { } interface LegacyElementMixin extends Polymer.ElementMixin, Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin, Polymer.GestureEventListeners { - isAttached: boolean; - _debouncers: {[key: string]: Function|null}; /** * Return the element whose local dom within which this element diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts index 72ce4b85b..aa7f962ce 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts @@ -104,6 +104,7 @@ declare namespace Polymer { * find the template. */ _finalizeClass(): void; + _prepareTemplate(): void; /** * Creates observers for the given `observers` array. @@ -137,12 +138,6 @@ declare namespace Polymer { } interface ElementMixin extends Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin { - _template: HTMLTemplateElement|null; - _importPath: string; - rootPath: string; - importPath: string; - root: StampedTemplate|HTMLElement|ShadowRoot|null; - $: {[key: string]: _Element}; /** * Stamps the element template. @@ -227,11 +222,4 @@ declare namespace Polymer { */ resolveUrl(url: string, base?: string): string; } - - /** - * Provides basic tracking of element definitions (registrations) and - * instance counts. - */ - namespace telemetry { - } } diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/properties-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/properties-mixin.d.ts index 313de4c82..2c4bb4a87 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/properties-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/properties-mixin.d.ts @@ -13,6 +13,7 @@ // tslint:disable:no-any describes the API as best we are able today /// +/// /// /// diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/debounce.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/debounce.d.ts index 3800afc4a..5e6748fbc 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/debounce.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/debounce.d.ts @@ -19,7 +19,6 @@ declare namespace Polymer { class Debouncer { - constructor(); /** * Creates a debouncer if no debouncer is passed as a parameter diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/settings.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/settings.d.ts index 89e201582..5b630b96c 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/settings.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/settings.d.ts @@ -41,4 +41,11 @@ declare namespace Polymer { * Sets `passiveTouchGestures` globally for all elements using Polymer Gestures. */ function setPassiveTouchGestures(usePassive: boolean): void; + + + /** + * Sets `legacyOptimizations` globally for all elements. Enables + * optimizations when only legacy Polymer() style elements are used. + */ + function setLegacyOptimizations(useLegacyOptimizations: boolean): void; } diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/telemetry.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/telemetry.d.ts new file mode 100644 index 000000000..f5b4fd6b4 --- /dev/null +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/utils/telemetry.d.ts @@ -0,0 +1,24 @@ +/** + * DO NOT EDIT + * + * This file was automatically generated by + * https://github.com/Polymer/tools/tree/master/packages/gen-typescript-declarations + * + * To modify these typings, edit the source file(s): + * lib/utils/telemetry.html + */ + + +// tslint:disable:variable-name Describing an API that's defined elsewhere. + +/// + +declare namespace Polymer { + + /** + * Provides basic tracking of element definitions (registrations) and + * instance counts. + */ + namespace telemetry { + } +} From 1eb481f7d20dbd4fabdcf32b4ac53b99800b7a20 Mon Sep 17 00:00:00 2001 From: Alexander Marks Date: Fri, 30 Nov 2018 21:58:53 -0800 Subject: [PATCH 2/3] Allow mixin classes to have members added via .prototype calls. For example: /** @type {string} */ MyMixin.prototype.foo; We already support this behavior for normal classes, but not for mixin classes. --- .../analyzer/src/javascript/class-scanner.ts | 18 +++++++------- .../src/polymer/polymer2-mixin-scanner.ts | 24 ++++++++++++++++--- .../lib/legacy/legacy-element-mixin.d.ts | 3 +++ .../polymer-2/lib/mixins/element-mixin.d.ts | 6 +++++ .../lib/legacy/legacy-element-mixin.d.ts | 1 + .../lib/legacy/legacy-element-mixin.d.ts | 3 +++ .../polymer-2/lib/mixins/element-mixin.d.ts | 6 +++++ .../lib/legacy/legacy-element-mixin.d.ts | 1 + 8 files changed, 50 insertions(+), 12 deletions(-) diff --git a/packages/analyzer/src/javascript/class-scanner.ts b/packages/analyzer/src/javascript/class-scanner.ts index 0beb3002f..62bb3cdf3 100644 --- a/packages/analyzer/src/javascript/class-scanner.ts +++ b/packages/analyzer/src/javascript/class-scanner.ts @@ -76,16 +76,16 @@ export class ClassScanner implements JavaScriptScanner { document: JavaScriptDocument, visit: (visitor: Visitor) => Promise) { const classFinder = new ClassFinder(document); - const mixinFinder = new MixinVisitor(document); const elementDefinitionFinder = new CustomElementsDefineCallFinder(document); const prototypeMemberFinder = new PrototypeMemberFinder(document); + await visit(prototypeMemberFinder); + const mixinFinder = new MixinVisitor(document, prototypeMemberFinder); // Find all classes and all calls to customElements.define() await Promise.all([ visit(classFinder), visit(elementDefinitionFinder), visit(mixinFinder), - visit(prototypeMemberFinder), ]); const mixins = mixinFinder.mixins; @@ -424,7 +424,7 @@ interface CustomElementDefinition { definition?: ElementDefineCall; } -class PrototypeMemberFinder implements Visitor { +export class PrototypeMemberFinder implements Visitor { readonly members = new MapWithDefault, properties: Map @@ -505,16 +505,16 @@ class PrototypeMemberFinder implements Visitor { } if (jsdoc.hasTag(jsdocAnn, 'function')) { - const prop = + const method = this._createMethodFromExpression(node.property.name, node, jsdocAnn); - if (prop) { - this._addMethodToClass(cls, prop); + if (method) { + this._addMethodToClass(cls, method); } } else { - const method = this._createPropertyFromExpression( + const prop = this._createPropertyFromExpression( node.property.name, node, jsdocAnn); - if (method) { - this._addPropertyToClass(cls, method); + if (prop) { + this._addPropertyToClass(cls, prop); } } } diff --git a/packages/analyzer/src/polymer/polymer2-mixin-scanner.ts b/packages/analyzer/src/polymer/polymer2-mixin-scanner.ts index 25e0df89c..5f46dc216 100644 --- a/packages/analyzer/src/polymer/polymer2-mixin-scanner.ts +++ b/packages/analyzer/src/polymer/polymer2-mixin-scanner.ts @@ -16,7 +16,7 @@ import {NodePath} from '@babel/traverse'; import * as babel from '@babel/types'; import {getIdentifierName, getNamespacedIdentifier} from '../javascript/ast-value'; -import {extractPropertiesFromClass} from '../javascript/class-scanner'; +import {extractPropertiesFromClass, PrototypeMemberFinder} from '../javascript/class-scanner'; import {Visitor} from '../javascript/estree-visitor'; import * as esutil from '../javascript/esutil'; import {getMethods, getOrInferPrivacy, getStaticMethods} from '../javascript/esutil'; @@ -34,10 +34,14 @@ export class MixinVisitor implements Visitor { private _currentMixin: ScannedPolymerElementMixin|null = null; private _currentMixinNode: babel.Node|null = null; private _currentMixinFunction: babel.Function|null = null; + private _prototypeMemberFinder: PrototypeMemberFinder; readonly warnings: Warning[] = []; - constructor(document: JavaScriptDocument) { + constructor( + document: JavaScriptDocument, + prototypeMemberFinder: PrototypeMemberFinder) { this._document = document; + this._prototypeMemberFinder = prototypeMemberFinder; } enterAssignmentExpression( @@ -159,7 +163,21 @@ export class MixinVisitor implements Visitor { mixin.events = esutil.getEventComments(node); // mixin.sourceRange = this._document.sourceRangeForNode(node); - return mixin; + // Also add members that were described like: + // /** @type {string} */ + // MixinClass.prototype.foo; + const name = getIdentifierName(node.id); + if (name !== undefined) { + const prototypeMembers = this._prototypeMemberFinder.members.get(name); + if (prototypeMembers !== undefined) { + for (const [, property] of prototypeMembers.properties) { + mixin.addProperty(property); + } + for (const [, method] of prototypeMembers.methods) { + mixin.addMethod(method); + } + } + } } } diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts index cc668601a..1965cd097 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/legacy/legacy-element-mixin.d.ts @@ -44,6 +44,9 @@ declare namespace Polymer { * `this.getRootNode().host`. */ readonly domHost: any; + isAttached: boolean; + _debouncers: {[key: string]: Function|null}; + is: string; /** * Overrides the default `Polymer.PropertyEffects` implementation to diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts index aa7f962ce..845451a9c 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-2/lib/mixins/element-mixin.d.ts @@ -138,6 +138,12 @@ declare namespace Polymer { } interface ElementMixin extends Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin { + _template: HTMLTemplateElement|null; + _importPath: string; + rootPath: string; + importPath: string; + root: StampedTemplate|HTMLElement|ShadowRoot|null; + $: {[key: string]: _Element}; /** * Stamps the element template. diff --git a/packages/gen-typescript-declarations/src/test/goldens/polymer-3/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens/polymer-3/lib/legacy/legacy-element-mixin.d.ts index 5ed162975..50a4b083a 100644 --- a/packages/gen-typescript-declarations/src/test/goldens/polymer-3/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens/polymer-3/lib/legacy/legacy-element-mixin.d.ts @@ -71,6 +71,7 @@ interface LegacyElementMixin extends ElementMixin, PropertyEffects, TemplateStam * `this.getRootNode().host`. */ readonly domHost: any; + is: string; /** * Overrides the default `Polymer.PropertyEffects` implementation to diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts index cc668601a..1965cd097 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/legacy/legacy-element-mixin.d.ts @@ -44,6 +44,9 @@ declare namespace Polymer { * `this.getRootNode().host`. */ readonly domHost: any; + isAttached: boolean; + _debouncers: {[key: string]: Function|null}; + is: string; /** * Overrides the default `Polymer.PropertyEffects` implementation to diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts index aa7f962ce..845451a9c 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-2/lib/mixins/element-mixin.d.ts @@ -138,6 +138,12 @@ declare namespace Polymer { } interface ElementMixin extends Polymer.PropertyEffects, Polymer.TemplateStamp, Polymer.PropertyAccessors, Polymer.PropertiesChanged, Polymer.PropertiesMixin { + _template: HTMLTemplateElement|null; + _importPath: string; + rootPath: string; + importPath: string; + root: StampedTemplate|HTMLElement|ShadowRoot|null; + $: {[key: string]: _Element}; /** * Stamps the element template. diff --git a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-3/lib/legacy/legacy-element-mixin.d.ts b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-3/lib/legacy/legacy-element-mixin.d.ts index fbcf233d6..538ba1794 100644 --- a/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-3/lib/legacy/legacy-element-mixin.d.ts +++ b/packages/gen-typescript-declarations/src/test/goldens_goog/polymer-3/lib/legacy/legacy-element-mixin.d.ts @@ -73,6 +73,7 @@ declare module 'goog:polymer.polymer.lib.legacy.legacyElementMixin' { * `this.getRootNode().host`. */ readonly domHost: any; + is: string; /** * Overrides the default `Polymer.PropertyEffects` implementation to From fe0a72449b352828c5a34bf0df191d296447c09c Mon Sep 17 00:00:00 2001 From: Alexander Marks Date: Mon, 3 Dec 2018 13:46:44 -0800 Subject: [PATCH 3/3] Add CHANGELOG entry. --- packages/analyzer/CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/analyzer/CHANGELOG.md b/packages/analyzer/CHANGELOG.md index 7e66c4768..51e26513f 100644 --- a/packages/analyzer/CHANGELOG.md +++ b/packages/analyzer/CHANGELOG.md @@ -5,7 +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 +* Support annotating mixin class properties and methods using + `MixinClass.prototype.foo` syntax. ## [3.1.3] - 2018-10-15