enums for primitive types and fix stdlib.jar reading

* PrimitiveType and JvmPrimitiveType enums

* roll up for-each-enum copy-paste lines into loop by enum values

* finish JetStandardLibrary.getPrimitiveArrayJetTypeByPrimitiveJetType for all primitive types
that fixes stdlib.jar loading
This commit is contained in:
Stepan Koltsov
2012-01-11 19:36:55 +04:00
parent 046a92ed7a
commit fbc7f60af1
11 changed files with 334 additions and 624 deletions
@@ -155,31 +155,13 @@ public class JavaTypeTransformer {
public Map<String, JetType> getPrimitiveTypesMap() {
if (primitiveTypesMap == null) {
primitiveTypesMap = new HashMap<String, JetType>();
primitiveTypesMap.put("byte", standardLibrary.getByteType());
primitiveTypesMap.put("short", standardLibrary.getShortType());
primitiveTypesMap.put("char", standardLibrary.getCharType());
primitiveTypesMap.put("int", standardLibrary.getIntType());
primitiveTypesMap.put("long", standardLibrary.getLongType());
primitiveTypesMap.put("float", standardLibrary.getFloatType());
primitiveTypesMap.put("double", standardLibrary.getDoubleType());
primitiveTypesMap.put("boolean", standardLibrary.getBooleanType());
primitiveTypesMap.put("[byte", standardLibrary.getByteArrayType());
primitiveTypesMap.put("[short", standardLibrary.getShortArrayType());
primitiveTypesMap.put("[char", standardLibrary.getCharArrayType());
primitiveTypesMap.put("[int", standardLibrary.getIntArrayType());
primitiveTypesMap.put("[long", standardLibrary.getLongArrayType());
primitiveTypesMap.put("[float", standardLibrary.getFloatArrayType());
primitiveTypesMap.put("[double", standardLibrary.getDoubleArrayType());
primitiveTypesMap.put("[boolean", standardLibrary.getBooleanArrayType());
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
primitiveTypesMap.put(jvmPrimitiveType.getName(), standardLibrary.getPrimitiveJetType(primitiveType));
primitiveTypesMap.put("[" + jvmPrimitiveType.getName(), standardLibrary.getPrimitiveArrayJetType(primitiveType));
primitiveTypesMap.put(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getNullablePrimitiveJetType(primitiveType));
}
primitiveTypesMap.put("void", JetStandardClasses.getUnitType());
primitiveTypesMap.put("java.lang.Byte", TypeUtils.makeNullable(standardLibrary.getByteType()));
primitiveTypesMap.put("java.lang.Short", TypeUtils.makeNullable(standardLibrary.getShortType()));
primitiveTypesMap.put("java.lang.Character", TypeUtils.makeNullable(standardLibrary.getCharType()));
primitiveTypesMap.put("java.lang.Integer", TypeUtils.makeNullable(standardLibrary.getIntType()));
primitiveTypesMap.put("java.lang.Long", TypeUtils.makeNullable(standardLibrary.getLongType()));
primitiveTypesMap.put("java.lang.Float", TypeUtils.makeNullable(standardLibrary.getFloatType()));
primitiveTypesMap.put("java.lang.Double", TypeUtils.makeNullable(standardLibrary.getDoubleType()));
primitiveTypesMap.put("java.lang.Boolean", TypeUtils.makeNullable(standardLibrary.getBooleanType()));
}
return primitiveTypesMap;
}
@@ -187,14 +169,10 @@ public class JavaTypeTransformer {
public Map<String, JetType> getClassTypesMap() {
if (classTypesMap == null) {
classTypesMap = new HashMap<String, JetType>();
classTypesMap.put("java.lang.Byte", TypeUtils.makeNullable(standardLibrary.getByteType()));
classTypesMap.put("java.lang.Short", TypeUtils.makeNullable(standardLibrary.getShortType()));
classTypesMap.put("java.lang.Character", TypeUtils.makeNullable(standardLibrary.getCharType()));
classTypesMap.put("java.lang.Integer", TypeUtils.makeNullable(standardLibrary.getIntType()));
classTypesMap.put("java.lang.Long", TypeUtils.makeNullable(standardLibrary.getLongType()));
classTypesMap.put("java.lang.Float", TypeUtils.makeNullable(standardLibrary.getFloatType()));
classTypesMap.put("java.lang.Double", TypeUtils.makeNullable(standardLibrary.getDoubleType()));
classTypesMap.put("java.lang.Boolean", TypeUtils.makeNullable(standardLibrary.getBooleanType()));
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
classTypesMap.put(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getNullablePrimitiveJetType(primitiveType));
}
classTypesMap.put("java.lang.Object", JetStandardClasses.getNullableAnyType());
classTypesMap.put("java.lang.String", standardLibrary.getNullableStringType());
}
@@ -204,14 +182,10 @@ public class JavaTypeTransformer {
public Map<String, ClassDescriptor> getPrimitiveWrappersClassDescriptorMap() {
if (classDescriptorMap == null) {
classDescriptorMap = new HashMap<String, ClassDescriptor>();
classDescriptorMap.put("java.lang.Byte", standardLibrary.getByte());
classDescriptorMap.put("java.lang.Short", standardLibrary.getShort());
classDescriptorMap.put("java.lang.Character", standardLibrary.getChar());
classDescriptorMap.put("java.lang.Integer", standardLibrary.getInt());
classDescriptorMap.put("java.lang.Long", standardLibrary.getLong());
classDescriptorMap.put("java.lang.Float", standardLibrary.getFloat());
classDescriptorMap.put("java.lang.Double", standardLibrary.getDouble());
classDescriptorMap.put("java.lang.Boolean", standardLibrary.getBoolean());
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
PrimitiveType primitiveType = jvmPrimitiveType.getPrimitiveType();
classDescriptorMap.put(jvmPrimitiveType.getWrapper().getFqName(), standardLibrary.getPrimitiveClassDescriptor(primitiveType));
}
//classDescriptorMap.put("java.lang.Object", standardLibrary.get
classDescriptorMap.put("java.lang.String", standardLibrary.getString());
}
@@ -38,46 +38,22 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
private JetType getPrimitiveType(char descriptor, boolean nullable) {
if (!nullable) {
switch (descriptor) {
case 'Z':
return jetStandardLibrary.getBooleanType();
case 'C':
return jetStandardLibrary.getCharType();
case 'B':
return jetStandardLibrary.getByteType();
case 'S':
return jetStandardLibrary.getShortType();
case 'I':
return jetStandardLibrary.getIntType();
case 'F':
return jetStandardLibrary.getFloatType();
case 'J':
return jetStandardLibrary.getLongType();
case 'D':
return jetStandardLibrary.getDoubleType();
case 'V':
return JetStandardClasses.getUnitType();
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
if (jvmPrimitiveType.getJvmLetter() == descriptor) {
return jetStandardLibrary.getPrimitiveJetType(jvmPrimitiveType.getPrimitiveType());
}
}
if (descriptor == 'V') {
return JetStandardClasses.getUnitType();
}
} else {
switch (descriptor) {
case 'Z':
return jetStandardLibrary.getNullableBooleanType();
case 'C':
return jetStandardLibrary.getNullableCharType();
case 'B':
return jetStandardLibrary.getNullableByteType();
case 'S':
return jetStandardLibrary.getNullableShortType();
case 'I':
return jetStandardLibrary.getNullableIntType();
case 'F':
return jetStandardLibrary.getNullableFloatType();
case 'J':
return jetStandardLibrary.getNullableLongType();
case 'D':
return jetStandardLibrary.getNullableDoubleType();
case 'V':
throw new IllegalStateException("incorrect signature: nullable void");
for (JvmPrimitiveType jvmPrimitiveType : JvmPrimitiveType.values()) {
if (jvmPrimitiveType.getJvmLetter() == descriptor) {
return jetStandardLibrary.getNullablePrimitiveJetType(jvmPrimitiveType.getPrimitiveType());
}
}
if (descriptor == 'V') {
throw new IllegalStateException("incorrect signature: nullable void");
}
}
throw new IllegalStateException("incorrect signature");
@@ -138,7 +114,7 @@ public abstract class JetTypeJetSignatureReader extends JetSignatureExceptionsAd
JetType primitiveType = getPrimitiveType(descriptor, nullable);
JetType arrayType;
if (!nullable) {
arrayType = jetStandardLibrary.getPrimitiveArrayType(primitiveType);
arrayType = jetStandardLibrary.getPrimitiveArrayJetTypeByPrimitiveJetType(primitiveType);
} else {
arrayType = TypeUtils.makeNullableAsSpecified(jetStandardLibrary.getArrayType(primitiveType), nullable);
}
@@ -1,6 +1,7 @@
package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.NotNull;
import org.objectweb.asm.Type;
/**
* @author Stepan Koltsov
@@ -39,4 +40,13 @@ public class JvmClassName {
}
return descriptor;
}
private Type asmType;
public Type getAsmType() {
if (asmType == null) {
asmType = Type.getType(getDescriptor());
}
return asmType;
}
}
@@ -0,0 +1,111 @@
package org.jetbrains.jet.lang.resolve.java;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.types.PrimitiveType;
import org.objectweb.asm.Type;
import java.util.HashMap;
import java.util.Map;
/**
* @author Stepan Koltsov
*/
public enum JvmPrimitiveType {
BOOLEAN(PrimitiveType.BOOLEAN, "boolean", "java.lang.Boolean", Type.BOOLEAN_TYPE),
CHAR(PrimitiveType.CHAR, "char", "java.lang.Character", Type.CHAR_TYPE),
BYTE(PrimitiveType.BYTE, "byte", "java.lang.Byte", Type.BYTE_TYPE),
SHORT(PrimitiveType.SHORT, "short", "java.lang.Short", Type.SHORT_TYPE),
INT(PrimitiveType.INT, "int", "java.lang.Integer", Type.INT_TYPE),
FLOAT(PrimitiveType.FLOAT, "float", "java.lang.Float", Type.FLOAT_TYPE),
LONG(PrimitiveType.LONG, "long", "java.lang.Long", Type.LONG_TYPE),
DOUBLE(PrimitiveType.DOUBLE, "double", "java.lang.Double", Type.DOUBLE_TYPE),
;
private final PrimitiveType primitiveType;
private final String name;
private final JvmClassName wrapper;
private final Type asmType;
private final char jvmLetter;
private final Type asmArrayType;
private final JvmClassName iterator;
private JvmPrimitiveType(PrimitiveType primitiveType, String name, String wrapperClassName, Type asmType) {
this.primitiveType = primitiveType;
this.name = name;
this.wrapper = new JvmClassName(wrapperClassName);
this.asmType = asmType;
this.jvmLetter = asmType.getDescriptor().charAt(0);
this.asmArrayType = makeArrayType(asmType);
this.iterator = new JvmClassName("jet." + primitiveType.getTypeName() + "Iterator");
}
private static Type makeArrayType(Type type) {
StringBuilder sb = new StringBuilder(2);
sb.append('[');
sb.append(type.getDescriptor());
return Type.getType(sb.toString());
}
public PrimitiveType getPrimitiveType() {
return primitiveType;
}
public String getName() {
return name;
}
public JvmClassName getWrapper() {
return wrapper;
}
public Type getAsmType() {
return asmType;
}
public Type getAsmArrayType() {
return asmArrayType;
}
public JvmClassName getIterator() {
return iterator;
}
public char getJvmLetter() {
return jvmLetter;
}
private static class MapByAsmTypeHolder {
private static final Map<Integer, JvmPrimitiveType> map;
static {
map = new HashMap<Integer, JvmPrimitiveType>();
for (JvmPrimitiveType jvmPrimitiveType : values()) {
map.put(jvmPrimitiveType.getAsmType().getSort(), jvmPrimitiveType);
}
}
}
@Nullable
public static JvmPrimitiveType getByAsmType(Type type) {
return MapByAsmTypeHolder.map.get(type.getSort());
}
private static class MapByWrapperAsmTypeHolder {
private static final Map<Type, JvmPrimitiveType> map;
static {
map = new HashMap<Type, JvmPrimitiveType>();
for (JvmPrimitiveType jvmPrimitiveType : values()) {
map.put(jvmPrimitiveType.getWrapper().getAsmType(), jvmPrimitiveType);
}
}
}
@Nullable
public static JvmPrimitiveType getByWrapperAsmType(Type type) {
return MapByWrapperAsmTypeHolder.map.get(type);
}
}