diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts
index e57a3fa98f390..884a5b36e38c1 100644
--- a/src/compiler/parser.ts
+++ b/src/compiler/parser.ts
@@ -8579,7 +8579,8 @@ namespace ts {
if (!comment) {
comment = parseTrailingTagComments(start, getNodePos(), indent, indentText);
}
- return finishNode(factory.createJSDocCallbackTag(tagName, typeExpression, fullName, comment), start);
+ const end = comment !== undefined ? getNodePos() : typeExpression.end;
+ return finishNode(factory.createJSDocCallbackTag(tagName, typeExpression, fullName, comment), start, end);
}
function escapedTextsEqual(a: EntityName, b: EntityName): boolean {
diff --git a/tests/cases/fourslash/jsTagAfterCallback1.ts b/tests/cases/fourslash/jsTagAfterCallback1.ts
new file mode 100644
index 0000000000000..cc270afcf399e
--- /dev/null
+++ b/tests/cases/fourslash/jsTagAfterCallback1.ts
@@ -0,0 +1,19 @@
+///
+// @Filename: foo.js
+// @allowJs: true
+// @checkJs: true
+//// /** @callback Listener @yeturn {ListenerBlock} */
+//// /**
+//// * The function used
+//// * /*1*/ settings
+//// */
+//// class /*2*/ListenerBlock {
+//// }
+
+// Force a syntax tree to be created.
+verify.noMatchingBracePositionInCurrentFile(0);
+
+goTo.marker('1');
+edit.insert('fenster');
+
+verify.quickInfoAt('2', 'class ListenerBlock', 'The function used\nfenster settings')
diff --git a/tests/cases/fourslash/jsTagAfterCallback2.ts b/tests/cases/fourslash/jsTagAfterCallback2.ts
new file mode 100644
index 0000000000000..3cfa493f32abf
--- /dev/null
+++ b/tests/cases/fourslash/jsTagAfterCallback2.ts
@@ -0,0 +1,19 @@
+///
+// @Filename: foo.js
+// @allowJs: true
+// @checkJs: true
+//// /** @callback Listener @param x @yeturn {ListenerBlock} */
+//// /**
+//// * The function used
+//// * /*1*/ settings
+//// */
+//// class /*2*/ListenerBlock {
+//// }
+
+// Force a syntax tree to be created.
+verify.noMatchingBracePositionInCurrentFile(0);
+
+goTo.marker('1');
+edit.insert('fenster');
+
+verify.quickInfoAt('2', 'class ListenerBlock', 'The function used\nfenster settings')
diff --git a/tests/cases/fourslash/jsTagAfterTypedef1.ts b/tests/cases/fourslash/jsTagAfterTypedef1.ts
new file mode 100644
index 0000000000000..d0cf99e6f1804
--- /dev/null
+++ b/tests/cases/fourslash/jsTagAfterTypedef1.ts
@@ -0,0 +1,19 @@
+///
+// @Filename: foo.js
+// @allowJs: true
+// @checkJs: true
+//// /** @typedef Lister @property p @yeturn {ListenerBlock} */
+//// /**
+//// * The function used
+//// * /*1*/ settings
+//// */
+//// class /*2*/ListenerBlock {
+//// }
+
+// Force a syntax tree to be created.
+verify.noMatchingBracePositionInCurrentFile(0);
+
+goTo.marker('1');
+edit.insert('fenster');
+
+verify.quickInfoAt('2', 'class ListenerBlock', 'The function used\nfenster settings')