mirror of https://github.com/Wilfred/difftastic/
Add 'vendor/tree-sitter-qmljs/' from commit '3bcf9c4d0911e74307c6d704c1ea242a1e4a2f94'
git-subtree-dir: vendor/tree-sitter-qmljs git-subtree-mainline:pull/361/headfe5ef8757dgit-subtree-split:3bcf9c4d09
commit
79d594fc56
@ -0,0 +1,30 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ dev ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ dev ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- name: Install dependencies (gyp would fail)
|
||||||
|
run: npm install || true
|
||||||
|
- name: Generate parser sources
|
||||||
|
run: make generate
|
||||||
|
- name: Install dependencies (again to run gyp rebuild)
|
||||||
|
run: npm install
|
||||||
|
- name: Run tests
|
||||||
|
run: npm test
|
||||||
|
- name: Run cargo tests
|
||||||
|
run: cargo test
|
||||||
|
- name: Parse examples
|
||||||
|
run: make fetch-examples parse-examples
|
||||||
@ -0,0 +1,38 @@
|
|||||||
|
name: Package
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test-regenerate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
- name: Regenerate parser sources
|
||||||
|
run: make generate
|
||||||
|
- name: Verify generated sources
|
||||||
|
run: git diff --exit-code
|
||||||
|
|
||||||
|
test-without-regenerate:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install
|
||||||
|
- name: Run tests
|
||||||
|
run: npm test
|
||||||
|
- name: Run cargo tests
|
||||||
|
run: cargo test
|
||||||
@ -0,0 +1,12 @@
|
|||||||
|
#*#
|
||||||
|
*.orig
|
||||||
|
*~
|
||||||
|
.#*
|
||||||
|
\#*#
|
||||||
|
|
||||||
|
/Cargo.lock
|
||||||
|
/build/
|
||||||
|
/examples/qtdeclarative
|
||||||
|
/node_modules/
|
||||||
|
/package-lock.json
|
||||||
|
/target/
|
||||||
@ -0,0 +1,26 @@
|
|||||||
|
[package]
|
||||||
|
name = "tree-sitter-qmljs"
|
||||||
|
description = "QML grammar for the tree-sitter parsing library"
|
||||||
|
version = "0.1.1"
|
||||||
|
keywords = ["incremental", "parsing", "qml"]
|
||||||
|
categories = ["parsing", "text-editors"]
|
||||||
|
repository = "https://github.com/yuja/tree-sitter-qmljs"
|
||||||
|
edition = "2021"
|
||||||
|
license = "MIT"
|
||||||
|
|
||||||
|
build = "bindings/rust/build.rs"
|
||||||
|
include = [
|
||||||
|
"bindings/rust/*",
|
||||||
|
"grammar.js",
|
||||||
|
"queries/*",
|
||||||
|
"src/*",
|
||||||
|
]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
path = "bindings/rust/lib.rs"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tree-sitter = "~0.20"
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
cc = "1.0"
|
||||||
@ -0,0 +1,20 @@
|
|||||||
|
Copyright (c) 2021 Yuya Nishihara
|
||||||
|
|
||||||
|
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.
|
||||||
@ -0,0 +1,64 @@
|
|||||||
|
JQ = jq
|
||||||
|
TREE_SITTER = node_modules/.bin/tree-sitter
|
||||||
|
|
||||||
|
.PHONY: help
|
||||||
|
help:
|
||||||
|
@echo 'Make targets:'
|
||||||
|
@echo ' generate - generate parser sources'
|
||||||
|
@echo ' clean - remove build directory and intermediate files'
|
||||||
|
@echo ' tests - run all tests'
|
||||||
|
@echo ' fetch-examples - fetch example repositories'
|
||||||
|
@echo ' parse-examples - parse example files'
|
||||||
|
|
||||||
|
.PHONY: generate
|
||||||
|
generate:
|
||||||
|
$(MAKE) queries/highlights-javascript.scm queries/highlights-typescript.scm
|
||||||
|
$(MAKE) src/typescript-scanner.h
|
||||||
|
$(TREE_SITTER) generate
|
||||||
|
|
||||||
|
# create symlinks out of sub packages so cargo can pick them up
|
||||||
|
queries/highlights-javascript.scm: node_modules/tree-sitter-javascript/queries/highlights.scm
|
||||||
|
ln -sf ../$< $@
|
||||||
|
queries/highlights-typescript.scm: node_modules/tree-sitter-typescript/queries/highlights.scm
|
||||||
|
ln -sf ../$< $@
|
||||||
|
|
||||||
|
src/typescript-scanner.h: \
|
||||||
|
node_modules/tree-sitter-typescript/common/scanner.h \
|
||||||
|
node_modules/tree-sitter-typescript/LICENSE \
|
||||||
|
package.json
|
||||||
|
( \
|
||||||
|
echo '/*'; \
|
||||||
|
echo 'Source:'; \
|
||||||
|
$(JQ) -r '.devDependencies["tree-sitter-typescript"]' package.json; \
|
||||||
|
echo; \
|
||||||
|
cat node_modules/tree-sitter-typescript/LICENSE; \
|
||||||
|
echo '*/'; \
|
||||||
|
echo; \
|
||||||
|
cat $<; \
|
||||||
|
) > $@
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
$(RM) -R build target
|
||||||
|
$(RM) \
|
||||||
|
queries/highlights-javascript.scm \
|
||||||
|
queries/highlights-typescript.scm \
|
||||||
|
src/grammar.json \
|
||||||
|
src/node-types.json \
|
||||||
|
src/parser.c \
|
||||||
|
src/tree_sitter/parser.h \
|
||||||
|
src/typescript-scanner.h
|
||||||
|
|
||||||
|
.PHONY: tests
|
||||||
|
tests:
|
||||||
|
$(TREE_SITTER) test $(TESTFLAGS)
|
||||||
|
|
||||||
|
.PHONY: fetch-examples
|
||||||
|
fetch-examples:
|
||||||
|
$(MAKE) -C examples all
|
||||||
|
|
||||||
|
.PHONY: parse-examples
|
||||||
|
parse-examples:
|
||||||
|
cat examples/known-failures.txt \
|
||||||
|
| sed 's|^|!examples/|' \
|
||||||
|
| xargs $(TREE_SITTER) parse -q 'examples/**/*.qml'
|
||||||
@ -0,0 +1,59 @@
|
|||||||
|
tree-sitter-qmljs
|
||||||
|
=================
|
||||||
|
|
||||||
|
[QML][] grammar for the [tree-sitter][] parsing library.
|
||||||
|
|
||||||
|
[QML]: https://doc.qt.io/qt-6/qmlapplications.html
|
||||||
|
[tree-sitter]: https://github.com/tree-sitter/tree-sitter
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
|
||||||
|
* https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/qml/parser/qqmljs.g
|
||||||
|
|
||||||
|
Pitfalls
|
||||||
|
--------
|
||||||
|
|
||||||
|
Since grouped binding notation is syntactically ambiguous, it is parsed as
|
||||||
|
an object definition.
|
||||||
|
|
||||||
|
```qml
|
||||||
|
// (ui_object_definition type_name: (identifier "Button") ...)
|
||||||
|
Button {
|
||||||
|
// (ui_object_definition type_name: (identifier "icon") ...)
|
||||||
|
icon { source: "foo.png"; color: "transparent" }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Building
|
||||||
|
--------
|
||||||
|
|
||||||
|
Use the `master` branch, which contains all generated files.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git checkout master
|
||||||
|
$ npm install
|
||||||
|
$ cargo build --release
|
||||||
|
```
|
||||||
|
|
||||||
|
Hacking
|
||||||
|
-------
|
||||||
|
|
||||||
|
Use the `dev` branch, but you'll first need to run `npm install` in the
|
||||||
|
`master` branch.
|
||||||
|
|
||||||
|
```
|
||||||
|
$ git checkout master
|
||||||
|
$ npm install
|
||||||
|
$ git checkout dev
|
||||||
|
```
|
||||||
|
|
||||||
|
Generate code and run tests:
|
||||||
|
```
|
||||||
|
$ make generate tests
|
||||||
|
```
|
||||||
|
|
||||||
|
Make sure example QML files can be parsed:
|
||||||
|
```
|
||||||
|
$ make fetch-examples parse-examples
|
||||||
|
```
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"targets": [
|
||||||
|
{
|
||||||
|
"target_name": "tree_sitter_qmljs_binding",
|
||||||
|
"include_dirs": [
|
||||||
|
"<!(node -e \"require('nan')\")",
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"sources": [
|
||||||
|
"bindings/node/binding.cc",
|
||||||
|
"src/parser.c",
|
||||||
|
"src/scanner.c",
|
||||||
|
],
|
||||||
|
"cflags_c": [
|
||||||
|
"-std=c99",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
#include "tree_sitter/parser.h"
|
||||||
|
#include <node.h>
|
||||||
|
#include "nan.h"
|
||||||
|
|
||||||
|
using namespace v8;
|
||||||
|
|
||||||
|
extern "C" TSLanguage * tree_sitter_qmljs();
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
NAN_METHOD(New) {}
|
||||||
|
|
||||||
|
void Init(Local<Object> exports, Local<Object> module) {
|
||||||
|
Local<FunctionTemplate> tpl = Nan::New<FunctionTemplate>(New);
|
||||||
|
tpl->SetClassName(Nan::New("Language").ToLocalChecked());
|
||||||
|
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
||||||
|
|
||||||
|
Local<Function> constructor = Nan::GetFunction(tpl).ToLocalChecked();
|
||||||
|
Local<Object> instance = constructor->NewInstance(Nan::GetCurrentContext()).ToLocalChecked();
|
||||||
|
Nan::SetInternalFieldPointer(instance, 0, tree_sitter_qmljs());
|
||||||
|
|
||||||
|
Nan::Set(instance, Nan::New("name").ToLocalChecked(), Nan::New("qmljs").ToLocalChecked());
|
||||||
|
Nan::Set(module, Nan::New("exports").ToLocalChecked(), instance);
|
||||||
|
}
|
||||||
|
|
||||||
|
NODE_MODULE(tree_sitter_qmljs_binding, Init)
|
||||||
|
|
||||||
|
} // namespace
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
try {
|
||||||
|
module.exports = require("../../build/Release/tree_sitter_qmljs_binding");
|
||||||
|
} catch (error1) {
|
||||||
|
if (error1.code !== 'MODULE_NOT_FOUND') {
|
||||||
|
throw error1;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
module.exports = require("../../build/Debug/tree_sitter_qmljs_binding");
|
||||||
|
} catch (error2) {
|
||||||
|
if (error2.code !== 'MODULE_NOT_FOUND') {
|
||||||
|
throw error2;
|
||||||
|
}
|
||||||
|
throw error1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
module.exports.nodeTypeInfo = require("../../src/node-types.json");
|
||||||
|
} catch (_) {}
|
||||||
@ -0,0 +1,24 @@
|
|||||||
|
fn main() {
|
||||||
|
let src_dir = std::path::Path::new("src");
|
||||||
|
|
||||||
|
let mut c_config = cc::Build::new();
|
||||||
|
c_config.include(&src_dir);
|
||||||
|
c_config
|
||||||
|
.flag_if_supported("-Wno-unused-parameter")
|
||||||
|
.flag_if_supported("-Wno-unused-but-set-variable")
|
||||||
|
.flag_if_supported("-Wno-trigraphs");
|
||||||
|
|
||||||
|
let parser_path = src_dir.join("parser.c");
|
||||||
|
c_config.file(&parser_path);
|
||||||
|
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
||||||
|
|
||||||
|
let scanner_path = src_dir.join("scanner.c");
|
||||||
|
c_config.file(&scanner_path);
|
||||||
|
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
||||||
|
println!(
|
||||||
|
"cargo:rerun-if-changed={}",
|
||||||
|
src_dir.join("typescript-scanner.h").to_str().unwrap()
|
||||||
|
);
|
||||||
|
|
||||||
|
c_config.compile("parser-scanner");
|
||||||
|
}
|
||||||
@ -0,0 +1,56 @@
|
|||||||
|
//! This crate provides QML language support for the [tree-sitter][] parsing library.
|
||||||
|
//!
|
||||||
|
//! Typically, you will use the [language][language func] function to add this language to a
|
||||||
|
//! tree-sitter [Parser][], and then use the parser to parse some code:
|
||||||
|
//!
|
||||||
|
//! ```
|
||||||
|
//! let code = "";
|
||||||
|
//! let mut parser = tree_sitter::Parser::new();
|
||||||
|
//! parser.set_language(tree_sitter_qmljs::language()).expect("Error loading QML grammar");
|
||||||
|
//! let tree = parser.parse(code, None).unwrap();
|
||||||
|
//! ```
|
||||||
|
//!
|
||||||
|
//! [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
|
||||||
|
//! [language func]: fn.language.html
|
||||||
|
//! [Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
|
||||||
|
//! [tree-sitter]: https://tree-sitter.github.io/
|
||||||
|
|
||||||
|
use tree_sitter::Language;
|
||||||
|
|
||||||
|
extern "C" {
|
||||||
|
fn tree_sitter_qmljs() -> Language;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Get the tree-sitter [Language][] for this grammar.
|
||||||
|
///
|
||||||
|
/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html
|
||||||
|
pub fn language() -> Language {
|
||||||
|
unsafe { tree_sitter_qmljs() }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The content of the [`node-types.json`][] file for this grammar.
|
||||||
|
///
|
||||||
|
/// [`node-types.json`]: https://tree-sitter.github.io/tree-sitter/using-parsers#static-node-types
|
||||||
|
pub const NODE_TYPES: &'static str = include_str!("../../src/node-types.json");
|
||||||
|
|
||||||
|
// Uncomment these to include any queries that this grammar contains
|
||||||
|
|
||||||
|
pub const HIGHLIGHTS_QUERY: &'static str = concat!(
|
||||||
|
include_str!("../../queries/highlights.scm"),
|
||||||
|
include_str!("../../queries/highlights-typescript.scm"),
|
||||||
|
include_str!("../../queries/highlights-javascript.scm"),
|
||||||
|
);
|
||||||
|
// pub const INJECTIONS_QUERY: &'static str = include_str!("../../queries/injections.scm");
|
||||||
|
pub const LOCALS_QUERY: &'static str = include_str!("../../queries/locals.scm");
|
||||||
|
// pub const TAGS_QUERY: &'static str = include_str!("../../queries/tags.scm");
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
#[test]
|
||||||
|
fn test_can_load_grammar() {
|
||||||
|
let mut parser = tree_sitter::Parser::new();
|
||||||
|
parser
|
||||||
|
.set_language(super::language())
|
||||||
|
.expect("Error loading QML language");
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,10 @@
|
|||||||
|
GIT = git
|
||||||
|
|
||||||
|
.PHONY: all
|
||||||
|
all: qtdeclarative
|
||||||
|
|
||||||
|
.PHONY: qtdeclarative
|
||||||
|
qtdeclarative:
|
||||||
|
[ -d $@ ] || $(GIT) clone git://code.qt.io/qt/qtdeclarative.git $@
|
||||||
|
$(GIT) -C $@ fetch
|
||||||
|
$(GIT) -C $@ reset --hard ba94a296c3ea97c755538ef99efe5d1dd034725c
|
||||||
@ -0,0 +1,28 @@
|
|||||||
|
qtdeclarative/src/quick/doc/snippets/qml/image-ext.qml
|
||||||
|
qtdeclarative/tests/auto/qml/debugger/qqmlpreview/data/broken.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qmlformat/data/settings/Example1.formatted_mac_cr.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qmllint/data/failure1.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmlecmascript/data/compatibilitySemicolon.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.1.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmlecmascript/data/numberParsing_error.2.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmlecmascript/data/stringParsing_error.5.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmlecmascript/data/stringParsing_error.6.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/empty.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/fuzzed.2.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/fuzzed.3.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/hangOnWarning.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/insertedSemicolon.1.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/invalidQmlEnumValue.1.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/invalidQmlEnumValue.2.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/invalidRoot.1.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/missingObject.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/nonexistantProperty.5.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/property.2.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/property.3.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/questionDotEOF.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.2.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.3.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qqmllanguage/data/signal.5.qml
|
||||||
|
qtdeclarative/tests/auto/qml/qquickfolderlistmodel/data/dummy.qml
|
||||||
|
qtdeclarative/tests/auto/quick/qquickloader/data/InvalidSourceComponent.qml
|
||||||
|
qtdeclarative/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml
|
||||||
@ -0,0 +1,312 @@
|
|||||||
|
// Implemented based on
|
||||||
|
// https://code.qt.io/cgit/qt/qtdeclarative.git/tree/src/qml/
|
||||||
|
// compiler/qqmlirbuilder.cpp
|
||||||
|
// parser/{qqmljs.g,qqmljsast_p.h,qqmljslexer.cpp}
|
||||||
|
// ba94a296c3ea97c755538ef99efe5d1dd034725c
|
||||||
|
|
||||||
|
module.exports = grammar(require('tree-sitter-typescript/typescript/grammar'), {
|
||||||
|
name: 'qmljs',
|
||||||
|
|
||||||
|
supertypes: ($, original) => original.concat([
|
||||||
|
$._ui_object_member,
|
||||||
|
$._ui_script_statement,
|
||||||
|
]),
|
||||||
|
|
||||||
|
inline: ($, original) => original.concat([
|
||||||
|
$._ui_root_member,
|
||||||
|
$._ui_object_member,
|
||||||
|
$._ui_property_type,
|
||||||
|
$._ui_binding_value,
|
||||||
|
$._ui_property_value,
|
||||||
|
$._ui_script_statement,
|
||||||
|
$._ui_qualified_id,
|
||||||
|
$._ui_identifier,
|
||||||
|
]),
|
||||||
|
|
||||||
|
conflicts: ($, original) => original.concat([
|
||||||
|
[$.ui_property_modifier, $.ui_required], // required property name vs required property
|
||||||
|
[$.ui_nested_identifier, $.primary_expression], // Nested.Obj {} vs member.expr
|
||||||
|
]),
|
||||||
|
|
||||||
|
rules: {
|
||||||
|
// should be 'ui_program' per naming convention, but we need to override the
|
||||||
|
// start rule of the javascript/typescript grammar.
|
||||||
|
program: $ => seq(
|
||||||
|
optional($.hash_bang_line),
|
||||||
|
repeat(choice(
|
||||||
|
$.ui_pragma,
|
||||||
|
$.ui_import,
|
||||||
|
)),
|
||||||
|
field('root', $._ui_root_member),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_pragma: $ => seq(
|
||||||
|
'pragma',
|
||||||
|
field('name', $.identifier), // PragmaId
|
||||||
|
optional(seq(
|
||||||
|
':',
|
||||||
|
field('value', $.identifier),
|
||||||
|
)),
|
||||||
|
$._semicolon,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_import: $ => seq(
|
||||||
|
'import',
|
||||||
|
field('source', choice(
|
||||||
|
$.string,
|
||||||
|
$.identifier,
|
||||||
|
$.nested_identifier,
|
||||||
|
)), // ImportId
|
||||||
|
optional(field('version', $.ui_version_specifier)),
|
||||||
|
optional(seq(
|
||||||
|
'as',
|
||||||
|
field('alias', $.identifier), // QmlIdentifier
|
||||||
|
)),
|
||||||
|
$._semicolon,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_version_specifier: $ => {
|
||||||
|
const version_number = alias(/\d+/, $.number);
|
||||||
|
return choice(
|
||||||
|
field('major', version_number),
|
||||||
|
seq(
|
||||||
|
field('major', version_number),
|
||||||
|
'.',
|
||||||
|
field('minor', version_number),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
_ui_root_member: $ => choice(
|
||||||
|
$.ui_object_definition,
|
||||||
|
$.ui_annotated_object,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_object_definition: $ => seq(
|
||||||
|
field('type_name', $._ui_qualified_id),
|
||||||
|
field('initializer', $.ui_object_initializer),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_annotated_object: $ => seq(
|
||||||
|
repeat1(field('annotation', $.ui_annotation)),
|
||||||
|
field('definition', $.ui_object_definition),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_annotation: $ => seq(
|
||||||
|
'@',
|
||||||
|
field('type_name', choice(
|
||||||
|
$.identifier,
|
||||||
|
$.nested_identifier,
|
||||||
|
)), // UiSimpleQualifiedId
|
||||||
|
field('initializer', $.ui_object_initializer),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_object_initializer: $ => seq(
|
||||||
|
'{',
|
||||||
|
repeat(choice(
|
||||||
|
$._ui_object_member,
|
||||||
|
$.ui_annotated_object_member,
|
||||||
|
)),
|
||||||
|
'}',
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_annotated_object_member: $ => seq(
|
||||||
|
repeat1(field('annotation', $.ui_annotation)),
|
||||||
|
field('definition', $._ui_object_member),
|
||||||
|
),
|
||||||
|
|
||||||
|
_ui_object_member: $ => choice(
|
||||||
|
$.ui_object_definition,
|
||||||
|
$.ui_object_definition_binding,
|
||||||
|
$.ui_binding,
|
||||||
|
$.ui_property,
|
||||||
|
$.ui_required,
|
||||||
|
$.ui_signal,
|
||||||
|
$.ui_inline_component,
|
||||||
|
$.generator_function_declaration,
|
||||||
|
$.function_declaration,
|
||||||
|
$.variable_declaration,
|
||||||
|
alias($._qml_enum_declaration, $.enum_declaration),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_object_definition_binding: $ => seq(
|
||||||
|
field('type_name', $._ui_qualified_id),
|
||||||
|
'on',
|
||||||
|
field('name', $._ui_qualified_id),
|
||||||
|
field('initializer', $.ui_object_initializer),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_binding: $ => seq(
|
||||||
|
field('name', $._ui_qualified_id),
|
||||||
|
':',
|
||||||
|
field('value', $._ui_binding_value),
|
||||||
|
),
|
||||||
|
|
||||||
|
// Duplicated modifiers are rejected by qqmljs.g, but we don't check for that.
|
||||||
|
ui_property: $ => seq(
|
||||||
|
repeat($.ui_property_modifier),
|
||||||
|
'property',
|
||||||
|
field('type', choice(
|
||||||
|
$._ui_property_type,
|
||||||
|
$.ui_list_property_type,
|
||||||
|
)),
|
||||||
|
field('name', $._ui_identifier), // QmlIdentifier
|
||||||
|
choice(
|
||||||
|
seq(
|
||||||
|
':',
|
||||||
|
field('value', $._ui_property_value),
|
||||||
|
),
|
||||||
|
$._semicolon,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
_ui_property_type: $ => choice(
|
||||||
|
$._type_identifier,
|
||||||
|
$.nested_type_identifier,
|
||||||
|
),
|
||||||
|
|
||||||
|
// "T_IDENTIFIER T_LT UiPropertyType T_GT", but only "list" is allowed as
|
||||||
|
// a property type modifier.
|
||||||
|
ui_list_property_type: $ => seq(
|
||||||
|
alias('list', $.type_identifier),
|
||||||
|
'<',
|
||||||
|
$._ui_property_type,
|
||||||
|
'>',
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_property_modifier: $ => choice(
|
||||||
|
'default',
|
||||||
|
'readonly',
|
||||||
|
'required',
|
||||||
|
),
|
||||||
|
|
||||||
|
_ui_binding_value: $ => choice(
|
||||||
|
$.ui_object_array,
|
||||||
|
$.ui_object_definition,
|
||||||
|
$._ui_script_statement,
|
||||||
|
),
|
||||||
|
|
||||||
|
// similar to $._ui_binding_value, but optional semicolon is also allowed
|
||||||
|
// for array/object.
|
||||||
|
_ui_property_value: $=> choice(
|
||||||
|
seq($.ui_object_array, $._semicolon), // UiObjectMemberWithArray
|
||||||
|
seq($.ui_object_definition, $._semicolon), // UiObjectMemberExpressionStatementLookahead
|
||||||
|
$._ui_script_statement,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_object_array: $ => seq(
|
||||||
|
'[',
|
||||||
|
sep1($.ui_object_definition, ','), // UiArrayMemberList
|
||||||
|
']',
|
||||||
|
),
|
||||||
|
|
||||||
|
_ui_script_statement: $ => choice(
|
||||||
|
$.statement_block,
|
||||||
|
$.empty_statement,
|
||||||
|
$.expression_statement,
|
||||||
|
$.if_statement,
|
||||||
|
$.with_statement,
|
||||||
|
$.switch_statement,
|
||||||
|
$.try_statement,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_required: $ => seq(
|
||||||
|
'required',
|
||||||
|
field('name', $._ui_identifier), // QmlIdentifier
|
||||||
|
$._semicolon,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_signal: $ => seq(
|
||||||
|
'signal',
|
||||||
|
field('name', $.identifier),
|
||||||
|
optional(field('parameters', $.ui_signal_parameters)),
|
||||||
|
$._semicolon,
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_signal_parameters: $ => seq(
|
||||||
|
'(',
|
||||||
|
sep($.ui_signal_parameter, ','),
|
||||||
|
')',
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_signal_parameter: $ => choice(
|
||||||
|
seq(
|
||||||
|
field('name', $.identifier), // QmlIdentifier
|
||||||
|
':',
|
||||||
|
field('type', $._ui_property_type),
|
||||||
|
),
|
||||||
|
seq(
|
||||||
|
field('type', $._ui_property_type),
|
||||||
|
field('name', $.identifier), // QmlIdentifier
|
||||||
|
),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_inline_component: $ => seq(
|
||||||
|
'component',
|
||||||
|
field('name', $.identifier),
|
||||||
|
':',
|
||||||
|
field('component', $.ui_object_definition),
|
||||||
|
),
|
||||||
|
|
||||||
|
// QML enum can be considered a restricted form of the TypeScript enum.
|
||||||
|
_qml_enum_declaration: $ => seq(
|
||||||
|
'enum',
|
||||||
|
field('name', $.identifier),
|
||||||
|
field('body', alias($._qml_enum_body, $.enum_body)),
|
||||||
|
),
|
||||||
|
|
||||||
|
_qml_enum_body: $ => seq(
|
||||||
|
'{',
|
||||||
|
sep1(choice(
|
||||||
|
field('name', $.identifier),
|
||||||
|
alias($._qml_enum_assignment, $.enum_assignment),
|
||||||
|
), ','),
|
||||||
|
'}',
|
||||||
|
),
|
||||||
|
|
||||||
|
_qml_enum_assignment: $ => seq(
|
||||||
|
field('name', $.identifier),
|
||||||
|
'=',
|
||||||
|
field('value', $.number),
|
||||||
|
),
|
||||||
|
|
||||||
|
// MemberExpression -> reparseAsQualifiedId()
|
||||||
|
_ui_qualified_id: $ => choice(
|
||||||
|
$._ui_identifier,
|
||||||
|
alias($.ui_nested_identifier, $.nested_identifier),
|
||||||
|
),
|
||||||
|
|
||||||
|
_ui_identifier: $ => choice(
|
||||||
|
$.identifier,
|
||||||
|
alias($._reserved_identifier, $.identifier),
|
||||||
|
),
|
||||||
|
|
||||||
|
ui_nested_identifier: $ => seq(
|
||||||
|
$._ui_qualified_id,
|
||||||
|
'.',
|
||||||
|
$.identifier,
|
||||||
|
),
|
||||||
|
|
||||||
|
// teach JavaScript/TypeScript grammar about QML keywords.
|
||||||
|
_reserved_identifier: ($, original) => choice(
|
||||||
|
original,
|
||||||
|
'property',
|
||||||
|
'signal',
|
||||||
|
'readonly',
|
||||||
|
'on',
|
||||||
|
'required',
|
||||||
|
'component',
|
||||||
|
// not QML keywords, but qmljs.g accepts them as JS expressions:
|
||||||
|
'from',
|
||||||
|
'of',
|
||||||
|
),
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function sep(rule, sep) {
|
||||||
|
return optional(sep1(rule, sep));
|
||||||
|
}
|
||||||
|
|
||||||
|
function sep1(rule, sep) {
|
||||||
|
return seq(rule, repeat(seq(sep, rule)));
|
||||||
|
}
|
||||||
@ -0,0 +1,54 @@
|
|||||||
|
{
|
||||||
|
"name": "tree-sitter-qmljs",
|
||||||
|
"version": "0.1.1",
|
||||||
|
"description": "QML grammar for the tree-sitter parsing library",
|
||||||
|
"main": "bindings/node",
|
||||||
|
"scripts": {
|
||||||
|
"test": "tree-sitter test"
|
||||||
|
},
|
||||||
|
"repository": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "git+https://github.com/yuja/tree-sitter-qmljs.git"
|
||||||
|
},
|
||||||
|
"keywords": [
|
||||||
|
"parser",
|
||||||
|
"tree-sitter",
|
||||||
|
"qml"
|
||||||
|
],
|
||||||
|
"author": "Yuya Nishihara",
|
||||||
|
"license": "MIT",
|
||||||
|
"bugs": {
|
||||||
|
"url": "https://github.com/yuja/tree-sitter-qmljs/issues"
|
||||||
|
},
|
||||||
|
"homepage": "https://github.com/yuja/tree-sitter-qmljs#readme",
|
||||||
|
"dependencies": {
|
||||||
|
"nan": "^2.15.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"tree-sitter-cli": "^0.20.1",
|
||||||
|
"tree-sitter-javascript": "github:tree-sitter/tree-sitter-javascript#fdeb68ac8d2bd5a78b943528bb68ceda3aade2eb",
|
||||||
|
"tree-sitter-typescript": "github:tree-sitter/tree-sitter-typescript#1b3ba31c7538825b05815f4f5bffcca6394edc63"
|
||||||
|
},
|
||||||
|
"tree-sitter": [
|
||||||
|
{
|
||||||
|
"scope": "source.qml",
|
||||||
|
"file-types": [
|
||||||
|
"qml"
|
||||||
|
],
|
||||||
|
"highlights": [
|
||||||
|
"queries/highlights.scm",
|
||||||
|
"node_modules/tree-sitter-typescript/queries/highlights.scm",
|
||||||
|
"node_modules/tree-sitter-javascript/queries/highlights.scm"
|
||||||
|
],
|
||||||
|
"locals": [
|
||||||
|
"queries/locals.scm",
|
||||||
|
"node_modules/tree-sitter-typescript/queries/locals.scm",
|
||||||
|
"node_modules/tree-sitter-javascript/queries/locals.scm"
|
||||||
|
],
|
||||||
|
"tags": [
|
||||||
|
"node_modules/tree-sitter-typescript/queries/tags.scm",
|
||||||
|
"node_modules/tree-sitter-javascript/queries/tags.scm"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../node_modules/tree-sitter-javascript/queries/highlights.scm
|
||||||
@ -0,0 +1 @@
|
|||||||
|
../node_modules/tree-sitter-typescript/queries/highlights.scm
|
||||||
@ -0,0 +1,60 @@
|
|||||||
|
;;; Annotations
|
||||||
|
|
||||||
|
(ui_annotation
|
||||||
|
"@" @operator
|
||||||
|
type_name: [
|
||||||
|
(identifier) @attribute
|
||||||
|
(nested_identifier (identifier) @attribute)
|
||||||
|
])
|
||||||
|
|
||||||
|
;;; Properties
|
||||||
|
|
||||||
|
(ui_object_definition_binding
|
||||||
|
name: [
|
||||||
|
(identifier) @property
|
||||||
|
(nested_identifier (identifier) @property)
|
||||||
|
])
|
||||||
|
|
||||||
|
(ui_binding
|
||||||
|
name: [
|
||||||
|
(identifier) @property
|
||||||
|
(nested_identifier (identifier) @property)
|
||||||
|
])
|
||||||
|
|
||||||
|
;; locals query appears not working unless id: <ref> isn't a parameter.
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier) @property
|
||||||
|
(#eq? @property "id")
|
||||||
|
value: (expression_statement (identifier) @variable.parameter))
|
||||||
|
|
||||||
|
(ui_property
|
||||||
|
name: (identifier) @property)
|
||||||
|
|
||||||
|
(ui_required
|
||||||
|
name: (identifier) @property)
|
||||||
|
|
||||||
|
(ui_list_property_type
|
||||||
|
["<" ">"] @punctuation.bracket)
|
||||||
|
|
||||||
|
;;; Signals
|
||||||
|
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier) @function.signal)
|
||||||
|
|
||||||
|
(ui_signal_parameter
|
||||||
|
(identifier) @variable.parameter)
|
||||||
|
|
||||||
|
;;; Keywords
|
||||||
|
|
||||||
|
[
|
||||||
|
"as"
|
||||||
|
"component"
|
||||||
|
"default"
|
||||||
|
"import"
|
||||||
|
"on"
|
||||||
|
"pragma"
|
||||||
|
"property"
|
||||||
|
"readonly"
|
||||||
|
"required"
|
||||||
|
"signal"
|
||||||
|
] @keyword
|
||||||
@ -0,0 +1,6 @@
|
|||||||
|
;;; Definitions
|
||||||
|
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier) @property
|
||||||
|
(#eq? @property "id")
|
||||||
|
value: (expression_statement (identifier) @local.definition))
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,11 @@
|
|||||||
|
#include <tree_sitter/parser.h>
|
||||||
|
#include "typescript-scanner.h"
|
||||||
|
|
||||||
|
void *tree_sitter_qmljs_external_scanner_create() { return NULL; }
|
||||||
|
void tree_sitter_qmljs_external_scanner_destroy(void *p) {}
|
||||||
|
unsigned tree_sitter_qmljs_external_scanner_serialize(void *p, char *buffer) { return 0; }
|
||||||
|
void tree_sitter_qmljs_external_scanner_deserialize(void *p, const char *b, unsigned n) {}
|
||||||
|
|
||||||
|
bool tree_sitter_qmljs_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
|
||||||
|
return external_scanner_scan(payload, lexer, valid_symbols);
|
||||||
|
}
|
||||||
@ -0,0 +1,224 @@
|
|||||||
|
#ifndef TREE_SITTER_PARSER_H_
|
||||||
|
#define TREE_SITTER_PARSER_H_
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define ts_builtin_sym_error ((TSSymbol)-1)
|
||||||
|
#define ts_builtin_sym_end 0
|
||||||
|
#define TREE_SITTER_SERIALIZATION_BUFFER_SIZE 1024
|
||||||
|
|
||||||
|
typedef uint16_t TSStateId;
|
||||||
|
|
||||||
|
#ifndef TREE_SITTER_API_H_
|
||||||
|
typedef uint16_t TSSymbol;
|
||||||
|
typedef uint16_t TSFieldId;
|
||||||
|
typedef struct TSLanguage TSLanguage;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
TSFieldId field_id;
|
||||||
|
uint8_t child_index;
|
||||||
|
bool inherited;
|
||||||
|
} TSFieldMapEntry;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t index;
|
||||||
|
uint16_t length;
|
||||||
|
} TSFieldMapSlice;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
bool visible;
|
||||||
|
bool named;
|
||||||
|
bool supertype;
|
||||||
|
} TSSymbolMetadata;
|
||||||
|
|
||||||
|
typedef struct TSLexer TSLexer;
|
||||||
|
|
||||||
|
struct TSLexer {
|
||||||
|
int32_t lookahead;
|
||||||
|
TSSymbol result_symbol;
|
||||||
|
void (*advance)(TSLexer *, bool);
|
||||||
|
void (*mark_end)(TSLexer *);
|
||||||
|
uint32_t (*get_column)(TSLexer *);
|
||||||
|
bool (*is_at_included_range_start)(const TSLexer *);
|
||||||
|
bool (*eof)(const TSLexer *);
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TSParseActionTypeShift,
|
||||||
|
TSParseActionTypeReduce,
|
||||||
|
TSParseActionTypeAccept,
|
||||||
|
TSParseActionTypeRecover,
|
||||||
|
} TSParseActionType;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
uint8_t type;
|
||||||
|
TSStateId state;
|
||||||
|
bool extra;
|
||||||
|
bool repetition;
|
||||||
|
} shift;
|
||||||
|
struct {
|
||||||
|
uint8_t type;
|
||||||
|
uint8_t child_count;
|
||||||
|
TSSymbol symbol;
|
||||||
|
int16_t dynamic_precedence;
|
||||||
|
uint16_t production_id;
|
||||||
|
} reduce;
|
||||||
|
uint8_t type;
|
||||||
|
} TSParseAction;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint16_t lex_state;
|
||||||
|
uint16_t external_lex_state;
|
||||||
|
} TSLexMode;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
TSParseAction action;
|
||||||
|
struct {
|
||||||
|
uint8_t count;
|
||||||
|
bool reusable;
|
||||||
|
} entry;
|
||||||
|
} TSParseActionEntry;
|
||||||
|
|
||||||
|
struct TSLanguage {
|
||||||
|
uint32_t version;
|
||||||
|
uint32_t symbol_count;
|
||||||
|
uint32_t alias_count;
|
||||||
|
uint32_t token_count;
|
||||||
|
uint32_t external_token_count;
|
||||||
|
uint32_t state_count;
|
||||||
|
uint32_t large_state_count;
|
||||||
|
uint32_t production_id_count;
|
||||||
|
uint32_t field_count;
|
||||||
|
uint16_t max_alias_sequence_length;
|
||||||
|
const uint16_t *parse_table;
|
||||||
|
const uint16_t *small_parse_table;
|
||||||
|
const uint32_t *small_parse_table_map;
|
||||||
|
const TSParseActionEntry *parse_actions;
|
||||||
|
const char * const *symbol_names;
|
||||||
|
const char * const *field_names;
|
||||||
|
const TSFieldMapSlice *field_map_slices;
|
||||||
|
const TSFieldMapEntry *field_map_entries;
|
||||||
|
const TSSymbolMetadata *symbol_metadata;
|
||||||
|
const TSSymbol *public_symbol_map;
|
||||||
|
const uint16_t *alias_map;
|
||||||
|
const TSSymbol *alias_sequences;
|
||||||
|
const TSLexMode *lex_modes;
|
||||||
|
bool (*lex_fn)(TSLexer *, TSStateId);
|
||||||
|
bool (*keyword_lex_fn)(TSLexer *, TSStateId);
|
||||||
|
TSSymbol keyword_capture_token;
|
||||||
|
struct {
|
||||||
|
const bool *states;
|
||||||
|
const TSSymbol *symbol_map;
|
||||||
|
void *(*create)(void);
|
||||||
|
void (*destroy)(void *);
|
||||||
|
bool (*scan)(void *, TSLexer *, const bool *symbol_whitelist);
|
||||||
|
unsigned (*serialize)(void *, char *);
|
||||||
|
void (*deserialize)(void *, const char *, unsigned);
|
||||||
|
} external_scanner;
|
||||||
|
const TSStateId *primary_state_ids;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Lexer Macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define START_LEXER() \
|
||||||
|
bool result = false; \
|
||||||
|
bool skip = false; \
|
||||||
|
bool eof = false; \
|
||||||
|
int32_t lookahead; \
|
||||||
|
goto start; \
|
||||||
|
next_state: \
|
||||||
|
lexer->advance(lexer, skip); \
|
||||||
|
start: \
|
||||||
|
skip = false; \
|
||||||
|
lookahead = lexer->lookahead;
|
||||||
|
|
||||||
|
#define ADVANCE(state_value) \
|
||||||
|
{ \
|
||||||
|
state = state_value; \
|
||||||
|
goto next_state; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define SKIP(state_value) \
|
||||||
|
{ \
|
||||||
|
skip = true; \
|
||||||
|
state = state_value; \
|
||||||
|
goto next_state; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ACCEPT_TOKEN(symbol_value) \
|
||||||
|
result = true; \
|
||||||
|
lexer->result_symbol = symbol_value; \
|
||||||
|
lexer->mark_end(lexer);
|
||||||
|
|
||||||
|
#define END_STATE() return result;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Parse Table Macros
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define SMALL_STATE(id) id - LARGE_STATE_COUNT
|
||||||
|
|
||||||
|
#define STATE(id) id
|
||||||
|
|
||||||
|
#define ACTIONS(id) id
|
||||||
|
|
||||||
|
#define SHIFT(state_value) \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.state = state_value \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define SHIFT_REPEAT(state_value) \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.state = state_value, \
|
||||||
|
.repetition = true \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define SHIFT_EXTRA() \
|
||||||
|
{{ \
|
||||||
|
.shift = { \
|
||||||
|
.type = TSParseActionTypeShift, \
|
||||||
|
.extra = true \
|
||||||
|
} \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define REDUCE(symbol_val, child_count_val, ...) \
|
||||||
|
{{ \
|
||||||
|
.reduce = { \
|
||||||
|
.type = TSParseActionTypeReduce, \
|
||||||
|
.symbol = symbol_val, \
|
||||||
|
.child_count = child_count_val, \
|
||||||
|
__VA_ARGS__ \
|
||||||
|
}, \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define RECOVER() \
|
||||||
|
{{ \
|
||||||
|
.type = TSParseActionTypeRecover \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#define ACCEPT_INPUT() \
|
||||||
|
{{ \
|
||||||
|
.type = TSParseActionTypeAccept \
|
||||||
|
}}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TREE_SITTER_PARSER_H_
|
||||||
@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
Source:
|
||||||
|
github:tree-sitter/tree-sitter-typescript#1b3ba31c7538825b05815f4f5bffcca6394edc63
|
||||||
|
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2017 GitHub
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <tree_sitter/parser.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
|
||||||
|
enum TokenType {
|
||||||
|
AUTOMATIC_SEMICOLON,
|
||||||
|
TEMPLATE_CHARS,
|
||||||
|
TERNARY_QMARK,
|
||||||
|
BINARY_OPERATORS,
|
||||||
|
FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON,
|
||||||
|
};
|
||||||
|
|
||||||
|
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') {
|
||||||
|
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, const bool *valid_symbols){
|
||||||
|
lexer->result_symbol = AUTOMATIC_SEMICOLON;
|
||||||
|
lexer->mark_end(lexer);
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
if (lexer->lookahead == 0) return true;
|
||||||
|
if (lexer->lookahead == '}') {
|
||||||
|
// Automatic semicolon insertion breaks detection of object patterns
|
||||||
|
// in a typed context:
|
||||||
|
// type F = ({a}: {a: number}) => number;
|
||||||
|
// Therefore, disable automatic semicolons when followed by typing
|
||||||
|
do {
|
||||||
|
skip(lexer);
|
||||||
|
} while (iswspace(lexer->lookahead));
|
||||||
|
if (lexer->lookahead == ':') return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if (!iswspace(lexer->lookahead)) return false;
|
||||||
|
if (lexer->lookahead == '\n') break;
|
||||||
|
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 ':':
|
||||||
|
return false;
|
||||||
|
|
||||||
|
case '{':
|
||||||
|
if (valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]) return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// Don't insert a semicolon before a '[' or '(', unless we're parsing
|
||||||
|
// a type. Detect whether we're parsing a type or an expression using
|
||||||
|
// the validity of a binary operator token.
|
||||||
|
case '(':
|
||||||
|
case '[':
|
||||||
|
if (valid_symbols[BINARY_OPERATORS]) return false;
|
||||||
|
break;
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
/* Optional chaining. */
|
||||||
|
if (lexer->lookahead == '.') return false;
|
||||||
|
|
||||||
|
/* TypeScript optional arguments contain the ?: sequence, possibly
|
||||||
|
with whitespace. */
|
||||||
|
for(;;) {
|
||||||
|
if (!iswspace(lexer->lookahead)) break;
|
||||||
|
skip(lexer);
|
||||||
|
}
|
||||||
|
if (lexer->lookahead == ':') return false;
|
||||||
|
if (lexer->lookahead == ')') return false;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool 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] ||
|
||||||
|
valid_symbols[FUNCTION_SIGNATURE_AUTOMATIC_SEMICOLON]
|
||||||
|
) {
|
||||||
|
bool ret = scan_automatic_semicolon(lexer, valid_symbols);
|
||||||
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
@ -0,0 +1,174 @@
|
|||||||
|
================================================================================
|
||||||
|
Compatibility semicolon
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
// qtdeclarative/tests/auto/qml/qqmlecmascript/data/compatibilitySemicolon.qml
|
||||||
|
QtObject {
|
||||||
|
function code() {
|
||||||
|
// Not correct according to ECMA 5.1, but JSC and V8 accept the following:
|
||||||
|
do {
|
||||||
|
;
|
||||||
|
} while (false) true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(function_declaration
|
||||||
|
(identifier)
|
||||||
|
(formal_parameters)
|
||||||
|
(statement_block
|
||||||
|
(comment)
|
||||||
|
(do_statement
|
||||||
|
(statement_block
|
||||||
|
(empty_statement))
|
||||||
|
(parenthesized_expression
|
||||||
|
(false))
|
||||||
|
(MISSING ";"))
|
||||||
|
(expression_statement
|
||||||
|
(true)))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Semicolon after array/object binding in property declaration
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
// qtdeclarative/tests/auto/qml/qqmlecmascript/data/semicolonAfterProperty.qml
|
||||||
|
QtObject {
|
||||||
|
property var field: {"key": "value"};
|
||||||
|
property list<QtObject> mylist: [
|
||||||
|
QtObject {id: a},
|
||||||
|
QtObject {id: b}
|
||||||
|
];
|
||||||
|
property var object: QtObject {};
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_property
|
||||||
|
(type_identifier)
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(object
|
||||||
|
(pair
|
||||||
|
(string
|
||||||
|
(string_fragment))
|
||||||
|
(string
|
||||||
|
(string_fragment))))))
|
||||||
|
(ui_property
|
||||||
|
(ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
(identifier)
|
||||||
|
(ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))))
|
||||||
|
(ui_property
|
||||||
|
(type_identifier)
|
||||||
|
(identifier)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Semicolon after array/object binding is not allowed
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
object: QtObject {};
|
||||||
|
array: [QtObject {}];
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer)))
|
||||||
|
(ERROR)
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))))
|
||||||
|
(ERROR))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Weird object pattern
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
// Found in
|
||||||
|
// qtdeclarative/tests/auto/quickcontrols2/controls/data/tst_scrollbar.qml
|
||||||
|
//
|
||||||
|
// This appears not accepted by Chrome/Firefox, but QML parser doesn't report
|
||||||
|
// any error.
|
||||||
|
Control {
|
||||||
|
id: control
|
||||||
|
function func() {
|
||||||
|
var p0 = { x = control.leftPadding, y = control.height/2 };
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(comment)
|
||||||
|
(comment)
|
||||||
|
(comment)
|
||||||
|
(comment)
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))
|
||||||
|
(function_declaration
|
||||||
|
(identifier)
|
||||||
|
(formal_parameters)
|
||||||
|
(statement_block
|
||||||
|
(variable_declaration
|
||||||
|
(variable_declarator
|
||||||
|
(identifier))
|
||||||
|
(ERROR
|
||||||
|
(object_pattern
|
||||||
|
(object_assignment_pattern
|
||||||
|
(shorthand_property_identifier_pattern)
|
||||||
|
(member_expression
|
||||||
|
(identifier)
|
||||||
|
(property_identifier)))
|
||||||
|
(object_assignment_pattern
|
||||||
|
(shorthand_property_identifier_pattern)
|
||||||
|
(binary_expression
|
||||||
|
(member_expression
|
||||||
|
(identifier)
|
||||||
|
(property_identifier))
|
||||||
|
(number)))))))))))
|
||||||
@ -0,0 +1,741 @@
|
|||||||
|
================================================================================
|
||||||
|
Pragma and imports
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
pragma Singleton
|
||||||
|
pragma ListPropertyAssignBehavior: Append
|
||||||
|
import QtQuick
|
||||||
|
import Qt.labs.platform as Platform
|
||||||
|
import QtQuick.Controls 2
|
||||||
|
import QtQuick3D 1.15
|
||||||
|
import "path"
|
||||||
|
import "script.js" as Script
|
||||||
|
|
||||||
|
Item {}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_pragma
|
||||||
|
name: (identifier))
|
||||||
|
(ui_pragma
|
||||||
|
name: (identifier)
|
||||||
|
value: (identifier))
|
||||||
|
(ui_import
|
||||||
|
source: (identifier))
|
||||||
|
(ui_import
|
||||||
|
source: (nested_identifier
|
||||||
|
(nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
(identifier))
|
||||||
|
alias: (identifier))
|
||||||
|
(ui_import
|
||||||
|
source: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
version: (ui_version_specifier
|
||||||
|
major: (number)))
|
||||||
|
(ui_import
|
||||||
|
source: (identifier)
|
||||||
|
version: (ui_version_specifier
|
||||||
|
major: (number)
|
||||||
|
minor: (number)))
|
||||||
|
(ui_import
|
||||||
|
source: (string
|
||||||
|
(string_fragment)))
|
||||||
|
(ui_import
|
||||||
|
source: (string
|
||||||
|
(string_fragment))
|
||||||
|
alias: (identifier))
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Shebang
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
#!/usr/bin/env qml
|
||||||
|
import QtQml
|
||||||
|
|
||||||
|
OtObject {}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(hash_bang_line)
|
||||||
|
(ui_import
|
||||||
|
(identifier))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer)))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Nested objects
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
import QtQuick
|
||||||
|
import QtQuick.Controls as C
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Rectangle {}
|
||||||
|
C.Button {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_import
|
||||||
|
source: (identifier))
|
||||||
|
(ui_import
|
||||||
|
source: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
alias: (identifier))
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Object on bindings
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
Behavior on value {}
|
||||||
|
Qualified.Object on qualified.prop {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_object_definition_binding
|
||||||
|
type_name: (identifier)
|
||||||
|
name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
(ui_object_definition_binding
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Object/Array bindings
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
array0: [] // is actually a script binding
|
||||||
|
array1: [expr]
|
||||||
|
arrayN: [member.expr, expr]
|
||||||
|
objArray1: [Element {}]
|
||||||
|
objArrayN: [Qualified.Element {}, Element {}]
|
||||||
|
object: Object {}
|
||||||
|
qualifiedObject: Qualified.Object {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(array)
|
||||||
|
(comment)))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(array
|
||||||
|
(identifier))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(array
|
||||||
|
(member_expression
|
||||||
|
object: (identifier)
|
||||||
|
property: (property_identifier))
|
||||||
|
(identifier))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer)))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_definition
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Script bindings
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
id: root
|
||||||
|
emptySt: ;
|
||||||
|
withSt: with (Math) PI
|
||||||
|
ifSt: if(x) true; else false;
|
||||||
|
switchSt: switch (y) {
|
||||||
|
default: return undefined;
|
||||||
|
}
|
||||||
|
objectLit: {foo: false, bar: true}
|
||||||
|
memberExpr: member.expr
|
||||||
|
paren.expr: (true)
|
||||||
|
onBlock: {}
|
||||||
|
onFunction: function(a) {}
|
||||||
|
onArrow: (b) => {}
|
||||||
|
onTrySt: try { foo(); } catch (error) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(identifier)))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (empty_statement))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (with_statement
|
||||||
|
object: (parenthesized_expression
|
||||||
|
(identifier))
|
||||||
|
body: (expression_statement
|
||||||
|
(identifier))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (if_statement
|
||||||
|
condition: (parenthesized_expression
|
||||||
|
(identifier))
|
||||||
|
consequence: (expression_statement
|
||||||
|
(true))
|
||||||
|
alternative: (else_clause
|
||||||
|
(expression_statement
|
||||||
|
(false)))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (switch_statement
|
||||||
|
value: (parenthesized_expression
|
||||||
|
(identifier))
|
||||||
|
body: (switch_body
|
||||||
|
(switch_default
|
||||||
|
body: (return_statement
|
||||||
|
(undefined))))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(object
|
||||||
|
(pair
|
||||||
|
key: (property_identifier)
|
||||||
|
value: (false))
|
||||||
|
(pair
|
||||||
|
key: (property_identifier)
|
||||||
|
value: (true)))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(member_expression
|
||||||
|
object: (identifier)
|
||||||
|
property: (property_identifier))))
|
||||||
|
(ui_binding
|
||||||
|
name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
value: (expression_statement
|
||||||
|
(parenthesized_expression
|
||||||
|
(true))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (statement_block))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(function
|
||||||
|
parameters: (formal_parameters
|
||||||
|
(required_parameter
|
||||||
|
pattern: (identifier)))
|
||||||
|
body: (statement_block))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(arrow_function
|
||||||
|
parameters: (formal_parameters
|
||||||
|
(required_parameter
|
||||||
|
pattern: (identifier)))
|
||||||
|
body: (statement_block))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (try_statement
|
||||||
|
body: (statement_block
|
||||||
|
(expression_statement
|
||||||
|
(call_expression
|
||||||
|
function: (identifier)
|
||||||
|
arguments: (arguments))))
|
||||||
|
handler: (catch_clause
|
||||||
|
parameter: (identifier)
|
||||||
|
body: (statement_block)))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Grouped binding notation
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
// This is grammatically ambiguous and parsed as an object definition.
|
||||||
|
// See IRBuilder::visit(QQmlJS::AST::UiObjectDefinition *node) for details.
|
||||||
|
Button {
|
||||||
|
icon { source: "foo.png"; color: "transparent" }
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(comment)
|
||||||
|
(comment)
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment)))))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Property declarations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
property var varProp
|
||||||
|
property var varPropWithScriptStatement: if (0) 1; else 2
|
||||||
|
readonly property var readonlyVarPropWithScriptStatement: (0 ? 1 : 2)
|
||||||
|
required property var requiredVarProp
|
||||||
|
required default property var requiredDefaultVarProp
|
||||||
|
default property var defaultVarProp
|
||||||
|
default property var defaultVarPropWithScriptStatement: 123
|
||||||
|
default required property var defaultRequiredVarProp
|
||||||
|
|
||||||
|
property QtObject objectPropWithDefinition: QtObject {}
|
||||||
|
readonly property QtObject readonlyObjectPropWithDefinition: QtObject {}
|
||||||
|
|
||||||
|
property list<Rectangle> listProp
|
||||||
|
property list<Rectangle> listPropWithArray: [Rectangle {}, Rectangle {}]
|
||||||
|
readonly property list<Rectangle> readonlyListProp
|
||||||
|
readonly property list<Rectangle> readonlyListPropWithArray: [Rectangle {}]
|
||||||
|
required property list<Rectangle> requiredProp
|
||||||
|
required default property list<Rectangle> requiredDefaultListProp
|
||||||
|
default property list<Rectangle> defaultListProp
|
||||||
|
default required property list<Rectangle> defaultRequiredListProp
|
||||||
|
|
||||||
|
property Qualified.Object qualifiedObjectProp: Qualified.Object {}
|
||||||
|
property list<Qualified.Object> qualifiedArrayProp: [Qualified.Object {}]
|
||||||
|
|
||||||
|
required width
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier)
|
||||||
|
value: (if_statement
|
||||||
|
condition: (parenthesized_expression
|
||||||
|
(number))
|
||||||
|
consequence: (expression_statement
|
||||||
|
(number))
|
||||||
|
alternative: (else_clause
|
||||||
|
(expression_statement
|
||||||
|
(number)))))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(parenthesized_expression
|
||||||
|
(ternary_expression
|
||||||
|
condition: (number)
|
||||||
|
consequence: (number)
|
||||||
|
alternative: (number)))))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(number)))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer)))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer)))
|
||||||
|
(ui_property
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
(ui_property_modifier)
|
||||||
|
(ui_property_modifier)
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (nested_type_identifier
|
||||||
|
module: (identifier)
|
||||||
|
name: (type_identifier))
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_definition
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer)))
|
||||||
|
(ui_property
|
||||||
|
type: (ui_list_property_type
|
||||||
|
(type_identifier)
|
||||||
|
(nested_type_identifier
|
||||||
|
module: (identifier)
|
||||||
|
name: (type_identifier)))
|
||||||
|
name: (identifier)
|
||||||
|
value: (ui_object_array
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
initializer: (ui_object_initializer))))
|
||||||
|
(ui_required
|
||||||
|
name: (identifier)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Signals
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
signal sigNoArg
|
||||||
|
signal sig0()
|
||||||
|
signal sig1(var name)
|
||||||
|
signal sig2(name0: var, int name1, string name2)
|
||||||
|
signal sig3(name0: qualified.type0, qualified.type1 name1, name2: Type2)
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (ui_signal_parameters))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (ui_signal_parameters
|
||||||
|
(ui_signal_parameter
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (ui_signal_parameters
|
||||||
|
(ui_signal_parameter
|
||||||
|
name: (identifier)
|
||||||
|
type: (type_identifier))
|
||||||
|
(ui_signal_parameter
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal_parameter
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (ui_signal_parameters
|
||||||
|
(ui_signal_parameter
|
||||||
|
name: (identifier)
|
||||||
|
type: (nested_type_identifier
|
||||||
|
module: (identifier)
|
||||||
|
name: (type_identifier)))
|
||||||
|
(ui_signal_parameter
|
||||||
|
type: (nested_type_identifier
|
||||||
|
module: (identifier)
|
||||||
|
name: (type_identifier))
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal_parameter
|
||||||
|
name: (identifier)
|
||||||
|
type: (type_identifier)))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Inline component
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
component RedRect : Rectangle { color: "red" }
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_inline_component
|
||||||
|
name: (identifier)
|
||||||
|
component: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
JavaScript/TypeScript declarations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
function fun() {
|
||||||
|
}
|
||||||
|
|
||||||
|
function typedFun(param: string) : Qualified.Object {
|
||||||
|
}
|
||||||
|
|
||||||
|
function* gen() {
|
||||||
|
yield 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This can't be mapped to IR, but the parser somehow accepts it.
|
||||||
|
var v
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters
|
||||||
|
(required_parameter
|
||||||
|
pattern: (identifier)
|
||||||
|
type: (type_annotation
|
||||||
|
(predefined_type))))
|
||||||
|
return_type: (type_annotation
|
||||||
|
(nested_type_identifier
|
||||||
|
module: (identifier)
|
||||||
|
name: (type_identifier)))
|
||||||
|
body: (statement_block))
|
||||||
|
(generator_function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block
|
||||||
|
(expression_statement
|
||||||
|
(yield_expression
|
||||||
|
(number)))))
|
||||||
|
(comment)
|
||||||
|
(variable_declaration
|
||||||
|
(variable_declarator
|
||||||
|
name: (identifier))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Enum
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
enum Foo {
|
||||||
|
Foo0
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Bar {
|
||||||
|
Bar0 = 0,
|
||||||
|
Bar1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(enum_declaration
|
||||||
|
name: (identifier)
|
||||||
|
body: (enum_body
|
||||||
|
name: (identifier)))
|
||||||
|
(enum_declaration
|
||||||
|
name: (identifier)
|
||||||
|
body: (enum_body
|
||||||
|
(enum_assignment
|
||||||
|
name: (identifier)
|
||||||
|
value: (number))
|
||||||
|
name: (identifier))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Annotations
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
import QtQml
|
||||||
|
|
||||||
|
@Foo {}
|
||||||
|
@Bar {}
|
||||||
|
QtObject {
|
||||||
|
@Foo {}
|
||||||
|
@Bar {}
|
||||||
|
OtObject {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_import
|
||||||
|
source: (identifier))
|
||||||
|
root: (ui_annotated_object
|
||||||
|
annotation: (ui_annotation
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
annotation: (ui_annotation
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
definition: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_annotated_object_member
|
||||||
|
annotation: (ui_annotation
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
annotation: (ui_annotation
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer))
|
||||||
|
definition: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer)))))))
|
||||||
@ -0,0 +1,690 @@
|
|||||||
|
================================================================================
|
||||||
|
Reserved words as identifiers
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
NumberAnimation {
|
||||||
|
required property
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberAnimation {
|
||||||
|
property: "foo"
|
||||||
|
}
|
||||||
|
|
||||||
|
Component {
|
||||||
|
id: component
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
property var any
|
||||||
|
property var async
|
||||||
|
property var component
|
||||||
|
property var declare
|
||||||
|
property var from
|
||||||
|
property var get
|
||||||
|
property var module
|
||||||
|
property var namespace
|
||||||
|
property var never
|
||||||
|
property var number
|
||||||
|
property var object
|
||||||
|
property var of
|
||||||
|
property var on
|
||||||
|
property var override
|
||||||
|
property var property
|
||||||
|
property var readonly
|
||||||
|
property var required
|
||||||
|
property var set
|
||||||
|
property var signal
|
||||||
|
property var string
|
||||||
|
property var symbol
|
||||||
|
property var type
|
||||||
|
property var unknown
|
||||||
|
property var yield
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
signal any
|
||||||
|
signal async
|
||||||
|
signal declare
|
||||||
|
signal module
|
||||||
|
signal namespace
|
||||||
|
signal never
|
||||||
|
signal number
|
||||||
|
signal object
|
||||||
|
signal override
|
||||||
|
signal string
|
||||||
|
signal symbol
|
||||||
|
signal type
|
||||||
|
signal unknown
|
||||||
|
signal yield
|
||||||
|
}
|
||||||
|
|
||||||
|
QtObject {
|
||||||
|
function any() {}
|
||||||
|
function async() {}
|
||||||
|
function component() {}
|
||||||
|
function declare() {}
|
||||||
|
function from() {}
|
||||||
|
function get() {}
|
||||||
|
function module() {}
|
||||||
|
function namespace() {}
|
||||||
|
function never() {}
|
||||||
|
function number() {}
|
||||||
|
function object() {}
|
||||||
|
function of() {}
|
||||||
|
function on() {}
|
||||||
|
function override() {}
|
||||||
|
function property() {}
|
||||||
|
function readonly() {}
|
||||||
|
function required() {}
|
||||||
|
function set() {}
|
||||||
|
function signal() {}
|
||||||
|
function static() {}
|
||||||
|
function string() {}
|
||||||
|
function symbol() {}
|
||||||
|
function type() {}
|
||||||
|
function unknown() {}
|
||||||
|
function yield() {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
root: (ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_required
|
||||||
|
name: (identifier))))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
name: (identifier)
|
||||||
|
value: (expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))
|
||||||
|
(ui_property
|
||||||
|
type: (type_identifier)
|
||||||
|
name: (identifier))))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))
|
||||||
|
(ui_signal
|
||||||
|
name: (identifier))))
|
||||||
|
(ui_object_definition
|
||||||
|
type_name: (identifier)
|
||||||
|
initializer: (ui_object_initializer
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block))
|
||||||
|
(function_declaration
|
||||||
|
name: (identifier)
|
||||||
|
parameters: (formal_parameters)
|
||||||
|
body: (statement_block)))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Reserved words as expressions
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
MyItem {
|
||||||
|
QtObject { id: any }
|
||||||
|
// qml accepts this but doesn't look valid: QtObject { id: as }
|
||||||
|
QtObject { id: async }
|
||||||
|
QtObject { id: component }
|
||||||
|
QtObject { id: declare }
|
||||||
|
QtObject { id: false }
|
||||||
|
QtObject { id: from }
|
||||||
|
QtObject { id: get }
|
||||||
|
QtObject { id: module }
|
||||||
|
QtObject { id: namespace }
|
||||||
|
QtObject { id: never }
|
||||||
|
QtObject { id: null }
|
||||||
|
QtObject { id: number }
|
||||||
|
QtObject { id: object }
|
||||||
|
QtObject { id: of }
|
||||||
|
QtObject { id: on }
|
||||||
|
QtObject { id: override }
|
||||||
|
QtObject { id: property }
|
||||||
|
QtObject { id: readonly }
|
||||||
|
QtObject { id: required }
|
||||||
|
QtObject { id: set }
|
||||||
|
QtObject { id: signal }
|
||||||
|
QtObject { id: static }
|
||||||
|
QtObject { id: string }
|
||||||
|
QtObject { id: symbol }
|
||||||
|
QtObject { id: this }
|
||||||
|
QtObject { id: true }
|
||||||
|
QtObject { id: type }
|
||||||
|
QtObject { objectName: undefined }
|
||||||
|
QtObject { id: unknown }
|
||||||
|
QtObject { id: yield }
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(false)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(null)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(this)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(true)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(undefined)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(identifier)))))
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(yield_expression))))))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Non-ascii type names
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
// qtdeclarative/tests/auto/qml/qqmllanguage/data/i18nNameSpace.qml
|
||||||
|
OtObject {
|
||||||
|
Áâãäå {}
|
||||||
|
Áâãäå.Áâãäå {}
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(ui_object_definition
|
||||||
|
(nested_identifier
|
||||||
|
(identifier)
|
||||||
|
(identifier))
|
||||||
|
(ui_object_initializer)))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Escaped type names
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
OtObject {
|
||||||
|
\u0041lice {} // "A"lice
|
||||||
|
B\u006f {} // B"o"b
|
||||||
|
\u{00043}arol {} // "C"arol
|
||||||
|
\u004audy {} // "J"udy
|
||||||
|
\u005A {} // "Z"
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(comment)
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer))
|
||||||
|
(comment))))
|
||||||
|
|
||||||
|
================================================================================
|
||||||
|
Escaped property names
|
||||||
|
================================================================================
|
||||||
|
|
||||||
|
OtObject {
|
||||||
|
\u0061lice: "alice"
|
||||||
|
b\u006Fb: "bob"
|
||||||
|
\u{00063}arol: "carol"
|
||||||
|
\u006Audy: "judy"
|
||||||
|
\u007a: "z"
|
||||||
|
}
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
(program
|
||||||
|
(ui_object_definition
|
||||||
|
(identifier)
|
||||||
|
(ui_object_initializer
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment))))
|
||||||
|
(ui_binding
|
||||||
|
(identifier)
|
||||||
|
(expression_statement
|
||||||
|
(string
|
||||||
|
(string_fragment)))))))
|
||||||
@ -0,0 +1,21 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
component MyItem : Item {}
|
||||||
|
// <- keyword
|
||||||
|
// ^ type ^ type
|
||||||
|
|
||||||
|
Component {
|
||||||
|
// <- type
|
||||||
|
id: component
|
||||||
|
// ^ variable.parameter
|
||||||
|
Item {}
|
||||||
|
}
|
||||||
|
|
||||||
|
function foo() {
|
||||||
|
let component = null;
|
||||||
|
// ^ variable
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
signal foo(int name0, name1: MyType)
|
||||||
|
// <- keyword
|
||||||
|
// ^ function.signal
|
||||||
|
// ^ type
|
||||||
|
// ^ variable.parameter
|
||||||
|
// ^ variable.parameter
|
||||||
|
// ^ type
|
||||||
|
|
||||||
|
function bar(name: string) : MyType {
|
||||||
|
// <- keyword
|
||||||
|
// ^ function
|
||||||
|
// ^ variable.parameter
|
||||||
|
// ^ type.builtin
|
||||||
|
// ^ type
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,65 @@
|
|||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
id: root
|
||||||
|
// <- property
|
||||||
|
// ^ variable.parameter
|
||||||
|
|
||||||
|
property MyItem myItem: MyItem {}
|
||||||
|
// <- keyword
|
||||||
|
// ^ type
|
||||||
|
// ^ property
|
||||||
|
// ^ type
|
||||||
|
|
||||||
|
readonly property int someNumber: 123
|
||||||
|
// <- keyword
|
||||||
|
// ^ keyword
|
||||||
|
// ^ type
|
||||||
|
// ^ property ^ number
|
||||||
|
|
||||||
|
required property var requiredData
|
||||||
|
// <- keyword
|
||||||
|
// ^ keyword
|
||||||
|
// ^ type
|
||||||
|
// ^ property
|
||||||
|
|
||||||
|
property list<MyItem> myItems: [MyItem {}]
|
||||||
|
// <- keyword
|
||||||
|
// ^ type ^ type
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
// ^ property
|
||||||
|
// ^ type
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
|
||||||
|
default property list<QtObject> defaultProp
|
||||||
|
// <- keyword
|
||||||
|
// ^ keyword
|
||||||
|
// ^ type
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
// ^ punctuation.bracket
|
||||||
|
// ^ type ^ property
|
||||||
|
|
||||||
|
component MyItem : Item {
|
||||||
|
Behavior on x {
|
||||||
|
// <- type
|
||||||
|
// ^ keyword
|
||||||
|
// ^ property
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
component MyAnimation: NumberAnimation {
|
||||||
|
required property
|
||||||
|
// <- keyword
|
||||||
|
// ^ property
|
||||||
|
}
|
||||||
|
|
||||||
|
x: 123
|
||||||
|
// ^ number
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
anchors.fill: root
|
||||||
|
// ^ variable.parameter
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue