RegenerationInfo renamed to TransformationInfo

This commit is contained in:
Michael Bogdanov
2016-03-11 14:29:58 +03:00
parent c062fff633
commit b88260b4f9
4 changed files with 60 additions and 60 deletions
@@ -34,7 +34,7 @@ import java.util.*;
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil.isThis0; import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtil.isThis0;
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin.NO_ORIGIN;
public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjectRegenerationInfo> { public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjectTransformationInfo> {
protected final GenerationState state; protected final GenerationState state;
@@ -59,23 +59,23 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
private final Map<String, List<String>> fieldNames = new HashMap<String, List<String>>(); private final Map<String, List<String>> fieldNames = new HashMap<String, List<String>>();
public AnonymousObjectTransformer( public AnonymousObjectTransformer(
@NotNull AnonymousObjectRegenerationInfo regenerationInfo, @NotNull AnonymousObjectTransformationInfo transformationInfo,
@NotNull InliningContext inliningContext, @NotNull InliningContext inliningContext,
boolean isSameModule, boolean isSameModule,
@NotNull Type newLambdaType @NotNull Type newLambdaType
) { ) {
super(regenerationInfo, inliningContext.state); super(transformationInfo, inliningContext.state);
this.isSameModule = isSameModule; this.isSameModule = isSameModule;
this.state = inliningContext.state; this.state = inliningContext.state;
this.typeMapper = state.getTypeMapper(); this.typeMapper = state.getTypeMapper();
this.inliningContext = inliningContext; this.inliningContext = inliningContext;
this.oldObjectType = Type.getObjectType(regenerationInfo.getOldClassName()); this.oldObjectType = Type.getObjectType(transformationInfo.getOldClassName());
this.newLambdaType = newLambdaType; this.newLambdaType = newLambdaType;
} }
@Override @Override
@NotNull @NotNull
public InlineResult doTransform(@NotNull AnonymousObjectRegenerationInfo regenerationInfo, @NotNull FieldRemapper parentRemapper) { public InlineResult doTransform(@NotNull AnonymousObjectTransformationInfo transformationInfo, @NotNull FieldRemapper parentRemapper) {
final List<InnerClassNode> innerClassNodes = new ArrayList<InnerClassNode>(); final List<InnerClassNode> innerClassNodes = new ArrayList<InnerClassNode>();
ClassBuilder classBuilder = createRemappingClassBuilderViaFactory(inliningContext); ClassBuilder classBuilder = createRemappingClassBuilderViaFactory(inliningContext);
final List<MethodNode> methodsToTransform = new ArrayList<MethodNode>(); final List<MethodNode> methodsToTransform = new ArrayList<MethodNode>();
@@ -155,13 +155,13 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
ParametersBuilder constructorParamBuilder = ParametersBuilder.newBuilder(); ParametersBuilder constructorParamBuilder = ParametersBuilder.newBuilder();
List<CapturedParamInfo> additionalFakeParams = List<CapturedParamInfo> additionalFakeParams =
extractParametersMappingAndPatchConstructor(constructor, allCapturedParamBuilder, constructorParamBuilder, extractParametersMappingAndPatchConstructor(constructor, allCapturedParamBuilder, constructorParamBuilder,
regenerationInfo, parentRemapper); transformationInfo, parentRemapper);
List<MethodVisitor> deferringMethods = new ArrayList<MethodVisitor>(); List<MethodVisitor> deferringMethods = new ArrayList<MethodVisitor>();
for (MethodNode next : methodsToTransform) { for (MethodNode next : methodsToTransform) {
MethodVisitor deferringVisitor = newMethod(classBuilder, next); MethodVisitor deferringVisitor = newMethod(classBuilder, next);
InlineResult funResult = InlineResult funResult =
inlineMethodAndUpdateGlobalResult(regenerationInfo, parentRemapper, deferringVisitor, next, allCapturedParamBuilder, false); inlineMethodAndUpdateGlobalResult(transformationInfo, parentRemapper, deferringVisitor, next, allCapturedParamBuilder, false);
Type returnType = Type.getReturnType(next.desc); Type returnType = Type.getReturnType(next.desc);
if (!AsmUtil.isPrimitive(returnType)) { if (!AsmUtil.isPrimitive(returnType)) {
@@ -178,7 +178,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
method.visitEnd(); method.visitEnd();
} }
generateConstructorAndFields(classBuilder, allCapturedParamBuilder, constructorParamBuilder, regenerationInfo, parentRemapper, additionalFakeParams); generateConstructorAndFields(classBuilder, allCapturedParamBuilder, constructorParamBuilder, transformationInfo, parentRemapper, additionalFakeParams);
SourceMapper.Companion.flushToClassBuilder(sourceMapper, classBuilder); SourceMapper.Companion.flushToClassBuilder(sourceMapper, classBuilder);
@@ -201,14 +201,14 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
@NotNull @NotNull
private InlineResult inlineMethodAndUpdateGlobalResult( private InlineResult inlineMethodAndUpdateGlobalResult(
@NotNull AnonymousObjectRegenerationInfo regenerationInfo, @NotNull AnonymousObjectTransformationInfo transformationInfo,
@NotNull FieldRemapper parentRemapper, @NotNull FieldRemapper parentRemapper,
@NotNull MethodVisitor deferringVisitor, @NotNull MethodVisitor deferringVisitor,
@NotNull MethodNode next, @NotNull MethodNode next,
@NotNull ParametersBuilder allCapturedParamBuilder, @NotNull ParametersBuilder allCapturedParamBuilder,
boolean isConstructor boolean isConstructor
) { ) {
InlineResult funResult = inlineMethod(regenerationInfo, parentRemapper, deferringVisitor, next, allCapturedParamBuilder, isConstructor); InlineResult funResult = inlineMethod(transformationInfo, parentRemapper, deferringVisitor, next, allCapturedParamBuilder, isConstructor);
transformationResult.addAllClassesToRemove(funResult); transformationResult.addAllClassesToRemove(funResult);
transformationResult.getReifiedTypeParametersUsages().mergeAll(funResult.getReifiedTypeParametersUsages()); transformationResult.getReifiedTypeParametersUsages().mergeAll(funResult.getReifiedTypeParametersUsages());
return funResult; return funResult;
@@ -216,7 +216,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
@NotNull @NotNull
private InlineResult inlineMethod( private InlineResult inlineMethod(
@NotNull AnonymousObjectRegenerationInfo regenerationInfo, @NotNull AnonymousObjectTransformationInfo transformationInfo,
@NotNull FieldRemapper parentRemapper, @NotNull FieldRemapper parentRemapper,
@NotNull MethodVisitor deferringVisitor, @NotNull MethodVisitor deferringVisitor,
@NotNull MethodNode sourceNode, @NotNull MethodNode sourceNode,
@@ -228,7 +228,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
RegeneratedLambdaFieldRemapper remapper = RegeneratedLambdaFieldRemapper remapper =
new RegeneratedLambdaFieldRemapper(oldObjectType.getInternalName(), newLambdaType.getInternalName(), new RegeneratedLambdaFieldRemapper(oldObjectType.getInternalName(), newLambdaType.getInternalName(),
parameters, regenerationInfo.getCapturedLambdasToInline(), parameters, transformationInfo.getCapturedLambdasToInline(),
parentRemapper, isConstructor); parentRemapper, isConstructor);
MethodInliner inliner = MethodInliner inliner =
@@ -238,12 +238,12 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
inliningContext.subInline(inliningContext.nameGenerator.subGenerator("lambda")), inliningContext.subInline(inliningContext.nameGenerator.subGenerator("lambda")),
remapper, remapper,
isSameModule, isSameModule,
"Transformer for " + regenerationInfo.getOldClassName(), "Transformer for " + transformationInfo.getOldClassName(),
sourceMapper, sourceMapper,
new InlineCallSiteInfo( new InlineCallSiteInfo(
regenerationInfo.getOldClassName(), transformationInfo.getOldClassName(),
sourceNode.name, sourceNode.name,
isConstructor ? regenerationInfo.getNewConstructorDescriptor() : sourceNode.desc), isConstructor ? transformationInfo.getNewConstructorDescriptor() : sourceNode.desc),
null null
); );
@@ -257,7 +257,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
@NotNull ClassBuilder classBuilder, @NotNull ClassBuilder classBuilder,
@NotNull ParametersBuilder allCapturedBuilder, @NotNull ParametersBuilder allCapturedBuilder,
@NotNull ParametersBuilder constructorInlineBuilder, @NotNull ParametersBuilder constructorInlineBuilder,
@NotNull AnonymousObjectRegenerationInfo regenerationInfo, @NotNull AnonymousObjectTransformationInfo transformationInfo,
@NotNull FieldRemapper parentRemapper, @NotNull FieldRemapper parentRemapper,
@NotNull List<CapturedParamInfo> constructorAdditionalFakeParams @NotNull List<CapturedParamInfo> constructorAdditionalFakeParams
) { ) {
@@ -285,7 +285,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, descTypes.toArray(new Type[descTypes.size()])); String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, descTypes.toArray(new Type[descTypes.size()]));
//TODO for inline method make public class //TODO for inline method make public class
regenerationInfo.setNewConstructorDescriptor(constructorDescriptor); transformationInfo.setNewConstructorDescriptor(constructorDescriptor);
MethodVisitor constructorVisitor = classBuilder.newMethod(NO_ORIGIN, MethodVisitor constructorVisitor = classBuilder.newMethod(NO_ORIGIN,
AsmUtil.NO_FLAG_PACKAGE_PRIVATE, AsmUtil.NO_FLAG_PACKAGE_PRIVATE,
"<init>", constructorDescriptor, "<init>", constructorDescriptor,
@@ -323,7 +323,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
} }
} }
inlineMethodAndUpdateGlobalResult(regenerationInfo, parentRemapper, capturedFieldInitializer, constructor, constructorInlineBuilder, true); inlineMethodAndUpdateGlobalResult(transformationInfo, parentRemapper, capturedFieldInitializer, constructor, constructorInlineBuilder, true);
constructorVisitor.visitEnd(); constructorVisitor.visitEnd();
AsmUtil.genClosureFields(TransformationUtilsKt.toNameTypePair(TransformationUtilsKt.filterSkipped(newFieldsWithSkipped)), classBuilder); AsmUtil.genClosureFields(TransformationUtilsKt.toNameTypePair(TransformationUtilsKt.filterSkipped(newFieldsWithSkipped)), classBuilder);
} }
@@ -367,20 +367,20 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
@NotNull MethodNode constructor, @NotNull MethodNode constructor,
@NotNull ParametersBuilder capturedParamBuilder, @NotNull ParametersBuilder capturedParamBuilder,
@NotNull ParametersBuilder constructorParamBuilder, @NotNull ParametersBuilder constructorParamBuilder,
@NotNull final AnonymousObjectRegenerationInfo regenerationInfo, @NotNull final AnonymousObjectTransformationInfo transformationInfo,
@NotNull FieldRemapper parentFieldRemapper @NotNull FieldRemapper parentFieldRemapper
) { ) {
CapturedParamOwner owner = new CapturedParamOwner() { CapturedParamOwner owner = new CapturedParamOwner() {
@Override @Override
public Type getType() { public Type getType() {
return Type.getObjectType(regenerationInfo.getOldClassName()); return Type.getObjectType(transformationInfo.getOldClassName());
} }
}; };
Set<LambdaInfo> capturedLambdas = new LinkedHashSet<LambdaInfo>(); //captured var of inlined parameter Set<LambdaInfo> capturedLambdas = new LinkedHashSet<LambdaInfo>(); //captured var of inlined parameter
List<CapturedParamInfo> constructorAdditionalFakeParams = new ArrayList<CapturedParamInfo>(); List<CapturedParamInfo> constructorAdditionalFakeParams = new ArrayList<CapturedParamInfo>();
Map<Integer, LambdaInfo> indexToLambda = regenerationInfo.getLambdasToInline(); Map<Integer, LambdaInfo> indexToLambda = transformationInfo.getLambdasToInline();
Set<Integer> capturedParams = new HashSet<Integer>(); Set<Integer> capturedParams = new HashSet<Integer>();
//load captured parameters and patch instruction list (NB: there is also could be object fields) //load captured parameters and patch instruction list (NB: there is also could be object fields)
@@ -423,7 +423,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
} }
constructorParamBuilder.addThis(oldObjectType, false); constructorParamBuilder.addThis(oldObjectType, false);
String constructorDesc = regenerationInfo.getConstructorDesc(); String constructorDesc = transformationInfo.getConstructorDesc();
if (constructorDesc == null) { if (constructorDesc == null) {
// in case of anonymous object with empty closure // in case of anonymous object with empty closure
@@ -498,8 +498,8 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
constructorParamBuilder.addCapturedParam(recapturedParamInfo, recapturedParamInfo.getNewFieldName()).setRemapValue(composed); constructorParamBuilder.addCapturedParam(recapturedParamInfo, recapturedParamInfo.getNewFieldName()).setRemapValue(composed);
} }
regenerationInfo.setAllRecapturedParameters(allRecapturedParameters); transformationInfo.setAllRecapturedParameters(allRecapturedParameters);
regenerationInfo.setCapturedLambdasToInline(capturedLambdasToInline); transformationInfo.setCapturedLambdasToInline(capturedLambdasToInline);
return constructorAdditionalFakeParams; return constructorAdditionalFakeParams;
} }
@@ -63,7 +63,7 @@ public class MethodInliner {
private final List<InvokeCall> invokeCalls = new ArrayList<InvokeCall>(); private final List<InvokeCall> invokeCalls = new ArrayList<InvokeCall>();
//keeps order //keeps order
private final List<AnonymousObjectRegenerationInfo> anonymousObjectRegenerations = new ArrayList<AnonymousObjectRegenerationInfo>(); private final List<AnonymousObjectTransformationInfo> anonymousObjectRegenerations = new ArrayList<AnonymousObjectTransformationInfo>();
//current state //current state
private final Map<String, String> currentTypeMapping = new HashMap<String, String>(); private final Map<String, String> currentTypeMapping = new HashMap<String, String>();
@@ -160,7 +160,7 @@ public class MethodInliner {
final MethodNode resultNode = new MethodNode(node.access, node.name, node.desc, node.signature, null); final MethodNode resultNode = new MethodNode(node.access, node.name, node.desc, node.signature, null);
final Iterator<AnonymousObjectRegenerationInfo> iterator = anonymousObjectRegenerations.iterator(); final Iterator<AnonymousObjectTransformationInfo> iterator = anonymousObjectRegenerations.iterator();
final TypeRemapper remapper = TypeRemapper.createFrom(currentTypeMapping); final TypeRemapper remapper = TypeRemapper.createFrom(currentTypeMapping);
final RemappingMethodAdapter remappingMethodAdapter = new RemappingMethodAdapter( final RemappingMethodAdapter remappingMethodAdapter = new RemappingMethodAdapter(
@@ -173,17 +173,17 @@ public class MethodInliner {
final int markerShift = InlineCodegenUtil.calcMarkerShift(parameters, node); final int markerShift = InlineCodegenUtil.calcMarkerShift(parameters, node);
InlineAdapter lambdaInliner = new InlineAdapter(remappingMethodAdapter, parameters.getArgsSizeOnStack(), sourceMapper) { InlineAdapter lambdaInliner = new InlineAdapter(remappingMethodAdapter, parameters.getArgsSizeOnStack(), sourceMapper) {
private AnonymousObjectRegenerationInfo anonymousObjectGen; private AnonymousObjectTransformationInfo transformationInfo;
private void handleAnonymousObjectRegeneration() { private void handleAnonymousObjectRegeneration() {
anonymousObjectGen = iterator.next(); transformationInfo = iterator.next();
if (anonymousObjectGen.shouldRegenerate(isSameModule)) { if (transformationInfo.shouldRegenerate(isSameModule)) {
//TODO: need poping of type but what to do with local funs??? //TODO: need poping of type but what to do with local funs???
String oldClassName = anonymousObjectGen.getOldClassName(); String oldClassName = transformationInfo.getOldClassName();
String newClassName = anonymousObjectGen.getNewClassName(); String newClassName = transformationInfo.getNewClassName();
remapper.addMapping(oldClassName, newClassName); remapper.addMapping(oldClassName, newClassName);
AnonymousObjectTransformer transformer = AnonymousObjectTransformer transformer =
new AnonymousObjectTransformer((AnonymousObjectRegenerationInfo) anonymousObjectGen, new AnonymousObjectTransformer((AnonymousObjectTransformationInfo) transformationInfo,
inliningContext inliningContext
.subInlineWithClassRegeneration( .subInlineWithClassRegeneration(
inliningContext.nameGenerator, inliningContext.nameGenerator,
@@ -192,11 +192,11 @@ public class MethodInliner {
isSameModule, Type.getObjectType(newClassName) isSameModule, Type.getObjectType(newClassName)
); );
InlineResult transformResult = transformer.doTransform(anonymousObjectGen, nodeRemapper); InlineResult transformResult = transformer.doTransform(transformationInfo, nodeRemapper);
result.addAllClassesToRemove(transformResult); result.addAllClassesToRemove(transformResult);
result.addChangedType(oldClassName, newClassName); result.addChangedType(oldClassName, newClassName);
if (inliningContext.isInliningLambda && anonymousObjectGen.canRemoveAfterTransformation()) { if (inliningContext.isInliningLambda && transformationInfo.canRemoveAfterTransformation()) {
// this class is transformed and original not used so we should remove original one after inlining // this class is transformed and original not used so we should remove original one after inlining
result.addClassToRemove(oldClassName); result.addClassToRemove(oldClassName);
} }
@@ -214,7 +214,7 @@ public class MethodInliner {
handleAnonymousObjectRegeneration(); handleAnonymousObjectRegeneration();
} }
//in case of regenerated anonymousObjectGen type would be remapped to new one via remappingMethodAdapter //in case of regenerated transformationInfo type would be remapped to new one via remappingMethodAdapter
super.anew(type); super.anew(type);
} }
@@ -269,22 +269,22 @@ public class MethodInliner {
} }
} }
else if (isAnonymousConstructorCall(owner, name)) { //TODO add method else if (isAnonymousConstructorCall(owner, name)) { //TODO add method
assert anonymousObjectGen != null : "<init> call not corresponds to new call" + owner + " " + name; assert transformationInfo != null : "<init> call not corresponds to new call" + owner + " " + name;
if (anonymousObjectGen.shouldRegenerate(isSameModule)) { if (transformationInfo.shouldRegenerate(isSameModule)) {
//put additional captured parameters on stack //put additional captured parameters on stack
for (CapturedParamDesc capturedParamDesc : anonymousObjectGen.getAllRecapturedParameters()) { for (CapturedParamDesc capturedParamDesc : transformationInfo.getAllRecapturedParameters()) {
visitFieldInsn(Opcodes.GETSTATIC, capturedParamDesc.getContainingLambdaName(), visitFieldInsn(Opcodes.GETSTATIC, capturedParamDesc.getContainingLambdaName(),
"$$$" + capturedParamDesc.getFieldName(), capturedParamDesc.getType().getDescriptor()); "$$$" + capturedParamDesc.getFieldName(), capturedParamDesc.getType().getDescriptor());
} }
String newInternalName = anonymousObjectGen.getNewClassName(); String newInternalName = transformationInfo.getNewClassName();
super.visitMethodInsn(opcode, newInternalName, name, anonymousObjectGen.getNewConstructorDescriptor(), itf); super.visitMethodInsn(opcode, newInternalName, name, transformationInfo.getNewConstructorDescriptor(), itf);
//TODO: add new inner class also for other contexts //TODO: add new inner class also for other contexts
if (inliningContext.getParent() instanceof RegeneratedClassContext) { if (inliningContext.getParent() instanceof RegeneratedClassContext) {
inliningContext.getParent().typeRemapper.addAdditionalMappings(anonymousObjectGen.getOldClassName(), newInternalName); inliningContext.getParent().typeRemapper.addAdditionalMappings(transformationInfo.getOldClassName(), newInternalName);
} }
anonymousObjectGen = null; transformationInfo = null;
} else { } else {
super.visitMethodInsn(opcode, changeOwnerForExternalPackage(owner, opcode), name, desc, itf); super.visitMethodInsn(opcode, changeOwnerForExternalPackage(owner, opcode), name, desc, itf);
} }
@@ -499,7 +499,7 @@ public class MethodInliner {
String owner = fieldInsnNode.owner; String owner = fieldInsnNode.owner;
if (isAnonymousSingletonLoad(owner, fieldInsnNode.name)) { if (isAnonymousSingletonLoad(owner, fieldInsnNode.name)) {
anonymousObjectRegenerations.add( anonymousObjectRegenerations.add(
new AnonymousObjectRegenerationInfo( new AnonymousObjectTransformationInfo(
owner, awaitClassReification, isAlreadyRegenerated(owner), true, owner, awaitClassReification, isAlreadyRegenerated(owner), true,
inliningContext.nameGenerator inliningContext.nameGenerator
) )
@@ -550,13 +550,13 @@ public class MethodInliner {
} }
@NotNull @NotNull
private AnonymousObjectRegenerationInfo buildConstructorInvocation( private AnonymousObjectTransformationInfo buildConstructorInvocation(
@NotNull String anonymousType, @NotNull String anonymousType,
@NotNull String desc, @NotNull String desc,
@NotNull Map<Integer, LambdaInfo> lambdaMapping, @NotNull Map<Integer, LambdaInfo> lambdaMapping,
boolean needReification boolean needReification
) { ) {
return new AnonymousObjectRegenerationInfo( return new AnonymousObjectTransformationInfo(
anonymousType, needReification, lambdaMapping, anonymousType, needReification, lambdaMapping,
inliningContext.classRegeneration, inliningContext.classRegeneration,
isAlreadyRegenerated(anonymousType), isAlreadyRegenerated(anonymousType),
@@ -23,7 +23,7 @@ import org.jetbrains.org.objectweb.asm.ClassReader
import org.jetbrains.org.objectweb.asm.ClassVisitor import org.jetbrains.org.objectweb.asm.ClassVisitor
import org.jetbrains.org.objectweb.asm.Type import org.jetbrains.org.objectweb.asm.Type
abstract class ObjectTransformer<T : RegenerationInfo>(val regenerationInfo: T, val state: GenerationState) { abstract class ObjectTransformer<T : TransformationInfo>(val transformationInfo: T, val state: GenerationState) {
abstract fun doTransform(info: T, parentRemapper: FieldRemapper): InlineResult abstract fun doTransform(info: T, parentRemapper: FieldRemapper): InlineResult
@@ -33,7 +33,7 @@ abstract class ObjectTransformer<T : RegenerationInfo>(val regenerationInfo: T,
protected fun createRemappingClassBuilderViaFactory(inliningContext: InliningContext): ClassBuilder { protected fun createRemappingClassBuilderViaFactory(inliningContext: InliningContext): ClassBuilder {
val classBuilder = state.factory.newVisitor( val classBuilder = state.factory.newVisitor(
JvmDeclarationOrigin.NO_ORIGIN, JvmDeclarationOrigin.NO_ORIGIN,
Type.getObjectType(regenerationInfo.newClassName), Type.getObjectType(transformationInfo.newClassName),
inliningContext.root.callElement.containingFile inliningContext.root.callElement.containingFile
) )
@@ -44,20 +44,20 @@ abstract class ObjectTransformer<T : RegenerationInfo>(val regenerationInfo: T,
fun createClassReader(): ClassReader { fun createClassReader(): ClassReader {
return InlineCodegenUtil.buildClassReaderByInternalName(state, regenerationInfo.oldClassName) return InlineCodegenUtil.buildClassReaderByInternalName(state, transformationInfo.oldClassName)
} }
} }
class WhenMappingTransformer( class WhenMappingTransformer(
whenObjectRegenerationInfo: WhenMappingRegenerationInfo, whenObjectRegenerationInfo: WhenMappingTransformationInfo,
state: GenerationState, state: GenerationState,
val inliningContext: InliningContext val inliningContext: InliningContext
) : ObjectTransformer<WhenMappingRegenerationInfo>(whenObjectRegenerationInfo, state) { ) : ObjectTransformer<WhenMappingTransformationInfo>(whenObjectRegenerationInfo, state) {
override fun doTransform(info: WhenMappingRegenerationInfo, parentRemapper: FieldRemapper): InlineResult { override fun doTransform(info: WhenMappingTransformationInfo, parentRemapper: FieldRemapper): InlineResult {
val classReader = createClassReader() val classReader = createClassReader()
//TODO add additional check that it's when mapping //TODO add additional check that class is when mapping
val classBuilder = createRemappingClassBuilderViaFactory(inliningContext) val classBuilder = createRemappingClassBuilderViaFactory(inliningContext)
classReader.accept(object : ClassVisitor(InlineCodegenUtil.API, classBuilder.visitor) { classReader.accept(object : ClassVisitor(InlineCodegenUtil.API, classBuilder.visitor) {
@@ -18,19 +18,19 @@ package org.jetbrains.kotlin.codegen.inline
import java.util.* import java.util.*
abstract class RegenerationInfo() { interface TransformationInfo {
abstract val oldClassName: String val oldClassName: String
abstract val newClassName: String val newClassName: String
abstract fun shouldRegenerate(sameModule: Boolean): Boolean fun shouldRegenerate(sameModule: Boolean): Boolean
abstract fun canRemoveAfterTransformation(): Boolean fun canRemoveAfterTransformation(): Boolean
} }
class WhenMappingRegenerationInfo(override val oldClassName: String, val nameGenerator: NameGenerator) : RegenerationInfo() { class WhenMappingTransformationInfo(override val oldClassName: String, val nameGenerator: NameGenerator) : TransformationInfo {
override val newClassName by lazy { override val newClassName by lazy {
nameGenerator.genLambdaClassName() + oldClassName.substringAfterLast("/") nameGenerator.genLambdaClassName() + oldClassName.substringAfterLast("/")
@@ -45,7 +45,7 @@ class WhenMappingRegenerationInfo(override val oldClassName: String, val nameGen
} }
} }
class AnonymousObjectRegenerationInfo internal constructor( class AnonymousObjectTransformationInfo internal constructor(
override val oldClassName: String, override val oldClassName: String,
private val needReification: Boolean, private val needReification: Boolean,
val lambdasToInline: Map<Int, LambdaInfo>, val lambdasToInline: Map<Int, LambdaInfo>,
@@ -53,7 +53,7 @@ class AnonymousObjectRegenerationInfo internal constructor(
private val alreadyRegenerated: Boolean, private val alreadyRegenerated: Boolean,
val constructorDesc: String?, val constructorDesc: String?,
private val isStaticOrigin: Boolean, private val isStaticOrigin: Boolean,
private val nameGenerator: NameGenerator) : RegenerationInfo() { private val nameGenerator: NameGenerator) : TransformationInfo {
override val newClassName: String by lazy { override val newClassName: String by lazy {
nameGenerator.genLambdaClassName() nameGenerator.genLambdaClassName()