Skip smap generation if there is no source information

#KT-7022 Fixed
This commit is contained in:
Michael Bogdanov
2015-03-17 15:54:48 +03:00
parent c945a53eec
commit 6e55ea6480
5 changed files with 137 additions and 17 deletions
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.jvm.compiler;
import com.google.common.collect.Iterables;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.analyzer.AnalysisResult;
@@ -38,11 +39,12 @@ import org.jetbrains.kotlin.test.*;
import org.jetbrains.kotlin.test.util.DescriptorValidator;
import org.jetbrains.kotlin.test.util.RecursiveDescriptorComparator;
import org.jetbrains.kotlin.utils.UtilsPackage;
import org.jetbrains.org.objectweb.asm.ClassReader;
import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.ClassWriter;
import org.jetbrains.org.objectweb.asm.Opcodes;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.*;
import java.util.*;
import java.util.jar.JarEntry;
import java.util.jar.JarFile;
@@ -210,4 +212,66 @@ public class CompileKotlinAgainstCustomBinariesTest extends TestCaseWithTmpdir {
JetTestUtils.assertEqualsToFile(new File(getTestDataDirectory(), "output.txt"), output);
}
/*test source mapping generation when source info is absent*/
public void testInlineFunWithoutDebugInfo() throws Exception {
File inlineSource = new File(getTestDataDirectory(), "sourceInline.kt");
CliBaseTest.executeCompilerGrabOutput(new K2JVMCompiler(), Arrays.asList(
inlineSource.getPath(),
"-d", tmpdir.getPath()
));
File inlineFunClass = new File(tmpdir.getAbsolutePath(), "test/A.class");
ClassReader reader = new ClassReader(new FileInputStream(inlineFunClass));
ClassWriter cw = new ClassWriter(Opcodes.ASM5);
reader.accept(new ClassVisitor(Opcodes.ASM5, cw) {
@Override
public void visitSource(String source, String debug) {
//skip debug info
}
}, 0);
assert inlineFunClass.delete();
assert !inlineFunClass.exists();
FileOutputStream stream = new FileOutputStream(inlineFunClass);
try {
stream.write(cw.toByteArray());
}
finally {
stream.close();
}
File resultSource = new File(getTestDataDirectory(), "source.kt");
CliBaseTest.executeCompilerGrabOutput(new K2JVMCompiler(), Arrays.asList(
resultSource.getPath(),
"-classpath", tmpdir.getPath(),
"-d", tmpdir.getPath()
));
File resultFile = new File(tmpdir.getAbsolutePath(), "test/B.class");
reader = new ClassReader(new FileInputStream(resultFile));
final Ref<String> debugInfo = new Ref<String>();
reader.accept(new ClassVisitor(Opcodes.ASM5) {
@Override
public void visitSource(String source, String debug) {
//skip debug info
debugInfo.set(debug);
}
}, 0);
String expected = "SMAP\n" +
"source.kt\n" +
"Kotlin\n" +
"*S Kotlin\n" +
"*F\n" +
"+ 1 source.kt\n" +
"test/B\n" +
"*L\n" +
"1#1,13:1\n" +
"*E\n";
assertEquals(expected, debugInfo.get());
}
}