8
8
package com .nexthink .utils .parsing .combinator .completion
9
9
10
10
import org .json4s
11
+ import org .json4s .{JArray , JValue }
11
12
12
13
import scala .util .parsing .input .{NoPosition , Position }
13
14
import org .json4s .JsonDSL ._
14
15
import org .json4s .native .JsonMethods ._
16
+
15
17
import scala .collection .immutable
16
18
17
19
/** Collection of data types allowing definition of structured parser completions.
@@ -33,6 +35,7 @@ import scala.collection.immutable
33
35
*/
34
36
trait CompletionTypes {
35
37
type Elem
38
+ type Elems = Seq [Elem ]
36
39
37
40
val DefaultCompletionTag = " "
38
41
val DefaultCompletionScore = 0
@@ -57,7 +60,7 @@ trait CompletionTypes {
57
60
}
58
61
59
62
override def toString : String = pretty(render(serializeJson))
60
- def toJson : String = compact(render( serializeJson))
63
+ def toJson : JValue = serializeJson
61
64
}
62
65
63
66
case object CompletionTag {
@@ -86,7 +89,7 @@ trait CompletionTypes {
86
89
(" tag" -> tag.serializeJson) ~ (" completions" -> entries.map(_.serializeJson).toList)
87
90
88
91
override def toString : String = pretty(render(serializeJson))
89
- def toJson : String = compact(render( serializeJson))
92
+ def toJson : JValue = serializeJson
90
93
}
91
94
92
95
case object CompletionSet {
@@ -119,9 +122,9 @@ trait CompletionTypes {
119
122
120
123
def apply (completions : Traversable [Elems ]): CompletionSet =
121
124
CompletionSet (CompletionTag .Default , completions.map(c => c -> Completion (c)).toSeq)
122
- }
123
125
124
- type Elems = Seq [Elem ]
126
+ implicit def orderingByScoreAndThenAlphabetical : Ordering [CompletionSet ] = Ordering .by(s => (- s.score, s.label))
127
+ }
125
128
126
129
/** Completion entry
127
130
* @param value entry value (e.g. string literal)
@@ -153,15 +156,15 @@ trait CompletionTypes {
153
156
def isEmpty : Boolean = sets.isEmpty
154
157
def nonEmpty : Boolean = ! isEmpty
155
158
def setWithTag (tag : String ): Option [CompletionSet ] = sets.get(tag)
156
- def allSets : Iterable [CompletionSet ] = sets.values
159
+ def allSets : Iterable [CompletionSet ] = sets.values.toSeq.sorted
157
160
def allCompletions : Iterable [Completion ] = allSets.flatMap(_.sortedEntries)
158
161
def defaultSet : Option [CompletionSet ] = sets.get(" " )
159
162
160
163
private def serializeJson = (" position" -> ((" line" -> position.line) ~ (" column" -> position.column))) ~ (" sets" -> allSets.map(_.serializeJson))
161
164
162
165
override def toString : String = pretty(render(serializeJson))
163
- def toJson : String = compact(render( serializeJson))
164
-
166
+ def toJson : JValue = serializeJson
167
+ def setsToJson : JArray = allSets.map(_.serializeJson)
165
168
166
169
private def mergeMetaData (left : Option [String ], right : Option [String ]) = (left, right) match {
167
170
case (Some (l), Some (r)) =>
0 commit comments