JetStandardClasses.java 12.5 KB
Newer Older
A
Andrey Breslav 已提交
1 2
package org.jetbrains.jet.lang.types;

A
Andrey Breslav 已提交
3
import org.jetbrains.annotations.NotNull;
A
Andrey Breslav 已提交
4
import org.jetbrains.annotations.Nullable;
5 6
import org.jetbrains.jet.lang.resolve.JetScope;
import org.jetbrains.jet.lang.resolve.JetScopeImpl;
A
Andrey Breslav 已提交
7
import org.jetbrains.jet.lang.resolve.WritableScope;
A
Andrey Breslav 已提交
8

9 10
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
A
Andrey Breslav 已提交
11
import java.util.*;
A
Andrey Breslav 已提交
12 13 14 15 16

/**
 * @author abreslav
 */
public class JetStandardClasses {
A
Andrey Breslav 已提交
17 18

    private static ClassDescriptor NOTHING_CLASS = new ClassDescriptor(
A
Andrey Breslav 已提交
19
            Collections.<Attribute>emptyList(),
20
            true,
A
Andrey Breslav 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
            "Nothing",
            Collections.<TypeParameterDescriptor>emptyList(),
            new AbstractCollection<Type>() {
                @Override
                public boolean contains(Object o) {
                    return o instanceof Type;
                }

                @Override
                public Iterator<Type> iterator() {
                    throw new UnsupportedOperationException();
                }

                @Override
                public int size() {
                    throw new UnsupportedOperationException();
                }
A
Andrey Breslav 已提交
38
            }, JetScope.EMPTY
A
Andrey Breslav 已提交
39
    );
A
Andrey Breslav 已提交
40

A
Andrey Breslav 已提交
41
    private static final ClassDescriptor ANY = new ClassDescriptor(
42
            Collections.<Attribute>emptyList(),
43
            false,
A
Andrey Breslav 已提交
44 45
            "Any",
            Collections.<TypeParameterDescriptor>emptyList(),
46
            Collections.<Type>emptySet(),
A
Andrey Breslav 已提交
47
            JetScope.EMPTY
A
Andrey Breslav 已提交
48 49
    );

A
Andrey Breslav 已提交
50
    public static final JetScope STUB = JetScope.EMPTY;
51

A
Andrey Breslav 已提交
52
    private static final Type ANY_TYPE = new TypeImpl(ANY.getTypeConstructor(), JetScope.EMPTY);
53

54
    private static final Type NULLABLE_ANY_TYPE = TypeUtils.makeNullable(ANY_TYPE);
55 56 57 58 59 60 61 62
    private static final ClassDescriptor BYTE    = new ClassDescriptor("Byte", STUB);
    private static final ClassDescriptor CHAR    = new ClassDescriptor("Char", STUB);
    private static final ClassDescriptor SHORT   = new ClassDescriptor("Short", STUB);
    private static final ClassDescriptor INT     = new ClassDescriptor("Int", STUB);
    private static final ClassDescriptor LONG    = new ClassDescriptor("Long", STUB);
    private static final ClassDescriptor FLOAT   = new ClassDescriptor("Float", STUB);
    private static final ClassDescriptor DOUBLE  = new ClassDescriptor("Double", STUB);
    private static final ClassDescriptor BOOLEAN = new ClassDescriptor("Boolean", STUB);
63

64
    private static final ClassDescriptor STRING  = new ClassDescriptor("String", STUB);
A
Andrey Breslav 已提交
65 66 67

    public static final int TUPLE_COUNT = 22;
    private static final ClassDescriptor[] TUPLE = new ClassDescriptor[TUPLE_COUNT];
68

A
Andrey Breslav 已提交
69 70 71 72 73
    static {
        for (int i = 0; i < TUPLE_COUNT; i++) {
            List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
            for (int j = 0; j < i; j++) {
                parameters.add(new TypeParameterDescriptor(
74
                        Collections.<Attribute>emptyList(),
A
Andrey Breslav 已提交
75
                        Variance.OUT_VARIANCE, "T" + j,
A
Andrey Breslav 已提交
76
                        Collections.singleton(getNullableAnyType())));
A
Andrey Breslav 已提交
77 78
            }
            TUPLE[i] = new ClassDescriptor(
79
                    Collections.<Attribute>emptyList(),
80
                    true,
A
Andrey Breslav 已提交
81 82
                    "Tuple" + i,
                    parameters,
83
                    Collections.singleton(JetStandardClasses.getAnyType()), STUB);
A
Andrey Breslav 已提交
84 85
        }
    }
A
Andrey Breslav 已提交
86 87 88
    public static final int FUNCTION_COUNT = 22;
    private static final ClassDescriptor[] FUNCTION = new ClassDescriptor[FUNCTION_COUNT];
    private static final ClassDescriptor[] RECEIVER_FUNCTION = new ClassDescriptor[FUNCTION_COUNT];
89 90


A
Andrey Breslav 已提交
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
    static {
        for (int i = 0; i < FUNCTION_COUNT; i++) {
            List<TypeParameterDescriptor> parameters = new ArrayList<TypeParameterDescriptor>();
            for (int j = 0; j < i; j++) {
                parameters.add(new TypeParameterDescriptor(
                        Collections.<Attribute>emptyList(),
                        Variance.IN_VARIANCE, "P" + j,
                        Collections.singleton(getNullableAnyType())));
            }
            parameters.add(new TypeParameterDescriptor(
                        Collections.<Attribute>emptyList(),
                        Variance.OUT_VARIANCE, "R",
                        Collections.singleton(getNullableAnyType())));
            FUNCTION[i] = new ClassDescriptor(
                    Collections.<Attribute>emptyList(),
                    false,
                    "Function" + i,
                    parameters,
109
                    Collections.singleton(JetStandardClasses.getAnyType()), STUB);
A
Andrey Breslav 已提交
110 111 112 113 114 115 116 117 118
            parameters.add(0, new TypeParameterDescriptor(
                        Collections.<Attribute>emptyList(),
                        Variance.IN_VARIANCE, "T",
                        Collections.singleton(getNullableAnyType())));
            RECEIVER_FUNCTION[i] = new ClassDescriptor(
                    Collections.<Attribute>emptyList(),
                    false,
                    "ReceiverFunction" + i,
                    parameters,
119
                    Collections.singleton(JetStandardClasses.getAnyType()), STUB);
A
Andrey Breslav 已提交
120 121 122
        }
    }

123 124 125 126 127 128 129 130 131 132 133
    private static final Type BYTE_TYPE = new TypeImpl(getByte());
    private static final Type CHAR_TYPE = new TypeImpl(getChar());
    private static final Type SHORT_TYPE = new TypeImpl(getShort());
    private static final Type INT_TYPE = new TypeImpl(getInt());
    private static final Type LONG_TYPE = new TypeImpl(getLong());
    private static final Type FLOAT_TYPE = new TypeImpl(getFloat());
    private static final Type DOUBLE_TYPE = new TypeImpl(getDouble());
    private static final Type BOOLEAN_TYPE = new TypeImpl(getBoolean());
    private static final Type STRING_TYPE = new TypeImpl(getString());
    private static final Type UNIT_TYPE = new TypeImpl(getTuple(0));
    private static final Type NOTHING_TYPE = new TypeImpl(getNothing());
A
Andrey Breslav 已提交
134

A
Andrey Breslav 已提交
135 136 137 138 139
    private static final Type NULLABLE_NOTHING_TYPE = new TypeImpl(
            Collections.<Attribute>emptyList(),
            getNothing().getTypeConstructor(),
            true,
            Collections.<TypeProjection>emptyList(),
A
Andrey Breslav 已提交
140
            JetScope.EMPTY);
A
Andrey Breslav 已提交
141

142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
    private static final Map<String, ClassDescriptor> CLASS_MAP = new HashMap<String, ClassDescriptor>();
    static {
        Field[] declaredFields = JetStandardClasses.class.getDeclaredFields();
        for (Field field : declaredFields) {
            if ((field.getModifiers() & Modifier.STATIC) == 0) {
                continue;
            }
            Class<?> type = field.getType();
            if (type == ClassDescriptor.class) {
                try {
                    ClassDescriptor descriptor = (ClassDescriptor) field.get(null);
                    CLASS_MAP.put(descriptor.getName(), descriptor);
                } catch (IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            } else if (type.isArray() && type.getComponentType() == ClassDescriptor.class) {
                try {
                    ClassDescriptor[] array = (ClassDescriptor[]) field.get(null);
                    for (ClassDescriptor descriptor : array) {
                        CLASS_MAP.put(descriptor.getName(), descriptor);
                    }
                } catch (IllegalAccessException e) {
                    throw new IllegalStateException(e);
                }
            }
        }
        CLASS_MAP.put("Unit", getTuple(0));
    }

    @NotNull
    public static final JetScope STANDARD_CLASSES = new JetScopeImpl() {
        @Override
        public ClassDescriptor getClass(String name) {
            return CLASS_MAP.get(name);
        }
    };

A
Andrey Breslav 已提交
179
    @NotNull
A
Andrey Breslav 已提交
180 181 182 183
    public static ClassDescriptor getAny() {
        return ANY;
    }

A
Andrey Breslav 已提交
184
    @NotNull
A
Andrey Breslav 已提交
185
    public static Type getAnyType() {
186 187 188
        return ANY_TYPE;
    }

189 190 191 192
    public static Type getNullableAnyType() {
        return NULLABLE_ANY_TYPE;
    }

A
Andrey Breslav 已提交
193
    @NotNull
A
Andrey Breslav 已提交
194 195 196 197
    public static ClassDescriptor getByte() {
        return BYTE;
    }

A
Andrey Breslav 已提交
198
    @NotNull
A
Andrey Breslav 已提交
199 200 201 202
    public static ClassDescriptor getChar() {
        return CHAR;
    }

A
Andrey Breslav 已提交
203
    @NotNull
A
Andrey Breslav 已提交
204 205 206 207
    public static ClassDescriptor getShort() {
        return SHORT;
    }

A
Andrey Breslav 已提交
208
    @NotNull
A
Andrey Breslav 已提交
209 210 211 212
    public static ClassDescriptor getInt() {
        return INT;
    }

A
Andrey Breslav 已提交
213
    @NotNull
A
Andrey Breslav 已提交
214 215 216 217
    public static ClassDescriptor getLong() {
        return LONG;
    }

A
Andrey Breslav 已提交
218
    @NotNull
A
Andrey Breslav 已提交
219 220 221 222
    public static ClassDescriptor getFloat() {
        return FLOAT;
    }

A
Andrey Breslav 已提交
223
    @NotNull
A
Andrey Breslav 已提交
224 225 226 227
    public static ClassDescriptor getDouble() {
        return DOUBLE;
    }

A
Andrey Breslav 已提交
228
    @NotNull
A
Andrey Breslav 已提交
229 230 231 232
    public static ClassDescriptor getBoolean() {
        return BOOLEAN;
    }

A
Andrey Breslav 已提交
233
    @NotNull
A
Andrey Breslav 已提交
234 235 236
    public static ClassDescriptor getString() {
        return STRING;
    }
A
Andrey Breslav 已提交
237

A
Andrey Breslav 已提交
238 239 240 241 242
    @NotNull
    public static ClassDescriptor getNothing() {
        return NOTHING_CLASS;
    }

A
Andrey Breslav 已提交
243 244 245 246 247
    @NotNull
    public static ClassDescriptor getTuple(int size) {
        return TUPLE[size];
    }

248 249 250 251 252 253 254 255 256 257
    @NotNull
    public static ClassDescriptor getFunction(int parameterCount) {
        return FUNCTION[parameterCount];
    }

    @NotNull
    public static ClassDescriptor getReceiverFunction(int parameterCount) {
        return RECEIVER_FUNCTION[parameterCount];
    }

A
Andrey Breslav 已提交
258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305
    public static Type getIntType() {
        return INT_TYPE;
    }

    public static Type getLongType() {
        return LONG_TYPE;
    }

    public static Type getDoubleType() {
        return DOUBLE_TYPE;
    }

    public static Type getFloatType() {
        return FLOAT_TYPE;
    }

    public static Type getCharType() {
        return CHAR_TYPE;
    }

    public static Type getBooleanType() {
        return BOOLEAN_TYPE;
    }

    public static Type getStringType() {
        return STRING_TYPE;
    }

    public static Type getByteType() {
        return BYTE_TYPE;
    }

    public static Type getShortType() {
        return SHORT_TYPE;
    }

    public static Type getUnitType() {
        return UNIT_TYPE;
    }

    public static Type getNothingType() {
        return NOTHING_TYPE;
    }

    public static Type getNullableNothingType() {
        return NULLABLE_NOTHING_TYPE;
    }

306 307 308 309
    public static boolean isNothing(Type type) {
        return type.getConstructor() == NOTHING_CLASS.getTypeConstructor();
    }

A
Andrey Breslav 已提交
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330
    public static Type getTupleType(List<Attribute> attributes, List<Type> arguments) {
        if (attributes.isEmpty() && arguments.isEmpty()) {
            return getUnitType();
        }
        return new TypeImpl(attributes, getTuple(arguments.size()).getTypeConstructor(), false, toProjections(arguments), STUB);
    }

    public static Type getTupleType(List<Type> arguments) {
        return getTupleType(Collections.<Attribute>emptyList(), arguments);
    }

    public static Type getTupleType(Type... arguments) {
        return getTupleType(Collections.<Attribute>emptyList(), Arrays.asList(arguments));
    }

    public static Type getLabeledTupleType(List<Attribute> attributes, List<ParameterDescriptor> arguments) {
        // TODO
        return getTupleType(attributes, toTypes(arguments));
    }

    public static Type getLabeledTupleType(List<ParameterDescriptor> arguments) {
A
Andrey Breslav 已提交
331
        // TODO
A
Andrey Breslav 已提交
332 333 334 335 336 337
        return getLabeledTupleType(Collections.<Attribute>emptyList(), arguments);
    }

    private static List<TypeProjection> toProjections(List<Type> arguments) {
        List<TypeProjection> result = new ArrayList<TypeProjection>();
        for (Type argument : arguments) {
338
            result.add(new TypeProjection(Variance.OUT_VARIANCE, argument));
A
Andrey Breslav 已提交
339 340 341 342 343 344 345 346 347 348
        }
        return result;
    }

    private static List<Type> toTypes(List<ParameterDescriptor> labeledEntries) {
        List<Type> result = new ArrayList<Type>();
        for (ParameterDescriptor entry : labeledEntries) {
            result.add(entry.getType());
        }
        return result;
A
Andrey Breslav 已提交
349
    }
A
Andrey Breslav 已提交
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368

    // TODO : labeled version?
    public static Type getFunctionType(List<Attribute> attributes, @Nullable Type receiverType, @NotNull List<Type> parameterTypes, @NotNull Type returnType) {
        List<TypeProjection> arguments = new ArrayList<TypeProjection>();
        if (receiverType != null) {
            arguments.add(defaultProjection(receiverType));
        }
        for (Type parameterType : parameterTypes) {
            arguments.add(defaultProjection(parameterType));
        }
        arguments.add(defaultProjection(returnType));
        int size = parameterTypes.size();
        TypeConstructor constructor = receiverType == null ? FUNCTION[size].getTypeConstructor() : RECEIVER_FUNCTION[size].getTypeConstructor();
        return new TypeImpl(attributes, constructor, false, arguments, STUB);
    }

    private static TypeProjection defaultProjection(Type returnType) {
        return new TypeProjection(Variance.INVARIANT, returnType);
    }
A
Andrey Breslav 已提交
369
}