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}