JavaDescriptorResolver.java 22.4 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
import org.jetbrains.jet.lang.types.*;

import java.util.*;

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
23 24
    
    public static String JAVA_ROOT = "<java_root>";
25

26 27
    /*package*/ static final DeclarationDescriptor JAVA_METHOD_TYPE_PARAMETER_PARENT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_generic_method>") {

28 29
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
30
            throw new UnsupportedOperationException();
31 32
        }

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

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

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

52
    protected final Map<String, ClassDescriptor> classDescriptorCache = new HashMap<String, ClassDescriptor>();
A
Andrey Breslav 已提交
53
    protected final Map<PsiTypeParameter, TypeParameterDescriptor> typeParameterDescriptorCache = Maps.newHashMap();
A
Andrey Breslav 已提交
54
    protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
A
Andrey Breslav 已提交
55
    protected final Map<PsiField, VariableDescriptor> fieldDescriptorCache = Maps.newHashMap();
56
    protected final Map<PsiPackage, NamespaceDescriptor> namespaceDescriptorCache = Maps.newHashMap();
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 89 90
    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;
    }

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

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

A
Andrey Breslav 已提交
101
        List<JetType> supertypes = new ArrayList<JetType>();
A
Andrey Breslav 已提交
102
        List<TypeParameterDescriptor> typeParameters = resolveTypeParameters(classDescriptor, psiClass.getTypeParameters());
A
Andrey Breslav 已提交
103 104
        classDescriptor.setTypeConstructor(new TypeConstructorImpl(
                classDescriptor,
A
Andrey Breslav 已提交
105
                Collections.<AnnotationDescriptor>emptyList(), // TODO
106
                // TODO
107
                psiClass.hasModifierProperty(PsiModifier.FINAL),
A
Andrey Breslav 已提交
108
                name,
A
Andrey Breslav 已提交
109
                typeParameters,
A
Andrey Breslav 已提交
110 111
                supertypes
        ));
112 113 114
        classDescriptor.setModality(Modality.convertFromFlags(
                psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                !psiClass.hasModifierProperty(PsiModifier.FINAL))
A
Andrey Breslav 已提交
115
        );
116
        classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), psiClass));
A
Andrey Breslav 已提交
117
        classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
118
        classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
A
Andrey Breslav 已提交
119
        classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true));
A
Andrey Breslav 已提交
120 121
        // UGLY HACK
        supertypes.addAll(getSupertypes(psiClass));
122 123 124 125 126 127 128 129 130 131 132
        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 已提交
133 134

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

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

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

164 165 166
        return classDescriptor;
    }

167 168 169 170 171 172 173 174 175 176 177
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
            return resolveClass(psiClass);
        }
        
        PsiJavaFile containingFile = (PsiJavaFile) psiClass.getContainingFile();
        String packageName = containingFile.getPackageName();
        return resolveNamespace(packageName);
    }

178
    private List<TypeParameterDescriptor> resolveTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
179 180
        List<TypeParameterDescriptor> result = Lists.newArrayList();
        for (PsiTypeParameter typeParameter : typeParameters) {
181
            TypeParameterDescriptor typeParameterDescriptor = resolveTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
182
            result.add(typeParameterDescriptor);
183 184 185 186
        }
        return result;
    }

A
Andrey Breslav 已提交
187
    private TypeParameterDescriptor createJavaTypeParameterDescriptor(@NotNull DeclarationDescriptor owner, @NotNull PsiTypeParameter typeParameter) {
188 189
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
                owner,
A
Andrey Breslav 已提交
190
                Collections.<AnnotationDescriptor>emptyList(), // TODO
191
                Variance.INVARIANT,
A
Andrey Breslav 已提交
192 193
                typeParameter.getName(),
                typeParameter.getIndex()
194
        );
195
        typeParameterDescriptorCache.put(typeParameter, typeParameterDescriptor);
A
Andrey Breslav 已提交
196 197
        PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes();
        if (referencedTypes.length == 0){
198
            typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
A
Andrey Breslav 已提交
199 200
        }
        else if (referencedTypes.length == 1) {
201
            typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0]));
A
Andrey Breslav 已提交
202 203 204
        }
        else {
            for (PsiClassType referencedType : referencedTypes) {
205
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType));
A
Andrey Breslav 已提交
206 207
            }
        }
208
        return typeParameterDescriptor;
A
Andrey Breslav 已提交
209 210 211
    }

    @NotNull
212
    public TypeParameterDescriptor resolveTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
A
Andrey Breslav 已提交
213 214
        TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter);
        if (typeParameterDescriptor == null) {
215 216
            typeParameterDescriptor = createJavaTypeParameterDescriptor(containingDeclaration, psiTypeParameter);
//            This is done inside the method: typeParameterDescriptorCache.put(psiTypeParameter, typeParameterDescriptor);
A
Andrey Breslav 已提交
217 218 219 220
        }
        return typeParameterDescriptor;
    }

A
Andrey Breslav 已提交
221 222
    private Collection<? extends JetType> getSupertypes(PsiClass psiClass) {
        List<JetType> result = new ArrayList<JetType>();
223 224 225 226 227 228
        result.add(JetStandardClasses.getAnyType());
        transformSupertypeList(result, psiClass.getExtendsListTypes());
        transformSupertypeList(result, psiClass.getImplementsListTypes());
        return result;
    }

A
Andrey Breslav 已提交
229
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes) {
230
        for (PsiClassType type : extendsListTypes) {
A
Andrey Breslav 已提交
231
            JetType transform = semanticServices.getTypeTransformer().transformToType(type);
232 233 234 235 236

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

237
    public NamespaceDescriptor resolveNamespace(String qualifiedName) {
238 239 240 241 242 243 244 245 246
        PsiPackage psiPackage = javaFacade.findPackage(qualifiedName);
        if (psiPackage == null) {
            return null;
        }
        return resolveNamespace(psiPackage);
    }

    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
        NamespaceDescriptor namespaceDescriptor = namespaceDescriptorCache.get(psiPackage);
247 248 249
        if (namespaceDescriptor == null) {
            // TODO : packages

A
Andrey Breslav 已提交
250 251 252 253 254
//            PsiClass psiClass = javaFacade.findClass(qualifiedName, javaSearchScope);
//            if (psiClass != null) {
//                namespaceDescriptor = createJavaNamespaceDescriptor(psiClass);
//            }
//            else {
255
                namespaceDescriptor = createJavaNamespaceDescriptor(psiPackage);
A
Andrey Breslav 已提交
256
//            }
257
            namespaceDescriptorCache.put(psiPackage, namespaceDescriptor);
258 259 260 261
        }
        return namespaceDescriptor;
    }

262 263
    private NamespaceDescriptor createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        String name = psiPackage.getName();
264
        JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
265
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
266
                Collections.<AnnotationDescriptor>emptyList(), // TODO
267
                name == null ? JAVA_ROOT : name
268
        );
269

270
        namespaceDescriptor.setMemberScope(new JavaPackageScope(psiPackage.getQualifiedName(), namespaceDescriptor, semanticServices));
271
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiPackage, namespaceDescriptor);
272 273 274
        return namespaceDescriptor;
    }

275 276 277 278 279 280 281 282
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

283
    private NamespaceDescriptor createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
284
        JavaNamespaceDescriptor namespaceDescriptor = new JavaNamespaceDescriptor(
285
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
286
                Collections.<AnnotationDescriptor>emptyList(), // TODO
287
                psiClass.getName()
288
        );
289
        namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceDescriptor, psiClass, semanticServices, true));
290
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceDescriptor);
291 292 293
        return namespaceDescriptor;
    }

294
    public List<ValueParameterDescriptor> resolveParameterDescriptors(DeclarationDescriptor containingDeclaration, PsiParameter[] parameters) {
295 296 297
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
        for (int i = 0, parametersLength = parameters.length; i < parametersLength; i++) {
            PsiParameter parameter = parameters[i];
A
Andrey Breslav 已提交
298
            String name = parameter.getName();
299
            result.add(new ValueParameterDescriptorImpl(
300
                    containingDeclaration,
301
                    i,
A
Andrey Breslav 已提交
302
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
303
                    name == null ? "p" + i : name,
304
                    null, // TODO : review
A
Andrey Breslav 已提交
305
                    semanticServices.getTypeTransformer().transformToType(parameter.getType()),
306 307 308 309 310 311
                    false,
                    parameter.isVarArgs()
            ));
        }
        return result;
    }
A
Andrey Breslav 已提交
312

A
Andrey Breslav 已提交
313 314 315 316 317 318 319 320 321
    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 已提交
322
                Collections.<AnnotationDescriptor>emptyList(),
323
                Modality.FINAL,
324
                resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), field),
A
Andrey Breslav 已提交
325 326 327 328 329
                !isFinal,
                null,
                field.getName(),
                isFinal ? null : type,
                type);
330
        semanticServices.getTrace().record(BindingContext.VARIABLE, field, propertyDescriptor);
A
Andrey Breslav 已提交
331 332 333 334
        fieldDescriptorCache.put(field, propertyDescriptor);
        return propertyDescriptor;
    }

A
Andrey Breslav 已提交
335
    @NotNull
A
Andrey Breslav 已提交
336 337
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, @Nullable ClassDescriptor classDescriptor, @NotNull String methodName, boolean staticMembers) {
        Set<FunctionDescriptor> writableFunctionGroup = Sets.newLinkedHashSet();
338
        final Collection<HierarchicalMethodSignature> signatures = psiClass.getVisibleSignatures();
A
Andrey Breslav 已提交
339
        TypeSubstitutor typeSubstitutor = createSubstitutorForGenericSupertypes(classDescriptor);
340
        for (HierarchicalMethodSignature signature: signatures) {
341
            if (!methodName.equals(signature.getName())) {
A
Andrey Breslav 已提交
342 343 344
                 continue;
            }

345
            FunctionDescriptor substitutedFunctionDescriptor = resolveHierarchicalSignatureToFunction(owner, psiClass, staticMembers, typeSubstitutor, signature);
346
            if (substitutedFunctionDescriptor != null) {
A
Andrey Breslav 已提交
347
                writableFunctionGroup.add(substitutedFunctionDescriptor);
348
            }
A
Andrey Breslav 已提交
349 350 351
        }
        return writableFunctionGroup;
    }
A
Andrey Breslav 已提交
352

353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
    @Nullable
    private FunctionDescriptor resolveHierarchicalSignatureToFunction(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers, TypeSubstitutor typeSubstitutor, HierarchicalMethodSignature signature) {
        PsiMethod method = signature.getMethod();
        if (method.hasModifierProperty(PsiModifier.STATIC) != staticMembers) {
                return null;
        }
        FunctionDescriptor functionDescriptor = resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutor, method);
//        if (functionDescriptor != null && !staticMembers) {
//            for (HierarchicalMethodSignature superSignature : signature.getSuperSignatures()) {
//                ((FunctionDescriptorImpl) functionDescriptor).addOverriddenFunction(resolveHierarchicalSignatureToFunction(owner, superSignature.getMethod().getContainingClass(), false, typeSubstitutor, superSignature));
//            }
//        }
        return functionDescriptor;
    }

A
Andrey Breslav 已提交
368 369 370 371 372 373 374 375 376 377 378 379
    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 已提交
380
    public FunctionDescriptor resolveMethodToFunctionDescriptor(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, PsiMethod method) {
A
Andrey Breslav 已提交
381 382 383 384 385 386 387 388 389 390 391 392 393
        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 已提交
394 395
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
396 397 398 399 400 401 402
                method.getName()
        );
        methodDescriptorCache.put(method, functionDescriptorImpl);
        functionDescriptorImpl.initialize(
                null,
                resolveTypeParameters(functionDescriptorImpl, method.getTypeParameters()),
                semanticServices.getDescriptorResolver().resolveParameterDescriptors(functionDescriptorImpl, parameters),
403
                semanticServices.getTypeTransformer().transformToType(returnType),
404 405
                Modality.convertFromFlags(method.hasModifierProperty(PsiModifier.ABSTRACT), !method.hasModifierProperty(PsiModifier.FINAL)),
                resolveVisibilityFromPsiModifiers(semanticServices.getTrace(), method)
A
Andrey Breslav 已提交
406
        );
407
        semanticServices.getTrace().record(BindingContext.FUNCTION, method, functionDescriptorImpl);
A
Andrey Breslav 已提交
408 409 410 411 412 413
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
        if (method.getContainingClass() != psiClass) {
            substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
        }
        return substitutedFunctionDescriptor;
    }
414 415 416 417 418 419 420 421

    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));
    }

422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446
    public TypeParameterDescriptor resolveTypeParameter(PsiTypeParameter typeParameter) {
        PsiTypeParameterListOwner owner = typeParameter.getOwner();
        if (owner instanceof PsiClass) {
            PsiClass psiClass = (PsiClass) owner;
            return resolveTypeParameter(resolveClass(psiClass), typeParameter);
        }
        if (owner instanceof PsiMethod) {
            PsiMethod psiMethod = (PsiMethod) owner;
            PsiClass containingClass = psiMethod.getContainingClass();
            DeclarationDescriptor ownerOwner;
            TypeSubstitutor substitutorForGenericSupertypes;
            if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) {
                substitutorForGenericSupertypes = TypeSubstitutor.EMPTY;
                return resolveTypeParameter(JAVA_METHOD_TYPE_PARAMETER_PARENT, typeParameter);
            }
            else {
                ClassDescriptor classDescriptor = resolveClass(containingClass);
                ownerOwner = classDescriptor;
                substitutorForGenericSupertypes = semanticServices.getDescriptorResolver().createSubstitutorForGenericSupertypes(classDescriptor);
            }
            FunctionDescriptor functionDescriptor = resolveMethodToFunctionDescriptor(ownerOwner, containingClass, substitutorForGenericSupertypes, psiMethod);
            return resolveTypeParameter(functionDescriptor, typeParameter);
        }
        throw new IllegalStateException("Unknown parent type: " + owner);
    }
447
}