Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
fix: parse also linkcode, and not only link
  • Loading branch information
dorb-legit committed Nov 13, 2025
commit 394b8553c135e7c532561fdbdbb4b112a02c2277
5 changes: 5 additions & 0 deletions .changeset/forty-hornets-burn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@biomejs/biome": patch
---

Fixed [#7876](https://github.com/biomejs/biome/issues/7876) Jsdoc lint now supports @linkcode and @linkplain (previously supported @link and @see)
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ fn load_jsdoc_types_from_node(model: &mut JsDocTypeModel, node: &SyntaxNode<JsLa
}

static JSDOC_INLINE_TAG_REGEX: LazyLock<Regex> =
LazyLock::new(|| Regex::new(r"\{@(link|see)\s*([^}| #\.]+)(?:[^}]+)?\}").unwrap());
LazyLock::new(|| Regex::new(r"\{@(linkcode|linkplain|link|see)\s*([^}| #\.]+)(?:[^}]+)?\}").unwrap());

static JSDOC_TYPE_TAG_REGEX: LazyLock<Regex> =
LazyLock::new(|| Regex::new(r"@(param|returns|type|typedef)\s*\{([^}]+)\}").unwrap());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
// See https://github.com/biomejs/biome/issues/7876

// some types for the different locations
import type LinkOnFunction from "mod";

import type LinkOnVariable from "mod";
import type LinkOnClass from "mod";

import type LinkOnClassField from "mod";
import type LinkOnClassMethod from "mod";
import type LinkOnClassConstructor from "mod";
import type LinkOnClassAccessor from "mod";
import type LinkOnClassIndexer from "mod";

import type LinkOnInterface from "mod";
import type LinkOnInterfaceField from "mod";
import type LinkOnInterfaceMethod from "mod";
import type LinkOnInterfaceIndexer from "mod";

import type LinkOnEnum from "mod";
import type LinkOnEnumMember from "mod";


/**
* {@linkcode LinkOnFunction}
*/
function testLinkOnFunction() { }

/**
* {@linkcode LinkOnVariable}
*/
const testLinkOnVariable = 3;

/**
* {@linkcode LinkOnClass}
*/
class TestLinkOnClass { }

class TestLinkOnClassField {
/**
* {@linkcode LinkOnClassField}
*/
field: number;
}

class TestLinkOnClassMethod {
/**
* {@linkcode LinkOnClassMethod}
*/
method(): void { }
}

class TestLinkOnClassConstructor {
/**
* {@linkcode LinkOnClassConstructor}
*/
constructor() { }
}

class TestLinkOnClassAccessor {
/**
* {@linkcode LinkOnClassAccessor}
*/
get accessor(): number { return 0 }
}

class TestLinkOnClassIndexer {
/**
* {@linkcode LinkOnClassIndexer}
*/
[index: number]: string;
}

/**
* {@linkcode LinkOnInterface}
*/
interface TestLinkOnInterface { }

interface TestLinkOnInterfaceField {
/**
* {@linkcode LinkOnInterfaceField}
*/
field: string;
}

interface TestLinkOnInterfaceMethod {
/**
* {@linkcode LinkOnInterfaceMethod}
*/
method(): string;
}

interface TestLinkOnInterfaceIndexer {
/**
* {@linkcode LinkOnInterfaceIndexer}
*/
[index: number]: string;
}

/**
* {@linkcode LinkOnEnum}
*/
enum TestLinkOnEnum {
}

enum TestLinkOnEnumMember {
/**
* {@linkcode LinkOnEnumMember}
*/
member
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
---
source: crates/biome_js_analyze/tests/spec_tests.rs
expression: issue_7876_tsdoc_linkcode.ts
---
# Input
```ts
// See https://github.com/biomejs/biome/issues/7876

// some types for the different locations
import type LinkOnFunction from "mod";

import type LinkOnVariable from "mod";
import type LinkOnClass from "mod";

import type LinkOnClassField from "mod";
import type LinkOnClassMethod from "mod";
import type LinkOnClassConstructor from "mod";
import type LinkOnClassAccessor from "mod";
import type LinkOnClassIndexer from "mod";

import type LinkOnInterface from "mod";
import type LinkOnInterfaceField from "mod";
import type LinkOnInterfaceMethod from "mod";
import type LinkOnInterfaceIndexer from "mod";

import type LinkOnEnum from "mod";
import type LinkOnEnumMember from "mod";


/**
* {@linkcode LinkOnFunction}
*/
function testLinkOnFunction() { }

/**
* {@linkcode LinkOnVariable}
*/
const testLinkOnVariable = 3;

/**
* {@linkcode LinkOnClass}
*/
class TestLinkOnClass { }

class TestLinkOnClassField {
/**
* {@linkcode LinkOnClassField}
*/
field: number;
}

class TestLinkOnClassMethod {
/**
* {@linkcode LinkOnClassMethod}
*/
method(): void { }
}

class TestLinkOnClassConstructor {
/**
* {@linkcode LinkOnClassConstructor}
*/
constructor() { }
}

class TestLinkOnClassAccessor {
/**
* {@linkcode LinkOnClassAccessor}
*/
get accessor(): number { return 0 }
}

class TestLinkOnClassIndexer {
/**
* {@linkcode LinkOnClassIndexer}
*/
[index: number]: string;
}

/**
* {@linkcode LinkOnInterface}
*/
interface TestLinkOnInterface { }

interface TestLinkOnInterfaceField {
/**
* {@linkcode LinkOnInterfaceField}
*/
field: string;
}

interface TestLinkOnInterfaceMethod {
/**
* {@linkcode LinkOnInterfaceMethod}
*/
method(): string;
}

interface TestLinkOnInterfaceIndexer {
/**
* {@linkcode LinkOnInterfaceIndexer}
*/
[index: number]: string;
}

/**
* {@linkcode LinkOnEnum}
*/
enum TestLinkOnEnum {
}

enum TestLinkOnEnumMember {
/**
* {@linkcode LinkOnEnumMember}
*/
member
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
// See https://github.com/biomejs/biome/issues/7876

// some types for the different locations
import type LinkOnFunction from "mod";

import type LinkOnVariable from "mod";
import type LinkOnClass from "mod";

import type LinkOnClassField from "mod";
import type LinkOnClassMethod from "mod";
import type LinkOnClassConstructor from "mod";
import type LinkOnClassAccessor from "mod";
import type LinkOnClassIndexer from "mod";

import type LinkOnInterface from "mod";
import type LinkOnInterfaceField from "mod";
import type LinkOnInterfaceMethod from "mod";
import type LinkOnInterfaceIndexer from "mod";

import type LinkOnEnum from "mod";
import type LinkOnEnumMember from "mod";


/**
* {@linkplain LinkOnFunction}
*/
function testLinkOnFunction() { }

/**
* {@linkplain LinkOnVariable}
*/
const testLinkOnVariable = 3;

/**
* {@linkplain LinkOnClass}
*/
class TestLinkOnClass { }

class TestLinkOnClassField {
/**
* {@linkplain LinkOnClassField}
*/
field: number;
}

class TestLinkOnClassMethod {
/**
* {@linkplain LinkOnClassMethod}
*/
method(): void { }
}

class TestLinkOnClassConstructor {
/**
* {@linkplain LinkOnClassConstructor}
*/
constructor() { }
}

class TestLinkOnClassAccessor {
/**
* {@linkplain LinkOnClassAccessor}
*/
get accessor(): number { return 0 }
}

class TestLinkOnClassIndexer {
/**
* {@linkplain LinkOnClassIndexer}
*/
[index: number]: string;
}

/**
* {@linkplain LinkOnInterface}
*/
interface TestLinkOnInterface { }

interface TestLinkOnInterfaceField {
/**
* {@linkplain LinkOnInterfaceField}
*/
field: string;
}

interface TestLinkOnInterfaceMethod {
/**
* {@linkplain LinkOnInterfaceMethod}
*/
method(): string;
}

interface TestLinkOnInterfaceIndexer {
/**
* {@linkplain LinkOnInterfaceIndexer}
*/
[index: number]: string;
}

/**
* {@linkplain LinkOnEnum}
*/
enum TestLinkOnEnum {
}

enum TestLinkOnEnumMember {
/**
* {@linkplain LinkOnEnumMember}
*/
member
}
Loading
Loading