Extraction Engine: Get rid of explicit element offset manipulation and use copyable user data instead

This commit is contained in:
Alexey Sedunov
2015-11-25 18:39:05 +03:00
parent 44bc937499
commit 03e1480476
12 changed files with 357 additions and 411 deletions
@@ -560,6 +560,8 @@ public class KtPsiFactory(private val project: Project) {
return this
}
public fun transform(f: StringBuilder.() -> Unit) = sb.f()
public fun asString(): String {
if (state != State.DONE) {
state = State.DONE
@@ -21,13 +21,13 @@ import com.intellij.openapi.util.UserDataHolder
import com.intellij.psi.PsiElement
import kotlin.reflect.KProperty
public class UserDataProperty<in R: UserDataHolder, T : Any>(val key: Key<T>) {
public class UserDataProperty<in R : UserDataHolder, T : Any>(val key: Key<T>) {
operator fun getValue(thisRef: R, desc: KProperty<*>) = thisRef.getUserData(key)
operator fun setValue(thisRef: R, desc: KProperty<*>, value: T?) = thisRef.putUserData(key, value)
}
public class NotNullableUserDataProperty<in R: UserDataHolder, T : Any>(val key: Key<T>, val defaultValue: T) {
public class NotNullableUserDataProperty<in R : UserDataHolder, T : Any>(val key: Key<T>, val defaultValue: T) {
operator fun getValue(thisRef: R, desc: KProperty<*>) = thisRef.getUserData(key) ?: defaultValue
operator fun setValue(thisRef: R, desc: KProperty<*>, value: T) {
@@ -35,16 +35,25 @@ public class NotNullableUserDataProperty<in R: UserDataHolder, T : Any>(val key:
}
}
public class CopyableUserDataProperty<in R: PsiElement, T : Any>(val key: Key<T>) {
public class CopyableUserDataProperty<in R : PsiElement, T : Any>(val key: Key<T>) {
operator fun getValue(thisRef: R, property: KProperty<*>) = thisRef.getCopyableUserData(key)
operator fun setValue(thisRef: R, property: KProperty<*>, value: T?) = thisRef.putCopyableUserData(key, value)
}
public class NotNullableCopyableUserDataProperty<in R: PsiElement, T : Any>(val key: Key<T>, val defaultValue: T) {
public class NotNullableCopyableUserDataProperty<in R : PsiElement, T : Any>(val key: Key<T>, val defaultValue: T) {
operator fun getValue(thisRef: R, property: KProperty<*>) = thisRef.getCopyableUserData(key) ?: defaultValue
operator fun setValue(thisRef: R, property: KProperty<*>, value: T) {
thisRef.putCopyableUserData(key, if (value != defaultValue) value else null)
}
}
public class NotNullableCopyableUserDataPropertyWithLazyDefault<in R : PsiElement, T : Any>(val key: Key<T>,
val computeDefaultValue: () -> T) {
private val delegate by lazy { NotNullableCopyableUserDataProperty<R, T>(key, computeDefaultValue()) }
operator fun getValue(thisRef: R, property: KProperty<*>) = delegate.getValue(thisRef, property)
operator fun setValue(thisRef: R, property: KProperty<*>, value: T) = delegate.setValue(thisRef, property, value)
}