Skip to content

Commit 746afbd

Browse files
committed
feat: add thrift parser
1 parent 6c4e40c commit 746afbd

11 files changed

Lines changed: 1540 additions & 3 deletions

File tree

go.mod

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,12 @@ require (
1313
github.com/cloudwego/eino-ext/components/tool/mcp v0.0.3
1414
github.com/fsnotify/fsnotify v1.4.9
1515
github.com/invopop/jsonschema v0.13.0
16+
github.com/joyme123/thrift-ls v0.2.9
1617
github.com/mark3labs/mcp-go v0.34.0
1718
github.com/sourcegraph/go-lsp v0.0.0-20240223163137-f80c5dd31dfd
1819
github.com/sourcegraph/jsonrpc2 v0.2.0
1920
github.com/stretchr/testify v1.10.0
21+
go.lsp.dev/uri v0.3.0
2022
golang.org/x/mod v0.24.0
2123
golang.org/x/tools v0.32.0
2224
)
@@ -39,10 +41,13 @@ require (
3941
github.com/aws/smithy-go v1.22.1 // indirect
4042
github.com/bahlo/generic-list-go v0.2.0 // indirect
4143
github.com/buger/jsonparser v1.1.1 // indirect
44+
github.com/bytedance/gopkg v0.1.1 // indirect
4245
github.com/bytedance/sonic/loader v0.2.4 // indirect
4346
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
4447
github.com/cloudwego/base64x v0.1.5 // indirect
4548
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250626133421-3c142631c961 // indirect
49+
github.com/cloudwego/gopkg v0.1.4 // indirect
50+
github.com/cloudwego/thriftgo v0.4.2 // indirect
4651
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
4752
github.com/dustin/go-humanize v1.0.1 // indirect
4853
github.com/evanphx/json-patch v0.5.2 // indirect
@@ -54,6 +59,7 @@ require (
5459
github.com/invopop/yaml v0.3.1 // indirect
5560
github.com/jmespath/go-jmespath v0.4.0 // indirect
5661
github.com/josharian/intern v1.0.0 // indirect
62+
github.com/joyme123/protocol v0.12.0-patch20250429 // indirect
5763
github.com/json-iterator/go v1.1.12 // indirect
5864
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
5965
github.com/mailru/easyjson v0.9.0 // indirect
@@ -69,6 +75,8 @@ require (
6975
github.com/perimeterx/marshmallow v1.1.5 // indirect
7076
github.com/pkg/errors v0.9.1 // indirect
7177
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
78+
github.com/segmentio/asm v1.1.3 // indirect
79+
github.com/segmentio/encoding v0.3.4 // indirect
7280
github.com/sirupsen/logrus v1.9.3 // indirect
7381
github.com/slongfield/pyfmt v0.0.0-20220222012616-ea85ff4c361f // indirect
7482
github.com/spf13/cast v1.7.1 // indirect
@@ -82,6 +90,11 @@ require (
8290
github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect
8391
github.com/yargevad/filepathx v1.0.0 // indirect
8492
github.com/yosida95/uritemplate/v3 v3.0.2 // indirect
93+
go.lsp.dev/jsonrpc2 v0.10.0 // indirect
94+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 // indirect
95+
go.uber.org/atomic v1.9.0 // indirect
96+
go.uber.org/multierr v1.8.0 // indirect
97+
go.uber.org/zap v1.21.0 // indirect
8598
golang.org/x/arch v0.14.0 // indirect
8699
golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa // indirect
87100
golang.org/x/net v0.39.0 // indirect

go.sum

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro=
9696
github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg=
9797
github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPnH1Wvgk=
9898
github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg=
99+
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
99100
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
100101
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
101102
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
@@ -107,6 +108,8 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
107108
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
108109
github.com/bugsnag/bugsnag-go v1.4.0/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8=
109110
github.com/bugsnag/panicwrap v1.2.0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE=
111+
github.com/bytedance/gopkg v0.1.1 h1:3azzgSkiaw79u24a+w9arfH8OfnQQ4MHUt9lJFREEaE=
112+
github.com/bytedance/gopkg v0.1.1/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
110113
github.com/bytedance/mockey v1.2.14 h1:KZaFgPdiUwW+jOWFieo3Lr7INM1P+6adO3hxZhDswY8=
111114
github.com/bytedance/mockey v1.2.14/go.mod h1:1BPHF9sol5R1ud/+0VEHGQq/+i2lN+GTsr3O2Q9IENY=
112115
github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0=
@@ -147,7 +150,11 @@ github.com/cloudwego/eino-ext/components/tool/mcp v0.0.3 h1:kT8yynQh8q92BPofkHxx
147150
github.com/cloudwego/eino-ext/components/tool/mcp v0.0.3/go.mod h1:D1Yircehgx7em8EH6vw8If+ATjtXl60IpBzVaqFBx3c=
148151
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250626133421-3c142631c961 h1:fGE3RFHaAsrLjA+2fkE0YMsPrkFI6pEKKZmbhD42L7E=
149152
github.com/cloudwego/eino-ext/libs/acl/openai v0.0.0-20250626133421-3c142631c961/go.mod h1:iB0W8l+OqKNL5LtJQ9JaGYXekhsxVxrDMfnfD9L+5gc=
153+
github.com/cloudwego/gopkg v0.1.4 h1:EoQiCG4sTonTPHxOGE0VlQs+sQR+Hsi2uN0qqwu8O50=
154+
github.com/cloudwego/gopkg v0.1.4/go.mod h1:FQuXsRWRsSqJLsMVd5SYzp8/Z1y5gXKnVvRrWUOsCMI=
150155
github.com/cloudwego/iasm v0.2.0/go.mod h1:8rXZaNYT2n95jn+zTI1sDr+IgcD2GVs0nlbbQPiEFhY=
156+
github.com/cloudwego/thriftgo v0.4.2 h1:+XioeEgBOVqyKMJqUuqeJbKUtQ0XIkXhlNIqoWSESFw=
157+
github.com/cloudwego/thriftgo v0.4.2/go.mod h1:/D4zRAEj1t3/Tq1bVGDMnRt3wxpHfalXfZWvq/n4YmY=
151158
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
152159
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
153160
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
@@ -352,6 +359,10 @@ github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGw
352359
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
353360
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
354361
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
362+
github.com/joyme123/protocol v0.12.0-patch20250429 h1:xpdpCrPh3iiEIQvdg+qe5jvRLOZuGIB6sszHdXrypYk=
363+
github.com/joyme123/protocol v0.12.0-patch20250429/go.mod h1:DtA/00dR9o4lqtyqUzD6mGDfHKoCwHtazn62H2gnerA=
364+
github.com/joyme123/thrift-ls v0.2.9 h1:a1omU0mVzFnk34py+thVKjzx85rqoSZkewDMCZmVPH4=
365+
github.com/joyme123/thrift-ls v0.2.9/go.mod h1:5OjpgkpLu+87FVblB98llJYW7/JzapUL6SCD1238LQs=
355366
github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
356367
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
357368
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
@@ -515,6 +526,10 @@ github.com/rollbar/rollbar-go v1.0.2/go.mod h1:AcFs5f0I+c71bpHlXNNDbOWJiKwjFDtIS
515526
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
516527
github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
517528
github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
529+
github.com/segmentio/asm v1.1.3 h1:WM03sfUOENvvKexOLp+pCqgb/WDjsi7EK8gIsICtzhc=
530+
github.com/segmentio/asm v1.1.3/go.mod h1:Ld3L4ZXGNcSLRg4JBsZ3//1+f/TjYl0Mzen/DQy1EJg=
531+
github.com/segmentio/encoding v0.3.4 h1:WM4IBnxH8B9TakiM2QD5LyNl9JSndh88QbHqVC+Pauc=
532+
github.com/segmentio/encoding v0.3.4/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM=
518533
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
519534
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
520535
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
@@ -601,6 +616,12 @@ go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQc
601616
go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
602617
go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ=
603618
go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0=
619+
go.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI=
620+
go.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac=
621+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 h1:hCzQgh6UcwbKgNSRurYWSqh8MufqRRPODRBblutn4TE=
622+
go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw=
623+
go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo=
624+
go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I=
604625
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
605626
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
606627
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
@@ -609,14 +630,21 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
609630
go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
610631
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
611632
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
633+
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
612634
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
613635
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
636+
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
637+
go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
614638
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
615639
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
616640
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
617641
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
642+
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
643+
go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
618644
go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
619645
go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI=
646+
go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8=
647+
go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
620648
golang.org/x/arch v0.14.0 h1:z9JUEZWr8x4rR0OU6c4/4t6E6jOZ8/QBS2bBYBm4tx4=
621649
golang.org/x/arch v0.14.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
622650
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
@@ -805,6 +833,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
805833
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
806834
golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
807835
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
836+
golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
808837
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
809838
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
810839
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=

lang/collect/collect.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ type CollectOption struct {
4040
NotNeedTest bool
4141
Excludes []string
4242
LoadByPackages bool
43+
IDLPkgType string
4344
}
4445

4546
type Collector struct {

lang/parse.go

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import (
3232
"github.com/cloudwego/abcoder/lang/lsp"
3333
"github.com/cloudwego/abcoder/lang/python"
3434
"github.com/cloudwego/abcoder/lang/rust"
35+
tparser "github.com/cloudwego/abcoder/lang/thrift/parser"
3536
"github.com/cloudwego/abcoder/lang/uniast"
3637
)
3738

@@ -107,8 +108,6 @@ func checkRepoPath(repoPath string, language uniast.Language) (openfile string,
107108
openfile, wait = rust.CheckRepo(repoPath)
108109
case uniast.Cxx:
109110
openfile, wait = cxx.CheckRepo(repoPath)
110-
case uniast.Python:
111-
openfile, wait = python.CheckRepo(repoPath)
112111
default:
113112
openfile = ""
114113
wait = 0
@@ -126,6 +125,8 @@ func checkLSP(language uniast.Language, lspPath string) (l uniast.Language, s st
126125
l, s = cxx.GetDefaultLSP()
127126
case uniast.Python:
128127
l, s = python.GetDefaultLSP()
128+
case uniast.Thrift:
129+
return "", "", nil
129130
case uniast.Golang:
130131
l = uniast.Golang
131132
s = ""
@@ -159,6 +160,11 @@ func collectSymbol(ctx context.Context, cli *lsp.LSPClient, repoPath string, opt
159160
if err != nil {
160161
return nil, err
161162
}
163+
} else if opts.Language == uniast.Thrift {
164+
repo, err = callThriftParser(ctx, repoPath, opts)
165+
if err != nil {
166+
return nil, err
167+
}
162168
} else {
163169
collector := collect.NewCollector(repoPath, cli)
164170
collector.CollectOption = opts
@@ -203,3 +209,24 @@ func callGoParser(ctx context.Context, repoPath string, opts collect.CollectOpti
203209
}
204210
return &repo, nil
205211
}
212+
213+
func callThriftParser(ctx context.Context, repoPath string, opts collect.CollectOption) (*uniast.Repository, error) {
214+
thriftopts := tparser.Options{}
215+
if !opts.NoNeedComment {
216+
thriftopts.CollectComment = true
217+
}
218+
219+
if opts.IDLPkgType != "" {
220+
thriftopts.TargetLanguage = opts.IDLPkgType
221+
} else {
222+
thriftopts.TargetLanguage = "go"
223+
}
224+
225+
thriftopts.Excludes = opts.Excludes
226+
p, err := tparser.NewParser(repoPath, thriftopts)
227+
repo, err := p.ParseRepo()
228+
if err != nil {
229+
return nil, err
230+
}
231+
return &repo, nil
232+
}

0 commit comments

Comments
 (0)