Skip to content

Commit dad8fff

Browse files
committed
fix value signature not having return type indexed
1 parent bb76dca commit dad8fff

File tree

4 files changed

+68
-55
lines changed

4 files changed

+68
-55
lines changed

src/main/scala/scmindex/core/SCMIndexEntry.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,11 +117,11 @@ object SCMIndexEntry {
117117
e.signature match {
118118
case SigCaseLambda(cases) => cases.flatMap(returnTypesInLambda)
119119
case l: SigLambda => returnTypesInLambda(l)
120+
case SigValue(predicate) => List(predicate)
120121
case SigSyntaxRules(keywords, patterns) => patterns.flatMap {
121122
case PatternAndType(_, Some(ret)) => returnType(ret)
122123
case _ => List()
123124
}
124-
case _ => List()
125125
}
126126
}
127127

@@ -449,6 +449,7 @@ object SCMIndexEntry {
449449

450450
def serializeParameterType(t: ParamType): Sexpr = {
451451
t match {
452+
case Unknown => SexprSymbol("unknown") // should never happen
452453
case Ellipsis => SexprSymbol("...")
453454
case LiteralFalse => SexprBool(false)
454455
case Predicate(identifier) => SexprSymbol(identifier)

src/main/scala/scmindex/core/Sexpr.scala

Lines changed: 7 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,59 +3,14 @@ package scmindex.core
33
import scala.annotation.tailrec
44

55
sealed trait Sexpr {
6-
def write(): String = toString()
7-
}
8-
9-
case class SexprBool(value: Boolean) extends Sexpr {
10-
override def toString: String = {
11-
if (value) "#t" else "#f"
12-
}
13-
override def write() = toString()
14-
}
15-
case class SexprSymbol(name: String) extends Sexpr {
16-
override def toString: String = name
17-
override def write() = {
18-
if (name.contains("|")) {
19-
"|" +
20-
name
21-
.replace("\\", "\\\\")
22-
.replace("|", "\\|")
23-
+ "|"
24-
} else name
25-
}
26-
}
27-
case class SexprString(value: String) extends Sexpr {
28-
override def toString: String = value
29-
override def write() =
30-
"\"" +
31-
value
32-
.replace("\\", "\\\\")
33-
.replace("\n", "\\\\n")
34-
.replace("\r", "\\\\r")
35-
.replace("\t", "\\\\t")
36-
+ "\""
37-
}
38-
case class SexprNumber(i: Int) extends Sexpr {
39-
override def toString: String = "" + i
40-
override def write() = toString()
41-
}
42-
case class SexprPair(car: Sexpr, cdr: Sexpr) extends Sexpr {
43-
def stringify(toStr: Sexpr => String) = {
44-
val (lst, tail) = Sexpr.pairToList(this)
45-
val lstStr = lst.map(toStr(_)).mkString(" ")
46-
val tailStr = tail match {
47-
case SexprNull => ""
48-
case _ => " . " + toStr(tail)
49-
}
50-
"(" + lstStr + tailStr + ")"
51-
}
52-
override def toString: String = stringify(sexpr => sexpr.toString)
53-
override def write() = stringify(sexpr => sexpr.write())
54-
}
55-
56-
case object SexprNull extends Sexpr {
57-
override def toString: String = "()"
6+
override def toString(): String = SexprWriter.display(this)
587
}
8+
case class SexprBool(value: Boolean) extends Sexpr
9+
case class SexprSymbol(name: String) extends Sexpr
10+
case class SexprString(value: String) extends Sexpr
11+
case class SexprNumber(i: Int) extends Sexpr
12+
case class SexprPair(car: Sexpr, cdr: Sexpr) extends Sexpr
13+
case object SexprNull extends Sexpr { }
5914

6015
object Sexpr {
6116
def parseListToPairs(value: List[Sexpr]): Sexpr = {
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package scmindex.core
2+
3+
object SexprWriter {
4+
5+
def stringifyPair(pair: SexprPair, toStr: Sexpr => String) = {
6+
val (lst, tail) = Sexpr.pairToList(pair)
7+
val lstStr = lst.map(toStr(_)).mkString(" ")
8+
val tailStr = tail match {
9+
case SexprNull => ""
10+
case _ => " . " + toStr(tail)
11+
}
12+
"(" + lstStr + tailStr + ")"
13+
}
14+
15+
def writeString(value: String): String = {
16+
"\"" +
17+
value
18+
.replace("\\", "\\\\")
19+
.replace("\n", "\\\\n")
20+
.replace("\r", "\\\\r")
21+
.replace("\t", "\\\\t")
22+
+ "\""
23+
}
24+
25+
def writeSymbol(name: String): String = {
26+
if (name.contains("|")) {
27+
"|" +
28+
name
29+
.replace("\\", "\\\\")
30+
.replace("|", "\\|")
31+
+ "|"
32+
} else name
33+
}
34+
35+
def display(sexpr: Sexpr): String = {
36+
sexpr match {
37+
case SexprBool(value) => if value then "#t" else "#f"
38+
case SexprNull => "()"
39+
case SexprNumber(i) => "" + i
40+
case pair: SexprPair => stringifyPair(pair, display)
41+
case SexprSymbol(name) => name
42+
case SexprString(value) => value
43+
}
44+
}
45+
46+
def write(sexpr: Sexpr): String = {
47+
sexpr match {
48+
case SexprString(value) => writeString(value)
49+
case SexprSymbol(name) => writeSymbol(name)
50+
case pair: SexprPair => stringifyPair(pair, write)
51+
case _ => display(sexpr)
52+
}
53+
}
54+
55+
}

src/main/scala/scmindex/persistance/SqliteStorage.scala

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package scmindex.persistance
22

33
import javax.sql.DataSource
44
import scmindex.core.*
5+
import scmindex.core.SexprWriter.*
6+
import scmindex.core.SCMIndexEntry.*
57
import cats.effect.IO
68
import org.flywaydb.core.Flyway
79
import doobie.*
@@ -56,14 +58,14 @@ object SqliteStorage {
5658
def saveSingle(e: SCMIndexEntry): ConnectionIO[Int] = {
5759
def saveInternalSingle(e: SCMIndexEntrySingle, groupId: Option[Int]): ConnectionIO[Int] = {
5860
for {
59-
id <- sql"insert into index_entry(group_id, lib, name, signature, description) values(${groupId}, ${e.lib}, ${e.name}, ${SCMIndexEntry.serializeSignature(e.signature).write()}, ${e.description})"
61+
id <- sql"insert into index_entry(group_id, lib, name, signature, description) values(${groupId}, ${e.lib}, ${e.name}, ${write(serializeSignature(e.signature))}, ${e.description})"
6062
.update
6163
.withUniqueGeneratedKeys[Int]("id")
6264
_ <- e.tags.map(tag => {
6365
sql"insert into index_entry_tag(index_entry_id, name) values(${id}, ${tag})".update.run
6466
}).sequence
6567
_ <- e.subsignatures.map(subsig => {
66-
sql"insert into index_entry_subsignature(index_entry_id, name, signature) values(${id}, ${subsig.paramName}, ${SCMIndexEntry.serializeSubSignature(subsig.signature).write()})"
68+
sql"insert into index_entry_subsignature(index_entry_id, name, signature) values(${id}, ${subsig.paramName}, ${write(serializeSubSignature(subsig.signature))})"
6769
.update
6870
.run
6971
}).sequence

0 commit comments

Comments
 (0)