[Assign plugin] Add a compiler plugin for overloading assign ('=') operator
This commit is contained in:
committed by
Dmitriy Novozhilov
parent
6052962f50
commit
09d6dfc8bf
@@ -0,0 +1,200 @@
|
||||
// FILE: Property.java
|
||||
@ValueContainer
|
||||
public interface Property<T> {
|
||||
void set(T v);
|
||||
T get();
|
||||
}
|
||||
|
||||
// FILE: JavaTaskWithField.java
|
||||
public class JavaTaskWithField {
|
||||
public final StringProperty input;
|
||||
|
||||
public JavaTaskWithField(StringProperty input) {
|
||||
this.input = input;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: JavaTaskWithProperty.java
|
||||
public class JavaTaskWithProperty {
|
||||
private final StringProperty input;
|
||||
|
||||
public JavaTaskWithProperty(StringProperty input) {
|
||||
this.input = input;
|
||||
}
|
||||
|
||||
public StringProperty getInput() {
|
||||
return input;
|
||||
}
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
annotation class ValueContainer
|
||||
|
||||
data class StringProperty(var v: String): Property<String> {
|
||||
override fun set(v: String) {
|
||||
this.v = v
|
||||
}
|
||||
fun assign(v: String) {
|
||||
this.v = v
|
||||
}
|
||||
fun assign(v: Property<String>) {
|
||||
this.v = v.get()
|
||||
}
|
||||
override fun get(): String {
|
||||
return v
|
||||
}
|
||||
}
|
||||
|
||||
data class Task(val input: StringProperty)
|
||||
|
||||
fun `should work with assignment for raw type`(): String {
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.input = "OK"
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with assignment for wrapped type`(): String {
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.input = StringProperty("OK")
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with assignment with apply for raw type`(): String {
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.apply {
|
||||
input = "OK"
|
||||
}
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with assignment with apply for wrapped type`(): String {
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.apply {
|
||||
input = StringProperty("OK")
|
||||
}
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with extension function`(): String {
|
||||
fun StringProperty.assign(v: Int) = this.assign("OK")
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.input = 42
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with extension function for interface type`(): String {
|
||||
fun Property<String>.assign(v: Int) = this.set("OK")
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.input = 42
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with generic extension function`(): String {
|
||||
fun <T> Property<T>.assign(v: T) = this.set(v)
|
||||
data class IntProperty(var v: Int): Property<Int> {
|
||||
override fun set(v: Int) {
|
||||
this.v = v
|
||||
}
|
||||
override fun get() = this.v
|
||||
}
|
||||
data class IntTask(val input: IntProperty)
|
||||
val task = IntTask(IntProperty(0))
|
||||
task.input = 42
|
||||
|
||||
return if (task.input.get() != 42) {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with callable receiver`(): String {
|
||||
fun StringProperty.assign(r: StringProperty.() -> Unit) = r.invoke(this)
|
||||
val task = Task(StringProperty("Fail"))
|
||||
task.input = { this.set("OK") }
|
||||
|
||||
return if (task.input.get() != "OK") {
|
||||
"Fail: ${task.input.get()}"
|
||||
} else {
|
||||
"OK"
|
||||
}
|
||||
}
|
||||
|
||||
fun `should work with Java classes`(): String {
|
||||
var taskWithField = JavaTaskWithField(StringProperty("Fail"))
|
||||
taskWithField.input = "OK"
|
||||
if (taskWithField.input.get() != "OK") return "Fail for Java: ${taskWithField.input.get()}"
|
||||
taskWithField = JavaTaskWithField(StringProperty("Fail"))
|
||||
taskWithField.input = StringProperty("OK")
|
||||
if (taskWithField.input.get() != "OK") return "Fail for Java: ${taskWithField.input.get()}"
|
||||
|
||||
var taskWithProperty = JavaTaskWithProperty(StringProperty("Fail"))
|
||||
taskWithProperty.input = "OK"
|
||||
if (taskWithProperty.input.get() != "OK") return "Fail for Java: ${taskWithProperty.input.get()}"
|
||||
taskWithProperty = JavaTaskWithProperty(StringProperty("Fail"))
|
||||
taskWithProperty.input = StringProperty("OK")
|
||||
if (taskWithProperty.input.get() != "OK") return "Fail for Java: ${taskWithProperty.input.get()}"
|
||||
|
||||
return "OK"
|
||||
}
|
||||
|
||||
fun box(): String {
|
||||
var result = `should work with assignment for raw type`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with assignment for wrapped type`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with assignment with apply for raw type`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with assignment with apply for wrapped type`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with extension function`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with extension function for interface type`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with generic extension function`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with callable receiver`()
|
||||
if (result != "OK") return result
|
||||
|
||||
result = `should work with Java classes`()
|
||||
if (result != "OK") return result
|
||||
|
||||
return "OK"
|
||||
}
|
||||
Reference in New Issue
Block a user