Skip to content

Commit 18136ed

Browse files
authored
Merge pull request microsoft#187941 from microsoft/merogge/symbol-icon
provide symbol info to screen reader users in documentSymbolsTree
2 parents ef42b49 + 247fab6 commit 18136ed

File tree

3 files changed

+46
-33
lines changed

3 files changed

+46
-33
lines changed

src/vs/editor/common/languages.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { LanguageId } from 'vs/editor/common/encodedTokenAttributes';
2121
import * as model from 'vs/editor/common/model';
2222
import { TokenizationRegistry as TokenizationRegistryImpl } from 'vs/editor/common/tokenizationRegistry';
2323
import { ContiguousMultilineTokens } from 'vs/editor/common/tokens/contiguousMultilineTokens';
24+
import { localize } from 'vs/nls';
2425
import { ExtensionIdentifier } from 'vs/platform/extensions/common/extensions';
2526
import { IMarkerData } from 'vs/platform/markers/common/markers';
2627

@@ -1142,6 +1143,45 @@ export const enum SymbolKind {
11421143
TypeParameter = 25
11431144
}
11441145

1146+
/**
1147+
* @internal
1148+
*/
1149+
export const symbolKindNames: { [symbol: number]: string } = {
1150+
[SymbolKind.Array]: localize('Array', "array"),
1151+
[SymbolKind.Boolean]: localize('Boolean', "boolean"),
1152+
[SymbolKind.Class]: localize('Class', "class"),
1153+
[SymbolKind.Constant]: localize('Constant', "constant"),
1154+
[SymbolKind.Constructor]: localize('Constructor', "constructor"),
1155+
[SymbolKind.Enum]: localize('Enum', "enumeration"),
1156+
[SymbolKind.EnumMember]: localize('EnumMember', "enumeration member"),
1157+
[SymbolKind.Event]: localize('Event', "event"),
1158+
[SymbolKind.Field]: localize('Field', "field"),
1159+
[SymbolKind.File]: localize('File', "file"),
1160+
[SymbolKind.Function]: localize('Function', "function"),
1161+
[SymbolKind.Interface]: localize('Interface', "interface"),
1162+
[SymbolKind.Key]: localize('Key', "key"),
1163+
[SymbolKind.Method]: localize('Method', "method"),
1164+
[SymbolKind.Module]: localize('Module', "module"),
1165+
[SymbolKind.Namespace]: localize('Namespace', "namespace"),
1166+
[SymbolKind.Null]: localize('Null', "null"),
1167+
[SymbolKind.Number]: localize('Number', "number"),
1168+
[SymbolKind.Object]: localize('Object', "object"),
1169+
[SymbolKind.Operator]: localize('Operator', "operator"),
1170+
[SymbolKind.Package]: localize('Package', "package"),
1171+
[SymbolKind.Property]: localize('Property', "property"),
1172+
[SymbolKind.String]: localize('String', "string"),
1173+
[SymbolKind.Struct]: localize('Struct', "struct"),
1174+
[SymbolKind.TypeParameter]: localize('TypeParameter', "type parameter"),
1175+
[SymbolKind.Variable]: localize('Variable', "variable"),
1176+
};
1177+
1178+
/**
1179+
* @internal
1180+
*/
1181+
export function getAriaLabelForSymbol(symbolName: string, kind: SymbolKind): string {
1182+
return localize('symbolAriaLabel', '{0} Symbol: {1}', symbolName, symbolKindNames[kind]);
1183+
}
1184+
11451185
export const enum SymbolTag {
11461186
Deprecated = 1,
11471187
}

src/vs/editor/contrib/quickAccess/browser/gotoSymbolQuickAccess.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { format, trim } from 'vs/base/common/strings';
1414
import { IRange, Range } from 'vs/editor/common/core/range';
1515
import { ScrollType } from 'vs/editor/common/editorCommon';
1616
import { ITextModel } from 'vs/editor/common/model';
17-
import { DocumentSymbol, SymbolKind, SymbolKinds, SymbolTag } from 'vs/editor/common/languages';
17+
import { DocumentSymbol, SymbolKind, SymbolKinds, SymbolTag, getAriaLabelForSymbol } from 'vs/editor/common/languages';
1818
import { IOutlineModelService } from 'vs/editor/contrib/documentSymbols/browser/outlineModel';
1919
import { AbstractEditorNavigationQuickAccessProvider, IEditorNavigationQuickAccessOptions, IQuickAccessTextEditorContext } from 'vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess';
2020
import { localize } from 'vs/nls';
@@ -316,7 +316,7 @@ export abstract class AbstractGotoSymbolQuickAccessProvider extends AbstractEdit
316316
kind: symbol.kind,
317317
score: symbolScore,
318318
label: symbolLabelWithIcon,
319-
ariaLabel: symbolLabel,
319+
ariaLabel: getAriaLabelForSymbol(symbol.name, symbol.kind),
320320
description: containerLabel,
321321
highlights: deprecated ? undefined : {
322322
label: symbolMatches,

src/vs/workbench/contrib/codeEditor/browser/outline/documentSymbolsTree.ts

Lines changed: 4 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { IIdentityProvider, IKeyboardNavigationLabelProvider, IListVirtualDelega
1111
import { ITreeNode, ITreeRenderer, ITreeFilter } from 'vs/base/browser/ui/tree/tree';
1212
import { createMatches, FuzzyScore } from 'vs/base/common/filters';
1313
import { Range } from 'vs/editor/common/core/range';
14-
import { SymbolKind, SymbolKinds, SymbolTag } from 'vs/editor/common/languages';
14+
import { SymbolKind, SymbolKinds, SymbolTag, getAriaLabelForSymbol, symbolKindNames } from 'vs/editor/common/languages';
1515
import { OutlineElement, OutlineGroup, OutlineModel } from 'vs/editor/contrib/documentSymbols/browser/outlineModel';
1616
import { localize } from 'vs/nls';
1717
import { IconLabel, IIconLabelValueOptions } from 'vs/base/browser/ui/iconLabel/iconLabel';
@@ -49,7 +49,7 @@ export class DocumentSymbolAccessibilityProvider implements IListAccessibilityPr
4949
if (element instanceof OutlineGroup) {
5050
return element.label;
5151
} else {
52-
return element.symbol.name;
52+
return getAriaLabelForSymbol(element.symbol.name, element.symbol.kind);
5353
}
5454
}
5555
}
@@ -138,7 +138,7 @@ export class DocumentSymbolRenderer implements ITreeRenderer<OutlineElement, Fuz
138138
matches: createMatches(node.filterData),
139139
labelEscapeNewLines: true,
140140
extraClasses,
141-
title: localize('title.template', "{0} ({1})", element.symbol.name, DocumentSymbolRenderer._symbolKindNames[element.symbol.kind])
141+
title: localize('title.template', "{0} ({1})", element.symbol.name, symbolKindNames[element.symbol.kind])
142142
};
143143
if (this._configurationService.getValue(OutlineConfigKeys.icons)) {
144144
// add styles for the icons
@@ -195,34 +195,7 @@ export class DocumentSymbolRenderer implements ITreeRenderer<OutlineElement, Fuz
195195
}
196196
}
197197

198-
private static _symbolKindNames: { [symbol: number]: string } = {
199-
[SymbolKind.Array]: localize('Array', "array"),
200-
[SymbolKind.Boolean]: localize('Boolean', "boolean"),
201-
[SymbolKind.Class]: localize('Class', "class"),
202-
[SymbolKind.Constant]: localize('Constant', "constant"),
203-
[SymbolKind.Constructor]: localize('Constructor', "constructor"),
204-
[SymbolKind.Enum]: localize('Enum', "enumeration"),
205-
[SymbolKind.EnumMember]: localize('EnumMember', "enumeration member"),
206-
[SymbolKind.Event]: localize('Event', "event"),
207-
[SymbolKind.Field]: localize('Field', "field"),
208-
[SymbolKind.File]: localize('File', "file"),
209-
[SymbolKind.Function]: localize('Function', "function"),
210-
[SymbolKind.Interface]: localize('Interface', "interface"),
211-
[SymbolKind.Key]: localize('Key', "key"),
212-
[SymbolKind.Method]: localize('Method', "method"),
213-
[SymbolKind.Module]: localize('Module', "module"),
214-
[SymbolKind.Namespace]: localize('Namespace', "namespace"),
215-
[SymbolKind.Null]: localize('Null', "null"),
216-
[SymbolKind.Number]: localize('Number', "number"),
217-
[SymbolKind.Object]: localize('Object', "object"),
218-
[SymbolKind.Operator]: localize('Operator', "operator"),
219-
[SymbolKind.Package]: localize('Package', "package"),
220-
[SymbolKind.Property]: localize('Property', "property"),
221-
[SymbolKind.String]: localize('String', "string"),
222-
[SymbolKind.Struct]: localize('Struct', "struct"),
223-
[SymbolKind.TypeParameter]: localize('TypeParameter', "type parameter"),
224-
[SymbolKind.Variable]: localize('Variable', "variable"),
225-
};
198+
226199

227200
disposeTemplate(_template: DocumentSymbolTemplate): void {
228201
_template.iconLabel.dispose();

0 commit comments

Comments
 (0)