From 5b99b0ceb001c05c681eadb32aa400f357c35a2f Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 23 May 2014 22:18:30 +0400 Subject: [PATCH] Make ClassBuilderOnDemand extend ClassBuilder Introduce DelegatingClassBuilder, refactor RemappingClassBuilder to use it --- .../jet/codegen/ClassBuilderOnDemand.java | 6 +- .../jet/codegen/DelegatingClassBuilder.java | 113 ++++++++++++++++++ .../jetbrains/jet/codegen/PackageCodegen.java | 17 +-- .../codegen/inline/RemappingClassBuilder.java | 58 ++------- 4 files changed, 131 insertions(+), 63 deletions(-) create mode 100644 compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java index c13407e2901..a9b065fe99e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderOnDemand.java @@ -21,18 +21,20 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.storage.LockBasedStorageManager; import org.jetbrains.jet.storage.NotNullLazyValue; -public class ClassBuilderOnDemand { +public class ClassBuilderOnDemand extends DelegatingClassBuilder { private final NotNullLazyValue classBuilder; public ClassBuilderOnDemand(@NotNull Function0 createClassBuilder) { this.classBuilder = LockBasedStorageManager.NO_LOCKS.createLazyValue(createClassBuilder); } + @Override @NotNull - public ClassBuilder getClassBuilder() { + protected ClassBuilder getDelegate() { return classBuilder.invoke(); } + @Override public void done() { if (classBuilder.isComputed()) { classBuilder.invoke().done(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java new file mode 100644 index 00000000000..4f77458fa79 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java @@ -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(); + } +} diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java index 635e5b3ef4d..09685a31263 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/PackageCodegen.java @@ -147,12 +147,7 @@ public class PackageCodegen { Type.getObjectType(getPackagePartInternalName(member)), compiledPackageFragment); - FunctionCodegen functionCodegen = new FunctionCodegen( - context, - v.getClassBuilder(), - state, - getMemberCodegen(context) - ); + FunctionCodegen functionCodegen = new FunctionCodegen(context, v, state, getMemberCodegen(context)); if (member instanceof DeserializedSimpleFunctionDescriptor) { DeserializedSimpleFunctionDescriptor function = (DeserializedSimpleFunctionDescriptor) member; @@ -172,8 +167,7 @@ public class PackageCodegen { ); } else if (member instanceof DeserializedPropertyDescriptor) { - PropertyCodegen propertyCodegen = new PropertyCodegen( - context, v.getClassBuilder(), functionCodegen, getMemberCodegen(context)); + PropertyCodegen propertyCodegen = new PropertyCodegen(context, v, functionCodegen, getMemberCodegen(context)); propertyCodegen.generateInPackageFacade((DeserializedPropertyDescriptor) member); } else { @@ -218,7 +212,7 @@ public class PackageCodegen { generateCallableMemberTasks.get(member).run(); } - bindings.add(v.getClassBuilder().getSerializationBindings()); + bindings.add(v.getSerializationBindings()); writeKotlinPackageAnnotationIfNeeded(JvmSerializationBindings.union(bindings)); } @@ -242,8 +236,7 @@ public class PackageCodegen { PackageData data = new PackageData(createNameResolver(serializer.getNameTable()), packageProto); - AnnotationVisitor av = - v.getClassBuilder().newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE), true); + AnnotationVisitor av = v.newAnnotation(asmDescByFqNameWithoutInnerClasses(JvmAnnotationNames.KOTLIN_PACKAGE), true); av.visit(JvmAnnotationNames.ABI_VERSION_FIELD_NAME, JvmAbi.VERSION); AnnotationVisitor array = av.visitArray(JvmAnnotationNames.DATA_FIELD_NAME); for (String string : BitEncoding.encodeBytes(data.toBytes())) { @@ -295,7 +288,7 @@ public class PackageCodegen { new Runnable() { @Override public void run() { - memberCodegen.genFunctionOrProperty(declaration, v.getClassBuilder()); + memberCodegen.genFunctionOrProperty(declaration, v); } } ); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java index 7bfdb6e9284..cfdea59cbaa 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java @@ -19,16 +19,15 @@ package org.jetbrains.jet.codegen.inline; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; 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.ClassVisitor; import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.MethodVisitor; 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 Remapper remapper; @@ -37,6 +36,12 @@ public class RemappingClassBuilder implements ClassBuilder { this.remapper = remapper; } + @Override + @NotNull + protected ClassBuilder getDelegate() { + return builder; + } + @Override @NotNull 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); } - @Override - @NotNull - public JvmSerializationBindings getSerializationBindings() { - return builder.getSerializationBindings(); - } - @Override @NotNull public AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible) { return new RemappingAnnotationAdapter(builder.newAnnotation(remapper.mapDesc(desc), visible), remapper); } - @Override - public void done() { - builder.done(); - } - @Override @NotNull public ClassVisitor getVisitor() { 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(); - } }