Skip to content

Commit b1301e8

Browse files
committed
feat!(types): AST nodes and token
1 parent bd9dd01 commit b1301e8

File tree

3 files changed

+70
-24
lines changed

3 files changed

+70
-24
lines changed

lexer.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ var DEBUG = false; // `true` to print debugging info.
22
var TIMER = false; // `true` to time calls to `lex()` and print the results.
33

44
import dbg from './debug.js'
5+
import { Token } from "./types.ts";
56

67
let debug = dbg('lex');
78

@@ -13,7 +14,7 @@ export default lex;
1314
* @param {String} css CSS
1415
* @returns {Array} lexical tokens
1516
*/
16-
function lex(css: string) {
17+
function lex(css: string): Token[] {
1718
var start = 0; // Debug timer start.
1819

1920
var buffer = ''; // Character accumulator
@@ -24,8 +25,8 @@ function lex(css: string) {
2425
var line = 1; // Current source line number
2526
var state = 'before-selector'; // Current state
2627
var stack = [state]; // State stack
27-
var token: any = {}; // Current token
28-
var tokens: any[] = []; // Token accumulator
28+
var token: Token = {}; // Current token
29+
var tokens: Token[] = []; // Token accumulator
2930

3031
// Supported @-rules, in roughly descending order of usage probability.
3132
var atRules: any = [
@@ -201,7 +202,7 @@ function lex(css: string) {
201202
*
202203
* @param {String} type Token type.
203204
*/
204-
function initializeToken(type: any) {
205+
function initializeToken(type: string) {
205206
token = {
206207
type: type,
207208
start: {

parser.ts

+19-20
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
var DEBUG = false; // `true` to print debugging info.
22
var TIMER = false; // `true` to time calls to `parse()` and print the results.
33

4-
54
import dbg from './debug.js'
65
let debug = dbg('parse');
76

87
import lex from './lexer.ts';
8+
import { Token, AST } from "./types.ts";
99

1010
export default parse;
1111

@@ -22,7 +22,7 @@ var _tokens: any[]; // Array of lexical tokens.
2222
* @param {Boolean} [options.comments=false] allow comment nodes in the AST
2323
* @returns {Object} `stringify`-able AST
2424
*/
25-
function parse(css: string | any[], options: any) {
25+
function parse(css: string | any[], options: any): AST {
2626
var start = 0; // Debug timer start.
2727

2828
options || (options = {});
@@ -65,29 +65,28 @@ function parse(css: string | any[], options: any) {
6565
* already in the token, or that will be added to the token.
6666
* @returns {Object} AST node
6767
*/
68-
function astNode(token: any, overrd?: any): any {
68+
function astNode(token: Token, overrd?: any): Token {
6969
let override: any = overrd || {};
7070

71-
var key;
72-
var keys = ['type', 'name', 'value'];
73-
var node: any = {};
74-
75-
// Avoiding [].forEach for performance reasons.
76-
for (var i = 0; i < keys.length; ++i) {
77-
key = keys[i];
71+
var node: Token = {};
7872

79-
if (token[key]) {
80-
node[key] = override[key] || token[key];
81-
}
73+
if (token.type) {
74+
node.type = override.type || token.type;
75+
}
76+
if (token.name) {
77+
node.name = override.name || token.name;
78+
}
79+
if (token.type) {
80+
node.type = override.type || token.type;
8281
}
8382

84-
keys = Object.keys(override);
85-
86-
for (i = 0; i < keys.length; ++i) {
83+
let keys = Object.keys(override);
84+
let key;
85+
for (let i = 0; i < keys.length; ++i) {
8786
key = keys[i];
88-
89-
if (!node[key]) {
90-
node[key] = override[key];
87+
let n = node as Record<string, any>
88+
if (!n[key]) {
89+
n[key] = override[key];
9190
}
9291
}
9392

@@ -122,7 +121,7 @@ function next() {
122121
* @param {Object} token @-group lexical token
123122
* @returns {Object} @-group AST node
124123
*/
125-
function parseAtGroup(token: any): any {
124+
function parseAtGroup(token: Token): any {
126125
_depth = _depth + 1;
127126

128127
// As the @-group token is assembled, relevant token values are captured here

types.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
type Type = 'stylesheet';
2+
3+
export interface AST {
4+
type: Type;
5+
stylesheet: {
6+
rules: Rule[]
7+
}
8+
}
9+
10+
export interface Rule {
11+
type: 'rule';
12+
selectors: string[];
13+
declarations: Decl[]
14+
}
15+
16+
export interface Decl {
17+
type?: string;
18+
name?: string;
19+
value?: string;
20+
}
21+
22+
export interface Token {
23+
type?: string,
24+
start?: {
25+
line: number,
26+
col : number
27+
};
28+
end?: {
29+
line: number,
30+
col : number
31+
};
32+
position?: {
33+
start?: {
34+
line: number,
35+
col : number
36+
};
37+
end?: {
38+
line: number,
39+
col : number
40+
};
41+
};
42+
prefix?: string;
43+
name?: string;
44+
text?: string;
45+
value?: string;
46+
}

0 commit comments

Comments
 (0)