Commit f596e1f7 authored by Christian Hergert's avatar Christian Hergert

Merge branch 'jefferyto/gtksourceview-js-rewrite'

parents 67ea911c b9e2d2dd
......@@ -330,13 +330,25 @@
<include>
<context sub-pattern="0" where="start" style-ref="tag"/>
<context sub-pattern="0" where="end" style-ref="tag"/>
<context ref="embedded-lang-hook"/>
<context ref="js:js"/>
</include>
</context>
</include>
</context>
<context id="js-embedded-lang-hooks">
<include>
<context end-parent="true">
<start>(?=&lt;/script(?:&gt;|\s|$))</start>
<end>\%{def:always-match}</end>
</context>
<context ref="embedded-lang-hook"/>
<context ref="js:embedded-lang-hooks" original="true"/>
</include>
</context>
<replace id="js:embedded-lang-hooks" ref="js-embedded-lang-hooks"/>
<context id="tag" class="no-spell-check">
<start>&lt;/?[a-z0-9_-]+</start>
<end>/?&gt;</end>
......
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is part of GtkSourceView
Author: Scott Martin <scott@coffeeblack.org>
Copyright (C) 2004 Scott Martin <scott@coffeeblack.org>
Copyright (C) 2005 Stef Walter (formerly Nate Nielsen) <stef@memberwebs.com>
Copyright (C) 2005-2007 Marco Barisione <barisione@gmail.com>
Copyright (C) 2005-2007 Emanuele Aina
Copyright (C) 2019 Jeffery To <jeffery.to@gmail.com>
GtkSourceView is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
GtkSourceView is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, see <http://www.gnu.org/licenses/>.
-->
<language id="js-fn" name="JavaScript Functions and Classes" version="2.0" _section="Script" hidden="true">
<keyword-char-class>[a-zA-Z0-9_$]</keyword-char-class>
<definitions>
<!--
See javascript.lang for general notes, naming conventions, etc.
-->
<!-- # Function expression
function () { return; }
function fn([x, y], z = 3, ...rest) { return x + y + z; }
-->
<!-- ## Function expression keyword -->
<context id="_function-expression-async-keyword" style-ref="js:keyword">
<keyword>async</keyword>
</context> <!-- /_function-expression-async-keyword -->
<context id="_ordered-function-expression-async-keyword" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_function-expression-async-keyword"/>
</include>
</context> <!-- /_ordered-function-expression-async-keyword -->
<context id="_function-expression-function-keyword" style-ref="js:keyword">
<keyword>function</keyword>
</context> <!-- /_function-expression-function-keyword -->
<context id="_ordered-function-expression-function-keyword" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_function-expression-function-keyword"/>
</include>
</context> <!-- /_ordered-function-expression-function-keyword -->
<!-- ## Function parameters list -->
<context id="_function-parameters-content">
<include>
<context ref="js:ordered-rest-syntax"/>
<context ref="js:ordered-assignment-target"/>
<context ref="js:ordered-default-value-assignment"/>
</include>
</context> <!-- /_function-parameters-content -->
<context id="_function-parameters-list" once-only="true">
<start>\(</start>
<end>\)</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_function-parameters-list-content">
<include>
<context id="_function-first-parameter" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context ref="_function-parameters-content"/>
</include>
</context> <!-- /_function-first-parameter -->
<context id="_function-parameters">
<start>,</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context ref="_function-parameters-content"/>
</include>
</context> <!-- /_function-parameters -->
</include>
</context> <!-- /_function-parameters-list-content -->
</include>
</context> <!-- /_function-parameters-list -->
<context id="_ordered-function-parameters-list" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_function-parameters-list"/>
</include>
</context> <!-- /_ordered-function-parameters-list -->
<!-- ## Function body -->
<!-- <FunctionBody> -->
<context id="_choice-function-body" end-parent="true">
<start>{</start>
<end>}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_function-body-content">
<include>
<context ref="js-st:directives"/>
<context ref="js-st:statements"/>
</include>
</context> <!-- /_function-body-content -->
</include>
</context> <!-- /_choice-function-body -->
<context id="_last-function-body" end-parent="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_choice-function-body"/>
</include>
</context> <!-- /_last-function-body -->
<!-- ## Function expression -->
<!-- <FunctionExpression> / <FunctionDeclaration> -->
<context id="choice-function-expression" style-ref="js:function-expression" end-parent="true">
<start>(?=\%{js:function-expression-keyword})</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_function-expression-content">
<include>
<context ref="_ordered-function-expression-async-keyword"/>
<context ref="_ordered-function-expression-function-keyword"/>
<context ref="js:ordered-generator-modifier"/>
<context ref="js:ordered-identifier"/>
<context ref="_ordered-function-parameters-list"/>
<context ref="_last-function-body"/>
</include>
</context> <!-- /_function-expression-content -->
</include>
</context> <!-- /choice-function-expression -->
<!-- # Arrow function
x => -x;
(x, y) => x + y
({ a: x, b: y = 2}) => { return x + y; }
-->
<context id="_arrow-function-body" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_arrow-function-body-content">
<include>
<context ref="_choice-function-body"/>
<context ref="js-expr:choice-expression-without-comma"/>
</include>
</context> <!-- /_arrow-function-body-content -->
</include>
</context> <!-- /_arrow-function-body -->
<!-- <ArrowFunction> -->
<!-- parenthesized arrow function parameters matched by grouping
context -->
<context id="arrow-functions" style-ref="js:function-expression">
<start>=&gt;</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_arrow-function-content">
<include>
<context ref="_arrow-function-body"/>
</include>
</context> <!-- /_arrow-function-content -->
</include>
</context> <!-- /arrow-functions -->
<!-- # Method definition
{
method() { ... },
get prop() { return this._prop; },
set prop(v) { this._prop = v; }
}
-->
<context id="_method-definition-modifier" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_method-definition-modifier-content">
<include>
<context id="_choice-method-definition-modifier-keyword" style-ref="js:keyword" end-parent="true">
<keyword>get</keyword>
<keyword>set</keyword>
</context> <!-- /_choice-method-definition-modifier-keyword -->
<!-- ES2017, cannot be followed by line terminator -->
<context id="_choice-async-method-definition-modifier-keyword" style-ref="js:keyword" end-parent="true">
<match extended="true">
\%[ async \%]
(?=
\%{js:optional-whitespace-or-comments}
(?:
\%{js:identifier-start} |
\%{js:generator-modifier}
)
)
</match>
</context> <!-- /_choice-async-method-definition-modifier-keyword -->
</include>
</context> <!-- /_method-definition-modifier-content -->
</include>
</context> <!-- /_method-definition-modifier -->
<context id="_ordered-method-definition-modifier" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_method-definition-modifier"/>
</include>
</context> <!-- /_ordered-method-definition-modifier -->
<!-- <MethodDefinition> -->
<context id="_method-definition" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_method-definition-content">
<include>
<context ref="_ordered-method-definition-modifier"/>
<context ref="js:ordered-generator-modifier"/>
<context ref="js-lit:ordered-property-name"/>
<context ref="_ordered-function-parameters-list" style-ref="js:function-expression"/>
<context ref="_last-function-body" style-ref="js:function-expression"/>
</include>
</context> <!-- /_method-definition-content -->
</include>
</context> <!-- /_method-definition -->
<context id="ordered-method-definition" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_method-definition"/>
</include>
</context> <!-- /ordered-method-definition -->
<!-- # Class expression
class Foo extends Bar {
constructor() { ... }
methodA() { ... }
static methodB() { ... }
}
-->
<!-- ## Class optional name -->
<context id="_class-optional-name" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-optional-name-content">
<include>
<context id="_choice-class-optional-name-ignore-extends" end-parent="true">
<start>(?=\%[extends\%])</start>
<end>\%{def:always-match}</end>
</context> <!-- /_choice-class-optional-name-ignore-extends -->
<context ref="js:choice-identifier"/>
</include>
</context> <!-- /_class-optional-name-content -->
</include>
</context> <!-- /_class-optional-name -->
<context id="_ordered-class-optional-name" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_class-optional-name"/>
</include>
</context> <!-- /_ordered-class-optional-name -->
<!-- ## Class extends clause -->
<context id="_class-extends-clause" once-only="true">
<start>\%[extends\%]</start>
<end>\%{js:before-next-token}</end>
<include>
<context sub-pattern="0" where="start" style-ref="js:keyword"/>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-extends-clause-content">
<include>
<context ref="js-expr:lhs-expression"/>
</include>
</context> <!-- /_class-extends-clause-content -->
</include>
</context> <!-- /_class-extends-clause -->
<context id="_ordered-class-extends-clause" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_class-extends-clause"/>
</include>
</context> <!-- /_ordered-class-extends-clause -->
<!-- ## Class body -->
<context id="_class-body-member-modifier" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-body-member-modifier-content">
<include>
<context id="_choice-class-body-member-modifier-keyword" style-ref="js:keyword" end-parent="true">
<keyword>static</keyword>
</context> <!-- /_choice-class-body-member-modifier-keyword -->
</include>
</context> <!-- /_class-body-member-modifier-content -->
</include>
</context> <!-- /_class-body-member-modifier -->
<context id="_ordered-class-body-member-modifier" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_class-body-member-modifier"/>
</include>
</context> <!-- /_ordered-class-body-member-modifier -->
<context id="_class-body-members">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-body-member-content">
<include>
<context ref="_ordered-class-body-member-modifier"/>
<context ref="ordered-method-definition"/>
</include>
</context> <!-- /_class-body-member-content -->
</include>
</context> <!-- /_class-body-members -->
<context id="_class-body" once-only="true">
<start>{</start>
<end>}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-body-content">
<include>
<context ref="_class-body-members"/>
</include>
</context> <!-- /_class-body-content -->
</include>
</context> <!-- /_class-body -->
<context id="_last-class-body" end-parent="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_class-body"/>
</include>
</context> <!-- /_last-class-body -->
<!-- ## Class expression -->
<!-- <ClassExpression> / <ClassDeclaration> -->
<context id="choice-class-expression" style-ref="js:class-expression" end-parent="true">
<start>\%{js:class-expression-keyword}</start>
<end>\%{js:before-next-token}</end>
<include>
<context sub-pattern="0" where="start" style-ref="js:keyword"/>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-expression-content">
<include>
<context ref="_ordered-class-optional-name"/>
<context ref="_ordered-class-extends-clause"/>
<context ref="_last-class-body"/>
</include>
</context> <!-- /_class-expression-content -->
</include>
</context> <!-- /choice-class-expression -->
<!-- <ClassExpression> / <ClassDeclaration> -->
<context id="choice-class-expression-required-name" style-ref="js:class-expression" end-parent="true">
<start>\%{js:class-expression-keyword}</start>
<end>\%{js:before-next-token}</end>
<include>
<context sub-pattern="0" where="start" style-ref="js:keyword"/>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_class-expression-required-name-content">
<include>
<context ref="js:ordered-identifier"/>
<context ref="_ordered-class-extends-clause"/>
<context ref="_last-class-body"/>
</include>
</context> <!-- /_class-expression-required-name-content -->
</include>
</context> <!-- /choice-class-expression-required-name -->
</definitions>
</language>
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?>
<!--
This file is part of GtkSourceView
Author: Scott Martin <scott@coffeeblack.org>
Copyright (C) 2004 Scott Martin <scott@coffeeblack.org>
Copyright (C) 2005 Stef Walter (formerly Nate Nielsen) <stef@memberwebs.com>
Copyright (C) 2005-2007 Marco Barisione <barisione@gmail.com>
Copyright (C) 2005-2007 Emanuele Aina
Copyright (C) 2019 Jeffery To <jeffery.to@gmail.com>
GtkSourceView is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
GtkSourceView is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this library; if not, see <http://www.gnu.org/licenses/>.
-->
<language id="js-mod" name="JavaScript Modules" version="2.0" _section="Script" hidden="true">
<keyword-char-class>[a-zA-Z0-9_$]</keyword-char-class>
<definitions>
<!--
See javascript.lang for general notes, naming conventions, etc.
-->
<!-- # Shared between export and import declarations -->
<!-- ## (Import) From module
from 'module'
-->
<context id="_from-module" once-only="true">
<start>\%[from\%]</start>
<end>\%{js:before-next-token}</end>
<include>
<context sub-pattern="0" where="start" style-ref="js:keyword"/>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_from-module-content">
<include>
<context ref="js-lit:choice-string-path"/>
</include>
</context> <!-- /_from-module-content -->
</include>
</context> <!-- /_from-module -->
<context id="_ordered-from-module" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_from-module"/>
</include>
</context> <!-- /_ordered-from-module -->
<!-- ## Export / import name group
{ x, y as b }
{ x as default }
{ default }
{ default as y }
-->
<context id="_name-group-identifier" once-only="true">
<start>(?=\%{js:identifier-start})</start>
<end>\%{def:always-match}</end>
<include>
<!-- no embedded-lang-hooks here -->
<!-- no comments here -->
<!-- do not extend the context by matching comments or
embedded-lang-hooks, which may lead to multiple identifiers -->
<context id="_name-group-identifier-content">
<include>
<context id="_name-group-keywords" style-ref="js:keyword">
<keyword>default</keyword>
</context> <!-- /_name-group-keywords -->
<context ref="js:identifier"/>
</include>
</context> <!-- /_name-group-identifier-content -->
</include>
</context> <!-- /_name-group-identifier -->
<context id="_name-group-as-identifier" once-only="true">
<start>\%[as\%]</start>
<end>\%{js:before-next-token}</end>
<include>
<context sub-pattern="0" where="start" style-ref="js:keyword"/>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_name-group-as-identifier-content">
<include>
<context ref="_name-group-identifier"/>
</include>
</context> <!-- /_name-group-as-identifier-content -->
</include>
</context> <!-- /_name-group-as-identifier -->
<context id="_name-group-name-content">
<include>
<context ref="_name-group-identifier"/>
<context ref="_name-group-as-identifier"/>
</include>
</context> <!-- /_name-group-name-content -->
<!-- <ExportClause> / <NamedImports> -->
<context id="_name-group" once-only="true">
<start>{</start>
<end>}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_name-group-content">
<include>
<context id="_name-group-first-name" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context ref="_name-group-name-content"/>
</include>
</context> <!-- /_name-group-first-name -->
<context id="_name-group-names">
<start>,</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context ref="_name-group-name-content"/>
</include>
</context> <!-- /_name-group-names -->
</include>
</context> <!-- /_name-group-content -->
</include>
</context> <!-- /_name-group -->
<context id="_ordered-name-group" once-only="true">
<start>\%{js:before-next-token}</start>
<end>\%{js:before-next-token}</end>
<include>
<context ref="_name-group"/>
</include>
</context> <!-- /_ordered-name-group -->
<!-- # Export declaration -->
<!-- ## Export named
export { x, y as b };
export { x as default };
export { default } from 'module';
-->
<context id="_choice-export-named" end-parent="true">
<start>(?=\{)</start>
<end>\%{js:statement-end}</end>
<include>
<context ref="js:embedded-lang-hooks"/>
<context ref="js:comments"/>
<context id="_choice-export-named-content">
<incl