Don't verify mapping files and proper packagemapper propagation

This commit is contained in:
Michael Bogdanov
2015-08-19 16:25:45 +03:00
parent 0883781f8c
commit 5581d4e207
12 changed files with 69 additions and 27 deletions
@@ -29,7 +29,7 @@ public abstract class AbstractBytecodeListingTest : CodegenTestCase() {
val ktFile = File(filename) val ktFile = File(filename)
val txtFile = File(ktFile.parent, ktFile.nameWithoutExtension + ".txt") val txtFile = File(ktFile.parent, ktFile.nameWithoutExtension + ".txt")
val generatedFiles = CodegenTestUtil.generateFiles(myEnvironment, myFiles) val generatedFiles = CodegenTestUtil.generateFiles(myEnvironment, myFiles)
.asList() .getClassFiles()
.sortedBy { it.relativePath } .sortedBy { it.relativePath }
.map { .map {
val cr = ClassReader(it.asByteArray()) val cr = ClassReader(it.asByteArray())
@@ -117,7 +117,7 @@ public class AbstractLineNumberTest extends TestCaseWithTmpdir {
private static List<Integer> extractActualLineNumbersFromBytecode(@NotNull GenerationState state, boolean testFunInvoke) { private static List<Integer> extractActualLineNumbersFromBytecode(@NotNull GenerationState state, boolean testFunInvoke) {
ClassFileFactory factory = state.getFactory(); ClassFileFactory factory = state.getFactory();
List<Integer> actualLineNumbers = Lists.newArrayList(); List<Integer> actualLineNumbers = Lists.newArrayList();
for (OutputFile outputFile : factory.asList()) { for (OutputFile outputFile : CodegenPackage.getClassFiles(factory)) {
if (PackageClassUtils.isPackageClassFqName(new FqName(FileUtil.getNameWithoutExtension(outputFile.getRelativePath())))) { if (PackageClassUtils.isPackageClassFqName(new FqName(FileUtil.getNameWithoutExtension(outputFile.getRelativePath())))) {
// Don't test line numbers in *Package facade classes // Don't test line numbers in *Package facade classes
continue; continue;
@@ -236,7 +236,7 @@ public abstract class CodegenTestCase extends UsefulTestCase {
private static boolean verifyAllFilesWithAsm(ClassFileFactory factory, ClassLoader loader) { private static boolean verifyAllFilesWithAsm(ClassFileFactory factory, ClassLoader loader) {
boolean noErrors = true; boolean noErrors = true;
for (OutputFile file : factory.asList()) { for (OutputFile file : CodegenPackage.getClassFiles(factory)) {
noErrors &= verifyWithAsm(file, loader); noErrors &= verifyWithAsm(file, loader);
} }
return noErrors; return noErrors;
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.codegen.state.GenerationState;
import org.jetbrains.kotlin.config.CompilerConfiguration; import org.jetbrains.kotlin.config.CompilerConfiguration;
import org.jetbrains.kotlin.resolve.AnalyzingUtils; import org.jetbrains.kotlin.resolve.AnalyzingUtils;
import org.jetbrains.kotlin.resolve.BindingTraceContext; import org.jetbrains.kotlin.resolve.BindingTraceContext;
import org.jetbrains.kotlin.resolve.lazy.JvmPackageMappingProvider;
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil;
import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.JetTestUtils;
import org.jetbrains.kotlin.utils.UtilsPackage; import org.jetbrains.kotlin.utils.UtilsPackage;
@@ -51,7 +52,8 @@ public class CodegenTestUtil {
public static ClassFileFactory generateFiles(@NotNull KotlinCoreEnvironment environment, @NotNull CodegenTestFiles files) { public static ClassFileFactory generateFiles(@NotNull KotlinCoreEnvironment environment, @NotNull CodegenTestFiles files) {
AnalysisResult analysisResult = JvmResolveUtil.analyzeFilesWithJavaIntegrationAndCheckForErrors( AnalysisResult analysisResult = JvmResolveUtil.analyzeFilesWithJavaIntegrationAndCheckForErrors(
environment.getProject(), environment.getProject(),
files.getPsiFiles() files.getPsiFiles(),
new JvmPackageMappingProvider(environment)
); );
analysisResult.throwIfError(); analysisResult.throwIfError();
AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext()); AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext());
@@ -44,7 +44,7 @@ public class DxChecker {
array[0] = "testArgs"; array[0] = "testArgs";
arguments.parse(array); arguments.parse(array);
for (OutputFile file : outputFiles.asList()) { for (OutputFile file : CodegenPackage.getClassFiles(outputFiles)) {
try { try {
byte[] bytes = file.asByteArray(); byte[] bytes = file.asByteArray();
checkFileWithDx(bytes, file.getRelativePath(), arguments); checkFileWithDx(bytes, file.getRelativePath(), arguments);
@@ -16,23 +16,15 @@
package org.jetbrains.kotlin.codegen; package org.jetbrains.kotlin.codegen;
import com.intellij.openapi.util.Ref
import com.intellij.openapi.util.text.StringUtil
import org.jetbrains.kotlin
import org.jetbrains.kotlin.backend.common.output.OutputFile import org.jetbrains.kotlin.backend.common.output.OutputFile
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.load.java.JvmAnnotationNames import org.jetbrains.kotlin.load.java.JvmAnnotationNames
import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass import org.jetbrains.kotlin.load.kotlin.FileBasedKotlinClass
import org.jetbrains.kotlin.load.kotlin.KotlinBinaryClassCache
import org.jetbrains.kotlin.load.kotlin.PackageClassUtils import org.jetbrains.kotlin.load.kotlin.PackageClassUtils
import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader import org.jetbrains.kotlin.load.kotlin.header.KotlinClassHeader
import org.jetbrains.kotlin.load.kotlin.header.ReadKotlinClassHeaderAnnotationVisitor
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.JetFile import org.jetbrains.kotlin.psi.JetFile
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.test.InTextDirectivesUtils import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.utils.join
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.util.ArrayList import java.util.ArrayList
@@ -43,7 +35,7 @@ public object InlineTestUtil {
public val INLINE_ANNOTATION_CLASS: String = "kotlin/inline" public val INLINE_ANNOTATION_CLASS: String = "kotlin/inline"
public fun checkNoCallsToInline(files: List<OutputFile>, sourceFiles: List<JetFile>) { public fun checkNoCallsToInline(files: Iterable<OutputFile>, sourceFiles: List<JetFile>) {
val inlineInfo = obtainInlineInfo(files) val inlineInfo = obtainInlineInfo(files)
val inlineMethods = inlineInfo.inlineMethods val inlineMethods = inlineInfo.inlineMethods
assert(!inlineMethods.isEmpty(), "There are no inline methods") assert(!inlineMethods.isEmpty(), "There are no inline methods")
@@ -64,7 +56,7 @@ public object InlineTestUtil {
} }
} }
private fun obtainInlineInfo(files: List<OutputFile>): InlineInfo { private fun obtainInlineInfo(files: Iterable<OutputFile>): InlineInfo {
val inlineMethods = HashSet<MethodInfo>() val inlineMethods = HashSet<MethodInfo>()
val classHeaders = hashMapOf<String, KotlinClassHeader>() val classHeaders = hashMapOf<String, KotlinClassHeader>()
@@ -93,7 +85,7 @@ public object InlineTestUtil {
return InlineInfo(inlineMethods, classHeaders) return InlineInfo(inlineMethods, classHeaders)
} }
private fun checkInlineMethodNotInvoked(files: List<OutputFile>, inlinedMethods: Set<MethodInfo>): List<NotInlinedCall> { private fun checkInlineMethodNotInvoked(files: Iterable<OutputFile>, inlinedMethods: Set<MethodInfo>): List<NotInlinedCall> {
val notInlined = ArrayList<NotInlinedCall>() val notInlined = ArrayList<NotInlinedCall>()
files.forEach { file -> files.forEach { file ->
@@ -128,7 +120,7 @@ public object InlineTestUtil {
return notInlined return notInlined
} }
private fun checkParametersInlined(files: List<OutputFile>, inlineInfo: InlineInfo): ArrayList<NotInlinedParameter> { private fun checkParametersInlined(files: Iterable<OutputFile>, inlineInfo: InlineInfo): ArrayList<NotInlinedParameter> {
val inlinedMethods = inlineInfo.inlineMethods val inlinedMethods = inlineInfo.inlineMethods
val notInlinedParameters = ArrayList<NotInlinedParameter>() val notInlinedParameters = ArrayList<NotInlinedParameter>()
for (file in files) { for (file in files) {
@@ -17,6 +17,8 @@
package org.jetbrains.kotlin.codegen.generated package org.jetbrains.kotlin.codegen.generated
import org.jetbrains.kotlin.codegen.InlineTestUtil import org.jetbrains.kotlin.codegen.InlineTestUtil
import org.jetbrains.kotlin.codegen.filterClassFiles
import org.jetbrains.kotlin.codegen.getClassFiles
import org.jetbrains.kotlin.jvm.compiler.AbstractSMAPBaseTest import org.jetbrains.kotlin.jvm.compiler.AbstractSMAPBaseTest
import java.io.File import java.io.File
@@ -28,8 +30,8 @@ public abstract class AbstractBlackBoxInlineCodegenTest : AbstractBlackBoxCodege
doTestMultiFile(inputFiles) doTestMultiFile(inputFiles)
try { try {
InlineTestUtil.checkNoCallsToInline(initializedClassLoader.getAllGeneratedFiles(), myFiles.getPsiFiles()) InlineTestUtil.checkNoCallsToInline(initializedClassLoader.allGeneratedFiles.filterClassFiles(), myFiles.getPsiFiles())
checkSMAP(myFiles.getPsiFiles(), generateClassesInFile().asList()) checkSMAP(myFiles.getPsiFiles(), generateClassesInFile().getClassFiles())
} }
catch (e: Throwable) { catch (e: Throwable) {
System.out.println(generateToText()) System.out.println(generateToText())
@@ -0,0 +1,27 @@
/*
* Copyright 2010-2015 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.codegen
import org.jetbrains.kotlin.backend.common.output.OutputFile
fun ClassFileFactory.getClassFiles(): Iterable<OutputFile> {
return asList().filterClassFiles()
}
fun List<OutputFile>.filterClassFiles(): Iterable<OutputFile> {
return filter { it.relativePath.endsWith(".class") }
}
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.jvm.compiler
import org.jetbrains.kotlin.codegen.ClassFileFactory import org.jetbrains.kotlin.codegen.ClassFileFactory
import org.jetbrains.kotlin.codegen.InlineTestUtil import org.jetbrains.kotlin.codegen.InlineTestUtil
import org.jetbrains.kotlin.codegen.filterClassFiles
import java.io.File import java.io.File
import java.util.Collections import java.util.Collections
@@ -31,8 +32,8 @@ public abstract class AbstractCompileKotlinAgainstInlineKotlinTest : AbstractCom
try { try {
val sourceFiles = factory1.getInputFiles() + factory2.getInputFiles() val sourceFiles = factory1.getInputFiles() + factory2.getInputFiles()
InlineTestUtil.checkNoCallsToInline(allGeneratedFiles, sourceFiles) InlineTestUtil.checkNoCallsToInline(allGeneratedFiles.filterClassFiles(), sourceFiles)
checkSMAP(sourceFiles, allGeneratedFiles) checkSMAP(sourceFiles, allGeneratedFiles.filterClassFiles())
} }
catch (e: Throwable) { catch (e: Throwable) {
System.out.println(factory1.createText() + "\n" + factory2.createText()) System.out.println(factory1.createText() + "\n" + factory2.createText())
@@ -35,8 +35,8 @@ import org.jetbrains.kotlin.resolve.BindingTrace;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.TopDownAnalysisMode; import org.jetbrains.kotlin.resolve.TopDownAnalysisMode;
import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM; import org.jetbrains.kotlin.resolve.jvm.TopDownAnalyzerFacadeForJVM;
import org.jetbrains.kotlin.resolve.lazy.JvmPackageMappingProvider;
import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil; import org.jetbrains.kotlin.resolve.lazy.JvmResolveUtil;
import org.jetbrains.kotlin.load.java.lazy.PackageMappingProvider;
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor; import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedClassDescriptor;
import org.jetbrains.kotlin.test.ConfigurationKind; import org.jetbrains.kotlin.test.ConfigurationKind;
import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.JetTestUtils;
@@ -156,7 +156,7 @@ public abstract class AbstractLoadJavaTest extends TestCaseWithTmpdir {
environment.getSourceFiles(), environment.getSourceFiles(),
trace, trace,
TopDownAnalysisMode.TopLevelDeclarations, TopDownAnalysisMode.TopLevelDeclarations,
PackageMappingProvider.EMPTY new JvmPackageMappingProvider(environment)
); );
PackageViewDescriptor packageView = moduleContext.getModule().getPackage(TEST_PACKAGE_FQNAME); PackageViewDescriptor packageView = moduleContext.getModule().getPackage(TEST_PACKAGE_FQNAME);
@@ -32,7 +32,7 @@ import java.io.File
public trait AbstractSMAPBaseTest { public trait AbstractSMAPBaseTest {
private fun extractSMAPFromClasses(outputFiles: List<OutputFile>): List<SMAPAndFile> { private fun extractSMAPFromClasses(outputFiles: Iterable<OutputFile>): List<SMAPAndFile> {
return outputFiles.map { outputFile -> return outputFiles.map { outputFile ->
if (PackageClassUtils.isPackageClassFqName(FqName(FileUtil.getNameWithoutExtension(outputFile.relativePath).replace('/', '.')))) { if (PackageClassUtils.isPackageClassFqName(FqName(FileUtil.getNameWithoutExtension(outputFile.relativePath).replace('/', '.')))) {
// Don't test line numbers in *Package facade classes // Don't test line numbers in *Package facade classes
@@ -65,7 +65,7 @@ public trait AbstractSMAPBaseTest {
return null; return null;
} }
fun checkSMAP(inputFiles: List<JetFile>, outputFiles: List<OutputFile>) { fun checkSMAP(inputFiles: List<JetFile>, outputFiles: Iterable<OutputFile>) {
if (!InlineCodegenUtil.GENERATE_SMAP) { if (!InlineCodegenUtil.GENERATE_SMAP) {
return return
} }
@@ -51,12 +51,21 @@ public class JvmResolveUtil {
public static AnalysisResult analyzeFilesWithJavaIntegrationAndCheckForErrors( public static AnalysisResult analyzeFilesWithJavaIntegrationAndCheckForErrors(
@NotNull Project project, @NotNull Project project,
@NotNull Collection<JetFile> files @NotNull Collection<JetFile> files
) {
return analyzeFilesWithJavaIntegrationAndCheckForErrors(project, files, PackageMappingProvider.EMPTY);
}
@NotNull
public static AnalysisResult analyzeFilesWithJavaIntegrationAndCheckForErrors(
@NotNull Project project,
@NotNull Collection<JetFile> files,
@NotNull PackageMappingProvider packageMappingProvider
) { ) {
for (JetFile file : files) { for (JetFile file : files) {
AnalyzingUtils.checkForSyntacticErrors(file); AnalyzingUtils.checkForSyntacticErrors(file);
} }
AnalysisResult analysisResult = analyzeFilesWithJavaIntegration(project, files); AnalysisResult analysisResult = analyzeFilesWithJavaIntegration(project, files, packageMappingProvider);
AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext()); AnalyzingUtils.throwExceptionOnErrors(analysisResult.getBindingContext());
@@ -67,11 +76,20 @@ public class JvmResolveUtil {
public static AnalysisResult analyzeFilesWithJavaIntegration( public static AnalysisResult analyzeFilesWithJavaIntegration(
@NotNull Project project, @NotNull Project project,
@NotNull Collection<JetFile> files @NotNull Collection<JetFile> files
) {
return analyzeFilesWithJavaIntegration(project, files, PackageMappingProvider.EMPTY);
}
@NotNull
public static AnalysisResult analyzeFilesWithJavaIntegration(
@NotNull Project project,
@NotNull Collection<JetFile> files,
@NotNull PackageMappingProvider packageMappingProvider
) { ) {
ModuleContext moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project, "java-integration-test"); ModuleContext moduleContext = TopDownAnalyzerFacadeForJVM.createContextWithSealedModule(project, "java-integration-test");
BindingTrace trace = new CliLightClassGenerationSupport.CliBindingTrace(); BindingTrace trace = new CliLightClassGenerationSupport.CliBindingTrace();
return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext(moduleContext, files, trace, null, null, PackageMappingProvider.EMPTY); return TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegrationWithCustomContext(moduleContext, files, trace, null, null, packageMappingProvider);
} }
} }