Do nothing if there is no smap data on anonymous object transfromation during fun inline

This commit is contained in:
Michael Bogdanov
2015-03-16 17:39:44 +03:00
parent 0999cd99e3
commit 90651e4b28
4 changed files with 20 additions and 10 deletions
@@ -48,8 +48,6 @@ public class AnonymousObjectTransformer {
private String debugInfo;
private SMAP smap;
private SourceMapper sourceMapper;
private final InliningContext inliningContext;
@@ -162,9 +160,13 @@ public class AnonymousObjectTransformer {
}, ClassReader.SKIP_FRAMES);
if (!inliningContext.isInliningLambda) {
assert debugInfo != null && !debugInfo.isEmpty() : "Debug info is null for " + oldObjectType;
smap = new SMAPParser(debugInfo, sourceInfo, "notused", 1, 2).parse();
sourceMapper = SourceMapper.Default.createFromSmap(smap);
if (debugInfo != null && !debugInfo.isEmpty()) {
sourceMapper = SourceMapper.OBJECT$.createFromSmap(SMAPParser.parse(debugInfo));
}
else {
//seems we can't do any clever mapping cause we don't know any about original class name
sourceMapper = IdenticalSourceMapper.INSTANCE$;
}
}
else {
classBuilder.visitSource(sourceInfo, debugInfo);
@@ -382,6 +382,7 @@ public class InlineCodegen extends CallGenerator {
@NotNull
@Override
//TODO: obtain name from context
public String getClassName() {
return className;
}
@@ -126,7 +126,7 @@ public class InlineCodegenUtil {
}
}, ClassReader.SKIP_FRAMES);
SMAP smap = new SMAPParser(debugInfo[1], debugInfo[0], classId.toString(), lines[0], lines[1]).parse();
SMAP smap = SMAPParser.parseOrCreateDefault(debugInfo[1], debugInfo[0], classId.toString(), lines[0], lines[1]);
return new SMAPAndMethodNode(node[0], smap);
}
@@ -16,11 +16,12 @@
package org.jetbrains.kotlin.codegen.inline
class SMAPParser(val mappingInfo: String?, val source: String, val path: String, val methodStartLine: Int, val methodEndLine: Int) {
import kotlin.platform.platformStatic
val fileMappings = linkedMapOf<Int, FileMapping>()
object SMAPParser {
fun parse() : SMAP {
[platformStatic]
public fun parseOrCreateDefault(mappingInfo: String?, source: String, path: String, methodStartLine: Int, methodEndLine: Int): SMAP {
if (mappingInfo == null || mappingInfo.isEmpty()) {
val fm = FileMapping(source, path)
if (methodStartLine <= methodEndLine) {
@@ -29,6 +30,12 @@ class SMAPParser(val mappingInfo: String?, val source: String, val path: String,
}
return SMAP(listOf(fm))
}
return parse(mappingInfo)
}
[platformStatic]
public fun parse(mappingInfo: String): SMAP {
val fileMappings = linkedMapOf<Int, FileMapping>()
val fileSectionStart = mappingInfo.indexOf(SMAP.FILE_SECTION) + SMAP.FILE_SECTION.length()
val lineSectionAnchor = mappingInfo.indexOf(SMAP.LINE_SECTION)
@@ -54,7 +61,7 @@ class SMAPParser(val mappingInfo: String?, val source: String, val path: String,
/*only simple mapping now*/
val targetSplit = lineMapping.indexOf(':')
val originalPart = lineMapping.substring(0, targetSplit)
var rangeSeparator = originalPart.indexOf(',').let { if (it < 0) targetSplit else it}
var rangeSeparator = originalPart.indexOf(',').let { if (it < 0) targetSplit else it }
val fileSeparator = lineMapping.indexOf('#')
val originalIndex = Integer.valueOf(originalPart.substring(0, fileSeparator))