mirror of https://github.com/Wilfred/difftastic/
Merge commit '02b4ee757654b7d54fe35352fd8e53a8a4385d42'
commit
688aaa83f8
@ -0,0 +1,20 @@
|
|||||||
|
module.exports = {
|
||||||
|
'env': {
|
||||||
|
'commonjs': true,
|
||||||
|
'es2021': true,
|
||||||
|
},
|
||||||
|
'extends': 'google',
|
||||||
|
'overrides': [
|
||||||
|
],
|
||||||
|
'parserOptions': {
|
||||||
|
'ecmaVersion': 'latest',
|
||||||
|
'sourceType': 'module',
|
||||||
|
},
|
||||||
|
'rules': {
|
||||||
|
'indent': ['error', 2, {'SwitchCase': 1}],
|
||||||
|
'max-len': [
|
||||||
|
'error',
|
||||||
|
{'code': 120, 'ignoreComments': true, 'ignoreUrls': true, 'ignoreStrings': true},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
@ -1,2 +1,10 @@
|
|||||||
/src/** linguist-vendored
|
/src/** linguist-vendored
|
||||||
/examples/* linguist-vendored
|
/examples/* linguist-vendored
|
||||||
|
|
||||||
|
src/grammar.json linguist-generated
|
||||||
|
src/node-types.json linguist-generated
|
||||||
|
src/parser.c linguist-generated
|
||||||
|
|
||||||
|
src/grammar.json -diff
|
||||||
|
src/node-types.json -diff
|
||||||
|
src/parser.c -diff
|
||||||
|
|||||||
@ -0,0 +1,60 @@
|
|||||||
|
name: Bug Report
|
||||||
|
description: File a bug or issue
|
||||||
|
title: "bug: "
|
||||||
|
labels: [bug]
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
**Before** reporting an issue, make sure to search [existing issues](https://github.com/tree-sitter/tree-sitter-css/issues). Usage questions such as ***"How do I...?"*** either belong in [Discussions](https://github.com/tree-sitter/tree-sitter/discussions) upstream or in our [Discord server](https://discord.gg/w7nTvsVJhm) and will be closed.
|
||||||
|
If your issue is related to a bug in your editor-experience because your editor *leverages* tree-sitter and this parser, then it is likely your issue does *NOT* belong here and belongs in the relevant editor's repository.
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Did you check existing issues?
|
||||||
|
description: Make sure you've checked all of the below before submitting an issue
|
||||||
|
options:
|
||||||
|
- label: I have read all the [tree-sitter docs](https://tree-sitter.github.io/tree-sitter/using-parsers) if it relates to using the parser
|
||||||
|
required: false
|
||||||
|
- label: I have searched the existing issues of tree-sitter-css
|
||||||
|
required: true
|
||||||
|
- type: input
|
||||||
|
attributes:
|
||||||
|
label: "Tree-Sitter CLI Version, if relevant (output of `tree-sitter --version`)"
|
||||||
|
placeholder: "tree-sitter 0.20.8 (6bbb50bef8249e6460e7d69e42cc8146622fa4fd)"
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is. Please include any related errors you see such as parsing errors or tree-sitter cli errors.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Steps To Reproduce/Bad Parse Tree
|
||||||
|
description: Steps to reproduce the behavior. If you have a bad parse tree, please include it here. You can get this by running `tree-sitter parse <path-to-file>` and copying the output.
|
||||||
|
placeholder: |
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Expected Behavior/Parse Tree
|
||||||
|
description: A concise description of what you expected to happen, or in the case of a bad parse tree, the expected parse tree.
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
attributes:
|
||||||
|
label: Repro
|
||||||
|
description: Minimal code to reproduce this issue. Ideally this should be reproducible with the C library or the tree-sitter cli, do not suggest an editor or external tool.
|
||||||
|
value: |
|
||||||
|
/* Example code that fails to parse */
|
||||||
|
.foo {
|
||||||
|
color: red;
|
||||||
|
/* Code that fails to parse, or causes an error */
|
||||||
|
}
|
||||||
|
render: CSS
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
@ -0,0 +1 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
@ -0,0 +1,36 @@
|
|||||||
|
name: Feature Request
|
||||||
|
description: Suggest a new feature
|
||||||
|
title: "feature: "
|
||||||
|
labels: [enhancement]
|
||||||
|
body:
|
||||||
|
- type: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Did you check the tree-sitter docs?
|
||||||
|
description: Make sure you read all the docs before submitting a feature request
|
||||||
|
options:
|
||||||
|
- label: I have read all the [tree-sitter docs](https://tree-sitter.github.io/tree-sitter/using-parsers) if it relates to using the parser
|
||||||
|
required: false
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Is your feature request related to a problem? Please describe.
|
||||||
|
description: A clear and concise description of what the problem is. Ex. I think the grammar models this rule incorrectly and can be improved, or the scanner can be improved by doing [...], or CSS has officially added a new feature that should be added to the grammar.
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Describe the solution you'd like
|
||||||
|
description: A clear and concise description of what you want to happen.
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
attributes:
|
||||||
|
label: Describe alternatives you've considered
|
||||||
|
description: A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
- type: textarea
|
||||||
|
validations:
|
||||||
|
required: false
|
||||||
|
attributes:
|
||||||
|
label: Additional context
|
||||||
|
description: Add any other context or screenshots about the feature request here. If your feature request is related to a new CSS feature, please include a link to the relevant **official** CSS documentation.
|
||||||
@ -0,0 +1,32 @@
|
|||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "**"
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- "master"
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
fail-fast: true
|
||||||
|
matrix:
|
||||||
|
os: [macos-latest, ubuntu-latest]
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- run: npm install
|
||||||
|
- run: npm test
|
||||||
|
test_windows:
|
||||||
|
runs-on: windows-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run-script test-windows
|
||||||
@ -0,0 +1,22 @@
|
|||||||
|
name: Fuzz Parser
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- src/scanner.c
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- src/scanner.c
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
test:
|
||||||
|
name: Parser fuzzing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- uses: vigoux/tree-sitter-fuzz-action@v1
|
||||||
|
with:
|
||||||
|
language: css
|
||||||
|
external-scanner: src/scanner.c
|
||||||
|
time: 60
|
||||||
@ -0,0 +1,19 @@
|
|||||||
|
name: Lint
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- "**"
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Install modules
|
||||||
|
run: npm install
|
||||||
|
- name: Run ESLint
|
||||||
|
run: npm run lint
|
||||||
@ -0,0 +1,103 @@
|
|||||||
|
name: Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_run:
|
||||||
|
workflows: ["CI"]
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
types:
|
||||||
|
- completed
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Get previous commit SHA
|
||||||
|
id: get_previous_commit
|
||||||
|
run: |
|
||||||
|
LATEST_TAG=$(git describe --tags --abbrev=0)
|
||||||
|
if [[ -z "$LATEST_TAG" ]]; then
|
||||||
|
echo "No tag found. Failing..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "latest_tag=${LATEST_TAG#v}" >> "$GITHUB_ENV" # Remove 'v' prefix from the tag
|
||||||
|
|
||||||
|
- name: Check if version changed and is greater than the previous
|
||||||
|
id: version_check
|
||||||
|
run: |
|
||||||
|
# Compare the current version with the version from the previous commit
|
||||||
|
PREVIOUS_NPM_VERSION=${{ env.latest_tag }}
|
||||||
|
CURRENT_NPM_VERSION=$(jq -r '.version' package.json)
|
||||||
|
CURRENT_CARGO_VERSION=$(awk -F '"' '/^version/ {print $2}' Cargo.toml)
|
||||||
|
if [[ "$CURRENT_NPM_VERSION" != "$CURRENT_CARGO_VERSION" ]]; then # Cargo.toml and package.json versions must match
|
||||||
|
echo "Mismatch: NPM version ($CURRENT_NPM_VERSION) and Cargo.toml version ($CURRENT_CARGO_VERSION)"
|
||||||
|
echo "version_changed=false" >> "$GITHUB_ENV"
|
||||||
|
else
|
||||||
|
if [[ "$PREVIOUS_NPM_VERSION" == "$CURRENT_NPM_VERSION" ]]; then
|
||||||
|
echo "version_changed=" >> "$GITHUB_ENV"
|
||||||
|
else
|
||||||
|
IFS='.' read -ra PREVIOUS_VERSION_PARTS <<< "$PREVIOUS_NPM_VERSION"
|
||||||
|
IFS='.' read -ra CURRENT_VERSION_PARTS <<< "$CURRENT_NPM_VERSION"
|
||||||
|
VERSION_CHANGED=false
|
||||||
|
for i in "${!PREVIOUS_VERSION_PARTS[@]}"; do
|
||||||
|
if [[ ${CURRENT_VERSION_PARTS[i]} -gt ${PREVIOUS_VERSION_PARTS[i]} ]]; then
|
||||||
|
VERSION_CHANGED=true
|
||||||
|
break
|
||||||
|
elif [[ ${CURRENT_VERSION_PARTS[i]} -lt ${PREVIOUS_VERSION_PARTS[i]} ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "version_changed=$VERSION_CHANGED" >> "$GITHUB_ENV"
|
||||||
|
echo "current_version=${CURRENT_NPM_VERSION}" >> "$GITHUB_ENV"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Display result
|
||||||
|
run: |
|
||||||
|
echo "Version bump detected: ${{ env.version_changed }}"
|
||||||
|
|
||||||
|
- name: Fail if version is lower
|
||||||
|
if: env.version_changed == 'false'
|
||||||
|
run: exit 1
|
||||||
|
|
||||||
|
- name: Setup Node
|
||||||
|
if: env.version_changed == 'true'
|
||||||
|
uses: actions/setup-node@v4
|
||||||
|
with:
|
||||||
|
node-version: 18
|
||||||
|
registry-url: "https://registry.npmjs.org"
|
||||||
|
- name: Publish to NPM
|
||||||
|
if: env.version_changed == 'true'
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
||||||
|
run: npm publish
|
||||||
|
|
||||||
|
- name: Setup Rust
|
||||||
|
if: env.version_changed == 'true'
|
||||||
|
uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
profile: minimal
|
||||||
|
toolchain: stable
|
||||||
|
override: true
|
||||||
|
- name: Publish to Crates.io
|
||||||
|
if: env.version_changed == 'true'
|
||||||
|
uses: katyo/publish-crates@v2
|
||||||
|
with:
|
||||||
|
registry-token: ${{ secrets.CARGO_REGISTRY_TOKEN }}
|
||||||
|
|
||||||
|
- name: Tag versions
|
||||||
|
if: env.version_changed == 'true'
|
||||||
|
run: |
|
||||||
|
git checkout master
|
||||||
|
git config user.name github-actions[bot]
|
||||||
|
git config user.email github-actions[bot]@users.noreply.github.com
|
||||||
|
git tag -d "v${{ env.current_version }}" || true
|
||||||
|
git push origin --delete "v${{ env.current_version }}" || true
|
||||||
|
git tag -a "v${{ env.current_version }}" -m "Version ${{ env.current_version }}"
|
||||||
|
git push origin "v${{ env.current_version }}"
|
||||||
@ -1,6 +1,6 @@
|
|||||||
|
Cargo.lock
|
||||||
node_modules
|
node_modules
|
||||||
build
|
build
|
||||||
target
|
|
||||||
*.log
|
|
||||||
package-lock.json
|
package-lock.json
|
||||||
Cargo.lock
|
/target/
|
||||||
|
.build/
|
||||||
@ -1,3 +1,5 @@
|
|||||||
build
|
/test
|
||||||
target
|
/examples
|
||||||
Cargo.lock
|
/build
|
||||||
|
/script
|
||||||
|
/target
|
||||||
|
|||||||
@ -1,27 +1,27 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "tree-sitter-css"
|
name = "tree-sitter-css"
|
||||||
description = "css grammar for the tree-sitter parsing library"
|
description = "CSS grammar for tree-sitter"
|
||||||
version = "0.19.0"
|
version = "0.20.0"
|
||||||
|
authors = [
|
||||||
|
"Max Brunsfeld <maxbrunsfeld@gmail.com>",
|
||||||
|
"Amaan Qureshi <amaanq12@gmail.com>",
|
||||||
|
]
|
||||||
|
license = "MIT"
|
||||||
|
readme = "bindings/rust/README.md"
|
||||||
keywords = ["incremental", "parsing", "css"]
|
keywords = ["incremental", "parsing", "css"]
|
||||||
categories = ["parsing", "text-editors"]
|
categories = ["parsing", "text-editors"]
|
||||||
repository = "https://github.com/tree-sitter/tree-sitter-javascript"
|
repository = "https://github.com/tree-sitter/tree-sitter-css"
|
||||||
edition = "2018"
|
edition = "2021"
|
||||||
license = "MIT"
|
autoexamples = false
|
||||||
authors = ["Max Brunsfeld <maxbrunsfeld@gmail.com>"]
|
|
||||||
|
|
||||||
build = "bindings/rust/build.rs"
|
build = "bindings/rust/build.rs"
|
||||||
include = [
|
include = ["bindings/rust/*", "grammar.js", "queries/*", "src/*"]
|
||||||
"bindings/rust/*",
|
|
||||||
"grammar.js",
|
|
||||||
"queries/*",
|
|
||||||
"src/*",
|
|
||||||
]
|
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
path = "bindings/rust/lib.rs"
|
path = "bindings/rust/lib.rs"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tree-sitter = ">= 0.19"
|
tree-sitter = "~0.20.10"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
cc = "1.0"
|
cc = "~1.0"
|
||||||
|
|||||||
@ -0,0 +1,33 @@
|
|||||||
|
// swift-tools-version:5.3
|
||||||
|
import PackageDescription
|
||||||
|
|
||||||
|
let package = Package(
|
||||||
|
name: "TreeSitterCSS",
|
||||||
|
products: [
|
||||||
|
.library(name: "TreeSitterCSS", targets: ["TreeSitterCSS"]),
|
||||||
|
],
|
||||||
|
dependencies: [],
|
||||||
|
targets: [
|
||||||
|
.target(name: "TreeSitterCSS",
|
||||||
|
path: ".",
|
||||||
|
exclude: [
|
||||||
|
"binding.gyp",
|
||||||
|
"bindings",
|
||||||
|
"Cargo.toml",
|
||||||
|
"corpus",
|
||||||
|
"grammar.js",
|
||||||
|
"LICENSE",
|
||||||
|
"package.json",
|
||||||
|
"README.md",
|
||||||
|
],
|
||||||
|
sources: [
|
||||||
|
"src/parser.c",
|
||||||
|
"src/scanner.c",
|
||||||
|
],
|
||||||
|
resources: [
|
||||||
|
.copy("queries")
|
||||||
|
],
|
||||||
|
publicHeadersPath: "bindings/swift",
|
||||||
|
cSettings: [.headerSearchPath("src")])
|
||||||
|
]
|
||||||
|
)
|
||||||
@ -1,11 +1,19 @@
|
|||||||
tree-sitter-css
|
# tree-sitter-css
|
||||||
===============
|
|
||||||
|
|
||||||
[](https://travis-ci.org/tree-sitter/tree-sitter-css)
|
[![CI][ci]](https://github.com/tree-sitter/tree-sitter-css/actions/workflows/ci.yml)
|
||||||
[](https://ci.appveyor.com/project/maxbrunsfeld/tree-sitter-css/branch/master)
|
[![discord][discord]](https://discord.gg/w7nTvsVJhm)
|
||||||
|
[![matrix][matrix]](https://matrix.to/#/#tree-sitter-chat:matrix.org)
|
||||||
|
[![crates][crates]](https://crates.io/crates/tree-sitter-css)
|
||||||
|
[![npm][npm]](https://www.npmjs.com/package/tree-sitter-css)
|
||||||
|
|
||||||
CSS grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter).
|
CSS grammar for [tree-sitter](https://github.com/tree-sitter/tree-sitter).
|
||||||
|
|
||||||
References
|
References
|
||||||
|
|
||||||
* [CSS Syntax Guide](https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax)
|
- [CSS Syntax Guide](https://developer.mozilla.org/en-US/docs/Web/CSS/Syntax)
|
||||||
|
|
||||||
|
[ci]: https://img.shields.io/github/actions/workflow/status/tree-sitter/tree-sitter-css/ci.yml?logo=github&label=CI
|
||||||
|
[discord]: https://img.shields.io/discord/1063097320771698699?logo=discord&label=discord
|
||||||
|
[matrix]: https://img.shields.io/matrix/tree-sitter-chat%3Amatrix.org?logo=matrix&label=matrix
|
||||||
|
[npm]: https://img.shields.io/npm/v/tree-sitter-css?logo=npm
|
||||||
|
[crates]: https://img.shields.io/crates/v/tree-sitter-css?logo=rust
|
||||||
|
|||||||
@ -0,0 +1,36 @@
|
|||||||
|
# tree-sitter-css
|
||||||
|
|
||||||
|
This crate provides a CSS grammar for the [tree-sitter][] parsing library.
|
||||||
|
To use this crate, add it to the `[dependencies]` section of your `Cargo.toml`
|
||||||
|
file. (Note that you will probably also need to depend on the
|
||||||
|
[`tree-sitter`][tree-sitter crate] crate to use the parsed result in any useful
|
||||||
|
way.)
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
tree-sitter = "~0.20.10"
|
||||||
|
tree-sitter-css = "0.20.0"
|
||||||
|
```
|
||||||
|
|
||||||
|
Typically, you will use the [language][language func] function to add this
|
||||||
|
grammar to a tree-sitter [Parser][], and then use the parser to parse some code:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
let code = r#"
|
||||||
|
.foo {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
"#;
|
||||||
|
let mut parser = Parser::new();
|
||||||
|
parser.set_language(tree_sitter_css::language()).expect("Error loading CSS grammar");
|
||||||
|
let parsed = parser.parse(code, None);
|
||||||
|
```
|
||||||
|
|
||||||
|
If you have any questions, please reach out to us in the [tree-sitter
|
||||||
|
discussions] page.
|
||||||
|
|
||||||
|
[language func]: https://docs.rs/tree-sitter-css/*/tree_sitter_css/fn.language.html
|
||||||
|
[Parser]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Parser.html
|
||||||
|
[tree-sitter]: https://tree-sitter.github.io/
|
||||||
|
[tree-sitter crate]: https://crates.io/crates/tree-sitter
|
||||||
|
[tree-sitter discussions]: https://github.com/tree-sitter/tree-sitter/discussions
|
||||||
@ -1,16 +1,19 @@
|
|||||||
fn main() {
|
fn main() {
|
||||||
let src_dir = std::path::Path::new("src");
|
let src_dir = std::path::Path::new("src");
|
||||||
|
|
||||||
let mut c_config = cc::Build::new();
|
let mut c_config = cc::Build::new();
|
||||||
c_config.include(&src_dir);
|
c_config.include(src_dir);
|
||||||
c_config
|
c_config
|
||||||
.flag_if_supported("-Wno-unused-parameter")
|
.flag_if_supported("-Wno-unused-parameter")
|
||||||
.flag_if_supported("-Wno-unused-but-set-variable")
|
.flag_if_supported("-Wno-unused-but-set-variable")
|
||||||
.flag_if_supported("-Wno-trigraphs");
|
.flag_if_supported("-Wno-trigraphs");
|
||||||
let parser_path = src_dir.join("parser.c");
|
let parser_path = src_dir.join("parser.c");
|
||||||
let scanner_path = src_dir.join("scanner.c");
|
|
||||||
c_config.file(&parser_path);
|
c_config.file(&parser_path);
|
||||||
|
|
||||||
|
let scanner_path = src_dir.join("scanner.c");
|
||||||
c_config.file(&scanner_path);
|
c_config.file(&scanner_path);
|
||||||
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
|
||||||
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
|
||||||
c_config.compile("parser");
|
c_config.compile("parser");
|
||||||
|
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -0,0 +1,16 @@
|
|||||||
|
#ifndef TREE_SITTER_CSS_H_
|
||||||
|
#define TREE_SITTER_CSS_H_
|
||||||
|
|
||||||
|
typedef struct TSLanguage TSLanguage;
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
extern TSLanguage *tree_sitter_css();
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // TREE_SITTER_CSS_H_
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,53 +1,84 @@
|
|||||||
#include <tree_sitter/parser.h>
|
#include "tree_sitter/parser.h"
|
||||||
|
|
||||||
#include <wctype.h>
|
#include <wctype.h>
|
||||||
|
|
||||||
enum TokenType {
|
enum TokenType {
|
||||||
DESCENDANT_OP,
|
DESCENDANT_OP,
|
||||||
|
PSEUDO_CLASS_SELECTOR_COLON,
|
||||||
|
ERROR_RECOVERY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline void advance(TSLexer *lexer) { lexer->advance(lexer, false); }
|
||||||
|
|
||||||
|
static inline void skip(TSLexer *lexer) { lexer->advance(lexer, true); }
|
||||||
|
|
||||||
void *tree_sitter_css_external_scanner_create() { return NULL; }
|
void *tree_sitter_css_external_scanner_create() { return NULL; }
|
||||||
void tree_sitter_css_external_scanner_destroy(void *p) {}
|
|
||||||
void tree_sitter_css_external_scanner_reset(void *p) {}
|
|
||||||
unsigned tree_sitter_css_external_scanner_serialize(void *p, char *buffer) { return 0; }
|
|
||||||
void tree_sitter_css_external_scanner_deserialize(void *p, const char *b, unsigned n) {}
|
|
||||||
|
|
||||||
bool tree_sitter_css_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
|
void tree_sitter_css_external_scanner_destroy(void *payload) {}
|
||||||
if (iswspace(lexer->lookahead) && valid_symbols[DESCENDANT_OP]) {
|
|
||||||
lexer->result_symbol = DESCENDANT_OP;
|
|
||||||
|
|
||||||
lexer->advance(lexer, true);
|
void tree_sitter_css_external_scanner_reset(void *payload) {}
|
||||||
while (iswspace(lexer->lookahead)) {
|
|
||||||
lexer->advance(lexer, true);
|
unsigned tree_sitter_css_external_scanner_serialize(void *payload, char *buffer) { return 0; }
|
||||||
|
|
||||||
|
void tree_sitter_css_external_scanner_deserialize(void *payload, const char *buffer, unsigned length) {}
|
||||||
|
|
||||||
|
bool tree_sitter_css_external_scanner_scan(void *payload, TSLexer *lexer, const bool *valid_symbols) {
|
||||||
|
if (valid_symbols[ERROR_RECOVERY]) {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
lexer->mark_end(lexer);
|
|
||||||
|
if (iswspace(lexer->lookahead) && valid_symbols[DESCENDANT_OP]) {
|
||||||
if (
|
lexer->result_symbol = DESCENDANT_OP;
|
||||||
lexer->lookahead == '#' ||
|
|
||||||
lexer->lookahead == '.' ||
|
lexer->advance(lexer, true);
|
||||||
lexer->lookahead == '[' ||
|
while (iswspace(lexer->lookahead)) {
|
||||||
lexer->lookahead == '-' ||
|
lexer->advance(lexer, true);
|
||||||
lexer->lookahead == '*' ||
|
}
|
||||||
iswalnum(lexer->lookahead)
|
lexer->mark_end(lexer);
|
||||||
) {
|
|
||||||
return true;
|
if (lexer->lookahead == '#' || lexer->lookahead == '.' || lexer->lookahead == '[' || lexer->lookahead == '-' ||
|
||||||
|
lexer->lookahead == '*' || iswalnum(lexer->lookahead)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lexer->lookahead == ':') {
|
||||||
|
lexer->advance(lexer, false);
|
||||||
|
if (iswspace(lexer->lookahead)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (;;) {
|
||||||
|
if (lexer->lookahead == ';' || lexer->lookahead == '}' || lexer->eof(lexer)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (lexer->lookahead == '{') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
lexer->advance(lexer, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lexer->lookahead == ':') {
|
if (valid_symbols[PSEUDO_CLASS_SELECTOR_COLON]) {
|
||||||
lexer->advance(lexer, false);
|
while (iswspace(lexer->lookahead)) {
|
||||||
if (iswspace(lexer->lookahead)) return false;
|
lexer->advance(lexer, true);
|
||||||
for (;;) {
|
}
|
||||||
if (
|
if (lexer->lookahead == ':') {
|
||||||
lexer->lookahead == ';' ||
|
advance(lexer);
|
||||||
lexer->lookahead == '}' ||
|
if (lexer->lookahead == ':') {
|
||||||
lexer->eof(lexer)
|
return false;
|
||||||
) return false;
|
}
|
||||||
if (lexer->lookahead == '{') {
|
lexer->mark_end(lexer);
|
||||||
return true;
|
// We need a { to be a pseudo class selector, a ; indicates a property
|
||||||
|
while (lexer->lookahead != ';' && lexer->lookahead != '}' && !lexer->eof(lexer)) {
|
||||||
|
advance(lexer);
|
||||||
|
if (lexer->lookahead == '{') {
|
||||||
|
lexer->result_symbol = PSEUDO_CLASS_SELECTOR_COLON;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
lexer->advance(lexer, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue