JavaDescriptorResolver.java 71.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright 2010-2012 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

17 18
package org.jetbrains.jet.lang.resolve.java;

19
import com.google.common.collect.Lists;
A
Andrey Breslav 已提交
20
import com.google.common.collect.Maps;
A
Andrey Breslav 已提交
21
import com.google.common.collect.Sets;
22
import com.intellij.openapi.project.Project;
23
import com.intellij.openapi.util.Pair;
24
import com.intellij.openapi.vfs.VirtualFile;
25
import com.intellij.psi.*;
26
import com.intellij.psi.impl.compiled.ClsClassImpl;
27
import com.intellij.psi.search.DelegatingGlobalSearchScope;
28
import com.intellij.psi.search.GlobalSearchScope;
29
import jet.typeinfo.TypeInfoVariance;
30 31
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
32
import org.jetbrains.jet.lang.descriptors.*;
A
Andrey Breslav 已提交
33
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
34
import org.jetbrains.jet.lang.resolve.BindingContext;
35
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
36
import org.jetbrains.jet.lang.resolve.OverrideResolver;
37
import org.jetbrains.jet.lang.resolve.constants.*;
M
Maxim Shafirov 已提交
38
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
39
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
40
import org.jetbrains.jet.lang.types.*;
41
import org.jetbrains.jet.plugin.JetFileType;
42
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
43 44 45
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
46

47
import java.util.*;
48 49 50 51 52

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
53 54
    
    public static String JAVA_ROOT = "<java_root>";
55

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

58 59
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
60
            throw new UnsupportedOperationException();
61 62
        }

63 64
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
65
            return visitor.visitDeclarationDescriptor(this, data);
66 67 68
        }
    };

A
Andrey Breslav 已提交
69
    /*package*/ static final DeclarationDescriptor JAVA_CLASS_OBJECT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_class_object_emulation>") {
A
Andrey Breslav 已提交
70 71 72
        @NotNull
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
73
            throw new UnsupportedOperationException();
A
Andrey Breslav 已提交
74 75 76 77 78 79 80
        }

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };
81 82 83 84 85
    
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
86

87 88
    public static class TypeParameterDescriptorInitialization {
        @NotNull
89
        private final TypeParameterDescriptorOrigin origin;
90 91 92
        @NotNull
        final TypeParameterDescriptor descriptor;
        final PsiTypeParameter psiTypeParameter;
93 94 95 96
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
97

98
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
99
            this.origin = TypeParameterDescriptorOrigin.JAVA;
100
            this.descriptor = descriptor;
101
            this.psiTypeParameter = psiTypeParameter;
102 103 104 105
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

106
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter,
107 108 109
                List<JetType> upperBoundsForKotlin, List<JetType> lowerBoundsForKotlin) {
            this.origin = TypeParameterDescriptorOrigin.KOTLIN;
            this.descriptor = descriptor;
110
            this.psiTypeParameter = psiTypeParameter;
111 112
            this.upperBoundsForKotlin = upperBoundsForKotlin;
            this.lowerBoundsForKotlin = lowerBoundsForKotlin;
113 114
        }
    }
115 116


117
    private static abstract class ResolverScopeData {
118
        protected boolean kotlin;
119 120
        
        private Map<String, NamedMembers> namedMembersMap;
121 122 123
        
        @NotNull
        public abstract List<TypeParameterDescriptor> getTypeParameters();
124
    }
A
Andrey Breslav 已提交
125

126 127 128 129
    static abstract class ResolverClassData extends ResolverScopeData {

        @NotNull
        public abstract ClassDescriptor getClassDescriptor();
130 131 132 133 134 135

        @NotNull
        @Override
        public List<TypeParameterDescriptor> getTypeParameters() {
            return getClassDescriptor().getTypeConstructor().getParameters();
        }
136 137
    }

138
    /** Class with instance members */
139 140 141 142 143
    static class ResolverBinaryClassData extends ResolverClassData {

        ResolverBinaryClassData() {
        }

144
        private MutableClassDescriptorLite classDescriptor;
145

146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
        List<TypeParameterDescriptorInitialization> typeParameters;

        @Override
        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }
    }

    static class ResolverSrcClassData extends ResolverClassData {
        @NotNull
        private final ClassDescriptor classDescriptor;

        ResolverSrcClassData(@NotNull ClassDescriptor classDescriptor) {
            this.classDescriptor = classDescriptor;
        }

        @Override
164 165 166 167 168 169
        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }
    }

170
    /** Either package or class with static members */
171
    private static class ResolverNamespaceData extends ResolverScopeData {
172 173 174 175 176 177
        private JavaNamespaceDescriptor namespaceDescriptor;

        @NotNull
        public NamespaceDescriptor getNamespaceDescriptor() {
            return namespaceDescriptor;
        }
178 179 180 181 182 183

        @NotNull
        @Override
        public List<TypeParameterDescriptor> getTypeParameters() {
            return new ArrayList<TypeParameterDescriptor>(0);
        }
184 185
    }

186
    protected final Map<String, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
187 188 189
    protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

190 191 192
    protected final JavaPsiFacade javaFacade;
    protected final GlobalSearchScope javaSearchScope;
    protected final JavaSemanticServices semanticServices;
M
Maxim Shafirov 已提交
193
    private final AltClassFinder altClassFinder;
194 195 196

    public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
        this.javaFacade = JavaPsiFacade.getInstance(project);
197 198 199 200 201 202
        this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
            @Override
            public boolean contains(VirtualFile file) {
                return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
            }
        };
203
        this.semanticServices = semanticServices;
M
Maxim Shafirov 已提交
204
        altClassFinder = new AltClassFinder(project);
205
    }
206
    
207
    @Nullable
208
    ResolverClassData resolveClassData(@NotNull PsiClass psiClass) {
209
        String qualifiedName = psiClass.getQualifiedName();
210

211 212 213 214
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
215

216
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
217 218
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
219
            return new ResolverSrcClassData(kotlinClassDescriptor);
220 221
        }

222 223 224 225 226 227
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
            // must resolve containing class first, because inner class must have a reference to it
            resolveClass(containingClass);
        }

228
        // Not let's take a descriptor of a Java class
229
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
230 231 232
        if (classData == null) {
            classData = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classData);
233
        }
234 235 236 237 238 239 240 241 242 243 244
        return classData;
    }

    @Nullable
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
        ResolverClassData classData = resolveClassData(psiClass);
        if (classData != null) {
            return classData.getClassDescriptor();
        } else {
            return null;
        }
245 246 247 248
    }

    @Nullable
    public ClassDescriptor resolveClass(@NotNull String qualifiedName) {
249

250 251 252 253 254
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
        
255
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
256 257 258 259 260
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
            return kotlinClassDescriptor;
        }

261
        // Not let's take a descriptor of a Java class
262
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
263
        if (classData == null) {
264
            PsiClass psiClass = findClass(qualifiedName);
265 266 267
            if (psiClass == null) {
                return null;
            }
268
            classData = createJavaClassDescriptor(psiClass);
269
        }
270
        return classData.getClassDescriptor();
271 272
    }

273
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
274 275 276
        if (classDescriptorCache.containsKey(psiClass.getQualifiedName())) {
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
277

278 279
        checkPsiClassIsNotJet(psiClass);

280
        String name = psiClass.getName();
281
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
282
        classDescriptorCache.put(psiClass.getQualifiedName(), classData);
283
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
284 285
        DeclarationDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
286
        classData.classDescriptor.setName(name);
287 288
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass));

A
Andrey Breslav 已提交
289
        List<JetType> supertypes = new ArrayList<JetType>();
290

291 292 293
        TypeVariableResolverFromOuters outerTypeVariableByNameResolver = new TypeVariableResolverFromOuters(containingDeclaration);

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
294 295 296 297 298 299
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
300 301 302
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
303 304 305 306 307 308 309 310 311 312
        Modality modality;
        if (classData.classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) {
            modality = Modality.FINAL;
        }
        else {
            modality = Modality.convertFromFlags(
                    psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                    !psiClass.hasModifierProperty(PsiModifier.FINAL));
        }
        classData.classDescriptor.setModality(modality);
313 314
        classData.classDescriptor.createTypeConstructor();
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
315

316
        initializeTypeParameters(classData.typeParameters, new TypeVariableResolverFromTypeDescriptors(new ArrayList<TypeParameterDescriptor>(), outerTypeVariableByNameResolver));
317

318
        TypeVariableResolverFromTypeDescriptors resolverForTypeParameters = new TypeVariableResolverFromTypeDescriptors(classData.getTypeParameters(), null);
319

320
        // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
321
        supertypes.addAll(getSupertypes(new PsiClassWrapper(psiClass), classData.classDescriptor, classData.getTypeParameters()));
322

A
Andrey Breslav 已提交
323
        PsiMethod[] psiConstructors = psiClass.getConstructors();
324 325

        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
326 327 328 329
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
330
            if (!psiClass.isInterface()) {
331
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
332
                        classData.classDescriptor,
A
Andrey Breslav 已提交
333
                        Collections.<AnnotationDescriptor>emptyList(),
334
                        false);
335
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), classData.classDescriptor.getVisibility());
336
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
337
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
338
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
339
            }
340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360
            if (psiClass.isAnnotationType()) {
                // A constructor for an annotation type takes all the "methods" in the @interface as parameters
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
                        classData.classDescriptor,
                        Collections.<AnnotationDescriptor>emptyList(),
                        false);

                List<ValueParameterDescriptor> valueParameters = Lists.newArrayList();
                PsiMethod[] methods = psiClass.getMethods();
                for (int i = 0; i < methods.length; i++) {
                    PsiMethod method = methods[i];
                    if (method instanceof PsiAnnotationMethod) {
                        PsiAnnotationMethod annotationMethod = (PsiAnnotationMethod) method;
                        assert annotationMethod.getParameterList().getParameters().length == 0;

                        PsiType returnType = annotationMethod.getReturnType();

                        // We take the following heuristical convention:
                        // if the last method of the @interface is an array, we convert it into a vararg
                        JetType varargElementType = null;
                        if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) {
361
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
362 363 364 365 366 367 368 369
                        }

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
370
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
371 372 373 374 375
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

376
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility());
377 378 379 380
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
            }
381 382
        }
        else {
383 384 385 386 387
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
388 389
                }

390
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
391
                        classData.classDescriptor,
A
Andrey Breslav 已提交
392
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
393
                        false);
394
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
395
                        constructor.getParameters(),
396
                        new TypeVariableResolverFromTypeDescriptors(classData.getTypeParameters(), null) // TODO: outer too
397
                    );
398 399 400
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
401 402
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors,
                        resolveVisibilityFromPsiModifiers(psiConstructor));
403
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
404
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
405
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
406
            }
A
Andrey Breslav 已提交
407
        }
408

409 410 411
        // TODO
        //classData.classDescriptor.setClassObjectDescriptor(createClassObjectDescriptor(classData.classDescriptor));

412
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
413

414
        return classData;
415 416
    }

417 418 419 420 421 422
    private void checkPsiClassIsNotJet(PsiClass psiClass) {
        if (psiClass instanceof JetJavaMirrorMarker) {
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass");
        }
    }

423 424 425 426 427 428 429 430 431 432 433 434 435 436 437
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
        MutableClassDescriptorLite classObjectDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);
        classObjectDescriptor.setName("<TODO>"); // TODO
        classObjectDescriptor.setModality(Modality.FINAL);
        classObjectDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classObjectDescriptor.createTypeConstructor();
        classObjectDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classObjectDescriptor, psiClass, semanticServices, true));
        return classObjectDescriptor;
    }

438
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData, TypeVariableResolver typeVariableResolver) {
439 440 441 442 443
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
444
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor, typeVariableResolver);
445
        }
446

447
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
448 449
    }

450
    @NotNull
451
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
452 453 454 455 456
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
457 458 459
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476

    // cache
    protected ClassDescriptor javaLangObject;

    @NotNull
    private ClassDescriptor getJavaLangObject() {
        if (javaLangObject == null) {
            javaLangObject = resolveClass("java.lang.Object");
        }
        return javaLangObject;
    }

    private boolean isJavaLangObject(JetType type) {
        return type.getConstructor().getDeclarationDescriptor() == getJavaLangObject();
    }


477
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
478 479

        @NotNull
480
        private final PsiTypeParameterListOwner psiOwner;
481
        @NotNull
482
        private final String name;
483
        @NotNull
484
        private final TypeVariableResolver typeVariableResolver;
485 486
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
487

488 489
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
490
        {
491 492 493
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
494

495 496
            this.psiOwner = psiOwner;
            this.name = name;
497
            this.typeVariableResolver = typeVariableResolver;
498
            this.typeParameterDescriptor = typeParameterDescriptor;
499 500 501 502
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
503
        
504 505
        @Override
        public JetSignatureVisitor visitClassBound() {
506
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
507 508
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
509 510 511
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
512 513 514 515 516 517 518
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
519
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
520 521 522 523 524 525 526 527 528
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
            TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter, upperBounds, lowerBounds);
            done(typeParameterDescriptorInitialization);
        }
        
        protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
    }

    private class JetSignatureTypeParametersVisitor extends JetSignatureExceptionsAdapter {
        @NotNull
        private final DeclarationDescriptor containingDeclaration;
        @NotNull
        private final PsiTypeParameterListOwner psiOwner;

        private final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
        // note changes state in this method
        private final TypeVariableResolver typeVariableResolver;


        private JetSignatureTypeParametersVisitor(@NotNull TypeVariableResolver containerTypeVariableResolver, @NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner) {
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

            this.typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, containerTypeVariableResolver);
        }

        private int formalTypeParameterIndex = 0;


        List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>();

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
562 563 564
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
565
                    reified,
566 567
                    JetSignatureUtils.translateVariance(variance),
                    name,
568 569 570 571 572 573 574 575 576 577 578
                    formalTypeParameterIndex++);

            previousTypeParameters.add(typeParameter);

            return new JetSignatureTypeParameterVisitor(psiOwner, name, typeVariableResolver, typeParameter) {
                @Override
                protected void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor) {
                    r.add(typeParameterDescriptor);
                    previousTypeParameters.add(typeParameterDescriptor.descriptor);
                }
            };
579
        }
580 581
    }

582
    /**
583
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor, TypeVariableResolver) 
584
     */
585
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz,
586
            final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) {
587
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(outerClassTypeVariableResolver, classDescriptor, clazz) {
588 589 590 591 592 593 594 595 596 597 598
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
599 600 601
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
602 603
    }

604 605 606
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
607
            return resolveClass(containingClass);
608
        }
609 610 611 612 613 614 615 616 617 618 619

        return resolveNamespace(packageNameOfClass(psiClass.getQualifiedName()));
    }

    private static String packageNameOfClass(@NotNull String qualifiedName) {
        int lastDot = qualifiedName.lastIndexOf('.');
        if (lastDot < 0) {
            return "";
        } else {
            return qualifiedName.substring(0, lastDot);
        }
620 621
    }

622 623
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
624
        for (PsiTypeParameter typeParameter : typeParameters) {
625
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
626
            result.add(typeParameterDescriptor);
627 628 629 630
        }
        return result;
    }

631
    @NotNull
632
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
633
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
634
                containingDeclaration,
A
Andrey Breslav 已提交
635
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
636
                false,
637
                Variance.INVARIANT,
638 639
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
640
        );
641
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
642 643
    }

644
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
645 646 647
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
648 649 650
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
651
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
652 653 654 655 656
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
657
        } else {
658
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
659 660 661 662
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
663
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
664 665 666
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
667
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
668
                }
A
Andrey Breslav 已提交
669 670
            }
        }
671
        typeParameterDescriptor.setInitialized();
672 673
    }

674
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, TypeVariableResolver typeVariableByPsiResolver) {
675
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
676
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
677 678
            prevTypeParameters.add(psiTypeParameter.descriptor);
            initializeTypeParameter(psiTypeParameter, new TypeVariableResolverFromTypeDescriptors(prevTypeParameters, typeVariableByPsiResolver));
S
Stepan Koltsov 已提交
679
        }
A
Andrey Breslav 已提交
680 681
    }

682
    private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
683 684 685
        final List<JetType> result = new ArrayList<JetType>();

        if (psiClass.getJetClass().signature().length() > 0) {
686
            final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(typeParameters, null);
687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708
            
            new JetSignatureReader(psiClass.getJetClass().signature()).accept(new JetSignatureExceptionsAdapter() {
                @Override
                public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) {
                    // TODO: collect
                    return new JetSignatureAdapter();
                }

                @Override
                public JetSignatureVisitor visitSuperclass() {
                    return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
709
                    return visitSuperclass();
710 711 712
                }
            });
        } else {
713 714
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null), classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null), classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
715
        }
716 717 718 719 720 721 722
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
                semanticServices.getTrace().record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
            }
        }
        
723 724 725
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
726 727 728
        return result;
    }

729
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
730
        for (PsiClassType type : extendsListTypes) {
731 732 733 734
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
735 736 737
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
738
            
739
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
740 741 742 743 744

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

745 746
    @Nullable
    public NamespaceDescriptor resolveNamespace(@NotNull String qualifiedName) {
747 748 749 750 751 752
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

753
        PsiPackage psiPackage = findPackage(qualifiedName);
754
        if (psiPackage == null) {
755
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
756 757
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
758 759 760 761
        }
        return resolveNamespace(psiPackage);
    }

762
    public PsiClass findClass(String qualifiedName) {
763
        PsiClass original = javaFacade.findClass(qualifiedName, javaSearchScope);
M
Maxim Shafirov 已提交
764
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
765 766 767 768 769 770 771 772
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

            return altClass;
        }
        return original;
773 774
    }

775
    /*package*/ PsiPackage findPackage(String qualifiedName) {
776 777 778
        return javaFacade.findPackage(qualifiedName);
    }

779
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
780 781 782 783 784
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
785
        }
786
        return namespaceData.namespaceDescriptor;
787 788
    }

A
Andrey Breslav 已提交
789
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
790 791 792 793 794
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
795
        }
796
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
797 798
    }

799 800
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
801
        String name = psiPackage.getName();
802
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
803
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
804
                Collections.<AnnotationDescriptor>emptyList(), // TODO
805
                name == null ? JAVA_ROOT : name,
806 807
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
808
        );
809

810 811 812 813 814
        namespaceData.namespaceDescriptor.setMemberScope(new JavaPackageScope(psiPackage.getQualifiedName(), namespaceData.namespaceDescriptor, semanticServices));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor);
        // TODO: hack
        namespaceData.kotlin = true;
        return namespaceData;
815 816
    }

817 818 819 820 821 822 823 824
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

825 826 827 828
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
829
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
830 831 832

        checkPsiClassIsNotJet(psiClass);

833 834
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
835
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
836
                Collections.<AnnotationDescriptor>emptyList(), // TODO
837
                psiClass.getName(),
838 839
                psiClass.getQualifiedName(),
                false
840
        );
841 842 843
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
844
    }
845 846 847 848 849 850 851 852 853 854
    
    private static class ValueParameterDescriptors {
        private final JetType receiverType;
        private final List<ValueParameterDescriptor> descriptors;

        private ValueParameterDescriptors(@Nullable JetType receiverType, List<ValueParameterDescriptor> descriptors) {
            this.receiverType = receiverType;
            this.descriptors = descriptors;
        }
    }
855

856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888
    private enum JvmMethodParameterKind {
        REGULAR,
        RECEIVER,
        TYPE_INFO,
    }
    
    private static class JvmMethodParameterMeaning {
        private final JvmMethodParameterKind kind;
        private final JetType receiverType;
        private final ValueParameterDescriptor valueParameterDescriptor;
        private final Object typeInfo;

        private JvmMethodParameterMeaning(JvmMethodParameterKind kind, JetType receiverType, ValueParameterDescriptor valueParameterDescriptor, Object typeInfo) {
            this.kind = kind;
            this.receiverType = receiverType;
            this.valueParameterDescriptor = valueParameterDescriptor;
            this.typeInfo = typeInfo;
        }
        
        public static JvmMethodParameterMeaning receiver(@NotNull JetType receiverType) {
            return new JvmMethodParameterMeaning(JvmMethodParameterKind.RECEIVER, receiverType, null, null);
        }
        
        public static JvmMethodParameterMeaning regular(@NotNull ValueParameterDescriptor valueParameterDescriptor) {
            return new JvmMethodParameterMeaning(JvmMethodParameterKind.REGULAR, null, valueParameterDescriptor, null);
        }
        
        public static JvmMethodParameterMeaning typeInfo(@NotNull Object typeInfo) {
            return new JvmMethodParameterMeaning(JvmMethodParameterKind.TYPE_INFO, null, null, typeInfo);
        }
    }

    @NotNull
889
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
890 891 892 893 894 895 896
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

        if (parameter.getJetTypeParameter().isDefined()) {
            return JvmMethodParameterMeaning.typeInfo(new Object());
        }

        PsiType psiType = parameter.getPsiParameter().getType();
897

898 899
        // TODO: must be very slow, make it lazy?
        String name = parameter.getPsiParameter().getName() != null ? parameter.getPsiParameter().getName() : "p" + i;
900

901 902
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
903 904
        }
        
905 906 907 908
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
909
        JetType outType;
910
        if (typeFromAnnotation.length() > 0) {
911
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
912
        } else {
913
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
914
        }
915 916 917 918 919 920 921 922

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
            varargElementType = semanticServices.getJetSemanticServices().getStandardLibrary().getArrayElementType(outType);
        } else {
            varargElementType = null;
        }

923 924 925
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
S
Stepan Koltsov 已提交
926 927 928 929 930 931 932 933 934

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
            } else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
            } else {
                transformedType = outType;
            }
935 936 937 938 939
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
940
                    false,
S
Stepan Koltsov 已提交
941
                    transformedType,
942
                    hasDefaultValue,
943 944 945
                    varargElementType
            ));
        }
946 947
    }

948
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, String fieldName, boolean staticMembers) {
949
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
950

951 952 953
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
954
        }
955
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
956

957
        resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, fieldName);
958

959 960 961 962 963 964 965
        r.addAll(namedMembers.propertyDescriptors);

        for (JetType supertype : getSupertypes(scopeData)) {
            r.addAll(supertype.getMemberScope().getProperties(fieldName));
        }

        return r;
966 967 968
    }
    
    @NotNull
969
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, boolean staticMembers) {
970

971 972 973 974 975 976
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
        
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
977
            if (namedMembers.propertyAccessors == null) {
978 979 980 981
                continue;
            }
            
            String propertyName = entry.getKey();
982

983
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName);
984
            descriptors.addAll(namedMembers.propertyDescriptors);
985
        }
986 987 988 989 990 991 992 993 994 995

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
996
        return descriptors;
997
    }
998 999 1000 1001 1002 1003 1004
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
1005
            return psiTypeToKey(typeSource.getPsiType());
1006 1007
        }
    }
1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020

    private Object psiTypeToKey(PsiType psiType) {
        if (psiType instanceof PsiClassType) {
            return ((PsiClassType) psiType).getClassName();
        } else if (psiType instanceof PsiPrimitiveType) {
            return psiType.getPresentableText();
        } else if (psiType instanceof PsiArrayType) {
            return Pair.create("[", psiTypeToKey(((PsiArrayType) psiType).getComponentType()));
        } else {
            throw new IllegalStateException("" + psiType.getClass());
        }
    }

1021 1022 1023 1024 1025
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1026

1027 1028 1029 1030
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
            boolean staticMembers, NamedMembers namedMembers, String propertyName) {
1031 1032 1033 1034
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1035
        if (namedMembers.propertyAccessors == null) {
1036 1037 1038
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
1039

1040
        final List<TypeParameterDescriptor> classTypeParameterDescriptorInitialization = scopeData.getTypeParameters();
1041

1042
        TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(scopeData.getTypeParameters(), null);
1043

1044 1045 1046 1047
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1048
            boolean ext;
1049
        }
1050 1051
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1052

1053
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1054

1055 1056 1057 1058 1059
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1060
                value.ext = propertyAccessor.getReceiverType() != null;
1061 1062
                map.put(key, value);
            }
1063

1064 1065 1066 1067
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085
            if (propertyAccessor.isGetter()) {
                if (value.getter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.getter = propertyAccessor;
            } else if (propertyAccessor.isSetter()) {
                if (value.setter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.setter = propertyAccessor;
            } else if (propertyAccessor.isField()) {
                if (value.field != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.field = propertyAccessor;
            } else {
                throw new IllegalStateException();
            }
1086
        }
1087

1088
        
1089 1090
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>(1);

1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
        int regularProperitesCount = 0;
        for (GroupingValue members : map.values()) {
            if (!members.ext) {
                ++regularProperitesCount;
            }
        }

        for (GroupingValue members : map.values()) {

            // we cannot have more then one property with given name even if java code
            // has several fields, getters and setter of different types
            if (!members.ext && regularProperitesCount > 1) {
                continue;
            }
1105

1106 1107 1108 1109 1110 1111 1112 1113 1114 1115
            boolean isFinal;
            if (members.setter == null && members.getter == null) {
                isFinal = false;
            } else if (members.getter != null) {
                isFinal = members.getter.getMember().isFinal();
            } else if (members.setter != null) {
                isFinal = members.setter.getMember().isFinal();
            } else {
                isFinal = false;
            }
1116

1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
            PropertyAccessorData anyMember;
            if (members.getter != null) {
                anyMember = members.getter;
            } else if (members.field != null) {
                anyMember = members.field;
            } else if (members.setter != null) {
                anyMember = members.setter;
            } else {
                throw new IllegalStateException();
            }
1127

1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
            } else {
                isVar = members.setter != null;
            }
            
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
                    Collections.<AnnotationDescriptor>emptyList(),
                    isFinal && !staticMembers ? Modality.FINAL : Modality.OPEN, // TODO: abstract
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
                    isVar,
                    false,
1142 1143
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1144

1145 1146 1147
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1148
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1149 1150
            }
            if (members.setter != null) {
1151
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1152
            }
1153

1154
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1155

1156
            List<TypeParameterDescriptor> typeParametersInitialization = new ArrayList<TypeParameterDescriptor>(0);
1157 1158 1159

            if (members.setter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.setter.getMember();
1160

1161
                if (anyMember == members.setter) {
1162
                    typeParametersInitialization = resolveMethodTypeParameters(method, setterDescriptor, typeVariableResolver);
1163 1164 1165 1166 1167 1168
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
1169
                    typeParametersInitialization = resolveMethodTypeParameters(method, getterDescriptor, typeVariableResolver);
1170 1171 1172
                }
            }

1173
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
1174 1175
            for (TypeParameterDescriptor typeParameter : typeParametersInitialization) {
                typeParameters.add(typeParameter);
1176 1177
            }

1178
            List<TypeParameterDescriptor> typeParametersForReceiver = new ArrayList<TypeParameterDescriptor>();
1179 1180
            typeParametersForReceiver.addAll(classTypeParameterDescriptorInitialization);
            typeParametersForReceiver.addAll(typeParametersInitialization);
1181
            TypeVariableResolver typeVariableResolverForPropertyInternals = new TypeVariableResolverFromTypeDescriptors(typeParametersForReceiver, null);
1182

1183 1184 1185 1186
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1187
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1188 1189 1190
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1191 1192 1193 1194 1195 1196 1197 1198
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1199
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1200 1201 1202 1203 1204 1205 1206
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1207
            );
1208 1209 1210 1211
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1212
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getOutType(), false, null));
1213 1214 1215 1216 1217
            }

            semanticServices.getTrace().record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
            
            r.add(propertyDescriptor);
1218
        }
1219

1220
        namedMembers.propertyDescriptors = r;
1221
    }
1222

1223
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1224 1225 1226
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1227 1228
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1229

1230
        Set<NamedFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1231
        for (PsiMethodWrapper method : namedMembers.methods) {
1232 1233
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    method);
1234
            if (function != null) {
1235 1236 1237 1238 1239 1240 1241 1242 1243
                functionsFromCurrent.add((NamedFunctionDescriptor) function);
            }
        }

        if (owner instanceof ClassDescriptor) {
            ClassDescriptor classDescriptor = (ClassDescriptor) owner;

            Set<NamedFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);

S
Stepan Koltsov 已提交
1244
            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1245
                @Override
S
Stepan Koltsov 已提交
1246 1247
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1248
                }
1249 1250

                @Override
S
Stepan Koltsov 已提交
1251
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1252 1253
                    // nop
                }
1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
    private Set<NamedFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<NamedFunctionDescriptor> r = new HashSet<NamedFunctionDescriptor>();
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
                r.add((NamedFunctionDescriptor) function);
1268
            }
1269
        }
1270
        return r;
1271 1272
    }

1273
    private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) {
1274
        ResolverScopeData scopeData;
1275
        boolean staticMembers;
1276 1277
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
1278
            staticMembers = true;
1279
        } else if (owner instanceof ClassDescriptor) {
1280
            scopeData = classDescriptorCache.get(psiClass.getQualifiedName());
1281
            staticMembers = false;
1282
        } else {
1283
            throw new IllegalStateException("unknown owner: " + owner.getClass().getName());
1284 1285 1286 1287 1288
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1289 1290
        if (scopeData.namedMembersMap == null) {
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1291 1292
        }
        
1293
        return scopeData;
1294
    }
A
Andrey Breslav 已提交
1295

A
Andrey Breslav 已提交
1296
    @NotNull
1297
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull ClassOrNamespaceDescriptor descriptor, @NotNull PsiClass psiClass, @NotNull String methodName, boolean staticMembers) {
A
Andrey Breslav 已提交
1298

1299
        ResolverScopeData resolverScopeData = getResolverScopeData(descriptor, new PsiClassWrapper(psiClass));
A
Andrey Breslav 已提交
1300

1301 1302 1303
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1304 1305
        if (namedMembers != null && namedMembers.methods != null) {
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);
1306

1307 1308 1309
            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);

            return namedMembers.functionDescriptors;
1310
        } else {
1311
            return Collections.emptySet();
1312
        }
1313 1314
    }

1315
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1316 1317 1318 1319 1320 1321 1322 1323 1324
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1325

1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349
    private ValueParameterDescriptors resolveParameterDescriptors(DeclarationDescriptor containingDeclaration,
            List<PsiParameterWrapper> parameters, TypeVariableResolver typeVariableResolver) {
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
        JetType receiverType = null;
        int indexDelta = 0;
        for (int i = 0, parametersLength = parameters.size(); i < parametersLength; i++) {
            PsiParameterWrapper parameter = parameters.get(i);
            JvmMethodParameterMeaning meaning = resolveParameterDescriptor(containingDeclaration, i + indexDelta, parameter, typeVariableResolver);
            if (meaning.kind == JvmMethodParameterKind.TYPE_INFO) {
                // TODO
                --indexDelta;
            } else if (meaning.kind == JvmMethodParameterKind.REGULAR) {
                result.add(meaning.valueParameterDescriptor);
            } else if (meaning.kind == JvmMethodParameterKind.RECEIVER) {
                if (receiverType != null) {
                    throw new IllegalStateException("more then one receiver");
                }
                --indexDelta;
                receiverType = meaning.receiverType;
            }
        }
        return new ValueParameterDescriptors(receiverType, result);
    }

A
Andrey Breslav 已提交
1350
    @Nullable
S
Stepan Koltsov 已提交
1351
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, final PsiMethodWrapper method) {
1352

1353
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1354 1355 1356
        if (returnType == null) {
            return null;
        }
1357 1358
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));

1359 1360 1361 1362 1363 1364 1365 1366 1367
        boolean kotlin;
        if (owner instanceof JavaNamespaceDescriptor) {
            JavaNamespaceDescriptor javaNamespaceDescriptor = (JavaNamespaceDescriptor) owner;
            ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(javaNamespaceDescriptor.getQualifiedName());
            if (namespaceData == null) {
                throw new IllegalStateException("namespaceData not found by name " + javaNamespaceDescriptor.getQualifiedName());
            }
            kotlin = namespaceData.kotlin;
        } else {
1368
            ResolverBinaryClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
1369 1370 1371 1372 1373 1374
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1375
        // TODO: ugly
1376
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1377
            return null;
1378
        }
1379

S
Stepan Koltsov 已提交
1380 1381 1382 1383 1384 1385 1386 1387
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1388
        ClassOrNamespaceDescriptor classDescriptor;
1389
        if (scopeData instanceof ResolverBinaryClassData) {
1390
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1391
            classDescriptor = classClassDescriptor;
1392 1393 1394
        }
        else {
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1395
        }
1396 1397 1398
        if (classDescriptor == null) {
            return null;
        }
1399

S
Stepan Koltsov 已提交
1400
        NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1401
                owner,
1402
                resolveAnnotations(method.getPsiMethod()),
1403 1404
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1405
        );
1406

1407
        final TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(classDescriptor);
1408

1409
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1410

1411
        TypeVariableResolver methodTypeVariableResolver = new TypeVariableResolverFromTypeDescriptors(methodTypeParameters, typeVariableResolverForParameters);
1412 1413


1414
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1415
        functionDescriptorImpl.initialize(
1416
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1417
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1418
                methodTypeParameters,
1419
                valueParameterDescriptors.descriptors,
1420
                makeReturnType(returnType, method, methodTypeVariableResolver),
1421 1422
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1423
        );
1424
        semanticServices.getTrace().record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1425
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1426 1427
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1428
        }
1429
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1430
    }
1431

1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation);
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

    @Nullable
    private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation) {
        AnnotationDescriptor annotation = new AnnotationDescriptor();

        String qname = psiAnnotation.getQualifiedName();
        if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName())) {
            // TODO
            return null;
        }

        ClassDescriptor clazz = resolveClass(psiAnnotation.getQualifiedName());
        if (clazz == null) {
            return null;
        }
        annotation.setAnnotationType(clazz.getDefaultType());
1459 1460 1461 1462 1463 1464 1465 1466
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
        if("jet.runtime.Intrinsic".equals(psiAnnotation.getQualifiedName())) {
            // temporary hack
            valueArguments.add(new StringValue(psiAnnotation.findAttributeValue("value").getText()));
            annotation.setValueArguments(valueArguments); // TODO
        }
        else
            annotation.setValueArguments(valueArguments); // TODO
1467 1468 1469
        return annotation;
    }

1470
    public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, ClassOrNamespaceDescriptor containingDeclaration) {
1471 1472
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1473
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1474

1475
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1476 1477 1478 1479 1480

        for (Map.Entry<String, NamedMembers> entry : scopeData.namedMembersMap.entrySet()) {
            String methodName = entry.getKey();
            NamedMembers namedMembers = entry.getValue();
            resolveNamedGroupFunctions(containingDeclaration, psiClass, substitutorForGenericSupertypes, namedMembers, methodName, scopeData);
1481
            functions.addAll(namedMembers.functionDescriptors);
1482
        }
1483

1484 1485
        return functions;
    }
1486

1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
        } else if (scope instanceof ResolverNamespaceData) {
            return Collections.emptyList();
        } else {
            throw new IllegalStateException();
        }
    }

    private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
        if (scopeData instanceof ResolverClassData) {
            return createSubstitutorForGenericSupertypes(((ResolverClassData) scopeData).getClassDescriptor());
        } else {
            return TypeSubstitutor.EMPTY;
        }
    }

1505
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1506
            @NotNull PsiMethodWrapper method,
1507
            @NotNull DeclarationDescriptor functionDescriptor,
1508 1509
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1510
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1511
        if (method.getJetMethod().typeParameters().length() > 0) {
1512
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
1513
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1514
        } else {
1515
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1516
        }
1517

1518 1519 1520 1521 1522 1523 1524 1525
        initializeTypeParameters(typeParametersIntialization, classTypeVariableResolver);
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1526 1527
        return typeParameters;
    }
1528 1529

    /**
1530
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor, TypeVariableResolver)
1531
     */
1532
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1533
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1534
    {
1535 1536 1537
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classTypeVariableResolver, functionDescriptor, method);
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1538 1539
    }

1540 1541
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1542 1543 1544

        String returnTypeFromAnnotation = method.getJetMethod().returnType();

S
Stepan Koltsov 已提交
1545
        JetType transformedType;
1546
        if (returnTypeFromAnnotation.length() > 0) {
1547
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1548
        } else {
1549
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1550
        }
1551 1552
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1553 1554
        } else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
1555 1556 1557 1558 1559
        } else {
            return transformedType;
        }
    }

1560
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1561 1562 1563 1564 1565 1566
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1567
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1568 1569 1570 1571
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1572 1573 1574
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1575 1576 1577 1578
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1579 1580 1581 1582
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1583
}