Skip to content

Commit e7a353f

Browse files
author
Abduqodiri Qurbonzoda
authored
Fix parsing of the Measurement annotation in SuiteSourceGenerator (#127)
1 parent f3f1ba8 commit e7a353f

File tree

4 files changed

+68
-7
lines changed

4 files changed

+68
-7
lines changed
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package kotlinx.benchmark.integration
2+
3+
class AnnotationsSpecifier {
4+
private var isMeasurementSpecified: Boolean = false
5+
private var iterations: Int? = null
6+
private var time: Int? = null
7+
private var timeUnit: String? = null
8+
9+
fun measurement(iterations: Int, time: Int, timeUnit: String) {
10+
isMeasurementSpecified = true
11+
this.iterations = iterations
12+
this.time = time
13+
this.timeUnit = timeUnit
14+
}
15+
16+
fun replacementForLine(line: String): String {
17+
val trimmedLine = line.trimStart()
18+
val prefix = line.substring(0, line.length - trimmedLine.length)
19+
return when {
20+
isMeasurementSpecified && trimmedLine.startsWith("@Measurement") ->
21+
"$prefix@Measurement($iterations, $time, $timeUnit)"
22+
else ->
23+
line
24+
}
25+
}
26+
}

integration/src/main/kotlin/kotlinx/benchmark/integration/Runner.kt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,16 @@ class Runner(
3434

3535
private fun defaultArguments(): Array<String> = arrayOf("--stacktrace")
3636

37+
fun updateAnnotations(filePath: String, annotationsSpecifier: AnnotationsSpecifier.() -> Unit) {
38+
val annotations = AnnotationsSpecifier().also(annotationsSpecifier)
39+
val file = projectDir.resolve(filePath)
40+
val updatedLines = file.readLines().map { annotations.replacementForLine(it) }
41+
file.writeText(updatedLines.joinToString(separator = "\n"))
42+
}
43+
44+
fun generatedDir(targetName: String, filePath: String, fileTestAction: (File) -> Unit) {
45+
fileTestAction(
46+
projectDir.resolve("build/benchmarks/${targetName}/sources/kotlinx/benchmark/generated").resolve(filePath)
47+
)
48+
}
3749
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package kotlinx.benchmark.integration
2+
3+
import kotlin.test.*
4+
5+
class SuiteSourceGeneratorTest : GradleTest() {
6+
@Test
7+
fun measurementAnnotation() {
8+
project("kotlin-multiplatform", true).let { runner ->
9+
runner.updateAnnotations("src/commonMain/kotlin/CommonBenchmark.kt") {
10+
measurement(iterations = 5, time = 200, timeUnit = "BenchmarkTimeUnit.MILLISECONDS")
11+
}
12+
13+
runner.run("nativeBenchmarkGenerate")
14+
15+
runner.generatedDir("native", "test/CommonBenchmark_Descriptor.kt") { descriptorFile ->
16+
val text = descriptorFile.readText()
17+
val parameters = "iterations = 5, iterationTime = IterationTime\\(200, BenchmarkTimeUnit.MILLISECONDS\\)"
18+
.replace(" ", "\\s+").toRegex()
19+
assertTrue(text.contains(parameters), "Parameters: <$parameters> not found in <$text>")
20+
}
21+
}
22+
}
23+
}

plugin/main/src/kotlinx/benchmark/gradle/SuiteSourceGenerator.kt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -134,18 +134,18 @@ class SuiteSourceGenerator(val title: String, val module: ModuleDescriptor, val
134134
val outputTimeAnnotation = original.annotations.singleOrNull { it.fqName.toString() == outputTimeAnnotationFQN }
135135
val modeAnnotation = original.annotations.singleOrNull { it.fqName.toString() == modeAnnotationFQN }
136136

137-
val outputTimeUnitValue = outputTimeAnnotation?.argumentValue("value") as? EnumValue
137+
val outputTimeUnitValue = outputTimeAnnotation?.argumentValue("value") as EnumValue?
138138
val outputTimeUnit = outputTimeUnitValue?.enumEntryName?.toString()
139139

140140
@Suppress("UNCHECKED_CAST")
141-
val modesValue = modeAnnotation?.argumentValue("value")?.value as? List<EnumValue>
141+
val modesValue = modeAnnotation?.argumentValue("value")?.value as List<EnumValue>?
142142
val mode = modesValue?.single()?.enumEntryName?.toString()
143143

144-
val measureIterations = measureAnnotation?.argumentValue("iterations")?.value as? Int
145-
val measureIterationTime = measureAnnotation?.argumentValue("time")?.value as? Int
146-
val measureIterationTimeUnit = measureAnnotation?.argumentValue("timeUnit")?.value as? EnumValue
144+
val measureIterations = measureAnnotation?.argumentValue("iterations")?.value as Int?
145+
val measureIterationTime = measureAnnotation?.argumentValue("time")?.value as Int?
146+
val measureIterationTimeUnit = measureAnnotation?.argumentValue("timeUnit") as EnumValue?
147147

148-
val warmupIterations = warmupAnnotation?.argumentValue("iterations")?.value as? Int
148+
val warmupIterations = warmupAnnotation?.argumentValue("iterations")?.value as Int?
149149

150150
val iterations = measureIterations
151151
val iterationTime = measureIterationTime
@@ -203,7 +203,7 @@ class SuiteSourceGenerator(val title: String, val module: ModuleDescriptor, val
203203
val constant = annotation.argumentValue("value")
204204
?: error("@Param annotation should have at least one default value")
205205
@Suppress("UNCHECKED_CAST")
206-
val values = constant.value as? List<StringValue>
206+
val values = constant.value as List<StringValue>?
207207
?: error("@Param annotation should have at least one default value")
208208
values
209209
})

0 commit comments

Comments
 (0)