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 01e8b1546..0dee7faad 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 @@ -46,6 +46,7 @@ declare namespace Polymer { * `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/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 01e8b1546..0dee7faad 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 @@ -46,6 +46,7 @@ declare namespace Polymer { * `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-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