refactor Tokens to enable goto-symbol and find-usages

This commit is contained in:
tophf 2020-05-31 20:11:32 +03:00
parent 2ffad1b6bb
commit 086f6285a6

View File

@ -1345,165 +1345,154 @@ self.parserlib = (() => {
* The following token names are defined in CSS3 Grammar: * The following token names are defined in CSS3 Grammar:
* https://www.w3.org/TR/css3-syntax/#lexical * https://www.w3.org/TR/css3-syntax/#lexical
*/ */
const Tokens = [ const Tokens = Object.assign([], {
EOF: {}, // must be the first token
}, {
// HTML-style comments // HTML-style comments
{name: 'CDO'}, CDO: {},
{name: 'CDC'}, CDC: {},
// ignorables // ignorables
{name: 'S', whitespace: true}, S: {whitespace: true},
{name: 'COMMENT', whitespace: true, comment: true, hide: true}, COMMENT: {whitespace: true, comment: true, hide: true},
// attribute equality // attribute equality
{name: 'INCLUDES', text: '~='}, INCLUDES: {text: '~='},
{name: 'DASHMATCH', text: '|='}, DASHMATCH: {text: '|='},
{name: 'PREFIXMATCH', text: '^='}, PREFIXMATCH: {text: '^='},
{name: 'SUFFIXMATCH', text: '$='}, SUFFIXMATCH: {text: '$='},
{name: 'SUBSTRINGMATCH', text: '*='}, SUBSTRINGMATCH: {text: '*='},
// identifier types // identifier types
{name: 'STRING'}, STRING: {},
{name: 'IDENT'}, IDENT: {},
{name: 'HASH'}, HASH: {},
// at-keywords // at-keywords
{name: 'IMPORT_SYM', text: '@import'}, IMPORT_SYM: {text: '@import'},
{name: 'PAGE_SYM', text: '@page'}, PAGE_SYM: {text: '@page'},
{name: 'MEDIA_SYM', text: '@media'}, MEDIA_SYM: {text: '@media'},
{name: 'FONT_FACE_SYM', text: '@font-face'}, FONT_FACE_SYM: {text: '@font-face'},
{name: 'CHARSET_SYM', text: '@charset'}, CHARSET_SYM: {text: '@charset'},
{name: 'NAMESPACE_SYM', text: '@namespace'}, NAMESPACE_SYM: {text: '@namespace'},
{name: 'SUPPORTS_SYM', text: '@supports'}, SUPPORTS_SYM: {text: '@supports'},
{name: 'VIEWPORT_SYM', text: ['@viewport', '@-ms-viewport', '@-o-viewport']}, VIEWPORT_SYM: {text: ['@viewport', '@-ms-viewport', '@-o-viewport']},
{name: 'DOCUMENT_SYM', text: ['@document', '@-moz-document']}, DOCUMENT_SYM: {text: ['@document', '@-moz-document']},
{name: 'UNKNOWN_SYM'}, //{ name: "ATKEYWORD"}, UNKNOWN_SYM: {}, //{ name: "ATKEYWORD"},
// CSS3 animations // CSS3 animations
{name: 'KEYFRAMES_SYM', text: ['@keyframes', '@-webkit-keyframes', '@-moz-keyframes', '@-o-keyframes']}, KEYFRAMES_SYM: {text: ['@keyframes', '@-webkit-keyframes', '@-moz-keyframes', '@-o-keyframes']},
// important symbol // important symbol
{name: 'IMPORTANT_SYM'}, IMPORTANT_SYM: {},
// measurements // measurements
{name: 'LENGTH'}, LENGTH: {},
{name: 'ANGLE'}, ANGLE: {},
{name: 'TIME'}, TIME: {},
{name: 'FREQ'}, FREQ: {},
{name: 'DIMENSION'}, DIMENSION: {},
{name: 'PERCENTAGE'}, PERCENTAGE: {},
{name: 'NUMBER'}, NUMBER: {},
// functions // functions
{name: 'URI'}, URI: {},
{name: 'FUNCTION'}, FUNCTION: {},
// Unicode ranges // Unicode ranges
{name: 'UNICODE_RANGE'}, UNICODE_RANGE: {},
/* /*
* The following token names are defined in CSS3 Selectors: https://www.w3.org/TR/css3-selectors/#selector-syntax * The following token names are defined in CSS3 Selectors: https://www.w3.org/TR/css3-selectors/#selector-syntax
*/ */
// invalid string // invalid string
{name: 'INVALID'}, INVALID: {},
// combinators // combinators
{name: 'PLUS', text: '+'}, PLUS: {text: '+'},
{name: 'GREATER', text: '>'}, GREATER: {text: '>'},
{name: 'COMMA', text: ','}, COMMA: {text: ','},
{name: 'TILDE', text: '~'}, TILDE: {text: '~'},
// modifier // modifier
{name: 'NOT'}, NOT: {},
{name: 'ANY', text: ['any', '-webkit-any', '-moz-any']}, ANY: {text: ['any', '-webkit-any', '-moz-any']},
{name: 'MATCHES'}, MATCHES: {},
{name: 'IS'}, IS: {},
/* /*
* Defined in CSS3 Paged Media * Defined in CSS3 Paged Media
*/ */
{name: 'TOPLEFTCORNER_SYM', text: '@top-left-corner'}, TOPLEFTCORNER_SYM: {text: '@top-left-corner'},
{name: 'TOPLEFT_SYM', text: '@top-left'}, TOPLEFT_SYM: {text: '@top-left'},
{name: 'TOPCENTER_SYM', text: '@top-center'}, TOPCENTER_SYM: {text: '@top-center'},
{name: 'TOPRIGHT_SYM', text: '@top-right'}, TOPRIGHT_SYM: {text: '@top-right'},
{name: 'TOPRIGHTCORNER_SYM', text: '@top-right-corner'}, TOPRIGHTCORNER_SYM: {text: '@top-right-corner'},
{name: 'BOTTOMLEFTCORNER_SYM', text: '@bottom-left-corner'}, BOTTOMLEFTCORNER_SYM: {text: '@bottom-left-corner'},
{name: 'BOTTOMLEFT_SYM', text: '@bottom-left'}, BOTTOMLEFT_SYM: {text: '@bottom-left'},
{name: 'BOTTOMCENTER_SYM', text: '@bottom-center'}, BOTTOMCENTER_SYM: {text: '@bottom-center'},
{name: 'BOTTOMRIGHT_SYM', text: '@bottom-right'}, BOTTOMRIGHT_SYM: {text: '@bottom-right'},
{name: 'BOTTOMRIGHTCORNER_SYM', text: '@bottom-right-corner'}, BOTTOMRIGHTCORNER_SYM: {text: '@bottom-right-corner'},
{name: 'LEFTTOP_SYM', text: '@left-top'}, LEFTTOP_SYM: {text: '@left-top'},
{name: 'LEFTMIDDLE_SYM', text: '@left-middle'}, LEFTMIDDLE_SYM: {text: '@left-middle'},
{name: 'LEFTBOTTOM_SYM', text: '@left-bottom'}, LEFTBOTTOM_SYM: {text: '@left-bottom'},
{name: 'RIGHTTOP_SYM', text: '@right-top'}, RIGHTTOP_SYM: {text: '@right-top'},
{name: 'RIGHTMIDDLE_SYM', text: '@right-middle'}, RIGHTMIDDLE_SYM: {text: '@right-middle'},
{name: 'RIGHTBOTTOM_SYM', text: '@right-bottom'}, RIGHTBOTTOM_SYM: {text: '@right-bottom'},
/* /*
* The following token names are defined in CSS3 Media Queries: https://www.w3.org/TR/css3-mediaqueries/#syntax * The following token names are defined in CSS3 Media Queries: https://www.w3.org/TR/css3-mediaqueries/#syntax
*/ */
{name: 'RESOLUTION', state: 'media'}, RESOLUTION: {state: 'media'},
/* /*
* The following token names are not defined in any CSS specification but are used by the lexer. * The following token names are not defined in any CSS specification but are used by the lexer.
*/ */
// not a real token, but useful for stupid IE filters // not a real token, but useful for stupid IE filters
{name: 'IE_FUNCTION'}, IE_FUNCTION: {},
// part of CSS3 grammar but not the Flex code // part of CSS3 grammar but not the Flex code
{name: 'CHAR'}, CHAR: {},
// TODO: Needed? // TODO: Needed?
// Not defined as tokens, but might as well be // Not defined as tokens, but might as well be
{name: 'PIPE', text: '|'}, PIPE: {text: '|'},
{name: 'SLASH', text: '/'}, SLASH: {text: '/'},
{name: 'MINUS', text: '-'}, MINUS: {text: '-'},
{name: 'STAR', text: '*'}, STAR: {text: '*'},
{name: 'LBRACE', text: '{', endChar: '}'}, LBRACE: {text: '{', endChar: '}'},
{name: 'RBRACE', text: '}'}, RBRACE: {text: '}'},
{name: 'LBRACKET', text: '[', endChar: ']'}, LBRACKET: {text: '[', endChar: ']'},
{name: 'RBRACKET', text: ']'}, RBRACKET: {text: ']'},
{name: 'EQUALS', text: '='}, EQUALS: {text: '='},
{name: 'COLON', text: ':'}, COLON: {text: ':'},
{name: 'SEMICOLON', text: ';'}, SEMICOLON: {text: ';'},
{name: 'LPAREN', text: '(', endChar: ')'}, LPAREN: {text: '(', endChar: ')'},
{name: 'RPAREN', text: ')'}, RPAREN: {text: ')'},
{name: 'DOT', text: '.'}, DOT: {text: '.'},
{name: 'USO_VAR', comment: true}, USO_VAR: {comment: true},
{name: 'CUSTOM_PROP'}, CUSTOM_PROP: {},
]; });
// make Tokens an array of tokens, store the index in original prop, add 'name' to each token
{
Tokens.UNKNOWN = -1;
Tokens.unshift({name: 'EOF'});
const nameMap = [];
const typeMap = new Map(); const typeMap = new Map();
for (let i = 0, len = Tokens.length; i < len; i++) { for (const [k, val] of Object.entries(Tokens)) {
nameMap.push(Tokens[i].name); const index = Tokens[k] = Tokens.length;
Tokens[Tokens[i].name] = i; val.name = k;
if (Tokens[i].text) { Tokens.push(val);
if (Tokens[i].text instanceof Array) { const {text} = val;
for (let j = 0; j < Tokens[i].text.length; j++) { if (text) {
typeMap.set(Tokens[i].text[j], i); for (const item of Array.isArray(text) ? text : [text]) {
} typeMap.set(item, index);
} else {
typeMap.set(Tokens[i].text, i);
} }
} }
} }
Tokens.UNKNOWN = -1;
Tokens.name = function (tt) { Tokens.name = index => (Tokens[index] || {}).name;
return nameMap[tt]; Tokens.type = text => typeMap.get(text) || -1;
};
Tokens.type = function (c) {
return typeMap.get(c) || -1;
};
}
//endregion //endregion
//region lowerCase helper //region lowerCase helper