Make ClassBuilderOnDemand extend ClassBuilder

Introduce DelegatingClassBuilder, refactor RemappingClassBuilder to use it
This commit is contained in:
Alexander Udalov
2014-05-23 22:18:30 +04:00
parent 9e325b3ebe
commit 5b99b0ceb0
4 changed files with 131 additions and 63 deletions
@@ -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> classBuilder;
public ClassBuilderOnDemand(@NotNull Function0<ClassBuilder> 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();
@@ -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)),
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);
}
}
);
@@ -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();
}
}