001    /*
002     * Copyright 2010-2014 JetBrains s.r.o.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.jetbrains.jet.codegen.inline;
018    
019    import com.intellij.psi.PsiElement;
020    import org.jetbrains.annotations.NotNull;
021    import org.jetbrains.annotations.Nullable;
022    import org.jetbrains.asm4.AnnotationVisitor;
023    import org.jetbrains.asm4.ClassVisitor;
024    import org.jetbrains.asm4.FieldVisitor;
025    import org.jetbrains.asm4.MethodVisitor;
026    import org.jetbrains.asm4.commons.*;
027    import org.jetbrains.jet.codegen.ClassBuilder;
028    import org.jetbrains.jet.codegen.JvmSerializationBindings;
029    
030    public class RemappingClassBuilder implements ClassBuilder {
031    
032        private final ClassBuilder builder;
033        private final Remapper remapper;
034    
035        public RemappingClassBuilder(@NotNull ClassBuilder builder, @NotNull Remapper remapper) {
036            this.builder = builder;
037            this.remapper = remapper;
038        }
039    
040        @Override
041        @NotNull
042        public FieldVisitor newField(
043                @Nullable PsiElement origin,
044                int access,
045                @NotNull String name,
046                @NotNull String desc,
047                @Nullable String signature,
048                @Nullable Object value
049        ) {
050            return new RemappingFieldAdapter(builder.newField(origin, access, name, remapper.mapDesc(desc), signature, value), remapper);
051        }
052    
053        @Override
054        @NotNull
055        public MethodVisitor newMethod(
056                @Nullable PsiElement origin,
057                int access,
058                @NotNull String name,
059                @NotNull String desc,
060                @Nullable String signature,
061                @Nullable String[] exceptions
062        ) {
063            return new RemappingMethodAdapter(access, desc, builder.newMethod(origin, access, name, remapper.mapMethodDesc(desc), signature, exceptions), remapper);
064        }
065    
066        @Override
067        @NotNull
068        public JvmSerializationBindings getSerializationBindings() {
069            return builder.getSerializationBindings();
070        }
071    
072        @Override
073        @NotNull
074        public AnnotationVisitor newAnnotation(@NotNull String desc, boolean visible) {
075            return new RemappingAnnotationAdapter(builder.newAnnotation(remapper.mapDesc(desc), visible), remapper);
076        }
077    
078        @Override
079        public void done() {
080            builder.done();
081        }
082    
083        @Override
084        @NotNull
085        public ClassVisitor getVisitor() {
086            return new RemappingClassAdapter(builder.getVisitor(), remapper);
087        }
088    
089        @Override
090        public void defineClass(
091                @Nullable PsiElement origin,
092                int version,
093                int access,
094                @NotNull String name,
095                @Nullable String signature,
096                @NotNull String superName,
097                @NotNull String[] interfaces
098        ) {
099            builder.defineClass(origin, version, access, name, signature, superName, interfaces);
100        }
101    
102        @Override
103        public void visitSource(@NotNull String name, @Nullable String debug) {
104            builder.visitSource(name, debug);
105        }
106    
107        @Override
108        public void visitOuterClass(@NotNull String owner, @Nullable String name, @Nullable String desc) {
109            builder.visitOuterClass(owner, name, desc);
110        }
111    
112        @Override
113        public void visitInnerClass(@NotNull String name, @Nullable String outerName, @Nullable String innerName, int access) {
114            builder.visitInnerClass(name, outerName, innerName, access);
115        }
116    
117        @Override
118        @NotNull
119        public String getThisName() {
120            return builder.getThisName();
121        }
122    }