Skip smap generation if there is no source information
#KT-7022 Fixed
This commit is contained in:
+68
-4
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user