001/*
002 * Copyright 2010-2013 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
017package org.jetbrains.jet.lang.resolve.java;
018
019import org.jetbrains.annotations.Nullable;
020import org.jetbrains.jet.lang.types.lang.PrimitiveType;
021import org.jetbrains.asm4.Type;
022
023import java.util.HashMap;
024import java.util.Map;
025
026public enum JvmPrimitiveType {
027    BOOLEAN(PrimitiveType.BOOLEAN, "boolean", "java.lang.Boolean", Type.BOOLEAN_TYPE),
028    CHAR(PrimitiveType.CHAR, "char", "java.lang.Character", Type.CHAR_TYPE),
029    BYTE(PrimitiveType.BYTE, "byte", "java.lang.Byte", Type.BYTE_TYPE),
030    SHORT(PrimitiveType.SHORT, "short", "java.lang.Short", Type.SHORT_TYPE),
031    INT(PrimitiveType.INT, "int", "java.lang.Integer", Type.INT_TYPE),
032    FLOAT(PrimitiveType.FLOAT, "float", "java.lang.Float", Type.FLOAT_TYPE),
033    LONG(PrimitiveType.LONG, "long", "java.lang.Long", Type.LONG_TYPE),
034    DOUBLE(PrimitiveType.DOUBLE, "double", "java.lang.Double", Type.DOUBLE_TYPE),
035    ;
036    
037    private final PrimitiveType primitiveType;
038    private final String name;
039    private final JvmClassName wrapper;
040    private final Type asmType;
041    private final char jvmLetter;
042    private final Type asmArrayType;
043    private final JvmClassName iterator;
044
045    private JvmPrimitiveType(PrimitiveType primitiveType, String name, String wrapperClassName, Type asmType) {
046        this.primitiveType = primitiveType;
047        this.name = name;
048        this.wrapper = JvmClassName.byFqNameWithoutInnerClasses(wrapperClassName);
049        this.asmType = asmType;
050        this.jvmLetter = asmType.getDescriptor().charAt(0);
051        this.asmArrayType = makeArrayType(asmType);
052        this.iterator = JvmClassName.byFqNameWithoutInnerClasses("jet." + primitiveType.getTypeName() + "Iterator");
053    }
054    
055    private static Type makeArrayType(Type type) {
056        StringBuilder sb = new StringBuilder(2);
057        sb.append('[');
058        sb.append(type.getDescriptor());
059        return Type.getType(sb.toString());
060    }
061
062    public PrimitiveType getPrimitiveType() {
063        return primitiveType;
064    }
065
066    public String getName() {
067        return name;
068    }
069
070    public JvmClassName getWrapper() {
071        return wrapper;
072    }
073
074    public Type getAsmType() {
075        return asmType;
076    }
077
078    public Type getAsmArrayType() {
079        return asmArrayType;
080    }
081
082    public JvmClassName getIterator() {
083        return iterator;
084    }
085
086    public char getJvmLetter() {
087        return jvmLetter;
088    }
089
090
091
092    private static class MapByAsmTypeHolder {
093        private static final Map<Integer, JvmPrimitiveType> map;
094        
095        static {
096            map = new HashMap<Integer, JvmPrimitiveType>();
097            for (JvmPrimitiveType jvmPrimitiveType : values()) {
098                map.put(jvmPrimitiveType.getAsmType().getSort(), jvmPrimitiveType);
099            }
100        }
101    }
102
103    @Nullable
104    public static JvmPrimitiveType getByAsmType(Type type) {
105        return MapByAsmTypeHolder.map.get(type.getSort());
106    }
107    
108    
109    private static class MapByWrapperAsmTypeHolder {
110        private static final Map<Type, JvmPrimitiveType> map;
111
112        static {
113            map = new HashMap<Type, JvmPrimitiveType>();
114            for (JvmPrimitiveType jvmPrimitiveType : values()) {
115                map.put(jvmPrimitiveType.getWrapper().getAsmType(), jvmPrimitiveType);
116            }
117        }
118    }
119    
120    @Nullable
121    public static JvmPrimitiveType getByWrapperAsmType(Type type) {
122        return MapByWrapperAsmTypeHolder.map.get(type);
123    }
124
125    @Nullable
126    public static JvmPrimitiveType getByWrapperClass(JvmClassName className) {
127        return getByWrapperAsmType(className.getAsmType());
128    }
129}