@@ -16,11 +16,19 @@ import org.jetbrains.exposed.sql.SqlExpressionBuilder.like
1616import org.jetbrains.exposed.sql.insert
1717
1818private object Symbols : Table() {
19- val fqName = varchar(" fqname" , length = 255 ).primaryKey()
20- val shortName = varchar(" shortname" , length = 80 )
19+ val fqName = varchar(" fqname" , length = 255 ) references FqNames .fqName
2120 val kind = integer(" kind" )
2221 val visibility = integer(" visibility" )
2322 val extensionReceiverType = varchar(" extensionreceivertype" , length = 255 ).nullable()
23+
24+ override val primaryKey = PrimaryKey (fqName)
25+ }
26+
27+ private object FqNames : Table() {
28+ val fqName = varchar(" fqname" , length = 255 )
29+ val shortName = varchar(" shortname" , length = 80 )
30+
31+ override val primaryKey = PrimaryKey (fqName)
2432}
2533
2634/* *
@@ -33,7 +41,7 @@ class SymbolIndex {
3341
3442 init {
3543 transaction(db) {
36- SchemaUtils .create(Symbols )
44+ SchemaUtils .create(Symbols , FqNames )
3745 }
3846 }
3947
@@ -50,23 +58,28 @@ class SymbolIndex {
5058 transaction(db) {
5159 Symbols .deleteAll()
5260
53- // TODO: Workaround, since insertIgnore seems to throw UnsupportedByDialectExceptions
54- // when used with H2.
55- val addedFqns = mutableSetOf<FqName >()
56-
5761 for (descriptor in descriptors) {
5862 val fqn = descriptor.fqNameSafe
63+ val extensionReceiverFqn = descriptor.accept(ExtractSymbolExtensionReceiverType , Unit )
5964
60- if (! addedFqns.contains(fqn)) {
61- addedFqns.add(fqn)
62- Symbols .insert {
63- it[fqName] = fqn.toString()
64- it[shortName] = fqn.shortName().toString()
65- it[kind] = descriptor.accept(ExtractSymbolKind , Unit ).rawValue
66- it[visibility] = descriptor.accept(ExtractSymbolVisibility , Unit ).rawValue
67- it[extensionReceiverType] = descriptor.accept(ExtractSymbolExtensionReceiverType , Unit )?.toString()
65+ FqNames .replace {
66+ it[fqName] = fqn.toString()
67+ it[shortName] = fqn.shortName().toString()
68+ }
69+
70+ extensionReceiverFqn?.let { rFqn ->
71+ FqNames .replace {
72+ it[fqName] = rFqn.toString()
73+ it[shortName] = rFqn.shortName().toString()
6874 }
6975 }
76+
77+ Symbols .replace {
78+ it[fqName] = fqn.toString()
79+ it[kind] = descriptor.accept(ExtractSymbolKind , Unit ).rawValue
80+ it[visibility] = descriptor.accept(ExtractSymbolVisibility , Unit ).rawValue
81+ it[extensionReceiverType] = extensionReceiverFqn?.toString()
82+ }
7083 }
7184
7285 val finished = System .currentTimeMillis()
@@ -82,9 +95,17 @@ class SymbolIndex {
8295 }
8396 }
8497
85- fun query (prefix : String , limit : Int = 20): List <Symbol > = transaction(db) {
86- Symbols
87- .select { Symbols .shortName.like(" $prefix %" ) }
98+ fun query (prefix : String , receiverType : FqName ? = null, limit : Int = 20): List <Symbol > = transaction(db) {
99+ (Symbols innerJoin FqNames )
100+ .select {
101+ FqNames .shortName
102+ .like(" $prefix %" )
103+ .let { q ->
104+ receiverType?.let { t ->
105+ q and (Symbols .extensionReceiverType eq wrapAsExpression(FqNames .slice(FqNames .fqName.count()).select { FqNames .shortName.like(" $t %" ) }))
106+ } ? : q
107+ }
108+ }
88109 .limit(limit)
89110 .map { Symbol (
90111 fqName = FqName (it[Symbols .fqName]),
0 commit comments