Add javascript
This commit is contained in:
parent
3088bcfa22
commit
b43f5ecea1
|
@ -8,3 +8,4 @@ Languages:
|
|||
* python: https://github.com/tree-sitter/tree-sitter-python (MIT)
|
||||
* rust: https://github.com/tree-sitter/tree-sitter-rust (MIT)
|
||||
* html: https://github.com/tree-sitter/tree-sitter-html (MIT)
|
||||
* javascript: https://github.com/tree-sitter/tree-sitter-javascript (MIT)
|
||||
|
|
|
@ -45,6 +45,7 @@
|
|||
packages.python = compile-tree-sitter { src = ./python; name = "python"; };
|
||||
packages.rust = compile-tree-sitter { src = ./rust; name = "rust"; };
|
||||
packages.html = compile-tree-sitter { src = ./html; name = "html"; };
|
||||
packages.javascript = compile-tree-sitter { src = ./javascript; name = "javascript"; };
|
||||
}
|
||||
);
|
||||
}
|
||||
|
|
21
javascript/LICENSE
Normal file
21
javascript/LICENSE
Normal file
|
@ -0,0 +1,21 @@
|
|||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2014 Max Brunsfeld
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
9190
javascript/examples/jquery.js
vendored
Normal file
9190
javascript/examples/jquery.js
vendored
Normal file
File diff suppressed because it is too large
Load Diff
4446
javascript/examples/text-editor-component.js
Normal file
4446
javascript/examples/text-editor-component.js
Normal file
File diff suppressed because it is too large
Load Diff
1242
javascript/grammar.js
Normal file
1242
javascript/grammar.js
Normal file
File diff suppressed because it is too large
Load Diff
188
javascript/src/scanner.c
Normal file
188
javascript/src/scanner.c
Normal file
|
@ -0,0 +1,188 @@
|
|||
#include <tree_sitter/parser.h>
|
||||
#include <wctype.h>
|
||||
|
||||
enum TokenType {
|
||||
AUTOMATIC_SEMICOLON,
|
||||
TEMPLATE_CHARS,
|
||||
TERNARY_QMARK,
|
||||
};
|
||||
|
||||
void *tree_sitter_javascript_external_scanner_create() { return NULL; }
|
||||
void tree_sitter_javascript_external_scanner_destroy(void *p) {}
|
||||
void tree_sitter_javascript_external_scanner_reset(void *p) {}
|
||||
unsigned tree_sitter_javascript_external_scanner_serialize(void *p, char *buffer) { return 0; }
|
||||
void tree_sitter_javascript_external_scanner_deserialize(void *p, const char *b, unsigned n) {}
|
||||
|
||||
static void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
||||
static void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
||||
|
||||
static bool scan_template_chars(TSLexer *lexer) {
|
||||
lexer->result_symbol = TEMPLATE_CHARS;
|
||||
for (bool has_content = false;; has_content = true) {
|
||||
lexer->mark_end(lexer);
|
||||
switch (lexer->lookahead) {
|
||||
case '`':
|
||||
return has_content;
|
||||
case '\0':
|
||||
return false;
|
||||
case '$':
|
||||
advance(lexer);
|
||||
if (lexer->lookahead == '{') return has_content;
|
||||
break;
|
||||
case '\\':
|
||||
return has_content;
|
||||
default:
|
||||
advance(lexer);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool scan_whitespace_and_comments(TSLexer *lexer) {
|
||||
for (;;) {
|
||||
while (iswspace(lexer->lookahead)) {
|
||||
skip(lexer);
|
||||
}
|
||||
|
||||
if (lexer->lookahead == '/') {
|
||||
skip(lexer);
|
||||
|
||||
if (lexer->lookahead == '/') {
|
||||
skip(lexer);
|
||||
while (lexer->lookahead != 0 && lexer->lookahead != '\n' && lexer->lookahead != 0x2028 &&
|
||||
lexer->lookahead != 0x2029) {
|
||||
skip(lexer);
|
||||
}
|
||||
} else if (lexer->lookahead == '*') {
|
||||
skip(lexer);
|
||||
while (lexer->lookahead != 0) {
|
||||
if (lexer->lookahead == '*') {
|
||||
skip(lexer);
|
||||
if (lexer->lookahead == '/') {
|
||||
skip(lexer);
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
skip(lexer);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool scan_automatic_semicolon(TSLexer *lexer) {
|
||||
lexer->result_symbol = AUTOMATIC_SEMICOLON;
|
||||
lexer->mark_end(lexer);
|
||||
|
||||
for (;;) {
|
||||
if (lexer->lookahead == 0) return true;
|
||||
if (lexer->lookahead == '}') return true;
|
||||
if (lexer->is_at_included_range_start(lexer)) return true;
|
||||
if (lexer->lookahead == '\n' || lexer->lookahead == 0x2028 || lexer->lookahead == 0x2029) break;
|
||||
if (!iswspace(lexer->lookahead)) return false;
|
||||
skip(lexer);
|
||||
}
|
||||
|
||||
skip(lexer);
|
||||
|
||||
if (!scan_whitespace_and_comments(lexer)) return false;
|
||||
|
||||
switch (lexer->lookahead) {
|
||||
case ',':
|
||||
case '.':
|
||||
case ':':
|
||||
case ';':
|
||||
case '*':
|
||||
case '%':
|
||||
case '>':
|
||||
case '<':
|
||||
case '=':
|
||||
case '[':
|
||||
case '(':
|
||||
case '?':
|
||||
case '^':
|
||||
case '|':
|
||||
case '&':
|
||||
case '/':
|
||||
return false;
|
||||
|
||||
// Insert a semicolon before `--` and `++`, but not before binary `+` or `-`.
|
||||
case '+':
|
||||
skip(lexer);
|
||||
return lexer->lookahead == '+';
|
||||
case '-':
|
||||
skip(lexer);
|
||||
return lexer->lookahead == '-';
|
||||
|
||||
// Don't insert a semicolon before `!=`, but do insert one before a unary `!`.
|
||||
case '!':
|
||||
skip(lexer);
|
||||
return lexer->lookahead != '=';
|
||||
|
||||
// Don't insert a semicolon before `in` or `instanceof`, but do insert one
|
||||
// before an identifier.
|
||||
case 'i':
|
||||
skip(lexer);
|
||||
|
||||
if (lexer->lookahead != 'n') return true;
|
||||
skip(lexer);
|
||||
|
||||
if (!iswalpha(lexer->lookahead)) return false;
|
||||
|
||||
for (unsigned i = 0; i < 8; i++) {
|
||||
if (lexer->lookahead != "stanceof"[i]) return true;
|
||||
skip(lexer);
|
||||
}
|
||||
|
||||
if (!iswalpha(lexer->lookahead)) return false;
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool scan_ternary_qmark(TSLexer *lexer) {
|
||||
for(;;) {
|
||||
if (!iswspace(lexer->lookahead)) break;
|
||||
skip(lexer);
|
||||
}
|
||||
|
||||
if (lexer->lookahead == '?') {
|
||||
advance(lexer);
|
||||
|
||||
if (lexer->lookahead == '?') return false;
|
||||
|
||||
lexer->mark_end(lexer);
|
||||
lexer->result_symbol = TERNARY_QMARK;
|
||||
|
||||
if (lexer->lookahead == '.') {
|
||||
advance(lexer);
|
||||
if (iswdigit(lexer->lookahead)) return true;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool tree_sitter_javascript_external_scanner_scan(void *payload, TSLexer *lexer,
|
||||
const bool *valid_symbols) {
|
||||
if (valid_symbols[TEMPLATE_CHARS]) {
|
||||
if (valid_symbols[AUTOMATIC_SEMICOLON]) return false;
|
||||
return scan_template_chars(lexer);
|
||||
} else if (valid_symbols[AUTOMATIC_SEMICOLON]) {
|
||||
bool ret = scan_automatic_semicolon(lexer);
|
||||
if (!ret && valid_symbols[TERNARY_QMARK] && lexer->lookahead == '?')
|
||||
return scan_ternary_qmark(lexer);
|
||||
return ret;
|
||||
}
|
||||
if (valid_symbols[TERNARY_QMARK]) {
|
||||
return scan_ternary_qmark(lexer);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
111
javascript/test/corpus/destructuring.txt
Normal file
111
javascript/test/corpus/destructuring.txt
Normal file
|
@ -0,0 +1,111 @@
|
|||
============================================
|
||||
Object destructuring assignments
|
||||
============================================
|
||||
|
||||
({a, b: c.d, ...e[f]} = object);
|
||||
let {a, b, ...c} = object
|
||||
const {a, b: {c, d}} = object
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (parenthesized_expression (assignment_expression
|
||||
(object_pattern
|
||||
(shorthand_property_identifier_pattern)
|
||||
(pair_pattern
|
||||
(property_identifier)
|
||||
(member_expression (identifier) (property_identifier)))
|
||||
(rest_pattern (subscript_expression (identifier) (identifier))))
|
||||
(identifier))))
|
||||
(lexical_declaration (variable_declarator
|
||||
(object_pattern
|
||||
(shorthand_property_identifier_pattern)
|
||||
(shorthand_property_identifier_pattern)
|
||||
(rest_pattern (identifier)))
|
||||
(identifier)))
|
||||
(lexical_declaration (variable_declarator
|
||||
(object_pattern
|
||||
(shorthand_property_identifier_pattern)
|
||||
(pair_pattern
|
||||
(property_identifier)
|
||||
(object_pattern
|
||||
(shorthand_property_identifier_pattern)
|
||||
(shorthand_property_identifier_pattern))))
|
||||
(identifier))))
|
||||
|
||||
============================================
|
||||
Object destructuring parameters
|
||||
============================================
|
||||
|
||||
function a ({b, c}, {d}) {}
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(function_declaration (identifier)
|
||||
(formal_parameters
|
||||
(object_pattern (shorthand_property_identifier_pattern) (shorthand_property_identifier_pattern))
|
||||
(object_pattern (shorthand_property_identifier_pattern)))
|
||||
(statement_block)))
|
||||
|
||||
============================================
|
||||
Array destructuring assignments
|
||||
============================================
|
||||
|
||||
[a, b.c, ...c[d]] = array;
|
||||
[a, b, ...c] = array;
|
||||
[,, c,, d,] = array;
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (assignment_expression
|
||||
(array_pattern
|
||||
(identifier)
|
||||
(member_expression (identifier) (property_identifier))
|
||||
(rest_pattern (subscript_expression (identifier) (identifier))))
|
||||
(identifier)))
|
||||
(expression_statement (assignment_expression
|
||||
(array_pattern
|
||||
(identifier)
|
||||
(identifier)
|
||||
(rest_pattern (identifier)))
|
||||
(identifier)))
|
||||
(expression_statement (assignment_expression
|
||||
(array_pattern
|
||||
(identifier)
|
||||
(identifier))
|
||||
(identifier))))
|
||||
|
||||
================================================
|
||||
Object destructuring patterns w/ default values
|
||||
================================================
|
||||
|
||||
let {a: b = c} = object;
|
||||
for await (var {a: {b} = object} of asyncIter) {}
|
||||
function a({b = true}, [c, d = false]) {}
|
||||
function b({c} = {}) {}
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(lexical_declaration (variable_declarator
|
||||
(object_pattern (pair_pattern
|
||||
(property_identifier)
|
||||
(assignment_pattern (identifier) (identifier))))
|
||||
(identifier)))
|
||||
(for_in_statement
|
||||
(object_pattern (pair_pattern
|
||||
(property_identifier)
|
||||
(assignment_pattern (object_pattern (shorthand_property_identifier_pattern)) (identifier))))
|
||||
(identifier)
|
||||
(statement_block))
|
||||
(function_declaration (identifier)
|
||||
(formal_parameters
|
||||
(object_pattern (object_assignment_pattern (shorthand_property_identifier_pattern) (true)))
|
||||
(array_pattern (identifier) (assignment_pattern (identifier) (false))))
|
||||
(statement_block))
|
||||
(function_declaration (identifier)
|
||||
(formal_parameters
|
||||
(assignment_pattern (object_pattern (shorthand_property_identifier_pattern)) (object)))
|
||||
(statement_block)))
|
1529
javascript/test/corpus/expressions.txt
Normal file
1529
javascript/test/corpus/expressions.txt
Normal file
File diff suppressed because it is too large
Load Diff
136
javascript/test/corpus/glimmer.txt
Normal file
136
javascript/test/corpus/glimmer.txt
Normal file
|
@ -0,0 +1,136 @@
|
|||
============================================
|
||||
Simple
|
||||
============================================
|
||||
|
||||
const Named = <template>
|
||||
{{ (doubled foo) }}
|
||||
</template>
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(lexical_declaration
|
||||
(variable_declarator
|
||||
(identifier)
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag)))))
|
||||
|
||||
|
||||
============================================
|
||||
Empty
|
||||
============================================
|
||||
|
||||
<template></template>
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(expression_statement
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
|
||||
============================================
|
||||
Two Components
|
||||
============================================
|
||||
|
||||
const WithSemi = <template>
|
||||
{{ (doubled foo) }}
|
||||
</template>;
|
||||
|
||||
<template>
|
||||
<WithSemi />
|
||||
</template>;
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(lexical_declaration
|
||||
(variable_declarator
|
||||
(identifier)
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
(expression_statement
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
============================================
|
||||
Multiple Assignment
|
||||
============================================
|
||||
|
||||
const Empty = <template></template>
|
||||
|
||||
const WithSemi = <template>
|
||||
<Empty />
|
||||
{{ (doubled foo) }}
|
||||
</template>;
|
||||
|
||||
|
||||
<template>
|
||||
<WithSemi />
|
||||
</template>;
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(lexical_declaration
|
||||
(variable_declarator
|
||||
(identifier)
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
(lexical_declaration
|
||||
(variable_declarator
|
||||
(identifier)
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
(expression_statement
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag))))
|
||||
|
||||
============================================
|
||||
Class Component
|
||||
============================================
|
||||
|
||||
class InClass {
|
||||
<template>
|
||||
{{this.whatever}}
|
||||
</template>
|
||||
}
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(class_declaration
|
||||
(identifier)
|
||||
(class_body
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag)))))
|
||||
|
||||
============================================
|
||||
JS Regex Evasion
|
||||
============================================
|
||||
|
||||
<template>
|
||||
{{#if true}}
|
||||
{{/if}}
|
||||
</template>
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(expression_statement
|
||||
(glimmer_template
|
||||
(glimmer_opening_tag)
|
||||
(glimmer_closing_tag)
|
||||
)))
|
43
javascript/test/corpus/injectables.txt
Normal file
43
javascript/test/corpus/injectables.txt
Normal file
|
@ -0,0 +1,43 @@
|
|||
============================================
|
||||
JSDoc
|
||||
============================================
|
||||
|
||||
/*
|
||||
* @return {void}
|
||||
*/
|
||||
function foo() {}
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(comment)
|
||||
(function_declaration
|
||||
(identifier)
|
||||
(formal_parameters)
|
||||
(statement_block)))
|
||||
|
||||
============================================
|
||||
JSX
|
||||
============================================
|
||||
|
||||
const foo = 2;
|
||||
|
||||
<div>{{foo}}</div>
|
||||
|
||||
----
|
||||
|
||||
(program
|
||||
(lexical_declaration
|
||||
(variable_declarator
|
||||
(identifier)
|
||||
(number)))
|
||||
(expression_statement
|
||||
(jsx_element
|
||||
(jsx_opening_element
|
||||
(identifier))
|
||||
(jsx_expression
|
||||
(object
|
||||
(shorthand_property_identifier)))
|
||||
(jsx_closing_element
|
||||
(identifier)))))
|
||||
|
153
javascript/test/corpus/literals.txt
Normal file
153
javascript/test/corpus/literals.txt
Normal file
|
@ -0,0 +1,153 @@
|
|||
============================================
|
||||
Numbers
|
||||
============================================
|
||||
|
||||
04000
|
||||
400
|
||||
100n
|
||||
0xffffffffn
|
||||
0b00111n
|
||||
0o1234n
|
||||
0xa_b_c
|
||||
0o1_1
|
||||
0b1_000_000
|
||||
1_2_3
|
||||
12_3.4_5e6_7
|
||||
0b1_000_000n
|
||||
01
|
||||
00000123
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number))
|
||||
(expression_statement (number)))
|
||||
|
||||
============================================
|
||||
Unicode identifiers
|
||||
============================================
|
||||
|
||||
const últimaVez = 1
|
||||
{ 県: '大阪府', '': '' }
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(lexical_declaration (variable_declarator (identifier) (number)))
|
||||
(expression_statement
|
||||
(object
|
||||
(pair (property_identifier) (string (string_fragment)))
|
||||
(pair (string) (string)))))
|
||||
|
||||
==========================================
|
||||
Strings containing comment-like content
|
||||
==========================================
|
||||
|
||||
"//ok\n//what"
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement
|
||||
(string (string_fragment) (escape_sequence) (string_fragment))))
|
||||
|
||||
==========================================
|
||||
Quote escaping
|
||||
==========================================
|
||||
|
||||
"";
|
||||
'';
|
||||
"\"";
|
||||
"a\"b";
|
||||
'\'';
|
||||
'a\'b';
|
||||
"it's a tiny tiny world";
|
||||
'"hello"';
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (string))
|
||||
(expression_statement (string))
|
||||
(expression_statement (string (escape_sequence)))
|
||||
(expression_statement
|
||||
(string (string_fragment) (escape_sequence) (string_fragment)))
|
||||
(expression_statement (string (escape_sequence)))
|
||||
(expression_statement
|
||||
(string (string_fragment) (escape_sequence) (string_fragment)))
|
||||
(expression_statement (string (string_fragment)))
|
||||
(expression_statement (string (string_fragment))))
|
||||
|
||||
==========================================
|
||||
Line continuations
|
||||
==========================================
|
||||
|
||||
"hello\
|
||||
world";
|
||||
|
||||
'hello\
|
||||
world';
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement
|
||||
(string (string_fragment) (escape_sequence) (string_fragment)))
|
||||
(expression_statement
|
||||
(string (string_fragment) (escape_sequence) (string_fragment))))
|
||||
|
||||
============================================================
|
||||
Non-standard unescaped newlines legal in TSX attributes
|
||||
============================================================
|
||||
|
||||
"hello
|
||||
world";
|
||||
|
||||
'hello
|
||||
world';
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (string (string_fragment)))
|
||||
(expression_statement (string (string_fragment))))
|
||||
|
||||
=========================================================
|
||||
JSX strings with unescaped newlines for TSX attributes
|
||||
=========================================================
|
||||
|
||||
<Element Attribute="hello
|
||||
world"></Element>;
|
||||
|
||||
<Element Attribute='hello
|
||||
world'></Element>;
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement
|
||||
(jsx_element
|
||||
(jsx_opening_element
|
||||
(identifier)
|
||||
(jsx_attribute (property_identifier) (string (string_fragment))))
|
||||
(jsx_closing_element
|
||||
(identifier))))
|
||||
(expression_statement
|
||||
(jsx_element
|
||||
(jsx_opening_element
|
||||
(identifier)
|
||||
(jsx_attribute (property_identifier) (string (string_fragment))))
|
||||
(jsx_closing_element
|
||||
(identifier)))))
|
289
javascript/test/corpus/semicolon_insertion.txt
Normal file
289
javascript/test/corpus/semicolon_insertion.txt
Normal file
|
@ -0,0 +1,289 @@
|
|||
============================================
|
||||
Automatic semicolon insertion
|
||||
============================================
|
||||
|
||||
if (a) {
|
||||
var b = c
|
||||
d()
|
||||
e()
|
||||
return f
|
||||
}
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(if_statement
|
||||
(parenthesized_expression (identifier))
|
||||
(statement_block
|
||||
(variable_declaration (variable_declarator (identifier) (identifier)))
|
||||
(expression_statement (call_expression (identifier) (arguments)))
|
||||
(expression_statement (call_expression (identifier) (arguments)))
|
||||
(return_statement (identifier)))))
|
||||
|
||||
============================================
|
||||
Semicolon insertion before update expressions
|
||||
============================================
|
||||
|
||||
if (a)
|
||||
d()
|
||||
++b
|
||||
|
||||
if (a)
|
||||
d()
|
||||
--b
|
||||
|
||||
---
|
||||
(program
|
||||
(if_statement
|
||||
(parenthesized_expression (identifier))
|
||||
(expression_statement
|
||||
(call_expression (identifier) (arguments))))
|
||||
(expression_statement (update_expression (identifier)))
|
||||
|
||||
(if_statement
|
||||
(parenthesized_expression (identifier))
|
||||
(expression_statement
|
||||
(call_expression (identifier) (arguments))))
|
||||
(expression_statement (update_expression (identifier))))
|
||||
|
||||
==========================================
|
||||
property access across lines
|
||||
==========================================
|
||||
|
||||
object
|
||||
.someProperty
|
||||
.otherProperty
|
||||
|
||||
---
|
||||
|
||||
(program (expression_statement
|
||||
(member_expression
|
||||
(member_expression (identifier) (property_identifier))
|
||||
(property_identifier))))
|
||||
|
||||
===========================================
|
||||
indented code after blocks
|
||||
===========================================
|
||||
|
||||
function x() {}
|
||||
return z;
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(function_declaration
|
||||
(identifier)
|
||||
(formal_parameters)
|
||||
(statement_block))
|
||||
(return_statement (identifier)))
|
||||
|
||||
================================================
|
||||
operator expressions split across lines
|
||||
================================================
|
||||
|
||||
a
|
||||
? b
|
||||
: c
|
||||
|
||||
a
|
||||
|| b
|
||||
|
||||
a
|
||||
^ b
|
||||
|
||||
a
|
||||
!== b
|
||||
|
||||
a
|
||||
!b; // standalone statement
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (ternary_expression (identifier) (identifier) (identifier)))
|
||||
(expression_statement (binary_expression (identifier) (identifier)))
|
||||
(expression_statement (binary_expression (identifier) (identifier)))
|
||||
(expression_statement (binary_expression (identifier) (identifier)))
|
||||
(expression_statement (identifier))
|
||||
(expression_statement (unary_expression (identifier)))
|
||||
(comment))
|
||||
|
||||
================================================
|
||||
Alphabetical infix operators split across lines
|
||||
================================================
|
||||
|
||||
a
|
||||
i;
|
||||
|
||||
a
|
||||
in b;
|
||||
|
||||
a
|
||||
ins;
|
||||
|
||||
a
|
||||
inst;
|
||||
|
||||
a
|
||||
instanceof b;
|
||||
|
||||
a
|
||||
instanceofX;
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(expression_statement (identifier))
|
||||
(expression_statement (identifier))
|
||||
|
||||
(expression_statement (binary_expression (identifier) (identifier)))
|
||||
|
||||
(expression_statement (identifier))
|
||||
(expression_statement (identifier))
|
||||
|
||||
(expression_statement (identifier))
|
||||
(expression_statement (identifier))
|
||||
|
||||
(expression_statement (binary_expression (identifier) (identifier)))
|
||||
|
||||
(expression_statement (identifier))
|
||||
(expression_statement (identifier)))
|
||||
|
||||
===========================================
|
||||
Single-line if/else statements
|
||||
===========================================
|
||||
|
||||
if (a) {b} else {c}
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(if_statement (parenthesized_expression (identifier))
|
||||
(statement_block (expression_statement (identifier)))
|
||||
(else_clause
|
||||
(statement_block (expression_statement (identifier))))))
|
||||
|
||||
===========================================
|
||||
single-line blocks without semicolons
|
||||
===========================================
|
||||
|
||||
function a() {b}
|
||||
function c() {return d}
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(function_declaration (identifier) (formal_parameters) (statement_block
|
||||
(expression_statement (identifier))))
|
||||
(function_declaration (identifier) (formal_parameters) (statement_block
|
||||
(return_statement (identifier)))))
|
||||
|
||||
==============================================
|
||||
Multi-line chained expressions in var declarations
|
||||
==============================================
|
||||
|
||||
var a = new A()
|
||||
.b({c: 'd'})
|
||||
.e()
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(variable_declaration (variable_declarator
|
||||
(identifier)
|
||||
(call_expression
|
||||
(member_expression
|
||||
(call_expression
|
||||
(member_expression
|
||||
(new_expression (identifier) (arguments))
|
||||
(property_identifier))
|
||||
(arguments
|
||||
(object
|
||||
(pair (property_identifier) (string (string_fragment))))))
|
||||
(property_identifier))
|
||||
(arguments)))))
|
||||
|
||||
==============================================
|
||||
if/for/while/do statements without semicolons
|
||||
==============================================
|
||||
|
||||
if (a) { if (b) return c }
|
||||
if (d) { for (;;) break }
|
||||
if (e) { for (f in g) break }
|
||||
if (h) { for (i of j) continue }
|
||||
if (k) { while (l) break }
|
||||
if (m) { do { n; } while (o) }
|
||||
if (p) { var q }
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(if_statement
|
||||
(parenthesized_expression (identifier))
|
||||
(return_statement (identifier)))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(for_statement
|
||||
(empty_statement)
|
||||
(empty_statement)
|
||||
(break_statement))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(for_in_statement (identifier) (identifier)
|
||||
(break_statement))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(for_in_statement (identifier) (identifier)
|
||||
(continue_statement))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(while_statement
|
||||
(parenthesized_expression (identifier))
|
||||
(break_statement))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(do_statement
|
||||
(statement_block (expression_statement (identifier)))
|
||||
(parenthesized_expression (identifier)))))
|
||||
(if_statement (parenthesized_expression (identifier)) (statement_block
|
||||
(variable_declaration (variable_declarator (identifier))))))
|
||||
|
||||
=====================================================
|
||||
Single-line declarations without semicolons
|
||||
=====================================================
|
||||
|
||||
function a () { function b () {} function *c () {} class D {} return }
|
||||
---
|
||||
|
||||
(program
|
||||
(function_declaration (identifier) (formal_parameters) (statement_block
|
||||
(function_declaration (identifier) (formal_parameters) (statement_block))
|
||||
(generator_function_declaration (identifier) (formal_parameters) (statement_block))
|
||||
(class_declaration (identifier) (class_body))
|
||||
(return_statement))))
|
||||
|
||||
=====================================================
|
||||
Comments after statements without semicolons
|
||||
=====================================================
|
||||
|
||||
let a // comment at end of declaration
|
||||
|
||||
// comment outside of declaration
|
||||
let b /* comment between declarators */, c
|
||||
|
||||
/** comment with *stars* **/ /* comment with /slashes/ */
|
||||
/* third comment in a row */
|
||||
|
||||
let d
|
||||
|
||||
---
|
||||
|
||||
(program
|
||||
(lexical_declaration
|
||||
(variable_declarator (identifier))
|
||||
(comment))
|
||||
(comment)
|
||||
(lexical_declaration
|
||||
(variable_declarator (identifier))
|
||||
(comment)
|
||||
(variable_declarator (identifier)))
|
||||
(comment)
|
||||
(comment)
|
||||
(comment)
|
||||
(lexical_declaration (variable_declarator (identifier))))
|
1254
javascript/test/corpus/statements.txt
Normal file
1254
javascript/test/corpus/statements.txt
Normal file
File diff suppressed because it is too large
Load Diff
48
javascript/test/highlight/functions.js
Normal file
48
javascript/test/highlight/functions.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
var a = 'a';
|
||||
// ^ variable
|
||||
|
||||
var b = function() {};
|
||||
// ^ function
|
||||
|
||||
var c = () => {};
|
||||
// ^ function
|
||||
|
||||
var d = async () => {};
|
||||
// ^ function
|
||||
|
||||
module.e = 'e';
|
||||
// ^ property
|
||||
|
||||
module.f = function() {};
|
||||
// ^ function.method
|
||||
|
||||
module.g = async function() {};
|
||||
// ^ function.method
|
||||
|
||||
module.h = () => {};
|
||||
// ^ function.method
|
||||
|
||||
function i() {
|
||||
// ^ function
|
||||
}
|
||||
|
||||
class Person {
|
||||
static foo = bar;
|
||||
// ^ property
|
||||
|
||||
getName() {
|
||||
// ^ function.method
|
||||
}
|
||||
}
|
||||
|
||||
foo(function callback() {
|
||||
// ^ keyword
|
||||
// ^ function
|
||||
})
|
||||
|
||||
|
||||
c();
|
||||
// <- function
|
||||
|
||||
module.e();
|
||||
// ^ function.method
|
5
javascript/test/highlight/injection.js
Normal file
5
javascript/test/highlight/injection.js
Normal file
|
@ -0,0 +1,5 @@
|
|||
eval(js `var foo`)
|
||||
// <- function
|
||||
// ^ function
|
||||
// ^ keyword
|
||||
// ^ variable
|
12
javascript/test/highlight/keywords.js
Normal file
12
javascript/test/highlight/keywords.js
Normal file
|
@ -0,0 +1,12 @@
|
|||
do {} while (a);
|
||||
// <- keyword
|
||||
// ^ keyword
|
||||
|
||||
try {} catch (e) {} finally {}
|
||||
// <- keyword
|
||||
// ^ keyword
|
||||
// ^ keyword
|
||||
|
||||
throw e
|
||||
// <- keyword
|
||||
// ^ variable
|
48
javascript/test/highlight/variables.js
Normal file
48
javascript/test/highlight/variables.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
class A {}
|
||||
// ^ constructor
|
||||
const ABC = 1
|
||||
// ^ constant
|
||||
const AB_C1 = 2
|
||||
// ^ constant
|
||||
const {AB_C2_D3} = x
|
||||
// ^ constant
|
||||
|
||||
module.exports = function(one, two) {
|
||||
// <- variable.builtin
|
||||
// ^ variable.parameter
|
||||
|
||||
if (something()) {
|
||||
let module = null, one = 1;
|
||||
// ^ variable
|
||||
// ^ variable
|
||||
|
||||
console.log(module, one, two);
|
||||
// ^ variable.builtin
|
||||
// ^ variable
|
||||
// ^ variable
|
||||
// ^ variable.parameter
|
||||
}
|
||||
|
||||
console.log(module, one, two);
|
||||
// ^ variable.builtin
|
||||
// ^ variable.builtin
|
||||
// ^ variable.parameter
|
||||
// ^ variable.parameter
|
||||
};
|
||||
|
||||
console.log(module, one, two);
|
||||
// ^ variable.builtin
|
||||
// ^ variable.builtin
|
||||
// ^ variable
|
||||
// ^ variable
|
||||
|
||||
function one({two: three}, [four]) {
|
||||
// ^ property
|
||||
// ^ variable.parameter
|
||||
// ^ variable.parameter
|
||||
|
||||
console.log(two, three, four)
|
||||
// ^ variable
|
||||
// ^ variable.parameter
|
||||
// ^ variable.parameter
|
||||
}
|
14
javascript/test/tags/classes.js
Normal file
14
javascript/test/tags/classes.js
Normal file
|
@ -0,0 +1,14 @@
|
|||
class Person {
|
||||
// ^ definition.class
|
||||
static foo = bar;
|
||||
|
||||
getName() {
|
||||
// ^ definition.method
|
||||
}
|
||||
}
|
||||
|
||||
var person = new Person();
|
||||
// ^ reference.class
|
||||
|
||||
person.getName()
|
||||
// ^ reference.call
|
22
javascript/test/tags/functions.js
Normal file
22
javascript/test/tags/functions.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
function foo() {
|
||||
// ^ definition.function
|
||||
}
|
||||
|
||||
foo()
|
||||
// <- reference.call
|
||||
|
||||
{ source: $ => repeat($._expression) }
|
||||
// ^ definition.function
|
||||
// ^ reference.call
|
||||
|
||||
let plus1 = x => x + 1
|
||||
// ^ definition.function
|
||||
|
||||
let plus2 = function(x) { return x + 2 }
|
||||
// ^ definition.function
|
||||
|
||||
function *gen() { }
|
||||
// ^ definition.function
|
||||
|
||||
async function* foo() { yield 1; }
|
||||
// ^ definition.function
|
Loading…
Reference in New Issue
Block a user