提交 2d584060 编写于 作者: M Martin Aeschlimann

get rid of TokenClassification

上级 5e0189c8
......@@ -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,43 +260,28 @@ 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) {
// all selector modifiers must be present
for (const selectorModifier of selectorModifiers) {
if (modifiers.indexOf(selectorModifier) === -1) {
return -1;
}
}
return score;
},
asString: () => selectorString
......@@ -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,
......
......@@ -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;
}
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册