Skip to content

Commit

Permalink
Kotlin programming (#935)
Browse files Browse the repository at this point in the history
  • Loading branch information
ice1000 authored and HannahSchellekens committed Jul 2, 2019
1 parent 1bc3e80 commit efa98db
Showing 1 changed file with 13 additions and 47 deletions.
60 changes: 13 additions & 47 deletions src/nl/hannahsten/texifyidea/psi/PsiContainer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -31,22 +31,7 @@ import javax.swing.Icon
*/
open class PsiContainer(val start: PsiElement, val end: PsiElement) : PsiElement {

/**
* Executes the given action on all elements between start and end (inclusive) that have the same level in the
* tree.
*/
inline fun iterateElements(action: (PsiElement) -> Unit) {
var element: PsiElement? = start
while (element != null) {
action(element)

if (element == end) {
break
}

element = element.nextSibling
}
}
fun elements() = generateSequence(start) { it.nextSibling?.takeIf { it != end } }

/**
* Only returns `true` when `another`
Expand All @@ -57,16 +42,14 @@ open class PsiContainer(val start: PsiElement, val end: PsiElement) : PsiElement

override fun copy() = PsiContainer(start, end)

override fun getText() = buildString {
iterateElements { append(it.text) }
}
override fun getText() = elements().joinToString(separator = "") { it.text }

override fun getStartOffsetInParent() = start.startOffsetInParent

override fun getPrevSibling(): PsiElement? = start.prevSibling

override fun <T : Any?> putUserData(key: Key<T>, value: T?) {
iterateElements { it.putUserData(key, value) }
elements().forEach { it.putUserData(key, value) }
}

/**
Expand All @@ -76,17 +59,9 @@ open class PsiContainer(val start: PsiElement, val end: PsiElement) : PsiElement

override fun getContainingFile(): PsiFile? = start.containingFile

override fun getReferences(): Array<PsiReference> {
val list = ArrayList<PsiReference>()
iterateElements {
list.addAll(it.references)
}
return list.toTypedArray()
}
override fun getReferences(): Array<PsiReference> = elements().flatMap { it.references.asSequence() }.toList().toTypedArray()

override fun checkAdd(element: PsiElement) = iterateElements {
it.checkAdd(element)
}
override fun checkAdd(element: PsiElement) = elements().forEach { it.checkAdd(element) }

override fun getLanguage() = start.language

Expand All @@ -105,26 +80,24 @@ open class PsiContainer(val start: PsiElement, val end: PsiElement) : PsiElement
override fun addAfter(element: PsiElement, anchor: PsiElement?): PsiElement? = end.addAfter(element, anchor)

override fun processDeclarations(processor: PsiScopeProcessor, state: ResolveState, lastParent: PsiElement?, place: PsiElement): Boolean {
return start.processDeclarations(processor, state, lastParent, place)
return elements().all { it.processDeclarations(processor, state, lastParent, place) }
}

override fun accept(visitor: PsiElementVisitor) = iterateElements {
start.accept(visitor)
}
override fun accept(visitor: PsiElementVisitor) = elements().forEach { it.accept(visitor) }

override fun getNextSibling(): PsiElement? = end.nextSibling

override fun getFirstChild(): PsiElement = start.firstChild

override fun getTextRange() = TextRange(start.textOffset, end.endOffset())

override fun <T : Any?> putCopyableUserData(key: Key<T>?, value: T?) = iterateElements {
override fun <T : Any?> putCopyableUserData(key: Key<T>?, value: T?) = elements().forEach {
it.putCopyableUserData(key, value)
}

override fun getOriginalElement(): PsiElement? = start.originalElement

override fun checkDelete() = iterateElements {
override fun checkDelete() = elements().forEach {
it.checkDelete()
}

Expand Down Expand Up @@ -158,32 +131,25 @@ open class PsiContainer(val start: PsiElement, val end: PsiElement) : PsiElement

override fun isValid() = start.isValid

override fun delete() = iterateElements {
override fun delete() = elements().forEach {
it.delete()
}

override fun getIcon(flags: Int): Icon? = start.getIcon(flags)

override fun deleteChildRange(first: PsiElement?, last: PsiElement?) = iterateElements {
override fun deleteChildRange(first: PsiElement?, last: PsiElement?) = elements().forEach {
it.deleteChildRange(first, last)
}

override fun getParent(): PsiElement? = start.parent

override fun getChildren(): Array<PsiElement> = emptyArray()

override fun acceptChildren(visitor: PsiElementVisitor) = iterateElements {
override fun acceptChildren(visitor: PsiElementVisitor) = elements().forEach {
it.accept(visitor)
}

override fun isWritable(): Boolean {
iterateElements {
if (!it.isWritable) {
return false
}
}
return true
}
override fun isWritable() = elements().all { it.isWritable }

override fun <T : Any?> getUserData(key: Key<T>): T? = start.getUserData(key)

Expand Down

0 comments on commit efa98db

Please sign in to comment.