Effects: support cfg tests with stdlib

- Add method "doTestWithStdLib" which launches test with stdlib
- Change GenerateTests.kt to generate cfg tests with stdlib from
folders 'cfgWithStdLib' and 'cfgVariablesWithStdLib'

==========
Introduction of Effect System: 14/18
This commit is contained in:
Dmitry Savvinov
2017-10-03 15:02:48 +03:00
parent d20c770a25
commit a986999226
2 changed files with 38 additions and 7 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.cfg;
import com.google.common.collect.LinkedHashMultimap;
import com.google.common.collect.SetMultimap;
import com.google.common.collect.Sets;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import kotlin.jvm.functions.Function3;
import org.jetbrains.annotations.NotNull;
@@ -31,12 +32,19 @@ import org.jetbrains.kotlin.cfg.pseudocode.PseudocodeUtil;
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction;
import org.jetbrains.kotlin.cfg.pseudocode.instructions.InstructionImpl;
import org.jetbrains.kotlin.cfg.pseudocode.instructions.special.LocalFunctionDeclarationInstruction;
import org.jetbrains.kotlin.checkers.BaseDiagnosticsTest;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.codegen.CodegenTestCase;
import org.jetbrains.kotlin.config.ApiVersion;
import org.jetbrains.kotlin.config.CommonConfigurationKeysKt;
import org.jetbrains.kotlin.config.LanguageVersion;
import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl;
import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.BindingContext;
import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.InTextDirectivesUtils;
import org.jetbrains.kotlin.test.KotlinTestUtils;
import org.jetbrains.kotlin.test.KotlinTestWithEnvironment;
import org.jetbrains.kotlin.test.KotlinTestWithEnvironmentManagement;
import java.io.File;
import java.io.IOException;
@@ -44,18 +52,33 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
public abstract class AbstractPseudocodeTest extends KotlinTestWithEnvironment {
@Override
protected KotlinCoreEnvironment createEnvironment() {
return createEnvironmentWithMockJdk(ConfigurationKind.JDK_ONLY);
public abstract class AbstractPseudocodeTest extends KotlinTestWithEnvironmentManagement {
protected void doTestWithStdLib(String fileName) throws Exception {
doTestWithEnvironment(fileName, createEnvironmentWithMockJdk(ConfigurationKind.NO_KOTLIN_REFLECT));
}
protected void doTest(String fileName) throws Exception {
doTestWithEnvironment(fileName, createEnvironmentWithMockJdk(ConfigurationKind.JDK_ONLY));
}
private void updateEnvironmentWithLanguageVersionDirective(File file, KotlinCoreEnvironment environment) throws IOException {
String version = InTextDirectivesUtils.findStringWithPrefixes(FileUtil.loadFile(file, true), "// LANGUAGE_VERSION:");
if (version != null) {
LanguageVersion explicitVersion = LanguageVersion.fromVersionString(version);
CommonConfigurationKeysKt.setLanguageVersionSettings(
environment.getConfiguration(),
new LanguageVersionSettingsImpl(explicitVersion, ApiVersion.createByLanguageVersion(explicitVersion))
);
}
}
private void doTestWithEnvironment(String fileName, KotlinCoreEnvironment environment) throws Exception {
File file = new File(fileName);
KtFile jetFile = KotlinTestUtils.loadJetFile(getProject(), file);
updateEnvironmentWithLanguageVersionDirective(file, environment);
KtFile jetFile = KotlinTestUtils.loadJetFile(environment.getProject(), file);
SetMultimap<KtElement, Pseudocode> data = LinkedHashMultimap.create();
AnalysisResult analysisResult = KotlinTestUtils.analyzeFile(jetFile, getEnvironment());
AnalysisResult analysisResult = KotlinTestUtils.analyzeFile(jetFile, environment);
List<KtDeclaration> declarations = jetFile.getDeclarations();
BindingContext bindingContext = analysisResult.getBindingContext();
for (KtDeclaration declaration : declarations) {
@@ -118,6 +141,10 @@ public abstract class AbstractPseudocodeTest extends KotlinTestWithEnvironment {
label = (((KtPropertyAccessor) correspondingElement).isGetter() ? "get" : "set") + "_" + propertyName;
}
if (pseudocode.isInlined()) {
label = "inlined " + label;
}
instructionDump.append("== ").append(label).append(" ==\n");
instructionDump.append(correspondingElement.getText());
@@ -447,15 +447,19 @@ fun main(args: Array<String>) {
testClass<AbstractControlFlowTest> {
model("cfg")
model("cfgWithStdLib", testMethod = "doTestWithStdLib")
}
testClass<AbstractDataFlowTest> {
model("cfg-variables")
model("cfgVariablesWithStdLib", testMethod = "doTestWithStdLib")
}
testClass<AbstractPseudoValueTest> {
model("cfg")
model("cfgWithStdLib", testMethod = "doTestWithStdLib")
model("cfg-variables")
model("cfgVariablesWithStdLib", testMethod = "doTestWithStdLib")
}
testClass<AbstractAnnotationParameterTest> {