microsoft / microsoft/TypeScript

No supported way to get js doc tags from extraneous comments

オープン
#42,895 コメント 7 件 リアクション 1 件 担当者 1 名 GitHub で見る

@sandersn がすでに取り組んでいます。

2021年2月23日 から。

Experience Enhancement Help Wanted Needs Investigation
主要言語
Go
スター
111k
フォーク
14.3k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

🔎 Search Terms

ts.getJSDocTags
JSDoc tag not found

🕗 Version & Regression Information

Seen in TS 4.0 and 4.1

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about the compiler API
💻 Code

Consider the input file:

/** @foo */

/** @bar */

var x;

As far as I can tell, there's no supported compiler API to access the @foo jsdoc tag. I've resorted to casting ts.Node to {jsDoc?: ts.JSDoc[]}.

🙁 Actual behavior

ts.getJSDocTags and friends only give the @bar JSDoc tag

🙂 Expected behavior

That method, or another, to return both the @foo and @bar tags.

Full compiler code sample to repro
import * as ts from 'typescript';

const filename = 'some_code.ts';
const program = ts.createProgram(['some_code.ts'], {noEmit: true});
program.emit();
const sourceFile = program.getSourceFile(filename);
if (!sourceFile) {
  throw new Error('could not get source file');
}

console.log(`getJSDocTags:`);
console.log([...getAllTags(sourceFile, (node) => ts.getJSDocTags(node))].map(
    (t) => t.tagName.text));
console.log(`Accessing jsDoc directly:`);
console.log(
    [...getAllTags(sourceFile, accessJsDoc)].map((t) => t.tagName.text));

function accessJsDoc(node: ts.Node): ts.JSDocTag[] {
  const tags = [];
  for (const jsDoc of (node as {jsDoc?: ts.JSDoc[]}).jsDoc ?? []) {
    for (const tag of jsDoc.tags ?? []) {
      tags.push(tag);
    }
  }
  return tags;
}

type TagGetter = (node: ts.Node) => Iterable<ts.JSDocTag>;
function getAllTags(
    node: ts.Node, getter: TagGetter, tags = new Set<ts.JSDocTag>()) {
  for (const tag of getter(node)) {
    tags.add(tag);
  }
  ts.forEachChild(node, (child) => {
    getAllTags(child, getter, tags);
  });
  return tags;
}

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。