Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'workhorse/internal/lsif_transformer/parser/result_set.go')
-rw-r--r--workhorse/internal/lsif_transformer/parser/result_set.go100
1 files changed, 100 insertions, 0 deletions
diff --git a/workhorse/internal/lsif_transformer/parser/result_set.go b/workhorse/internal/lsif_transformer/parser/result_set.go
new file mode 100644
index 00000000000..aa0b212d0ca
--- /dev/null
+++ b/workhorse/internal/lsif_transformer/parser/result_set.go
@@ -0,0 +1,100 @@
+package parser
+
+import (
+ "encoding/json"
+)
+
+type Property int8
+
+const (
+ DefinitionProp Property = iota
+ ReferencesProp
+)
+
+type ResultSet struct {
+ Hovers *Hovers
+ Cache *cache
+}
+
+type ResultSetRef struct {
+ Id Id
+ Property Property
+}
+
+type RawResultSetRef struct {
+ ResultSetId Id `json:"outV"`
+ RefId Id `json:"inV"`
+}
+
+func NewResultSet() (*ResultSet, error) {
+ hovers, err := NewHovers()
+ if err != nil {
+ return nil, err
+ }
+
+ cache, err := newCache("results-set-refs", &ResultSetRef{})
+ if err != nil {
+ return nil, err
+ }
+
+ return &ResultSet{
+ Hovers: hovers,
+ Cache: cache,
+ }, nil
+}
+
+func (r *ResultSet) Read(label string, line []byte) error {
+ switch label {
+ case "textDocument/references":
+ if err := r.addResultSetRef(line, ReferencesProp); err != nil {
+ return err
+ }
+ case "textDocument/definition":
+ if err := r.addResultSetRef(line, DefinitionProp); err != nil {
+ return err
+ }
+ default:
+ return r.Hovers.Read(label, line)
+ }
+
+ return nil
+}
+
+func (r *ResultSet) RefById(refId Id) (*ResultSetRef, error) {
+ var ref ResultSetRef
+ if err := r.Cache.Entry(refId, &ref); err != nil {
+ return nil, err
+ }
+
+ return &ref, nil
+}
+
+func (r *ResultSet) Close() error {
+ for _, err := range []error{
+ r.Cache.Close(),
+ r.Hovers.Close(),
+ } {
+ if err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
+func (r *ResultSet) addResultSetRef(line []byte, property Property) error {
+ var rawRef RawResultSetRef
+ if err := json.Unmarshal(line, &rawRef); err != nil {
+ return err
+ }
+
+ ref := &ResultSetRef{
+ Id: rawRef.ResultSetId,
+ Property: property,
+ }
+
+ return r.Cache.SetEntry(rawRef.RefId, ref)
+}
+
+func (r *ResultSetRef) IsDefinition() bool {
+ return r.Property == DefinitionProp
+}