From 2d584060f210e1dee207bf1a6f22190dd3e75de2 Mon Sep 17 00:00:00 2001 From: Martin Aeschlimann Date: Fri, 7 Feb 2020 12:35:19 +0100 Subject: [PATCH] get rid of TokenClassification --- .../common/tokenClassificationRegistry.ts | 57 ++++--------------- .../services/themes/common/colorThemeData.ts | 21 +++---- .../tokenStyleResolving.test.ts | 9 +-- 3 files changed, 20 insertions(+), 67 deletions(-) diff --git a/src/vs/platform/theme/common/tokenClassificationRegistry.ts b/src/vs/platform/theme/common/tokenClassificationRegistry.ts index 2ecc4b0b023..bf748f5b1d5 100644 --- a/src/vs/platform/theme/common/tokenClassificationRegistry.ts +++ b/src/vs/platform/theme/common/tokenClassificationRegistry.ts @@ -13,7 +13,6 @@ import { Event, Emitter } from 'vs/base/common/event'; import { IJSONSchema, IJSONSchemaMap } from 'vs/base/common/jsonSchema'; export const TOKEN_TYPE_WILDCARD = '*'; -export const TOKEN_TYPE_WILDCARD_NUM = -1; // qualified string [type|*](.modifier)* export type TokenClassificationString = string; @@ -21,13 +20,8 @@ export type TokenClassificationString = string; export const typeAndModifierIdPattern = '^\\w+[-_\\w+]*$'; export const fontStylePattern = '^(\\s*(-?italic|-?bold|-?underline))*\\s*$'; -export interface TokenClassification { - type: number; - modifiers: number; -} - export interface TokenSelector { - match(classification: TokenClassification): number; + match(type: string, modifiers: string[]): number; asString(): string; } @@ -138,8 +132,6 @@ export interface ITokenClassificationRegistry { */ registerTokenModifier(id: string, description: string): void; - getTokenClassification(type: string, modifiers: string[]): TokenClassification | undefined; - /** * Parses a token selector from a selector string. * @param selectorString selector string in the form (*|type)(.modifier)* @@ -241,8 +233,6 @@ class TokenClassificationRegistry implements ITokenClassificationRegistry { constructor() { this.tokenTypeById = {}; this.tokenModifierById = {}; - - this.tokenTypeById[TOKEN_TYPE_WILDCARD] = { num: TOKEN_TYPE_WILDCARD_NUM, id: TOKEN_TYPE_WILDCARD, description: '', deprecationMessage: undefined }; } public registerTokenType(id: string, description: string, deprecationMessage?: string): void { @@ -270,42 +260,27 @@ class TokenClassificationRegistry implements ITokenClassificationRegistry { this.tokenStylingSchema.properties[`*.${id}`] = getStylingSchemeEntry(description, deprecationMessage); } - public getTokenClassification(type: string, modifiers: string[]): TokenClassification | undefined { - const tokenTypeDesc = this.tokenTypeById[type]; - if (!tokenTypeDesc) { - return undefined; - } - let allModifierBits = 0; - for (const modifier of modifiers) { - const tokenModifierDesc = this.tokenModifierById[modifier]; - if (tokenModifierDesc) { - allModifierBits |= tokenModifierDesc.num; - } - } - return { type: tokenTypeDesc.num, modifiers: allModifierBits }; - } - - public parseTokenSelector(selectorString: string): TokenSelector { - const [type, ...modifiers] = selectorString.split('.'); + const [selectorType, ...selectorModifiers] = selectorString.split('.'); - const selectorClassification = this.getTokenClassification(type, modifiers); - if (!selectorClassification) { + if (!selectorType) { return { match: () => -1, asString: () => selectorString }; } - const score = getTokenStylingScore(selectorClassification); + const score = selectorModifiers.length + ((selectorString !== TOKEN_TYPE_WILDCARD) ? 1 : 0); return { - match: (classification: TokenClassification) => { - if (selectorClassification.type !== TOKEN_TYPE_WILDCARD_NUM && selectorClassification.type !== classification.type) { + match: (type: string, modifiers: string[]) => { + if (selectorType !== TOKEN_TYPE_WILDCARD && selectorType !== type) { return -1; } - const selectorModifier = selectorClassification.modifiers; - if ((classification.modifiers & selectorModifier) !== selectorModifier) { - return -1; + // all selector modifiers must be present + for (const selectorModifier of selectorModifiers) { + if (modifiers.indexOf(selectorModifier) === -1) { + return -1; + } } return score; }, @@ -432,16 +407,6 @@ export function getTokenClassificationRegistry(): ITokenClassificationRegistry { return tokenClassificationRegistry; } -function bitCount(u: number) { - // https://blogs.msdn.microsoft.com/jeuge/2005/06/08/bit-fiddling-3/ - const uCount = u - ((u >> 1) & 0o33333333333) - ((u >> 2) & 0o11111111111); - return ((uCount + (uCount >> 3)) & 0o30707070707) % 63; -} - -function getTokenStylingScore(classification: TokenClassification) { - return bitCount(classification.modifiers) + ((classification.type !== TOKEN_TYPE_WILDCARD_NUM) ? 1 : 0); -} - function getStylingSchemeEntry(description?: string, deprecationMessage?: string): IJSONSchema { return { description, diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index b781d3dd8d8..0ce389ce7e9 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -19,7 +19,7 @@ import { getParseErrorMessage } from 'vs/base/common/jsonErrorMessages'; import { URI } from 'vs/base/common/uri'; import { parse as parsePList } from 'vs/workbench/services/themes/common/plistParser'; import { startsWith } from 'vs/base/common/strings'; -import { TokenStyle, TokenClassification, ProbeScope, TokenStylingRule, getTokenClassificationRegistry, TokenStyleValue, TokenStyleData } from 'vs/platform/theme/common/tokenClassificationRegistry'; +import { TokenStyle, ProbeScope, TokenStylingRule, getTokenClassificationRegistry, TokenStyleValue, TokenStyleData } from 'vs/platform/theme/common/tokenClassificationRegistry'; import { MatcherWithPriority, Matcher, createMatchers } from 'vs/workbench/services/themes/common/textMateScopeMatcher'; import { IExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/common/extensionResourceLoader'; import { CharCode } from 'vs/base/common/charCode'; @@ -124,7 +124,7 @@ export class ColorThemeData implements IColorTheme { return color; } - public getTokenStyle(classification: TokenClassification, useDefault = true, definitions: TokenStyleDefinitions = {}): TokenStyle | undefined { + public getTokenStyle(type: string, modifiers: string[], useDefault = true, definitions: TokenStyleDefinitions = {}): TokenStyle | undefined { let result: any = { foreground: undefined, bold: undefined, @@ -158,7 +158,7 @@ export class ColorThemeData implements IColorTheme { } if (this.tokenStylingRules === undefined) { for (const rule of tokenClassificationRegistry.getTokenStylingDefaultRules()) { - const matchScore = rule.selector.match(classification); + const matchScore = rule.selector.match(type, modifiers); if (matchScore >= 0) { let style: TokenStyle | undefined; if (rule.defaults.scopesToProbe) { @@ -178,14 +178,14 @@ export class ColorThemeData implements IColorTheme { } } else { for (const rule of this.tokenStylingRules) { - const matchScore = rule.selector.match(classification); + const matchScore = rule.selector.match(type, modifiers); if (matchScore >= 0) { _processStyle(matchScore, rule.style, rule); } } } for (const rule of this.customTokenStylingRules) { - const matchScore = rule.selector.match(classification); + const matchScore = rule.selector.match(type, modifiers); if (matchScore >= 0) { _processStyle(matchScore, rule.style, rule); } @@ -202,10 +202,7 @@ export class ColorThemeData implements IColorTheme { return undefined; } else if (typeof tokenStyleValue === 'string') { const [type, ...modifiers] = tokenStyleValue.split('.'); - const classification = tokenClassificationRegistry.getTokenClassification(type, modifiers); - if (classification) { - return this.getTokenStyle(classification); - } + return this.getTokenStyle(type, modifiers); } else if (typeof tokenStyleValue === 'object') { return tokenStyleValue; } @@ -243,11 +240,7 @@ export class ColorThemeData implements IColorTheme { } public getTokenStyleMetadata(type: string, modifiers: string[], useDefault = true, definitions: TokenStyleDefinitions = {}): ITokenStyle | undefined { - const classification = tokenClassificationRegistry.getTokenClassification(type, modifiers); - if (!classification) { - return undefined; - } - const style = this.getTokenStyle(classification, useDefault, definitions); + const style = this.getTokenStyle(type, modifiers, useDefault, definitions); if (!style) { return undefined; } diff --git a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts index 78b704486a7..0052aab95c2 100644 --- a/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts +++ b/src/vs/workbench/services/themes/test/electron-browser/tokenStyleResolving.test.ts @@ -6,7 +6,7 @@ import { ColorThemeData } from 'vs/workbench/services/themes/common/colorThemeData'; import * as assert from 'assert'; import { ITokenColorCustomizations } from 'vs/workbench/services/themes/common/workbenchThemeService'; -import { TokenStyle, getTokenClassificationRegistry } from 'vs/platform/theme/common/tokenClassificationRegistry'; +import { TokenStyle } from 'vs/platform/theme/common/tokenClassificationRegistry'; import { Color } from 'vs/base/common/color'; import { isString } from 'vs/base/common/types'; import { FileService } from 'vs/platform/files/common/fileService'; @@ -18,8 +18,6 @@ import { getPathFromAmdModule } from 'vs/base/common/amd'; import { ExtensionResourceLoaderService } from 'vs/workbench/services/extensionResourceLoader/electron-browser/extensionResourceLoaderService'; import { ITokenStyle } from 'vs/platform/theme/common/themeService'; -let tokenClassificationRegistry = getTokenClassificationRegistry(); - const undefinedStyle = { bold: undefined, underline: undefined, italic: undefined }; const unsetStyle = { bold: false, underline: false, italic: false }; @@ -73,10 +71,7 @@ function assertTokenStyles(themeData: ColorThemeData, expected: { [qualifiedClas for (let qualifiedClassifier in expected) { const [type, ...modifiers] = qualifiedClassifier.split('.'); - const classification = tokenClassificationRegistry.getTokenClassification(type, modifiers); - assert.ok(classification, 'Classification not found'); - - const tokenStyle = themeData.getTokenStyle(classification!); + const tokenStyle = themeData.getTokenStyle(type, modifiers); const expectedTokenStyle = expected[qualifiedClassifier]; assertTokenStyle(tokenStyle, expectedTokenStyle, qualifiedClassifier); -- GitLab