ErrorUtils.java 7.1 KB
Newer Older
1 2
package org.jetbrains.jet.lang.types;

A
Andrey Breslav 已提交
3
import org.jetbrains.annotations.NotNull;
A
Andrey Breslav 已提交
4
import org.jetbrains.jet.lang.resolve.JetScope;
5
import org.jetbrains.jet.lang.resolve.OverloadResolutionResult;
6

7
import java.util.*;
8 9 10 11

/**
 * @author abreslav
 */
A
rename  
Andrey Breslav 已提交
12
public class ErrorUtils {
A
Andrey Breslav 已提交
13 14

    private static final ModuleDescriptor ERROR_MODULE = new ModuleDescriptor("<ERROR MODULE>");
A
Andrey Breslav 已提交
15
    private static final JetScope ERROR_SCOPE = new JetScope() {
A
Andrey Breslav 已提交
16

A
Andrey Breslav 已提交
17
        @Override
A
Andrey Breslav 已提交
18
        public ClassifierDescriptor getClassifier(@NotNull String name) {
A
Andrey Breslav 已提交
19
            return ERROR_CLASS;
20 21 22
        }

        @Override
23
        public VariableDescriptor getVariable(@NotNull String name) {
A
Andrey Breslav 已提交
24
            return ERROR_PROPERTY;
25 26 27
        }

        @Override
28
        public NamespaceDescriptor getNamespace(@NotNull String name) {
A
Andrey Breslav 已提交
29
            return null; // TODO : review
A
Andrey Breslav 已提交
30 31 32 33
        }

        @NotNull
        @Override
A
Andrey Breslav 已提交
34
        public JetType getThisType() {
A
Andrey Breslav 已提交
35
            return createErrorType("<ERROR TYPE>");
A
Andrey Breslav 已提交
36
        }
37 38 39

        @NotNull
        @Override
40
        public FunctionGroup getFunctionGroup(@NotNull String name) {
A
Andrey Breslav 已提交
41
            return ERROR_FUNCTION_GROUP;
42
        }
43

44 45 46
        @NotNull
        @Override
        public DeclarationDescriptor getContainingDeclaration() {
A
Andrey Breslav 已提交
47
            return ERROR_MODULE;
48 49
        }

A
Andrey Breslav 已提交
50 51 52 53 54 55
        @NotNull
        @Override
        public Collection<DeclarationDescriptor> getDeclarationsByLabel(String labelName) {
            return Collections.emptyList();
        }

A
Andrey Breslav 已提交
56 57 58 59 60
        @Override
        public PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName) {
            return null; // TODO : review
        }

A
Andrey Breslav 已提交
61
    };
62

A
Andrey Breslav 已提交
63 64 65 66 67 68 69 70 71
    private static final FunctionGroup ERROR_FUNCTION_GROUP = new FunctionGroup() {
        @NotNull
        @Override
        public String getName() {
            return "<ERROR FUNCTION>";
        }

        @NotNull
        @Override
72
        public OverloadResolutionResult getPossiblyApplicableFunctions(@NotNull List<JetType> typeArguments, @NotNull List<JetType> positionedValueArgumentTypes) {
73
            List<TypeParameterDescriptor> typeParameters = Collections.<TypeParameterDescriptor>emptyList();
74
            return OverloadResolutionResult.success(createErrorFunction(typeParameters, positionedValueArgumentTypes));
A
Andrey Breslav 已提交
75 76 77 78 79 80 81 82
        }

        @Override
        public boolean isEmpty() {
            return false;
        }
    };

83 84 85 86 87 88 89
    private static final ClassDescriptor ERROR_CLASS = new ClassDescriptorImpl(ERROR_MODULE, Collections.<Attribute>emptyList(), "<ERROR CLASS>").initialize(
            true, Collections.<TypeParameterDescriptor>emptyList(), Collections.<JetType>emptyList(), getErrorScope(), ERROR_FUNCTION_GROUP);

    private static JetScope getErrorScope() {
        return ERROR_SCOPE;
    }

A
Andrey Breslav 已提交
90
    private static final JetType ERROR_PROPERTY_TYPE = createErrorType("<ERROR PROPERTY TYPE>");
91
    private static final VariableDescriptor ERROR_PROPERTY = new PropertyDescriptor(
92
            ERROR_CLASS, Collections.<Attribute>emptyList(), new MemberModifiers(false, false, false), true, "<ERROR PROPERTY>", ERROR_PROPERTY_TYPE, ERROR_PROPERTY_TYPE);
93

94
    private static FunctionDescriptor createErrorFunction(List<TypeParameterDescriptor> typeParameters, List<JetType> positionedValueArgumentTypes) {
95
        FunctionDescriptorImpl functionDescriptor = new FunctionDescriptorImpl(ERROR_CLASS, Collections.<Attribute>emptyList(), "<ERROR FUNCTION>");
96
        return functionDescriptor.initialize(
97 98 99
                typeParameters,
                getValueParameters(functionDescriptor, positionedValueArgumentTypes),
                createErrorType("<ERROR FUNCTION RETURN>")
100
        );
101 102 103 104 105 106 107 108 109 110 111 112 113 114
    }

    private static FunctionDescriptor createErrorFunction(int typeParameterCount, Map<String, JetType> valueParameters) {
        throw new UnsupportedOperationException(); // TODO
    }

    private static FunctionDescriptor createErrorFunction(int typeParameterCount, List<JetType> positionedValueParameterTypes) {
        return new FunctionDescriptorImpl(ERROR_CLASS, Collections.<Attribute>emptyList(), "<ERROR FUNCTION>").initialize(
                Collections.<TypeParameterDescriptor>emptyList(), // TODO
                Collections.<ValueParameterDescriptor>emptyList(), // TODO
                createErrorType("<ERROR FUNCTION RETURN TYPE>")
        );
    }

115
    private static final JetType ERROR_PARAMETER_TYPE = createErrorType("<ERROR PARAMETER TYPE>");
116 117 118 119 120 121 122 123
    private static List<ValueParameterDescriptor> getValueParameters(FunctionDescriptor functionDescriptor, List<JetType> argumentTypes) {
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
        for (int i = 0, argumentTypesSize = argumentTypes.size(); i < argumentTypesSize; i++) {
            result.add(new ValueParameterDescriptorImpl(
                    functionDescriptor,
                    i,
                    Collections.<Attribute>emptyList(),
                    "<ERROR PARAMETER>",
124 125
                    ERROR_PARAMETER_TYPE,
                    ERROR_PARAMETER_TYPE,
126 127 128 129 130
                    false,
                    false));
        }
        return result;
    }
A
Andrey Breslav 已提交
131

A
Andrey Breslav 已提交
132
    public static JetType createErrorType(String debugMessage) {
A
Andrey Breslav 已提交
133
        return createErrorType(debugMessage, ERROR_SCOPE);
134 135
    }

A
Andrey Breslav 已提交
136
    private static JetType createErrorType(String debugMessage, JetScope memberScope) {
137
        return new ErrorTypeImpl(new TypeConstructorImpl(ERROR_CLASS, Collections.<Attribute>emptyList(), false, "[ERROR : " + debugMessage + "]", Collections.<TypeParameterDescriptor>emptyList(), Collections.<JetType>emptyList()), memberScope);
138 139
    }

A
Andrey Breslav 已提交
140
    public static JetType createWrongVarianceErrorType(TypeProjection value) {
A
Andrey Breslav 已提交
141
        return createErrorType(value + " is not allowed here]", value.getType().getMemberScope());
142 143
    }

A
Andrey Breslav 已提交
144
    public static boolean isErrorType(JetType type) {
145
        return type instanceof ErrorTypeImpl;
146 147
    }

148 149 150 151
    public static ClassifierDescriptor getErrorClass() {
        return ERROR_CLASS;
    }

A
Andrey Breslav 已提交
152 153 154 155
    public static boolean isError(@NotNull TypeConstructor typeConstructor) {
        return typeConstructor == ERROR_CLASS.getTypeConstructor();
    }

A
Andrey Breslav 已提交
156
    private static class ErrorTypeImpl implements JetType {
157 158 159

        private final TypeConstructor constructor;

160
        private final JetScope memberScope;
A
Andrey Breslav 已提交
161
        private ErrorTypeImpl(TypeConstructor constructor, JetScope memberScope) {
162
            this.constructor = constructor;
A
Andrey Breslav 已提交
163
            this.memberScope = memberScope;
164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
        }

        @NotNull
        @Override
        public TypeConstructor getConstructor() {
            return constructor;
        }

        @NotNull
        @Override
        public List<TypeProjection> getArguments() {
            return Collections.emptyList();
        }

        @Override
        public boolean isNullable() {
            return false;
        }

        @NotNull
        @Override
A
Andrey Breslav 已提交
185 186
        public JetScope getMemberScope() {
            return memberScope;
187 188 189 190 191 192
        }

        @Override
        public List<Attribute> getAttributes() {
            return Collections.emptyList();
        }
193

194 195 196 197
        @Override
        public String toString() {
            return constructor.toString();
        }
198
    }
199

A
rename  
Andrey Breslav 已提交
200
    private ErrorUtils() {}
201
}