JavaDescriptorResolver.java 19.2 KB
Newer Older
1 2
package org.jetbrains.jet.lang.resolve.java;

3
import com.google.common.collect.Lists;
A
Andrey Breslav 已提交
4
import com.google.common.collect.Maps;
A
Andrey Breslav 已提交
5
import com.google.common.collect.Sets;
6 7 8 9 10
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
A
Andrey Breslav 已提交
11
import org.jetbrains.jet.lang.descriptors.*;
A
Andrey Breslav 已提交
12
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
13
import org.jetbrains.jet.lang.resolve.BindingContext;
14
import org.jetbrains.jet.lang.resolve.BindingTrace;
15 16 17 18 19 20 21 22 23
import org.jetbrains.jet.lang.types.*;

import java.util.*;

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {

A
Andrey Breslav 已提交
24
    /*package*/ static final DeclarationDescriptor JAVA_ROOT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_root>") {
25 26 27 28 29 30
        @NotNull
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
            throw new UnsupportedOperationException(); // TODO
        }

31 32
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
33
            return visitor.visitDeclarationDescriptor(this, data);
34 35 36
        }
    };

A
Andrey Breslav 已提交
37
    /*package*/ static final DeclarationDescriptor JAVA_CLASS_OBJECT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_class_object_emulation>") {
A
Andrey Breslav 已提交
38 39 40 41 42 43 44 45 46 47 48 49
        @NotNull
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
            throw new UnsupportedOperationException(); // TODO
        }

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };

50
    protected final Map<String, ClassDescriptor> classDescriptorCache = new HashMap<String, ClassDescriptor>();
A
Andrey Breslav 已提交
51
    protected final Map<PsiTypeParameter, TypeParameterDescriptor> typeParameterDescriptorCache = Maps.newHashMap();
A
Andrey Breslav 已提交
52
    protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
A
Andrey Breslav 已提交
53
    protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    protected final Map<String, NamespaceDescriptor> namespaceDescriptorCache = new HashMap<String, NamespaceDescriptor>();
    protected final JavaPsiFacade javaFacade;
    protected final GlobalSearchScope javaSearchScope;
    protected final JavaSemanticServices semanticServices;

    public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
        this.javaFacade = JavaPsiFacade.getInstance(project);
        this.javaSearchScope = GlobalSearchScope.allScope(project);
        this.semanticServices = semanticServices;
    }

    @NotNull
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
        String qualifiedName = psiClass.getQualifiedName();
        ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
        if (classDescriptor == null) {
            classDescriptor = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classDescriptor);
        }
        return classDescriptor;
    }

    @Nullable
    public ClassDescriptor resolveClass(@NotNull String qualifiedName) {
        ClassDescriptor classDescriptor = classDescriptorCache.get(qualifiedName);
        if (classDescriptor == null) {
            PsiClass psiClass = javaFacade.findClass(qualifiedName, javaSearchScope);
            if (psiClass == null) {
                return null;
            }
            classDescriptor = createJavaClassDescriptor(psiClass);
        }
        return classDescriptor;
    }

89
    private ClassDescriptor createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
A
Andrey Breslav 已提交
90 91 92
        assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
        classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO

93
        String name = psiClass.getName();
94
        JavaClassDescriptor classDescriptor = new JavaClassDescriptor(
95
                JAVA_ROOT, psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS
96
        );
A
Andrey Breslav 已提交
97
        classDescriptor.setName(name);
A
Andrey Breslav 已提交
98

A
Andrey Breslav 已提交
99
        List<JetType> supertypes = new ArrayList<JetType>();
A
Andrey Breslav 已提交
100
        List<TypeParameterDescriptor> typeParameters = resolveTypeParameters(classDescriptor, psiClass.getTypeParameters());
A
Andrey Breslav 已提交
101 102
        classDescriptor.setTypeConstructor(new TypeConstructorImpl(
                classDescriptor,
A
Andrey Breslav 已提交
103
                Collections.<AnnotationDescriptor>emptyList(), // TODO
104
                // TODO
105
                psiClass.hasModifierProperty(PsiModifier.FINAL),
A
Andrey Breslav 已提交
106
                name,
A
Andrey Breslav 已提交
107
                typeParameters,
A
Andrey Breslav 已提交
108
                supertypes
109

A
Andrey Breslav 已提交
110
        ));
111 112 113
        classDescriptor.setModality(Modality.convertFromFlags(
                psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                !psiClass.hasModifierProperty(PsiModifier.FINAL))
A
Andrey Breslav 已提交
114
        );
115
        classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), psiClass));
A
Andrey Breslav 已提交
116
        classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
117
        classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
A
Andrey Breslav 已提交
118
        classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true));
A
Andrey Breslav 已提交
119 120
        // UGLY HACK
        supertypes.addAll(getSupertypes(psiClass));
121 122 123 124 125 126 127 128 129 130 131
        if (psiClass.isInterface()) {
            classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
        }
        else {
            PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
            assert extendsListTypes.length == 0 || extendsListTypes.length == 1;
            JetType superclassType = extendsListTypes.length == 0
                                            ? JetStandardClasses.getAnyType()
                                            : semanticServices.getTypeTransformer().transformToType(extendsListTypes[0]);
            classDescriptor.setSuperclassType(superclassType);
        }
A
Andrey Breslav 已提交
132 133

        PsiMethod[] psiConstructors = psiClass.getConstructors();
134 135 136 137 138

        if (psiConstructors.length == 0) {
            if (!psiClass.hasModifierProperty(PsiModifier.ABSTRACT) && !psiClass.isInterface()) {
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
                        classDescriptor,
A
Andrey Breslav 已提交
139
                        Collections.<AnnotationDescriptor>emptyList(),
140
                        false);
141
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classDescriptor.getVisibility());
142
                constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
143
                classDescriptor.addConstructor(constructorDescriptor);
144
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
145 146 147 148 149 150
            }
        }
        else {
            for (PsiMethod constructor : psiConstructors) {
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
                        classDescriptor,
A
Andrey Breslav 已提交
151
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
152
                        false);
153 154
                constructorDescriptor.initialize(typeParameters, resolveParameterDescriptors(constructorDescriptor, constructor.getParameterList().getParameters()), Modality.FINAL,
                                                 resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), constructor));
155
                constructorDescriptor.setReturnType(classDescriptor.getDefaultType());
156
                classDescriptor.addConstructor(constructorDescriptor);
157
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, constructor, constructorDescriptor);
158
            }
A
Andrey Breslav 已提交
159
        }
160

161
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classDescriptor);
162

163 164 165
        return classDescriptor;
    }

166
    private List<TypeParameterDescriptor> resolveTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
167 168
        List<TypeParameterDescriptor> result = Lists.newArrayList();
        for (PsiTypeParameter typeParameter : typeParameters) {
169
            TypeParameterDescriptor typeParameterDescriptor = resolveTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
170
            result.add(typeParameterDescriptor);
171 172 173 174
        }
        return result;
    }

A
Andrey Breslav 已提交
175
    private TypeParameterDescriptor createJavaTypeParameterDescriptor(@NotNull DeclarationDescriptor owner, @NotNull PsiTypeParameter typeParameter) {
176 177
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
                owner,
A
Andrey Breslav 已提交
178
                Collections.<AnnotationDescriptor>emptyList(), // TODO
179
                Variance.INVARIANT,
A
Andrey Breslav 已提交
180 181
                typeParameter.getName(),
                typeParameter.getIndex()
182
        );
183
        typeParameterDescriptorCache.put(typeParameter, typeParameterDescriptor);
A
Andrey Breslav 已提交
184 185
        PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes();
        if (referencedTypes.length == 0){
186
            typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
A
Andrey Breslav 已提交
187 188
        }
        else if (referencedTypes.length == 1) {
189
            typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0]));
A
Andrey Breslav 已提交
190 191 192
        }
        else {
            for (PsiClassType referencedType : referencedTypes) {
193
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType));
A
Andrey Breslav 已提交
194 195
            }
        }
196
        return typeParameterDescriptor;
A
Andrey Breslav 已提交
197 198 199
    }

    @NotNull
200
    public TypeParameterDescriptor resolveTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
A
Andrey Breslav 已提交
201 202
        TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter);
        if (typeParameterDescriptor == null) {
203 204
            typeParameterDescriptor = createJavaTypeParameterDescriptor(containingDeclaration, psiTypeParameter);
//            This is done inside the method: typeParameterDescriptorCache.put(psiTypeParameter, typeParameterDescriptor);
A
Andrey Breslav 已提交
205 206 207 208
        }
        return typeParameterDescriptor;
    }

A
Andrey Breslav 已提交
209 210
    private Collection<? extends JetType> getSupertypes(PsiClass psiClass) {
        List<JetType> result = new ArrayList<JetType>();
211 212 213 214 215 216
        result.add(JetStandardClasses.getAnyType());
        transformSupertypeList(result, psiClass.getExtendsListTypes());
        transformSupertypeList(result, psiClass.getImplementsListTypes());
        return result;
    }

A
Andrey Breslav 已提交
217
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes) {
218
        for (PsiClassType type : extendsListTypes) {
A
Andrey Breslav 已提交
219
            JetType transform = semanticServices.getTypeTransformer().transformToType(type);
220 221 222 223 224

            result.add(TypeUtils.makeNotNullable(transform));
        }
    }

225 226 227 228 229
    public NamespaceDescriptor resolveNamespace(String qualifiedName) {
        NamespaceDescriptor namespaceDescriptor = namespaceDescriptorCache.get(qualifiedName);
        if (namespaceDescriptor == null) {
            // TODO : packages

A
Andrey Breslav 已提交
230 231 232 233 234
//            PsiClass psiClass = javaFacade.findClass(qualifiedName, javaSearchScope);
//            if (psiClass != null) {
//                namespaceDescriptor = createJavaNamespaceDescriptor(psiClass);
//            }
//            else {
235 236 237 238 239
                PsiPackage psiPackage = javaFacade.findPackage(qualifiedName);
                if (psiPackage == null) {
                    return null;
                }
                namespaceDescriptor = createJavaNamespaceDescriptor(psiPackage);
A
Andrey Breslav 已提交
240
//            }
241 242 243 244 245
            namespaceDescriptorCache.put(qualifiedName, namespaceDescriptor);
        }
        return namespaceDescriptor;
    }

246
    private NamespaceDescriptor createJavaNamespaceDescriptor(PsiPackage psiPackage) {
247
        JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
248
                JAVA_ROOT,
A
Andrey Breslav 已提交
249
                Collections.<AnnotationDescriptor>emptyList(), // TODO
250
                psiPackage.getName()
251
        );
252
        namespaceDescriptor.setMemberScope(new JavaPackageScope(psiPackage.getQualifiedName(), namespaceDescriptor, semanticServices));
253
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiPackage, namespaceDescriptor);
254 255 256
        return namespaceDescriptor;
    }

257
    private NamespaceDescriptor createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
258
        JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
259
                JAVA_ROOT,
A
Andrey Breslav 已提交
260
                Collections.<AnnotationDescriptor>emptyList(), // TODO
261
                psiClass.getName()
262
        );
263
        namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceDescriptor, psiClass, semanticServices, true));
264
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceDescriptor);
265 266 267
        return namespaceDescriptor;
    }

268
    public List<ValueParameterDescriptor> resolveParameterDescriptors(DeclarationDescriptor containingDeclaration, PsiParameter[] parameters) {
269 270 271
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
        for (int i = 0, parametersLength = parameters.length; i < parametersLength; i++) {
            PsiParameter parameter = parameters[i];
A
Andrey Breslav 已提交
272
            String name = parameter.getName();
273
            result.add(new ValueParameterDescriptorImpl(
274
                    containingDeclaration,
275
                    i,
A
Andrey Breslav 已提交
276
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
277
                    name == null ? "p" + i : name,
278
                    null, // TODO : review
A
Andrey Breslav 已提交
279
                    semanticServices.getTypeTransformer().transformToType(parameter.getType()),
280 281 282 283 284 285
                    false,
                    parameter.isVarArgs()
            ));
        }
        return result;
    }
A
Andrey Breslav 已提交
286

A
Andrey Breslav 已提交
287 288 289 290 291 292 293 294 295
    public VariableDescriptor resolveFieldToVariableDescriptor(DeclarationDescriptor containingDeclaration, PsiField field) {
        VariableDescriptor variableDescriptor = fieldDescriptorCache.get(field);
        if (variableDescriptor != null) {
            return variableDescriptor;
        }
        JetType type = semanticServices.getTypeTransformer().transformToType(field.getType());
        boolean isFinal = field.hasModifierProperty(PsiModifier.FINAL);
        PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                containingDeclaration,
A
Andrey Breslav 已提交
296
                Collections.<AnnotationDescriptor>emptyList(),
297
                Modality.FINAL,
298
                resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), field),
A
Andrey Breslav 已提交
299 300 301 302 303
                !isFinal,
                null,
                field.getName(),
                isFinal ? null : type,
                type);
304
        semanticServices.getTrace().record(BindingContext.VARIABLE, field, propertyDescriptor);
A
Andrey Breslav 已提交
305 306 307 308
        fieldDescriptorCache.put(field, propertyDescriptor);
        return propertyDescriptor;
    }

A
Andrey Breslav 已提交
309
    @NotNull
A
Andrey Breslav 已提交
310 311
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, @Nullable ClassDescriptor classDescriptor, @NotNull String methodName, boolean staticMembers) {
        Set<FunctionDescriptor> writableFunctionGroup = Sets.newLinkedHashSet();
312
        final Collection<HierarchicalMethodSignature> signatures = psiClass.getVisibleSignatures();
A
Andrey Breslav 已提交
313
        TypeSubstitutor typeSubstitutor = createSubstitutorForGenericSupertypes(classDescriptor);
314
        for (HierarchicalMethodSignature signature: signatures) {
A
Andrey Breslav 已提交
315
            PsiMethod method = signature.getMethod();
A
Andrey Breslav 已提交
316 317 318 319 320 321 322
            if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
                continue;
            }
            if (!methodName.equals(method.getName())) {
                 continue;
            }

A
Andrey Breslav 已提交
323
            FunctionDescriptor substitutedFunctionDescriptor = resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutor, method);
324
            if (substitutedFunctionDescriptor != null) {
A
Andrey Breslav 已提交
325
                writableFunctionGroup.add(substitutedFunctionDescriptor);
326
            }
A
Andrey Breslav 已提交
327 328 329
        }
        return writableFunctionGroup;
    }
A
Andrey Breslav 已提交
330 331 332 333 334 335 336 337 338 339 340 341 342

    public TypeSubstitutor createSubstitutorForGenericSupertypes(ClassDescriptor classDescriptor) {
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }

    @Nullable
A
Andrey Breslav 已提交
343
    public FunctionDescriptor resolveMethodToFunctionDescriptor(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, PsiMethod method) {
A
Andrey Breslav 已提交
344 345 346 347 348 349 350 351 352 353 354 355 356
        PsiType returnType = method.getReturnType();
        if (returnType == null) {
            return null;
        }
        FunctionDescriptor functionDescriptor = methodDescriptorCache.get(method);
        if (functionDescriptor != null) {
            if (method.getContainingClass() != psiClass) {
                functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
            }
            return functionDescriptor;
        }
        PsiParameter[] parameters = method.getParameterList().getParameters();
        FunctionDescriptorImpl functionDescriptorImpl = new FunctionDescriptorImpl(
A
Andrey Breslav 已提交
357 358
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
359 360 361 362 363 364 365
                method.getName()
        );
        methodDescriptorCache.put(method, functionDescriptorImpl);
        functionDescriptorImpl.initialize(
                null,
                resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()),
                semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters),
366
                semanticServices.getTypeTransformer().transformToType(returnType),
367 368
                Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)),
                resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), method)
A
Andrey Breslav 已提交
369
        );
370
        semanticServices.getTrace().record(BindingContext.FUNCTION, method, functionDescriptorImpl);
A
Andrey Breslav 已提交
371 372 373 374 375 376
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
        if (method.getContainingClass() != psiClass) {
            substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
        }
        return substitutedFunctionDescriptor;
    }
377 378 379 380 381 382 383 384

    private static Visibility resolveVisibilityFromPsiModifiers(BindingTrace trace, PsiModifierListOwner modifierListOwner) {
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

385
}