Primitive support for LocalVariables for function parameters

This commit is contained in:
Denis Vnukov
2018-08-07 08:25:57 -07:00
committed by Mikhael Bogdanov
parent 1a56af9bb0
commit 65c79ecfe9
21 changed files with 293 additions and 26 deletions
@@ -42,8 +42,8 @@ import java.util.regex.Pattern;
*/
public abstract class AbstractCheckLocalVariablesTableTest extends TestCaseWithTmpdir {
private File ktFile;
private KotlinCoreEnvironment environment;
protected File ktFile;
protected KotlinCoreEnvironment environment;
public AbstractCheckLocalVariablesTableTest() {
}
@@ -82,6 +82,10 @@ public abstract class AbstractCheckLocalVariablesTableTest extends TestCaseWithT
ClassReader cr = new ClassReader(outputFile.asByteArray());
List<LocalVariable> actualLocalVariables = readLocalVariable(cr, methodName);
doCompare(text, actualLocalVariables);
}
protected void doCompare(String text, List<LocalVariable> actualLocalVariables) {
KotlinTestUtils.assertEqualsToFile(ktFile, text.substring(0, text.indexOf("// VARIABLE : ")) + getActualVariablesAsString(actualLocalVariables));
}
@@ -93,8 +97,7 @@ public abstract class AbstractCheckLocalVariablesTableTest extends TestCaseWithT
return builder.toString();
}
private static class LocalVariable {
protected static class LocalVariable {
private final String name;
private final String type;
private final int index;
@@ -0,0 +1,47 @@
/*
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
* that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.codegen.ir
import com.intellij.openapi.util.Comparing
import org.jetbrains.kotlin.codegen.AbstractCheckLocalVariablesTableTest
import org.jetbrains.kotlin.config.JVMConfigurationKeys
import org.junit.ComparisonFailure
import java.nio.charset.Charset
abstract class AbstractIrCheckLocalVariablesTableTest : AbstractCheckLocalVariablesTableTest() {
@Throws(Exception::class)
override fun setUp() {
super.setUp()
assert(environment != null)
environment.configuration.put(JVMConfigurationKeys.IR, true)
}
override fun doCompare(text: String?, actualLocalVariables: MutableList<LocalVariable>) {
val actual = getActualVariablesAsList(actualLocalVariables)
val expected = getExpectedVariablesAsList()
if (!Comparing.equal(expected, actual)) {
throw ComparisonFailure(
"Variables differ from expected",
expected.joinToString("\n"),
actual.joinToString("\n")
)
}
}
private fun getActualVariablesAsList(list: List<LocalVariable>): List<String> {
return list.map { it.toString() }
.map { line -> line.replaceFirst("INDEX=\\d+".toRegex(), "INDEX=*") } // Ignore index
.sorted()
}
private fun getExpectedVariablesAsList(): List<String> {
return ktFile.readLines(Charset.forName("utf-8"))
.filter { line -> line.startsWith("// VARIABLE ") }
.filter { !it.contains("NAME=\$i\$") }
.map { line -> line.replaceFirst("INDEX=\\d+".toRegex(), "INDEX=*") } // Ignore index
.sorted()
}
}