diff --git a/extensions/theme-abyss/themes/abyss-color-theme.json b/extensions/theme-abyss/themes/abyss-color-theme.json index 18c8235f79c..775dc8614d0 100644 --- a/extensions/theme-abyss/themes/abyss-color-theme.json +++ b/extensions/theme-abyss/themes/abyss-color-theme.json @@ -1,12 +1,6 @@ { "name": "Abyss", "tokenColors": [ - { - "settings": { - "background": "#000c18", - "foreground": "#6688cc" - } - }, { "scope": ["meta.embedded", "source.groovy.embedded"], "settings": { @@ -260,6 +254,9 @@ ], "colors": { + "editor.background": "#000c18", + "editor.foreground": "#6688cc", + // Base // "foreground": "", "focusBorder": "#596F99", @@ -303,8 +300,6 @@ "scrollbarSlider.hoverBackground": "#3B3F5188", // Editor - "editor.background": "#000c18", - // "editor.foreground": "#6688cc", "editorWidget.background": "#262641", "editorCursor.foreground": "#ddbb88", "editorWhitespace.foreground": "#103050", diff --git a/src/vs/platform/theme/common/tokenStyleRegistry.ts b/src/vs/platform/theme/common/tokenStyleRegistry.ts index e212367d873..27f1a7ebc29 100644 --- a/src/vs/platform/theme/common/tokenStyleRegistry.ts +++ b/src/vs/platform/theme/common/tokenStyleRegistry.ts @@ -71,7 +71,7 @@ export namespace TokenStyle { } } -export type ProbeScope = string[] | string; +export type ProbeScope = string[]; export interface TokenStyleFunction { (theme: ITheme): TokenStyle | undefined; @@ -246,13 +246,13 @@ export function getTokenStyleRegistry(): ITokenStyleRegistry { // colors -export const comments = registerTokenStyle('comments', { scopesToProbe: ['comment'], dark: null, light: null, hc: null }, nls.localize('comments', "Token style for comments.")); -export const strings = registerTokenStyle('strings', { scopesToProbe: ['string'], dark: null, light: null, hc: null }, nls.localize('strings', "Token style for strings.")); -export const keywords = registerTokenStyle('keywords', { scopesToProbe: ['keyword.control', 'storage', 'storage.type'], dark: null, light: null, hc: null }, nls.localize('keywords', "Token style for keywords.")); -export const numbers = registerTokenStyle('numbers', { scopesToProbe: ['constant.numeric'], dark: null, light: null, hc: null }, nls.localize('numbers', "Token style for numbers.")); -export const types = registerTokenStyle('types', { scopesToProbe: ['entity.name.type', 'entity.name.class', 'support.type', 'support.class'], dark: null, light: null, hc: null }, nls.localize('types', "Token style for types.")); -export const functions = registerTokenStyle('functions', { scopesToProbe: ['entity.name.function', 'support.function'], dark: null, light: null, hc: null }, nls.localize('functions', "Token style for functions.")); -export const variables = registerTokenStyle('variables', { scopesToProbe: ['variable', 'entity.name.variable'], dark: null, light: null, hc: null }, nls.localize('variables', "Token style for variables.")); +export const comments = registerTokenStyle('comments', { scopesToProbe: [['comment']], dark: null, light: null, hc: null }, nls.localize('comments', "Token style for comments.")); +export const strings = registerTokenStyle('strings', { scopesToProbe: [['string']], dark: null, light: null, hc: null }, nls.localize('strings', "Token style for strings.")); +export const keywords = registerTokenStyle('keywords', { scopesToProbe: [['keyword.control'], ['storage'], ['storage.type']], dark: null, light: null, hc: null }, nls.localize('keywords', "Token style for keywords.")); +export const numbers = registerTokenStyle('numbers', { scopesToProbe: [['constant.numeric']], dark: null, light: null, hc: null }, nls.localize('numbers', "Token style for numbers.")); +export const types = registerTokenStyle('types', { scopesToProbe: [['entity.name.type'], ['entity.name.class'], ['support.type'], ['support.class']], dark: null, light: null, hc: null }, nls.localize('types', "Token style for types.")); +export const functions = registerTokenStyle('functions', { scopesToProbe: [['entity.name.function'], ['support.function']], dark: null, light: null, hc: null }, nls.localize('functions', "Token style for functions.")); +export const variables = registerTokenStyle('variables', { scopesToProbe: [['variable'], ['entity.name.variable']], dark: null, light: null, hc: null }, nls.localize('variables', "Token style for variables.")); /** * @param colorValue Resolve a color value in the context of a theme diff --git a/src/vs/workbench/services/themes/common/colorThemeData.ts b/src/vs/workbench/services/themes/common/colorThemeData.ts index 12079e669db..4dbdfcc2eff 100644 --- a/src/vs/workbench/services/themes/common/colorThemeData.ts +++ b/src/vs/workbench/services/themes/common/colorThemeData.ts @@ -138,7 +138,9 @@ export class ColorThemeData implements IColorTheme { /** Public for testing reasons */ public findTokenStyleForScope(scope: ProbeScope): TokenStyle | undefined { - let foreground: string | null = null; + let foregroundColor = this.getColor(editorForeground); + + let foreground = foregroundColor ? foregroundColor.toString() : null; let fontStyle: string | null = null; let foregroundScore = -1; let fontStyleScore = -1; @@ -154,12 +156,15 @@ export class ColorThemeData implements IColorTheme { scopeMatchers[i] = matcher = getScopeMatcher(tokenColors[i]); } const score = matcher(scope); - if (score > foregroundScore && settings.foreground) { - foreground = settings.foreground; - } - if (score > fontStyleScore && types.isString(settings.fontStyle)) { - fontStyle = settings.fontStyle; + if (score >= 0) { + if (score >= foregroundScore && settings.foreground) { + foreground = settings.foreground; + } + if (score >= fontStyleScore && types.isString(settings.fontStyle)) { + fontStyle = settings.fontStyle; + } } + } } @@ -173,10 +178,7 @@ export class ColorThemeData implements IColorTheme { } findTokenStyleForScopeInScopes(this.customTokenScopeMatchers, this.customTokenColors); - if (foreground !== null || fontStyle !== null) { - return getTokenStyle(foreground, fontStyle); - } - return undefined; + return getTokenStyle(foreground, fontStyle); } @@ -464,26 +466,19 @@ const noMatch = (_scope: ProbeScope) => -1; function nameMatcher(identifers: string[], scope: ProbeScope): number { function findInIdents(s: string, lastIndent: number): number { for (let i = lastIndent - 1; i >= 0; i--) { - if (scopesAreMatching(identifers[i], s)) { + if (scopesAreMatching(s, identifers[i])) { return i; } } return -1; } - if (!Array.isArray(scope)) { - const idx = findInIdents(scope, identifers.length); - if (idx >= 0) { - return idx * 0x10000 + scope.length; - } - return -1; - } if (scope.length < identifers.length) { return -1; } let lastScopeIndex = scope.length - 1; let lastIdentifierIndex = findInIdents(scope[lastScopeIndex--], identifers.length); if (lastIdentifierIndex >= 0) { - const score = lastIdentifierIndex * 0x10000 + scope.length; + const score = (lastIdentifierIndex + 1) * 0x10000 + scope.length; while (lastScopeIndex >= 0) { lastIdentifierIndex = findInIdents(scope[lastScopeIndex--], lastIdentifierIndex); if (lastIdentifierIndex === -1) { @@ -520,10 +515,13 @@ function getScopeMatcher(rule: ITokenColorizationRule): Matcher { } else { matchers.push(...createMatchers(ruleScope, nameMatcher)); } + if (matchers.length === 0) { + return noMatch; + } return (scope: ProbeScope) => { - let max = 0; - for (const m of matchers) { - max = Math.max(max, m.matcher(scope)); + let max = matchers[0].matcher(scope); + for (let i = 1; i < matchers.length; i++) { + max = Math.max(max, matchers[i].matcher(scope)); } return max; }; 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 ac70d635999..12b9e9102da 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 @@ -15,6 +15,7 @@ import { DiskFileSystemProvider } from 'vs/platform/files/node/diskFileSystemPro import { Schemas } from 'vs/base/common/network'; import { URI } from 'vs/base/common/uri'; import { getPathFromAmdModule } from 'vs/base/common/amd'; +import { editorForeground } from 'vs/platform/theme/common/colorRegistry'; function ts(foreground: string | undefined, styleFlags: number | undefined): TokenStyle { const foregroundColor = isString(foreground) ? Color.fromHex(foreground) : undefined; @@ -154,12 +155,12 @@ suite('Themes - TokenStyleResolving', () => { assertTokenStyles(themeData, { [comments]: ts('#384887', 0), - [variables]: ts('#9966b8', 0), - [types]: ts('#f06431', 0), - [functions]: ts('#8ab1b0', 0), + [variables]: ts('#6688cc', 0), + [types]: ts('#ffeebb', TokenStyleBits.UNDERLINE), + [functions]: ts('#ddbb88', 0), [strings]: ts('#22aa44', 0), [numbers]: ts('#f280d0', 0), - [keywords]: ts('#98676a', 0) + [keywords]: ts('#225588', 0) }); }); @@ -209,6 +210,7 @@ suite('Themes - TokenStyleResolving', () => { themeData.setCustomTokenColors(customTokenColors); let tokenStyle; + let defaultTokenStyle = new TokenStyle(themeData.getColor(editorForeground)); tokenStyle = themeData.findTokenStyleForScope(['variable']); assertTokenStyle(tokenStyle, ts('#F8F8F2', 0), 'variable'); @@ -217,13 +219,13 @@ suite('Themes - TokenStyleResolving', () => { assertTokenStyle(tokenStyle, ts('#F92672', TokenStyleBits.ITALIC | TokenStyleBits.BOLD | TokenStyleBits.UNDERLINE), 'keyword'); tokenStyle = themeData.findTokenStyleForScope(['keyword']); - assertTokenStyle(tokenStyle, undefined, 'keyword'); + assertTokenStyle(tokenStyle, defaultTokenStyle, 'keyword'); tokenStyle = themeData.findTokenStyleForScope(['keyword.operator']); assertTokenStyle(tokenStyle, ts('#F92672', TokenStyleBits.ITALIC | TokenStyleBits.BOLD | TokenStyleBits.UNDERLINE), 'keyword.operator'); tokenStyle = themeData.findTokenStyleForScope(['keyword.operators']); - assertTokenStyle(tokenStyle, undefined, 'keyword.operators'); + assertTokenStyle(tokenStyle, defaultTokenStyle, 'keyword.operators'); tokenStyle = themeData.findTokenStyleForScope(['storage']); assertTokenStyle(tokenStyle, ts('#F92672', TokenStyleBits.ITALIC), 'storage');