TypeScript/tests/cases/conformance/jsdoc/jsdocAccessibilityTags.ts
Nathan Shively-Sanders 3c5ecc2a60
Add jsdoc support for @public/@private/@protected (#35731)
* Add @private/@protected/@public test

* Fix @declaration

* draft abstraction + one usage

* Fill in necessary parsing etc

* make general getEffectiveModifierFlags

move to utilities, make the right things call it

* reorder public/private/protected

* JS declaration emit works with @public/@private/@protected

* revert unneeded/incorrect changes

* Update baselines and skip @public/etc when parsing

1. Update the API baselines with the new functions.
2. Do not check for @public/etc during parsing, because parent pointers
aren't set, so non-local tags will be missed; this wrong answer will
then be cached.

* Parser: don't call hasModifier(s) anymore.

Then move jsdoc modifier tag checks into getModifierFlagsNoCache where
they should be. The jsdoc checks are skipped when the parent is
undefined. There are 3 cases when this can happen:

1. The code is in the parser (or a few places in the binder, notably
declareSymbol of module.exports assignments).
2. The node is a source file.
3. The node is synthetic, which I assume to be from the transforms.

It is fine to call getModifierFlags in cases (2) and (3). It is not fine
for (1), so I removed these calls and replaced them with simple
iteration over the modifiers. Worth noting: Ron's uniform node construction
PR removes these calls anyway; this PR just does it early.

* Fix constructor emit

1. Emit protected for protected, which I missed earlier.
2. Emit a constructor, not a property named "constructor".
3. Split declaration emit tests out so that errors are properly reported
there.
2019-12-18 12:58:12 -08:00

68 lines
1.2 KiB
TypeScript

// @allowJs: true
// @checkJs: true
// @target: esnext
// @noEmit: true
// @Filename: jsdocAccessibilityTag.js
class A {
/**
* Ap docs
*
* @private
*/
priv = 4;
/**
* Aq docs
*
* @protected
*/
prot = 5;
/**
* Ar docs
*
* @public
*/
pub = 6;
/** @public */
get ack() { return this.priv }
/** @private */
set ack(value) { }
}
class C {
constructor() {
/**
* Cp docs
*
* @private
*/
this.priv2 = 1;
/**
* Cq docs
*
* @protected
*/
this.prot2 = 2;
/**
* Cr docs
*
* @public
*/
this.pub2 = 3;
}
h() { return this.priv2 }
}
class B extends A {
m() {
this.priv + this.prot + this.pub
}
}
class D extends C {
n() {
this.priv2 + this.prot2 + this.pub2
}
}
new A().priv + new A().prot + new A().pub
new B().priv + new B().prot + new B().pub
new C().priv2 + new C().prot2 + new C().pub2
new D().priv2 + new D().prot2 + new D().pub2