JavaDescriptorResolver.java 70.7 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;
M
Maxim Shafirov 已提交
37
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
38
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
39
import org.jetbrains.jet.lang.types.*;
40
import org.jetbrains.jet.plugin.JetFileType;
41
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
42 43 44
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
45

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

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

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

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

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

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

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

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

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

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


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

125 126 127 128
    static abstract class ResolverClassData extends ResolverScopeData {

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

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

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

        ResolverBinaryClassData() {
        }

143
        private MutableClassDescriptorLite classDescriptor;
144

145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162
        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
163 164 165 166 167 168
        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }
    }

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

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

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

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

189
    protected final Map<PsiMethod, FunctionDescriptorImpl> methodDescriptorCache = 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
        String name = psiClass.getName();
279
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
280
        classDescriptorCache.put(psiClass.getQualifiedName(), classData);
281
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
282 283
        DeclarationDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
284
        classData.classDescriptor.setName(name);
285
        
A
Andrey Breslav 已提交
286
        List<JetType> supertypes = new ArrayList<JetType>();
287

288 289 290
        TypeVariableResolverFromOuters outerTypeVariableByNameResolver = new TypeVariableResolverFromOuters(containingDeclaration);

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
291 292 293 294 295 296
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
297 298 299
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
300
        classData.classDescriptor.setModality(Modality.convertFromFlags(
301 302
                psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                !psiClass.hasModifierProperty(PsiModifier.FINAL))
A
Andrey Breslav 已提交
303
        );
304 305
        classData.classDescriptor.createTypeConstructor();
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
306

307
        initializeTypeParameters(classData.typeParameters, new TypeVariableResolverFromTypeDescriptors(new ArrayList<TypeParameterDescriptor>(), outerTypeVariableByNameResolver));
308

309
        TypeVariableResolverFromTypeDescriptors resolverForTypeParameters = new TypeVariableResolverFromTypeDescriptors(classData.getTypeParameters(), null);
310

311
        // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
312
        supertypes.addAll(getSupertypes(new PsiClassWrapper(psiClass), classData.getTypeParameters()));
313

314
        if (psiClass.isInterface()) {
315
            //classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
316 317 318 319 320 321
        }
        else {
            PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
            assert extendsListTypes.length == 0 || extendsListTypes.length == 1;
            JetType superclassType = extendsListTypes.length == 0
                                            ? JetStandardClasses.getAnyType()
322
                                            : semanticServices.getTypeTransformer().transformToType(extendsListTypes[0], resolverForTypeParameters);
323
            //classData.classDescriptor.setSuperclassType(superclassType);
324
        }
A
Andrey Breslav 已提交
325 326

        PsiMethod[] psiConstructors = psiClass.getConstructors();
327 328

        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
329 330 331 332
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
333
            if (!psiClass.isInterface()) {
334
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
335
                        classData.classDescriptor,
A
Andrey Breslav 已提交
336
                        Collections.<AnnotationDescriptor>emptyList(),
337
                        false);
338 339
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classData.classDescriptor.getVisibility());
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
340
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
341
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
342
            }
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363
            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)) {
364
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
365 366 367 368 369 370 371 372
                        }

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
373
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
374 375 376 377 378 379 380 381 382 383
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

                constructorDescriptor.initialize(typeParameters, valueParameters, Modality.FINAL, classData.classDescriptor.getVisibility());
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
            }
384 385
        }
        else {
386 387 388 389 390
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
391 392
                }

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

412 413 414
        // TODO
        //classData.classDescriptor.setClassObjectDescriptor(createClassObjectDescriptor(classData.classDescriptor));

415
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
416

417
        return classData;
418 419
    }

420 421 422 423 424 425 426 427 428 429 430 431 432 433 434
    /**
     * 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;
    }

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

444
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
445 446
    }

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

S
Stepan Koltsov 已提交
457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473

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


474
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
475 476

        @NotNull
477
        private final PsiTypeParameterListOwner psiOwner;
478
        @NotNull
479
        private final String name;
480
        @NotNull
481
        private final TypeVariableResolver typeVariableResolver;
482 483
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
484

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

492 493
            this.psiOwner = psiOwner;
            this.name = name;
494
            this.typeVariableResolver = typeVariableResolver;
495
            this.typeParameterDescriptor = typeParameterDescriptor;
496 497 498 499
        }

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

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

        @Override
        public void visitFormalTypeParameterEnd() {
526 527 528 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
            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) {
559 560 561
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
562
                    reified,
563 564
                    JetSignatureUtils.translateVariance(variance),
                    name,
565 566 567 568 569 570 571 572 573 574 575
                    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);
                }
            };
576
        }
577 578
    }

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

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
596 597 598
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
599 600
    }

601 602 603
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
604
            return resolveClass(containingClass);
605 606 607 608 609 610 611
        }
        
        PsiJavaFile containingFile = (PsiJavaFile) psiClass.getContainingFile();
        String packageName = containingFile.getPackageName();
        return resolveNamespace(packageName);
    }

612 613
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
614
        for (PsiTypeParameter typeParameter : typeParameters) {
615
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
616
            result.add(typeParameterDescriptor);
617 618 619 620
        }
        return result;
    }

621
    @NotNull
622
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
623
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
624
                containingDeclaration,
A
Andrey Breslav 已提交
625
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
626
                false,
627
                Variance.INVARIANT,
628 629
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
630
        );
631
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
632 633
    }

634
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
635 636 637
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
638 639 640
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
641
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
642 643 644 645 646
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
647
        } else {
648
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
649 650 651 652
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
653
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
654 655 656
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
657
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
658
                }
A
Andrey Breslav 已提交
659 660
            }
        }
661
        typeParameterDescriptor.setInitialized();
662 663
    }

664
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, TypeVariableResolver typeVariableByPsiResolver) {
665
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
666
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
667 668
            prevTypeParameters.add(psiTypeParameter.descriptor);
            initializeTypeParameter(psiTypeParameter, new TypeVariableResolverFromTypeDescriptors(prevTypeParameters, typeVariableByPsiResolver));
S
Stepan Koltsov 已提交
669
        }
A
Andrey Breslav 已提交
670 671
    }

672
    private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, List<TypeParameterDescriptor> typeParameters) {
673 674 675
        final List<JetType> result = new ArrayList<JetType>();

        if (psiClass.getJetClass().signature().length() > 0) {
676
            final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(typeParameters, null);
677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709
            
            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() {
                    return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }
            });
        } else {
710 711
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
712 713 714 715
        }
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
716 717 718
        return result;
    }

719
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver) {
720
        for (PsiClassType type : extendsListTypes) {
721 722 723 724 725
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
            
726
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
727 728 729 730 731

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

732 733
    @Nullable
    public NamespaceDescriptor resolveNamespace(@NotNull String qualifiedName) {
734 735 736 737 738 739
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

740
        PsiPackage psiPackage = findPackage(qualifiedName);
741
        if (psiPackage == null) {
742
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
743 744
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
745 746 747 748
        }
        return resolveNamespace(psiPackage);
    }

749
    public PsiClass findClass(String qualifiedName) {
750
        PsiClass original = javaFacade.findClass(qualifiedName, javaSearchScope);
M
Maxim Shafirov 已提交
751
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
752 753 754 755 756 757 758 759
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

            return altClass;
        }
        return original;
760 761
    }

762
    /*package*/ PsiPackage findPackage(String qualifiedName) {
763 764 765
        return javaFacade.findPackage(qualifiedName);
    }

766
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
767 768 769 770 771
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
772
        }
773
        return namespaceData.namespaceDescriptor;
774 775
    }

A
Andrey Breslav 已提交
776
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
777 778 779 780 781
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
782
        }
783
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
784 785
    }

786 787
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
788
        String name = psiPackage.getName();
789
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
790
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
791
                Collections.<AnnotationDescriptor>emptyList(), // TODO
792
                name == null ? JAVA_ROOT : name,
793 794
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
795
        );
796

797 798 799 800 801
        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;
802 803
    }

804 805 806 807 808 809 810 811
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

812 813 814 815
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
816 817 818
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
819
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
820
                Collections.<AnnotationDescriptor>emptyList(), // TODO
821
                psiClass.getName(),
822 823
                psiClass.getQualifiedName(),
                false
824
        );
825 826 827
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
828
    }
829 830 831 832 833 834 835 836 837 838
    
    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;
        }
    }
839

840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872
    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
873
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
874 875 876 877 878 879 880
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

882
        boolean nullable = parameter.getJetValueParameter().nullable();
883

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

887 888
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
889 890
        }
        
891 892 893 894
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
895
        JetType outType;
896
        if (typeFromAnnotation.length() > 0) {
897
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
898
        } else {
899
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
900
        }
901 902 903 904 905 906 907 908

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

909 910 911 912 913 914 915 916
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
917
                    false,
918
                    nullable ? TypeUtils.makeNullableAsSpecified(outType, nullable) : outType,
919
                    hasDefaultValue,
920 921 922
                    varargElementType
            ));
        }
923 924
    }

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

928 929 930
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
931
        }
932
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
933

934
        resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, fieldName);
935

936 937 938 939 940 941 942
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
943 944 945
    }
    
    @NotNull
946
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, boolean staticMembers) {
947

948 949 950 951 952 953
        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();
954
            if (namedMembers.propertyAccessors == null) {
955 956 957 958
                continue;
            }
            
            String propertyName = entry.getKey();
959

960
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName);
961
            descriptors.addAll(namedMembers.propertyDescriptors);
962
        }
963 964 965 966 967 968 969 970 971 972

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
973
        return descriptors;
974
    }
975 976 977 978 979 980 981
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
982
            return psiTypeToKey(typeSource.getPsiType());
983 984
        }
    }
985 986 987 988 989 990 991 992 993 994 995 996 997

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

998 999 1000 1001 1002
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1003

1004 1005 1006 1007
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
            boolean staticMembers, NamedMembers namedMembers, String propertyName) {
1008 1009 1010 1011
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1012
        if (namedMembers.propertyAccessors == null) {
1013 1014 1015
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
1016

1017
        final List<TypeParameterDescriptor> classTypeParameterDescriptorInitialization = scopeData.getTypeParameters();
1018

1019
        TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(scopeData.getTypeParameters(), null);
1020

1021 1022 1023 1024
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1025
        }
1026 1027
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1028

1029
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1030

1031 1032 1033 1034 1035 1036 1037
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
                map.put(key, value);
            }
1038

1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
            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();
            }
1057
        }
1058

1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072
        
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
        
        for (GroupingValue members : map.values()) {
            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;
            }
1073

1074 1075 1076 1077 1078 1079 1080 1081 1082 1083
            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();
            }
1084

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098
            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,
1099 1100
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1101

1102 1103 1104
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1105
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1106 1107
            }
            if (members.setter != null) {
1108
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1109
            }
1110

1111
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1112

1113
            List<TypeParameterDescriptor> typeParametersInitialization = new ArrayList<TypeParameterDescriptor>(0);
1114 1115 1116

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

1118
                if (anyMember == members.setter) {
1119
                    typeParametersInitialization = resolveMethodTypeParameters(method, setterDescriptor, typeVariableResolver);
1120 1121 1122 1123 1124 1125
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
1126
                    typeParametersInitialization = resolveMethodTypeParameters(method, getterDescriptor, typeVariableResolver);
1127 1128 1129
                }
            }

1130
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
1131 1132
            for (TypeParameterDescriptor typeParameter : typeParametersInitialization) {
                typeParameters.add(typeParameter);
1133 1134
            }

1135
            List<TypeParameterDescriptor> typeParametersForReceiver = new ArrayList<TypeParameterDescriptor>();
1136 1137
            typeParametersForReceiver.addAll(classTypeParameterDescriptorInitialization);
            typeParametersForReceiver.addAll(typeParametersInitialization);
1138
            TypeVariableResolver typeVariableResolverForPropertyInternals = new TypeVariableResolverFromTypeDescriptors(typeParametersForReceiver, null);
1139

1140 1141 1142 1143
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1144
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
1145 1146 1147 1148 1149 1150 1151 1152
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1153
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1154 1155 1156 1157 1158 1159 1160
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1161
            );
1162 1163 1164 1165
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1166
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getOutType(), false, null));
1167 1168 1169 1170 1171
            }

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

1174
        namedMembers.propertyDescriptors = r;
1175
    }
1176

1177
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1178 1179 1180
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1181 1182
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1183

1184
        Set<NamedFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1185
        for (PsiMethodWrapper method : namedMembers.methods) {
1186 1187 1188
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    typeSubstitutorForGenericSuperclasses,
                    method);
1189
            if (function != null) {
1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200
                functionsFromCurrent.add((NamedFunctionDescriptor) function);
            }
        }

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

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

            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink<NamedFunctionDescriptor>() {
                @Override
1201
                public void addToScope(@NotNull NamedFunctionDescriptor fakeOverride) {
1202 1203
                    functions.add(fakeOverride);
                }
1204 1205 1206 1207 1208

                @Override
                public void conflict(@NotNull NamedFunctionDescriptor fromSuper, @NotNull NamedFunctionDescriptor fromCurrent) {
                    // nop
                }
1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222
            });

        }

        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);
1223
            }
1224
        }
1225
        return r;
1226 1227
    }

1228
    private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) {
1229
        ResolverScopeData scopeData;
1230
        boolean staticMembers;
1231 1232
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
1233
            staticMembers = true;
1234
        } else if (owner instanceof ClassDescriptor) {
1235
            scopeData = classDescriptorCache.get(psiClass.getQualifiedName());
1236
            staticMembers = false;
1237
        } else {
1238
            throw new IllegalStateException("unknown owner: " + owner.getClass().getName());
1239 1240 1241 1242 1243
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1244 1245
        if (scopeData.namedMembersMap == null) {
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1246 1247
        }
        
1248
        return scopeData;
1249
    }
A
Andrey Breslav 已提交
1250

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

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

1256 1257 1258
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1259 1260
        if (namedMembers != null && namedMembers.methods != null) {
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);
1261

1262 1263 1264
            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);

            return namedMembers.functionDescriptors;
1265
        } else {
1266
            return Collections.emptySet();
1267
        }
1268 1269
    }

1270
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1271 1272 1273 1274 1275 1276 1277 1278 1279
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314
    
    private static boolean equal(@NotNull PsiClass c1, @NotNull PsiClass c2) {
        return c1.getQualifiedName().equals(c2.getQualifiedName());
    }
    
    private static boolean equal(@NotNull PsiMethod m1, @NotNull PsiMethod m2) {
        // TODO dummy
        return m1.getName().equals(m2.getName()) && equal(m1.getContainingClass(), m2.getContainingClass());
    }

    private static boolean equal(@NotNull PsiTypeParameterListOwner o1, @NotNull PsiTypeParameterListOwner o2) {
        if (o1 == o2) {
            return true;
        }
        if (o1 instanceof PsiClass && o2 instanceof PsiClass) {
            return equal((PsiClass) o1, (PsiClass) o2);
        }
        if (o1 instanceof PsiMethod && o2 instanceof PsiMethod) {
            return equal((PsiMethod) o1, (PsiMethod) o2);
        }
        if ((o1 instanceof PsiClass || o1 instanceof PsiMethod) && (o2 instanceof PsiClass || o2 instanceof PsiMethod)) {
            return false;
        }
        throw new IllegalStateException(o1.getClass() + ", " + o2.getClass());
    }
    
    public static boolean equal(@NotNull PsiTypeParameter p1, @NotNull PsiTypeParameter p2) {
        if (p1 == p2) {
            return true;
        }
        if (p1.getIndex() != p2.getIndex()) {
            return false;
        }
        return equal(p1.getOwner(), p2.getOwner());
    }
1315

1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
    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 已提交
1340
    @Nullable
1341 1342
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, final PsiMethodWrapper method) {

1343
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1344 1345 1346
        if (returnType == null) {
            return null;
        }
1347
        FunctionDescriptorImpl functionDescriptor = methodDescriptorCache.get(method.getPsiMethod());
A
Andrey Breslav 已提交
1348
        if (functionDescriptor != null) {
1349
            if (method.getPsiMethod().getContainingClass() != psiClass) {
1350 1351
                //functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
                throw new IllegalStateException();
A
Andrey Breslav 已提交
1352 1353 1354
            }
            return functionDescriptor;
        }
1355

1356 1357
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));

1358 1359 1360 1361 1362 1363 1364 1365 1366
        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 {
1367
            ResolverBinaryClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
1368 1369 1370 1371 1372 1373
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

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

S
Stepan Koltsov 已提交
1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
            
            if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD) && method.getParameters().size() == 0) {
                return null;
            }
            
            if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD) && method.getParameters().size() == 0) {
                return null;
            }

            // TODO: check signature
            if (method.getName().equals(JvmAbi.SET_TYPE_INFO_METHOD)) {
                return null;
            }
        }

1400
        ClassOrNamespaceDescriptor classDescriptor;
1401
        if (scopeData instanceof ResolverBinaryClassData) {
1402
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1403
            classDescriptor = classClassDescriptor;
1404 1405 1406
        }
        else {
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1407
        }
1408 1409 1410
        if (classDescriptor == null) {
            return null;
        }
1411

S
Stepan Koltsov 已提交
1412
        NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1413 1414
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
1415 1416
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1417
        );
1418
        methodDescriptorCache.put(method.getPsiMethod(), functionDescriptorImpl);
1419

1420
        final TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(classDescriptor);
1421

1422
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1423

1424
        TypeVariableResolver methodTypeVariableResolver = new TypeVariableResolverFromTypeDescriptors(methodTypeParameters, typeVariableResolverForParameters);
1425 1426


1427
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1428
        functionDescriptorImpl.initialize(
1429
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1430
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1431
                methodTypeParameters,
1432
                valueParameterDescriptors.descriptors,
1433
                makeReturnType(returnType, method, methodTypeVariableResolver),
1434 1435
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1436
        );
1437
        semanticServices.getTrace().record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1438
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
1439
        if (method.getPsiMethod().getContainingClass() != psiClass) {
1440 1441
            //substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
            throw new IllegalStateException();
A
Andrey Breslav 已提交
1442
        }
1443
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1444
    }
1445

1446
    public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, ClassOrNamespaceDescriptor containingDeclaration) {
1447 1448
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1449
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1450

1451
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1452 1453 1454 1455 1456

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

1460 1461
        return functions;
    }
1462

1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
    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;
        }
    }

1481
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1482
            @NotNull PsiMethodWrapper method,
1483
            @NotNull DeclarationDescriptor functionDescriptor,
1484 1485
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1486
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1487
        if (method.getJetMethod().typeParameters().length() > 0) {
1488
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
1489
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1490
        } else {
1491
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1492
        }
1493

1494 1495 1496 1497 1498 1499 1500 1501
        initializeTypeParameters(typeParametersIntialization, classTypeVariableResolver);
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1502 1503
        return typeParameters;
    }
1504 1505

    /**
1506
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor, TypeVariableResolver)
1507
     */
1508
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1509
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1510
    {
1511 1512 1513
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classTypeVariableResolver, functionDescriptor, method);
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1514 1515
    }

1516 1517
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1518 1519 1520

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

S
Stepan Koltsov 已提交
1521
        JetType transformedType;
1522
        if (returnTypeFromAnnotation.length() > 0) {
1523
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1524
        } else {
1525
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1526
        }
1527 1528
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
1529 1530 1531 1532 1533
        } else {
            return transformedType;
        }
    }

1534
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1535 1536 1537 1538 1539 1540
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1541
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1542 1543 1544 1545
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1546 1547 1548
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1549 1550 1551 1552
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1553 1554 1555 1556
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1557
}