Make ClassBuilderOnDemand extend ClassBuilder
Introduce DelegatingClassBuilder, refactor RemappingClassBuilder to use it
This commit is contained in:
@@ -21,18 +21,20 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
import org.jetbrains.jet.storage.LockBasedStorageManager;
|
||||||
import org.jetbrains.jet.storage.NotNullLazyValue;
|
import org.jetbrains.jet.storage.NotNullLazyValue;
|
||||||
|
|
||||||
public class ClassBuilderOnDemand {
|
public class ClassBuilderOnDemand extends DelegatingClassBuilder {
|
||||||
private final NotNullLazyValue<ClassBuilder> classBuilder;
|
private final NotNullLazyValue<ClassBuilder> classBuilder;
|
||||||
|
|
||||||
public ClassBuilderOnDemand(@NotNull Function0<ClassBuilder> createClassBuilder) {
|
public ClassBuilderOnDemand(@NotNull Function0<ClassBuilder> createClassBuilder) {
|
||||||
this.classBuilder = LockBasedStorageManager.NO_LOCKS.createLazyValue(createClassBuilder);
|
this.classBuilder = LockBasedStorageManager.NO_LOCKS.createLazyValue(createClassBuilder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public ClassBuilder getClassBuilder() {
|
protected ClassBuilder getDelegate() {
|
||||||
return classBuilder.invoke();
|
return classBuilder.invoke();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public void done() {
|
public void done() {
|
||||||
if (classBuilder.isComputed()) {
|
if (classBuilder.isComputed()) {
|
||||||
classBuilder.invoke().done();
|
classBuilder.invoke().done();
|
||||||
|
|||||||
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 JetBrains s.r.o.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.jet.codegen;
|
||||||
|
|
||||||
|
import com.intellij.psi.PsiElement;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
|
||||||
|
import org.jetbrains.org.objectweb.asm.ClassVisitor;
|
||||||
|
import org.jetbrains.org.objectweb.asm.FieldVisitor;
|
||||||
|
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
||||||
|
|
||||||
|
public abstract class DelegatingClassBuilder implements ClassBuilder {
|
||||||
|
@NotNull
|
||||||
|
protected abstract ClassBuilder getDelegate();
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public FieldVisitor newField(
|
||||||
|
@Nullable PsiElement origin,
|
||||||
|
int access,
|
||||||
|
@NotNull String name,
|
||||||
|
@NotNull String desc,
|
||||||
|
@Nullable String signature,
|
||||||
|
@Nullable Object value
|
||||||
|
) {
|
||||||
|
return getDelegate().newField(origin, access, name, desc, signature, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public MethodVisitor newMethod(
|
||||||
|
@Nullable PsiElement origin,
|
||||||
|
int access,
|
||||||
|
@NotNull String name,
|
||||||
|
@NotNull String desc,
|
||||||
|
@Nullable String signature,
|
||||||
|
@Nullable String[] exceptions
|
||||||
|
) {
|
||||||
|
return getDelegate().newMethod(origin, access, name, desc, signature, exceptions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public JvmSerializationBindings getSerializationBindings() {
|
||||||
|
return getDelegate().getSerializationBindings();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible) {
|
||||||
|
return getDelegate().newAnnotation(desc, visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void done() {
|
||||||
|
getDelegate().done();
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public ClassVisitor getVisitor() {
|
||||||
|
return getDelegate().getVisitor();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void defineClass(
|
||||||
|
@Nullable PsiElement origin,
|
||||||
|
int version,
|
||||||
|
int access,
|
||||||
|
@NotNull String name,
|
||||||
|
@Nullable String signature,
|
||||||
|
@NotNull String superName,
|
||||||
|
@NotNull String[] interfaces
|
||||||
|
) {
|
||||||
|
getDelegate().defineClass(origin, version, access, name, signature, superName, interfaces);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitSource(@NotNull String name, @Nullable String debug) {
|
||||||
|
getDelegate().visitSource(name, debug);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitOuterClass(@NotNull String owner, @Nullable String name, @Nullable String desc) {
|
||||||
|
getDelegate().visitOuterClass(owner, name, desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void visitInnerClass(@NotNull String name, @Nullable String outerName, @Nullable String innerName, int access) {
|
||||||
|
getDelegate().visitInnerClass(name, outerName, innerName, access);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public String getThisName() {
|
||||||
|
return getDelegate().getThisName();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -147,12 +147,7 @@ public class PackageCodegen {
|
|||||||
Type.getObjectType(getPackagePartInternalName(member)),
|
Type.getObjectType(getPackagePartInternalName(member)),
|
||||||
compiledPackageFragment);
|
compiledPackageFragment);
|
||||||
|
|
||||||
FunctionCodegen functionCodegen = new FunctionCodegen(
|
FunctionCodegen functionCodegen = new FunctionCodegen(context, v, state, getMemberCodegen(context));
|
||||||
context,
|
|
||||||
v.getClassBuilder(),
|
|
||||||
state,
|
|
||||||
getMemberCodegen(context)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (member instanceof DeserializedSimpleFunctionDescriptor) {
|
if (member instanceof DeserializedSimpleFunctionDescriptor) {
|
||||||
DeserializedSimpleFunctionDescriptor function = (DeserializedSimpleFunctionDescriptor) member;
|
DeserializedSimpleFunctionDescriptor function = (DeserializedSimpleFunctionDescriptor) member;
|
||||||
@@ -172,8 +167,7 @@ public class PackageCodegen {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
else if (member instanceof DeserializedPropertyDescriptor) {
|
else if (member instanceof DeserializedPropertyDescriptor) {
|
||||||
PropertyCodegen propertyCodegen = new PropertyCodegen(
|
PropertyCodegen propertyCodegen = new PropertyCodegen(context, v, functionCodegen, getMemberCodegen(context));
|
||||||
context, v.getClassBuilder(), functionCodegen, getMemberCodegen(context));
|
|
||||||
propertyCodegen.generateInPackageFacade((DeserializedPropertyDescriptor) member);
|
propertyCodegen.generateInPackageFacade((DeserializedPropertyDescriptor) member);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -218,7 +212,7 @@ public class PackageCodegen {
|
|||||||
generateCallableMemberTasks.get(member).run();
|
generateCallableMemberTasks.get(member).run();
|
||||||
}
|
}
|
||||||
|
|
||||||
bindings.add(v.getClassBuilder().getSerializationBindings());
|
bindings.add(v.getSerializationBindings());
|
||||||
writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings));
|
writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,8 +236,7 @@ public class PackageCodegen {
|
|||||||
|
|
||||||
PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto);
|
PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto);
|
||||||
|
|
||||||
AnnotationVisitor av =
|
AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE), true);
|
||||||
v.getClassBuilder().newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE), true);
|
|
||||||
av.visit(JvmAnnotationNames.ABI_VERSION_FIELD_NAME, JvmAbi.VERSION);
|
av.visit(JvmAnnotationNames.ABI_VERSION_FIELD_NAME, JvmAbi.VERSION);
|
||||||
AnnotationVisitor array = av.visitArray(JvmAnnotationNames.DATA_FIELD_NAME);
|
AnnotationVisitor array = av.visitArray(JvmAnnotationNames.DATA_FIELD_NAME);
|
||||||
for (String string : BitEncoding.encodeBytes(data.toBytes())) {
|
for (String string : BitEncoding.encodeBytes(data.toBytes())) {
|
||||||
@@ -295,7 +288,7 @@ public class PackageCodegen {
|
|||||||
new Runnable() {
|
new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
memberCodegen.genFunctionOrProperty(declaration, v.getClassBuilder());
|
memberCodegen.genFunctionOrProperty(declaration, v);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -19,16 +19,15 @@ package org.jetbrains.jet.codegen.inline;
|
|||||||
import com.intellij.psi.PsiElement;
|
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.jet.codegen.ClassBuilder;
|
||||||
|
import org.jetbrains.jet.codegen.DelegatingClassBuilder;
|
||||||
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
|
import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
|
||||||
import org.jetbrains.org.objectweb.asm.ClassVisitor;
|
import org.jetbrains.org.objectweb.asm.ClassVisitor;
|
||||||
import org.jetbrains.org.objectweb.asm.FieldVisitor;
|
import org.jetbrains.org.objectweb.asm.FieldVisitor;
|
||||||
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
import org.jetbrains.org.objectweb.asm.MethodVisitor;
|
||||||
import org.jetbrains.org.objectweb.asm.commons.*;
|
import org.jetbrains.org.objectweb.asm.commons.*;
|
||||||
import org.jetbrains.jet.codegen.ClassBuilder;
|
|
||||||
import org.jetbrains.jet.codegen.JvmSerializationBindings;
|
|
||||||
|
|
||||||
public class RemappingClassBuilder implements ClassBuilder {
|
|
||||||
|
|
||||||
|
public class RemappingClassBuilder extends DelegatingClassBuilder {
|
||||||
private final ClassBuilder builder;
|
private final ClassBuilder builder;
|
||||||
private final Remapper remapper;
|
private final Remapper remapper;
|
||||||
|
|
||||||
@@ -37,6 +36,12 @@ public class RemappingClassBuilder implements ClassBuilder {
|
|||||||
this.remapper = remapper;
|
this.remapper = remapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
protected ClassBuilder getDelegate() {
|
||||||
|
return builder;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public FieldVisitor newField(
|
public FieldVisitor newField(
|
||||||
@@ -63,60 +68,15 @@ public class RemappingClassBuilder implements ClassBuilder {
|
|||||||
return new RemappingMethodAdapter(access, desc, builder.newMethod(origin, access, name, remapper.mapMethodDesc(desc), signature, exceptions), remapper);
|
return new RemappingMethodAdapter(access, desc, builder.newMethod(origin, access, name, remapper.mapMethodDesc(desc), signature, exceptions), remapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@NotNull
|
|
||||||
public JvmSerializationBindings getSerializationBindings() {
|
|
||||||
return builder.getSerializationBindings();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible) {
|
public AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible) {
|
||||||
return new RemappingAnnotationAdapter(builder.newAnnotation(remapper.mapDesc(desc), visible), remapper);
|
return new RemappingAnnotationAdapter(builder.newAnnotation(remapper.mapDesc(desc), visible), remapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void done() {
|
|
||||||
builder.done();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public ClassVisitor getVisitor() {
|
public ClassVisitor getVisitor() {
|
||||||
return new RemappingClassAdapter(builder.getVisitor(), remapper);
|
return new RemappingClassAdapter(builder.getVisitor(), remapper);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void defineClass(
|
|
||||||
@Nullable PsiElement origin,
|
|
||||||
int version,
|
|
||||||
int access,
|
|
||||||
@NotNull String name,
|
|
||||||
@Nullable String signature,
|
|
||||||
@NotNull String superName,
|
|
||||||
@NotNull String[] interfaces
|
|
||||||
) {
|
|
||||||
builder.defineClass(origin, version, access, name, signature, superName, interfaces);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitSource(@NotNull String name, @Nullable String debug) {
|
|
||||||
builder.visitSource(name, debug);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitOuterClass(@NotNull String owner, @Nullable String name, @Nullable String desc) {
|
|
||||||
builder.visitOuterClass(owner, name, desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void visitInnerClass(@NotNull String name, @Nullable String outerName, @Nullable String innerName, int access) {
|
|
||||||
builder.visitInnerClass(name, outerName, innerName, access);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
@NotNull
|
|
||||||
public String getThisName() {
|
|
||||||
return builder.getThisName();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user