ClassBuilder-to-ClassVisitor adapters should invoke methods of adapted ClassBuilder.
Call classBuilder.defineClass instead of ClassVisitor.visit. Call classBuilder.newField instead of ClassVisitor.visitField.
This commit is contained in:
+5
-4
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.codegen.FieldInfo;
|
|||||||
import org.jetbrains.kotlin.codegen.StackValue;
|
import org.jetbrains.kotlin.codegen.StackValue;
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
import org.jetbrains.kotlin.codegen.state.GenerationState;
|
||||||
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
import org.jetbrains.kotlin.codegen.state.KotlinTypeMapper;
|
||||||
|
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin;
|
||||||
import org.jetbrains.org.objectweb.asm.*;
|
import org.jetbrains.org.objectweb.asm.*;
|
||||||
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter;
|
||||||
import org.jetbrains.org.objectweb.asm.tree.*;
|
import org.jetbrains.org.objectweb.asm.tree.*;
|
||||||
@@ -73,14 +74,14 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
|
|||||||
@NotNull
|
@NotNull
|
||||||
public InlineResult doTransform(@NotNull FieldRemapper parentRemapper) {
|
public InlineResult doTransform(@NotNull FieldRemapper parentRemapper) {
|
||||||
final List<InnerClassNode> innerClassNodes = new ArrayList<InnerClassNode>();
|
final List<InnerClassNode> innerClassNodes = new ArrayList<InnerClassNode>();
|
||||||
ClassBuilder classBuilder = createRemappingClassBuilderViaFactory(inliningContext);
|
final ClassBuilder classBuilder = createRemappingClassBuilderViaFactory(inliningContext);
|
||||||
final List<MethodNode> methodsToTransform = new ArrayList<MethodNode>();
|
final List<MethodNode> methodsToTransform = new ArrayList<MethodNode>();
|
||||||
|
|
||||||
createClassReader().accept(new ClassVisitor(InlineCodegenUtil.API, classBuilder.getVisitor()) {
|
createClassReader().accept(new ClassVisitor(InlineCodegenUtil.API, classBuilder.getVisitor()) {
|
||||||
@Override
|
@Override
|
||||||
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
|
public void visit(int version, int access, @NotNull String name, String signature, String superName, String[] interfaces) {
|
||||||
InlineCodegenUtil.assertVersionNotGreaterThanJava6(version, name);
|
InlineCodegenUtil.assertVersionNotGreaterThanJava6(version, name);
|
||||||
super.visit(version, access, name, signature, superName, interfaces);
|
classBuilder.defineClass(null, version, access, name, signature, superName, interfaces);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -112,7 +113,7 @@ public class AnonymousObjectTransformer extends ObjectTransformer<AnonymousObjec
|
|||||||
if (InlineCodegenUtil.isCapturedFieldName(name)) {
|
if (InlineCodegenUtil.isCapturedFieldName(name)) {
|
||||||
return null;
|
return null;
|
||||||
} else {
|
} else {
|
||||||
return super.visitField(access, name, desc, signature, value);
|
return classBuilder.newField(JvmDeclarationOrigin.NO_ORIGIN, access, name, desc, signature, value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,14 +66,14 @@ class WhenMappingTransformer(
|
|||||||
val methodNodes = arrayListOf<MethodNode>()
|
val methodNodes = arrayListOf<MethodNode>()
|
||||||
val fieldNode = transformationInfo.fieldNode
|
val fieldNode = transformationInfo.fieldNode
|
||||||
classReader.accept(object : ClassVisitor(InlineCodegenUtil.API, classBuilder.visitor) {
|
classReader.accept(object : ClassVisitor(InlineCodegenUtil.API, classBuilder.visitor) {
|
||||||
override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String?, interfaces: Array<String>?) {
|
override fun visit(version: Int, access: Int, name: String, signature: String?, superName: String, interfaces: Array<String>) {
|
||||||
InlineCodegenUtil.assertVersionNotGreaterThanJava6(version, name)
|
InlineCodegenUtil.assertVersionNotGreaterThanJava6(version, name)
|
||||||
super.visit(version, access, name, signature, superName, interfaces)
|
classBuilder.defineClass(null, version, access, name, signature, superName, interfaces)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor? {
|
override fun visitField(access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor? {
|
||||||
return if (name.equals(fieldNode.name)) {
|
return if (name.equals(fieldNode.name)) {
|
||||||
super.visitField(access, name, desc, signature, value)
|
classBuilder.newField(JvmDeclarationOrigin.NO_ORIGIN, access, name, desc, signature, value)
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
null
|
null
|
||||||
|
|||||||
+15
-1
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2010-2015 JetBrains s.r.o.
|
* Copyright 2010-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.codegen.inline;
|
package org.jetbrains.kotlin.codegen.inline;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.codegen.ClassBuilder;
|
import org.jetbrains.kotlin.codegen.ClassBuilder;
|
||||||
@@ -42,6 +43,19 @@ public class RemappingClassBuilder extends DelegatingClassBuilder {
|
|||||||
return builder;
|
return builder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void defineClass(
|
||||||
|
@Nullable PsiElement origin,
|
||||||
|
int version,
|
||||||
|
int access,
|
||||||
|
@NotNull String name,
|
||||||
|
@Nullable String signature,
|
||||||
|
@NotNull String superName,
|
||||||
|
@NotNull String[] interfaces
|
||||||
|
) {
|
||||||
|
super.defineClass(origin, version, access, remapper.mapType(name), remapper.mapSignature(signature, false), remapper.mapType(superName), remapper.mapTypes(interfaces));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public FieldVisitor newField(
|
public FieldVisitor newField(
|
||||||
|
|||||||
Reference in New Issue
Block a user