plugin improvements; attempt to make AI life easier (incomplete and weak)
This commit is contained in:
1 parent
474293cfe3
commit
d2632cb99e
5 files changed
+148
-2
No files matched your search
@@ -239,6 +239,9 @@ object CompletionEngineLight {
|
||||
fun addMembersOf(name: String, direct: Boolean) {
|
||||
val cls = classes[name] ?: return
|
||||
val target = if (direct) directMap else inheritedMap
|
||||
for (cf in cls.ctorFields + cls.classFields) {
|
||||
target.getOrPut(cf.name) { mutableListOf() }.add(DocLookupUtils.toMemberVal(cf))
|
||||
}
|
||||
for (m in cls.members) target.getOrPut(m.name) { mutableListOf() }.add(m)
|
||||
for (b in cls.bases) if (visited.add(b)) addMembersOf(b, false)
|
||||
}
|
||||
|
||||
@@ -96,6 +96,19 @@ object DocLookupUtils {
|
||||
return null
|
||||
}
|
||||
|
||||
fun findEnclosingClass(mini: MiniScript, offset: Int): MiniClassDecl? {
|
||||
val src = mini.range.start.source
|
||||
return mini.declarations.filterIsInstance<MiniClassDecl>()
|
||||
.filter {
|
||||
val start = src.offsetOf(it.range.start)
|
||||
val end = src.offsetOf(it.range.end)
|
||||
offset in start..end
|
||||
}
|
||||
.minByOrNull {
|
||||
src.offsetOf(it.range.end) - src.offsetOf(it.range.start)
|
||||
}
|
||||
}
|
||||
|
||||
fun findTypeByRange(mini: MiniScript?, name: String, startOffset: Int, text: String? = null, imported: List<String>? = null): MiniTypeRef? {
|
||||
if (mini == null) return null
|
||||
val src = mini.range.start.source
|
||||
@@ -233,10 +246,14 @@ object DocLookupUtils {
|
||||
val rep = list.first()
|
||||
val bases = LinkedHashSet<String>()
|
||||
val members = LinkedHashMap<String, MutableList<MiniMemberDecl>>()
|
||||
val ctorFields = LinkedHashMap<String, MiniCtorField>()
|
||||
val classFields = LinkedHashMap<String, MiniCtorField>()
|
||||
var doc: MiniDoc? = null
|
||||
for (c in list) {
|
||||
bases.addAll(c.bases)
|
||||
if (doc == null && c.doc != null && c.doc.raw.isNotBlank()) doc = c.doc
|
||||
for (cf in c.ctorFields) ctorFields[cf.name] = cf
|
||||
for (cf in c.classFields) classFields[cf.name] = cf
|
||||
for (m in c.members) {
|
||||
// Group by name to keep overloads together
|
||||
members.getOrPut(m.name) { mutableListOf() }.add(m)
|
||||
@@ -249,8 +266,8 @@ object DocLookupUtils {
|
||||
name = rep.name,
|
||||
bases = bases.toList(),
|
||||
bodyRange = rep.bodyRange,
|
||||
ctorFields = rep.ctorFields,
|
||||
classFields = rep.classFields,
|
||||
ctorFields = ctorFields.values.toList(),
|
||||
classFields = classFields.values.toList(),
|
||||
doc = doc,
|
||||
nameStart = rep.nameStart,
|
||||
members = mergedMembers
|
||||
@@ -268,6 +285,18 @@ object DocLookupUtils {
|
||||
return result
|
||||
}
|
||||
|
||||
internal fun toMemberVal(cf: MiniCtorField): MiniMemberValDecl = MiniMemberValDecl(
|
||||
range = MiniRange(cf.nameStart, cf.nameStart),
|
||||
name = cf.name,
|
||||
mutable = cf.mutable,
|
||||
type = cf.type,
|
||||
initRange = null,
|
||||
doc = null,
|
||||
nameStart = cf.nameStart,
|
||||
isStatic = false,
|
||||
isExtern = false
|
||||
)
|
||||
|
||||
fun resolveMemberWithInheritance(importedModules: List<String>, className: String, member: String, localMini: MiniScript? = null): Pair<String, MiniNamedDecl>? {
|
||||
val classes = aggregateClasses(importedModules, localMini)
|
||||
fun dfs(name: String, visited: MutableSet<String>): Pair<String, MiniNamedDecl>? {
|
||||
@@ -275,6 +304,8 @@ object DocLookupUtils {
|
||||
val cls = classes[name]
|
||||
if (cls != null) {
|
||||
cls.members.firstOrNull { it.name == member }?.let { return name to it }
|
||||
cls.ctorFields.firstOrNull { it.name == member }?.let { return name to toMemberVal(it) }
|
||||
cls.classFields.firstOrNull { it.name == member }?.let { return name to toMemberVal(it) }
|
||||
for (baseName in cls.bases) {
|
||||
dfs(baseName, visited)?.let { return it }
|
||||
}
|
||||
@@ -656,6 +687,12 @@ object DocLookupUtils {
|
||||
val identRange = wordRangeAt(text, i + 1)
|
||||
if (identRange != null) {
|
||||
val ident = text.substring(identRange.first, identRange.second)
|
||||
|
||||
// 3a) Handle plain "this"
|
||||
if (ident == "this" && mini != null) {
|
||||
findEnclosingClass(mini, identRange.first)?.let { return it.name }
|
||||
}
|
||||
|
||||
// if it's "as Type", we want Type
|
||||
var k = prevNonWs(text, identRange.first - 1)
|
||||
if (k >= 1 && text[k] == 's' && text[k - 1] == 'a' && (k - 1 == 0 || !text[k - 2].isLetterOrDigit())) {
|
||||
|
||||
Reference in new issue
Block a user