diff --git a/extensions/html-language-features/server/src/modes/javascriptSemanticTokens.ts b/extensions/html-language-features/server/src/modes/javascriptSemanticTokens.ts
index 382e6fe19eb..e3015f40e89 100644
--- a/extensions/html-language-features/server/src/modes/javascriptSemanticTokens.ts
+++ b/extensions/html-language-features/server/src/modes/javascriptSemanticTokens.ts
@@ -30,8 +30,11 @@ export function getSemanticTokens(jsLanguageService: ts.LanguageService, current
if (symbol) {
let typeIdx = tokenFromDeclarationMapping[symbol.valueDeclaration.kind];
let modifierSet = 0;
- if (node.parent && (node.parent).name === node) {
- modifierSet = TokenModifier.declaration;
+ if (node.parent) {
+ const parentTypeIdx = tokenFromDeclarationMapping[node.parent.kind];
+ if (parentTypeIdx === typeIdx && (node.parent).name === node) {
+ modifierSet = TokenModifier.declaration;
+ }
}
if (typeIdx !== undefined) {
resultTokens.push({ offset: node.getStart(), length: node.getWidth(), typeIdx, modifierSet });
@@ -130,5 +133,7 @@ const tokenFromDeclarationMapping: { [name: string]: TokenType } = {
[ts.SyntaxKind.EnumDeclaration]: TokenType.enum,
[ts.SyntaxKind.EnumMember]: TokenType.property,
[ts.SyntaxKind.ClassDeclaration]: TokenType.property,
- [ts.SyntaxKind.MethodDeclaration]: TokenType.function
+ [ts.SyntaxKind.MethodDeclaration]: TokenType.member,
+ [ts.SyntaxKind.FunctionDeclaration]: TokenType.function,
+ [ts.SyntaxKind.MethodSignature]: TokenType.member,
};
diff --git a/extensions/html-language-features/server/src/test/semanticTokens.test.ts b/extensions/html-language-features/server/src/test/semanticTokens.test.ts
index aeb9c672896..0bc0e934e9c 100644
--- a/extensions/html-language-features/server/src/test/semanticTokens.test.ts
+++ b/extensions/html-language-features/server/src/test/semanticTokens.test.ts
@@ -83,9 +83,34 @@ suite('JavaScript Semantic Tokens', () => {
];
assertTokens(input, [
t(3, 11, 3, 'function.declaration'), t(3, 15, 2, 'parameter.declaration'),
- t(4, 11, 3, 'function'), t(4, 15, 3, 'namespace'), t(4, 20, 3, 'member'), t(4, 24, 2, 'parameter')
+ t(4, 11, 3, 'function'), t(4, 15, 4, 'variable'), t(4, 20, 3, 'member'), t(4, 24, 2, 'parameter')
+ ]);
+ });
+
+ test('members', () => {
+ const input = [
+ /*0*/'',
+ /*1*/'',
+ /*2*/'',
+ /*10*/'',
+ /*11*/'',
+ ];
+ assertTokens(input, [
+ t(3, 8, 1, 'class.declaration'),
+ t(4, 11, 1, 'member.declaration'),
+ t(5, 4, 1, 'property.declaration'),
+ t(6, 4, 1, 'member.declaration'), t(6, 17, 1, 'class'), t(6, 19, 1, 'property'),
+ t(7, 8, 1, 'member.declaration'),
]);
});
+
});