1299: Use ThemeColor and add support for light themes r=matklad a=lnicola

Part of #1294.

- switch to `ThemeColor`
- add light and high contrast theme definitions
- highlight control flow keywords and `unsafe`


Co-authored-by: Laurențiu Nicola <lnicola@dend.ro>
This commit is contained in:
bors[bot] 2019-05-21 13:58:42 +00:00
commit 51e82fe6d2
3 changed files with 149 additions and 14 deletions

View file

@ -1,6 +1,6 @@
use rustc_hash::FxHashSet; use rustc_hash::FxHashSet;
use ra_syntax::{ast, AstNode, TextRange, Direction, SyntaxKind::*, SyntaxElement, T}; use ra_syntax::{ast, AstNode, TextRange, Direction, SyntaxKind, SyntaxKind::*, SyntaxElement, T};
use ra_db::SourceDatabase; use ra_db::SourceDatabase;
use crate::{FileId, db::RootDatabase}; use crate::{FileId, db::RootDatabase};
@ -11,6 +11,21 @@ pub struct HighlightedRange {
pub tag: &'static str, pub tag: &'static str,
} }
fn is_control_keyword(kind: SyntaxKind) -> bool {
match kind {
T![for]
| T![loop]
| T![while]
| T![continue]
| T![break]
| T![if]
| T![else]
| T![match]
| T![return] => true,
_ => false,
}
}
pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Vec<HighlightedRange> { pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Vec<HighlightedRange> {
let source_file = db.parse(file_id); let source_file = db.parse(file_id);
@ -29,6 +44,8 @@ pub(crate) fn highlight(db: &RootDatabase, file_id: FileId) -> Vec<HighlightedRa
NAME => "function", NAME => "function",
INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal", INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal",
LIFETIME => "parameter", LIFETIME => "parameter",
T![unsafe] => "keyword.unsafe",
k if is_control_keyword(k) => "keyword.control",
k if k.is_keyword() => "keyword", k if k.is_keyword() => "keyword",
_ => { _ => {
if let Some(macro_call) = node.as_node().and_then(ast::MacroCall::cast) { if let Some(macro_call) = node.as_node().and_then(ast::MacroCall::cast) {

View file

@ -268,6 +268,116 @@
}, },
"pattern": "$rustc" "pattern": "$rustc"
} }
],
"colors": [
{
"id": "ralsp.comment",
"description": "Color for comments",
"defaults": {
"dark": "#6A9955",
"light": "#008000",
"highContrast": "#7CA668"
}
},
{
"id": "ralsp.string",
"description": "Color for strings",
"defaults": {
"dark": "#CE9178",
"light": "#A31515",
"highContrast": "#CE9178"
}
},
{
"id": "ralsp.keyword",
"description": "Color for keywords",
"defaults": {
"dark": "#569cd6",
"light": "#0000FF",
"highContrast": "#569CD6"
}
},
{
"id": "ralsp.keyword.control",
"description": "Color for control keywords",
"defaults": {
"dark": "#C586C0",
"light": "#AF00DB",
"highContrast": "#C586C0"
}
},
{
"id": "ralsp.keyword.unsafe",
"description": "Color for unsafe",
"defaults": {
"dark": "#FF3030",
"light": "#FF1010",
"highContrast": "#FF1010"
}
},
{
"id": "ralsp.function",
"description": "Color for functions",
"defaults": {
"dark": "#DCDCAA",
"light": "#795E26",
"highContrast": "#DCDCAA"
}
},
{
"id": "ralsp.parameter",
"description": "Color for parameters",
"defaults": {
"dark": "#9CDCFE",
"light": "#001080",
"highContrast": "#9CDCFE"
}
},
{
"id": "ralsp.builtin",
"description": "Color for builtins",
"defaults": {
"dark": "#DD6718",
"light": "#DD6718",
"highContrast": "#DD6718"
}
},
{
"id": "ralsp.text",
"description": "Color for text",
"defaults": {
"dark": "#D4D4D4",
"light": "#000000",
"highContrast": "#FFFFFF"
}
},
{
"id": "ralsp.attribute",
"description": "Color for attributes",
"defaults": {
"dark": "#9FE9BF",
"light": "#1F4B1F",
"highContrast": "#108010"
}
},
{
"id": "ralsp.literal",
"description": "Color for literals",
"defaults": {
"dark": "#BECEA8",
"light": "#09885A",
"highContrast": "#B5CEA8"
}
},
{
"id": "ralsp.macro",
"description": "Color for DFAF8F",
"defaults": {
"dark": "#BFEBBF",
"light": "#DD6718",
"highContrast": "#ED7718"
}
}
] ]
} }
} }

View file

@ -13,23 +13,31 @@ export class Highlighter {
string, string,
vscode.TextEditorDecorationType vscode.TextEditorDecorationType
> { > {
const decor = (color: string) => const colorContrib = (
vscode.window.createTextEditorDecorationType({ color }); tag: string
): [string, vscode.TextEditorDecorationType] => {
const color = new vscode.ThemeColor('ralsp.' + tag);
const decor = vscode.window.createTextEditorDecorationType({
color
});
return [tag, decor];
};
const decorations: Iterable< const decorations: Iterable<
[string, vscode.TextEditorDecorationType] [string, vscode.TextEditorDecorationType]
> = [ > = [
['background', decor('#3F3F3F')], colorContrib('comment'),
['comment', decor('#7F9F7F')], colorContrib('string'),
['string', decor('#CC9393')], colorContrib('keyword'),
['keyword', decor('#F0DFAF')], colorContrib('keyword.control'),
['function', decor('#93E0E3')], colorContrib('keyword.unsafe'),
['parameter', decor('#94BFF3')], colorContrib('function'),
['builtin', decor('#DD6718')], colorContrib('parameter'),
['text', decor('#DCDCCC')], colorContrib('builtin'),
['attribute', decor('#BFEBBF')], colorContrib('text'),
['literal', decor('#DFAF8F')], colorContrib('attribute'),
['macro', decor('#DFAF8F')] colorContrib('literal'),
colorContrib('macro')
]; ];
return new Map<string, vscode.TextEditorDecorationType>(decorations); return new Map<string, vscode.TextEditorDecorationType>(decorations);