001    /*
002     * Copyright 2010-2015 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.kotlin.codegen.inline;
018    
019    import org.jetbrains.annotations.NotNull;
020    import org.jetbrains.org.objectweb.asm.commons.Remapper;
021    
022    import java.util.HashMap;
023    import java.util.Map;
024    
025    public class TypeRemapper extends Remapper {
026        //typeMapping field could be changed outside through method processing
027        private final Map<String, String> typeMapping;
028    
029        private Map<String, String> additionalMappings;
030    
031        //typeMapping field could be changed outside through method processing
032        private TypeRemapper(@NotNull Map<String, String> typeMapping) {
033            this.typeMapping = typeMapping;
034        }
035    
036        public TypeRemapper(@NotNull TypeRemapper remapper, @NotNull Map<String, String> newTypeMappings) {
037            this(createNewAndMerge(remapper, newTypeMappings));
038        }
039    
040        public static TypeRemapper createEmpty() {
041            return new TypeRemapper(new HashMap<String, String>());
042        }
043    
044        public static TypeRemapper createFrom(Map<String, String> mappings) {
045            return new TypeRemapper(mappings);
046        }
047    
048        @NotNull
049        private static Map<String, String> createNewAndMerge(@NotNull TypeRemapper remapper, @NotNull Map<String, String> additionalTypeMappings) {
050            Map<String, String> map = new HashMap<String, String>(remapper.typeMapping);
051            map.putAll(additionalTypeMappings);
052            return map;
053        }
054    
055        public void addMapping(String type, String newType) {
056            typeMapping.put(type, newType);
057        }
058    
059        public boolean hasNoAdditionalMapping(String type) {
060            return typeMapping.containsKey(type);
061        }
062    
063        @Override
064        public String map(String type) {
065            String newType = typeMapping.get(type);
066            if (newType != null) {
067                return newType;
068            }
069    
070            if (additionalMappings != null) {
071                newType = additionalMappings.get(type);
072                if (newType != null) {
073                    return newType;
074                }
075            }
076    
077            return type;
078        }
079    
080        public void addAdditionalMappings(String oldName, String newName) {
081            if (additionalMappings == null) additionalMappings = new HashMap<String, String>();
082            additionalMappings.put(oldName, newName);
083        }
084    }