TypeScript JSDocTag宽度不一致

slhcrj9b  于 6个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(55)

TypeScript版本: 3.8.0-dev.20191128
搜索关键词: JSDocTag解析JS文档
代码

import * as ts from "typescript";

console.log(ts.version); // 3.8.0-dev.20191128

const testFilePath = "/file.ts";
const testFileText = `
/**
* @example Some text.
* @param someParam - Some text.
*/
function test() {}`;

const testSourceFile = ts.createSourceFile(testFilePath, testFileText, ts.ScriptTarget.Latest, true);
const funcDec = testSourceFile.statements.find(ts.isFunctionDeclaration)!;
const tags = ts.getJSDocTags(funcDec);
const firstTag = tags[0];

console.log(firstTag.getText(testSourceFile)); // "@example"
console.log(firstTag.tagName.getText(testSourceFile)); // "example"
console.log(firstTag.comment); // "Some text."
console.log(firstTag.pos); // 8
console.log(firstTag.end); // 17
console.log(firstTag.getWidth(testSourceFile)); // 9

const secondTag = tags[1];

console.log(secondTag.getText(testSourceFile)); // "@param someParam - SomeText.\n"
console.log(secondTag.tagName.getText(testSourceFile)); // "param"
console.log(secondTag.comment); // "- Some text."
console.log(secondTag.pos); // 31
console.log(secondTag.end); // 62
console.log(secondTag.getWidth(testSourceFile)); // 31

预期行为: 宽度对于两者应该是相同的。
实际行为: 不一致,或者我关于JSDocParameterTag遗漏了什么。

i2byvkas

i2byvkas1#

pos / end 反映了我们决定解析到节点的任何内容。由于我们不对 @example 标签后的文本做任何处理,解析器直接跳到行尾,而参数信息被解析到结果节点中,因此其 pos / end 反映了我们在那里解析的所有文本。

qmb5sa22

qmb5sa222#

由于我们不对@example标签后的文本进行任何操作
@RyanCavanaugh 我不认为这是真的。文本会进入该标签的注解中:

请查看此处,并在选项中启用“显示内部内容”。

v9tzhpje

v9tzhpje3#

这个问题已经被标记为"问题",并且最近没有活动。它已经为了保持整洁而自动关闭。如果你还在等待回复,通常在 stackoverflow 上提问会更好。

7uzetpgm

7uzetpgm4#

我认为这应该作为一个bug重新打开(参见我的最后一条评论),或者我可能遗漏了什么。

nwwlzxa7

nwwlzxa75#

这确实是不一致的;两种标签的报告跨度应该是相同的,除非有一些偶然的原因导致它们不能。
我认为JSDocParameterTag具有正确的跨度,因为该标签包含了其注解。JSDocTag的跨度也应该包括其注解。
这可能需要更新相当多的测试——我不确定我们有多少单元测试测试标签位置。

afdcj2ne

afdcj2ne6#

这可能是因为我们在构造JSDocTag时的顺序出现了错误。比较 parseUnknownTagparseParameterOrPropertyTag 。更好的方法是,如果像 @private 这样简单的东西具有正确的行为,就将其作为示例使用。

编辑:实际上,我非常确定区别在于 @param 标签解析自己的注解,因此 finishNode 在向节点添加注解后被调用,而其他所有内容在调用 finishNode 之后才调用 parseTagComments 的共享调用。修复只需将 finishNodeparseXXXTag 中移出,并在 parseTagComments 之后放置在 parseTag 中。

相关问题