-
Notifications
You must be signed in to change notification settings - Fork 0
139 lines (121 loc) · 4.79 KB
/
sync-grammar.yml
File metadata and controls
139 lines (121 loc) · 4.79 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
name: Sync Tree-sitter Grammar
on:
schedule:
- cron: "0 6 * * 1" # Weekly on Monday at 6 AM UTC
workflow_dispatch:
inputs:
lf_version:
description: "LF release tag (e.g. v0.11.0). Leave empty for latest."
required: false
type: string
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout lf.nvim
uses: actions/checkout@v4
- name: Resolve LF version
id: resolve
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
if [ -n "${{ inputs.lf_version }}" ]; then
version="${{ inputs.lf_version }}"
else
version=$(gh api repos/lf-lang/lingua-franca/releases \
--jq '[.[] | select(.tag_name != "nightly" and .prerelease == false)][0].tag_name')
fi
echo "version=$version" >> "$GITHUB_OUTPUT"
echo "Resolved LF version: $version"
- name: Fetch upstream Xtext grammar
run: |
curl -fSL "https://raw.githubusercontent.com/lf-lang/lingua-franca/${{ steps.resolve.outputs.version }}/core/src/main/java/org/lflang/LinguaFranca.xtext" \
-o /tmp/LinguaFranca.xtext
- name: Check if grammar changed
id: check
run: |
new_hash=$(sha256sum /tmp/LinguaFranca.xtext | cut -d' ' -f1)
if [ -f .xtext-grammar-sha256 ]; then
old_hash=$(cat .xtext-grammar-sha256)
else
old_hash=""
fi
if [ "$new_hash" = "$old_hash" ]; then
echo "Grammar unchanged, skipping."
echo "changed=false" >> "$GITHUB_OUTPUT"
else
echo "Grammar changed ($old_hash -> $new_hash)."
echo "changed=true" >> "$GITHUB_OUTPUT"
echo "$new_hash" > .xtext-grammar-sha256
echo "${{ steps.resolve.outputs.version }}" > .lf-upstream-version
fi
- name: Set up Python
if: steps.check.outputs.changed == 'true'
uses: actions/setup-python@v5
with:
python-version: "3.12"
- name: Set up Node.js
if: steps.check.outputs.changed == 'true'
uses: actions/setup-node@v4
with:
node-version: "20"
- name: Install tree-sitter CLI
if: steps.check.outputs.changed == 'true'
run: npm install -g tree-sitter-cli
- name: Generate grammar.js
if: steps.check.outputs.changed == 'true'
run: |
python -m xtext2ts \
--xtext /tmp/LinguaFranca.xtext \
--output tree-sitter-lf/grammar.js
- name: Generate parser
if: steps.check.outputs.changed == 'true'
run: cd tree-sitter-lf && tree-sitter generate
- name: Checkout upstream test files at anchored version
if: steps.check.outputs.changed == 'true'
uses: actions/checkout@v4
with:
repository: lf-lang/lingua-franca
ref: ${{ steps.resolve.outputs.version }}
sparse-checkout: test
path: /tmp/lingua-franca
- name: Validate against upstream test files
if: steps.check.outputs.changed == 'true'
run: |
cd tree-sitter-lf
total=$(find /tmp/lingua-franca/test -name "*.lf" | wc -l)
errors=$(find /tmp/lingua-franca/test -name "*.lf" \
| xargs tree-sitter parse --quiet 2>&1 \
| grep -c "ERROR" || true)
echo "Validation against LF ${{ steps.resolve.outputs.version }}: $errors failures out of $total files"
# Show failed files if any
if [ "$errors" -gt 0 ]; then
echo "Failed:"
find /tmp/lingua-franca/test -name "*.lf" \
| xargs tree-sitter parse --quiet 2>&1 \
| grep "ERROR" \
| sed 's|/tmp/lingua-franca/||'
fi
# All upstream tests must pass
if [ "$errors" -gt 0 ]; then
echo "Parse errors detected, aborting."
exit 1
fi
- name: Create Pull Request
if: steps.check.outputs.changed == 'true'
uses: peter-evans/create-pull-request@v7
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "update tree-sitter grammar for LF ${{ steps.resolve.outputs.version }}"
branch: update-grammar/${{ steps.resolve.outputs.version }}
title: "Update tree-sitter grammar for LF ${{ steps.resolve.outputs.version }}"
body: |
## Summary
- Auto-generated tree-sitter grammar from upstream Xtext grammar
- LF version: `${{ steps.resolve.outputs.version }}`
- Generated by `xtext2ts` converter
## Test plan
- [ ] Verify `tree-sitter generate` succeeds
- [ ] Verify test .lf files parse without errors
- [ ] Test syntax highlighting in Neovim
labels: automated