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.annotations.Nullable;
021    
022    import java.util.HashMap;
023    import java.util.Map;
024    
025    public class NameGenerator {
026    
027        private final String generatorClass;
028    
029        private int nextLambdaIndex = 1;
030        private int nextWhenIndex = 1;
031    
032        private final Map<String, NameGenerator> subGenerators = new HashMap<String, NameGenerator>();
033    
034        public NameGenerator(String generatorClass) {
035            this.generatorClass = generatorClass;
036        }
037    
038        public String getGeneratorClass() {
039            return generatorClass;
040        }
041    
042        private String genLambdaClassName() {
043            return generatorClass + "$" + nextLambdaIndex++;
044        }
045    
046        private String genWhenClassName(@NotNull String original) {
047            return generatorClass + "$" + nextWhenIndex++ + WhenMappingTransformationInfo.TRANSFORMED_WHEN_MAPPING_MARKER + original;
048        }
049    
050        public NameGenerator subGenerator(String inliningMethod) {
051            NameGenerator generator = subGenerators.get(inliningMethod);
052            if (generator == null) {
053                generator = new NameGenerator(generatorClass + "$" + inliningMethod);
054                subGenerators.put(inliningMethod, generator);
055            }
056            return generator;
057        }
058    
059        @NotNull
060        public NameGenerator subGenerator(boolean lambdaNoWhen, @Nullable String nameSuffix) {
061            String generatorClass = lambdaNoWhen ? genLambdaClassName() : genWhenClassName(nameSuffix);
062            assert !subGenerators.containsKey(generatorClass) : "Name generator for regenerated class should be unique: " + generatorClass;
063            NameGenerator generator = new NameGenerator(generatorClass);
064            subGenerators.put(generatorClass, generator);
065            return generator;
066        }
067    }