502 lines
17 KiB
XML
502 lines
17 KiB
XML
<?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-2020 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">
|
|
<!-- from js:identifier-char -->
|
|
<keyword-char-class>(?!\x{2E2F})[\p{L}\p{Nl}\x{1885}-\x{1886}\x{2118}\x{212E}\x{309B}-\x{309C}\p{Mn}\p{Mc}\p{Nd}\p{Pc}\x{00B7}\x{0387}\x{1369}-\x{1371}\x{19DA}$\x{200C}\x{200D}]</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" once-only="true">
|
|
<match>\%{js:async-keyword}</match>
|
|
</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" once-only="true">
|
|
<match>\%{js:function-keyword}</match>
|
|
</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-binding"/>
|
|
<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>=></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="_property-accessor-keyword" style-ref="js:keyword" once-only="true">
|
|
<match extended="true">
|
|
\%{js:get-keyword} | \%{js:set-keyword}
|
|
</match>
|
|
</context> <!-- /_property-accessor-keyword -->
|
|
|
|
<context id="ordered-property-accessor-keyword" once-only="true">
|
|
<start>\%{js:before-next-token}</start>
|
|
<end>\%{js:before-next-token}</end>
|
|
<include>
|
|
<context ref="_property-accessor-keyword"/>
|
|
</include>
|
|
</context> <!-- /ordered-property-accessor-keyword -->
|
|
|
|
<!-- <MethodDefinition> (part of) -->
|
|
<!-- note that this does not include js-lit:ordered-property-name -->
|
|
<context id="choice-method-definition" style-ref="js:function-expression" end-parent="true">
|
|
<start>(?=\()</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-function-parameters-list"/>
|
|
<context ref="_last-function-body"/>
|
|
</include>
|
|
</context> <!-- /_method-definition-content -->
|
|
|
|
</include>
|
|
</context> <!-- /choice-method-definition -->
|
|
|
|
<!-- <MethodDefinition> (part of) -->
|
|
<context id="choice-method-keyword-method-definition" style-ref="js:function-expression" end-parent="true">
|
|
<start>\%{js:method-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="_method-keyword-method-definition-content">
|
|
<include>
|
|
<context ref="js:ordered-generator-modifier"/>
|
|
<context ref="js-lit:ordered-property-name"/>
|
|
<context ref="choice-method-definition"/>
|
|
</include>
|
|
</context> <!-- /_method-keyword-method-definition-content -->
|
|
|
|
</include>
|
|
</context> <!-- /choice-method-keyword-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>(?=\%{js:extends-keyword})</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>\%{js:extends-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-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" style-ref="js:keyword" once-only="true">
|
|
<match>\%{js:static-keyword}</match>
|
|
</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="_choice-class-body-keyword-named-method-member" style-ref="js:function-expression" end-parent="true">
|
|
<start extended="true">
|
|
(?: \%{js:get-keyword} | \%{js:set-keyword} | \%{js:static-keyword} )
|
|
(?= \%{js:optional-whitespace-or-comments} \( )
|
|
</start>
|
|
<end>\%{js:before-next-token}</end>
|
|
<include>
|
|
<context sub-pattern="0" where="start" style-ref="js:identifier"/>
|
|
<context ref="js:embedded-lang-hooks"/>
|
|
<context ref="js:comments"/>
|
|
|
|
<context id="_class-body-keyword-named-method-member-content">
|
|
<include>
|
|
<context ref="choice-method-definition"/>
|
|
</include>
|
|
</context> <!-- /_class-body-keyword-named-method-member-content -->
|
|
|
|
</include>
|
|
</context> <!-- /_choice-class-body-keyword-named-method-member -->
|
|
|
|
<context id="_choice-class-body-constructor-member" style-ref="js:function-expression" end-parent="true">
|
|
<start extended="true">
|
|
\%{js:keyword-start} constructor \%{js:keyword-end}
|
|
</start>
|
|
<end>\%{js:before-next-token}</end>
|
|
<include>
|
|
<context sub-pattern="0" where="start" style-ref="js:built-in-method"/>
|
|
<context ref="js:embedded-lang-hooks"/>
|
|
<context ref="js:comments"/>
|
|
|
|
<context id="_class-body-constructor-member-content">
|
|
<include>
|
|
<context ref="choice-method-definition"/>
|
|
</include>
|
|
</context> <!-- /_class-body-constructor-member-content -->
|
|
|
|
</include>
|
|
</context> <!-- /_choice-class-body-constructor-member -->
|
|
|
|
<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>
|
|
<!-- try to match before and after modifier -->
|
|
<context ref="_choice-class-body-keyword-named-method-member"/>
|
|
|
|
<!-- should not be combined with modifier, but cannot prevent it -->
|
|
<context ref="_choice-class-body-constructor-member"/>
|
|
|
|
<context ref="_ordered-class-body-member-modifier"/>
|
|
|
|
<context ref="choice-method-keyword-method-definition"/>
|
|
|
|
<context ref="ordered-property-accessor-keyword"/>
|
|
<context ref="js-lit:ordered-property-name"/>
|
|
|
|
<context ref="choice-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-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-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>
|