blob: c5fb665696b0a85fbff1bf02465738ec1885958f (
plain) (
tree)
|
|
/* ____ ____ ____ ____ ______ *\
** / __// __ \/ __// __ \/ ____/ SOcos COmpiles Scala **
** __\_ \/ /_/ / /__/ /_/ /\_ \ (c) 2002, LAMP/EPFL **
** /_____/\____/\___/\____/____/ **
** **
** $Id$
\* */
package scalac.symtab.classfile;
import scala.tools.util.Position;
import scalac.atree.AConstant;
import scalac.util.Debug;
import scalac.util.Name;
import scalac.symtab.*;
import Type.*;
public class JavaTypeCreator implements JavaTypeFactory {
protected final Definitions definitions;
protected final Type ANY_TYPE;
protected final Type DOUBLE_TYPE;
protected final Type FLOAT_TYPE;
protected final Type LONG_TYPE;
protected final Type INT_TYPE;
protected final Type CHAR_TYPE;
protected final Type SHORT_TYPE;
protected final Type BYTE_TYPE;
protected final Type BOOLEAN_TYPE;
protected final Type UNIT_TYPE;
protected final Type OBJECT_TYPE;
protected final Type STRING_TYPE;
protected final Type ARRAY_TYPE;
public JavaTypeCreator(Definitions definitions) {
this.definitions = definitions;
this.ANY_TYPE = classType(definitions.ANY_CLASS);
this.DOUBLE_TYPE = classType(definitions.DOUBLE_CLASS);
this.FLOAT_TYPE = classType(definitions.FLOAT_CLASS);
this.LONG_TYPE = classType(definitions.LONG_CLASS);
this.INT_TYPE = classType(definitions.INT_CLASS);
this.CHAR_TYPE = classType(definitions.CHAR_CLASS);
this.SHORT_TYPE = classType(definitions.SHORT_CLASS);
this.BYTE_TYPE = classType(definitions.BYTE_CLASS);
this.BOOLEAN_TYPE = classType(definitions.BOOLEAN_CLASS);
this.UNIT_TYPE = classType(definitions.UNIT_CLASS);
this.OBJECT_TYPE = classType(definitions.OBJECT_CLASS);
this.STRING_TYPE = classType(definitions.STRING_CLASS);
this.ARRAY_TYPE = classType(definitions.ARRAY_CLASS);
}
public Type anyType() {
return ANY_TYPE;
}
public Type byteType() {
return BYTE_TYPE;
}
public Type shortType() {
return SHORT_TYPE;
}
public Type charType() {
return CHAR_TYPE;
}
public Type intType() {
return INT_TYPE;
}
public Type longType() {
return LONG_TYPE;
}
public Type floatType() {
return FLOAT_TYPE;
}
public Type doubleType() {
return DOUBLE_TYPE;
}
public Type booleanType() {
return BOOLEAN_TYPE;
}
public Type voidType() {
return UNIT_TYPE;
}
public Type objectType() {
return OBJECT_TYPE;
}
public Type stringType() {
return STRING_TYPE;
}
public Type classType(String classname) {
return classType(definitions.getClass(classname));
}
public Type classType(Symbol clasz) {
return clasz.staticType();
}
public Type arrayType(Type elemtpe) {
return Type.appliedType(ARRAY_TYPE, new Type[]{elemtpe});
}
public Type methodType(Type[] argtpes, Type restpe, Type[] thrown) {
Symbol[] args = new Symbol[argtpes.length];
for (int i = 0; i < args.length; i++) {
args[i] = Symbol.NONE.newTerm( // !!! should be newVParam
Position.NOPOS, Modifiers.PARAM, Name.fromString("x" + i));
args[i].setInfo(objToAny(argtpes[i]));
}
return new MethodType(args, restpe);
}
private Type objToAny(Type tp) {
if (tp.isSameAs(OBJECT_TYPE))
return ANY_TYPE;
else
return tp;
}
public Type packageType(Name packagename) {
return null;
}
/** return the constant type for the given constant.
*/
public Type constantType(AConstant value) {
return Type.constantType(value);
}
/** return the type of a given constant.
*/
public Type typeOfValue(Object value) {
if (value instanceof Character)
return charType();
else if (value instanceof Integer)
return intType();
else if (value instanceof Long)
return longType();
else if (value instanceof Float)
return floatType();
else if (value instanceof Double)
return doubleType();
else if (value instanceof String)
return stringType();
else if (value instanceof Boolean)
return booleanType();
else
throw Debug.abort("unknown constant type", value.getClass());
}
}
|