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

3
import com.google.common.collect.Lists;
A
Andrey Breslav 已提交
4
import com.google.common.collect.Maps;
A
Andrey Breslav 已提交
5
import com.google.common.collect.Sets;
6
import com.intellij.openapi.project.Project;
7
import com.intellij.openapi.util.Pair;
8
import com.intellij.openapi.vfs.VirtualFile;
9
import com.intellij.psi.JavaPsiFacade;
10
import com.intellij.psi.PsiArrayType;
11 12 13 14 15 16 17 18 19
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiClassType;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiEllipsisType;
import com.intellij.psi.PsiJavaFile;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.PsiPackage;
20
import com.intellij.psi.PsiPrimitiveType;
21 22 23
import com.intellij.psi.PsiType;
import com.intellij.psi.PsiTypeParameter;
import com.intellij.psi.PsiTypeParameterListOwner;
24 25
import com.intellij.psi.PsiTypeVariable;
import com.intellij.psi.impl.source.PsiClassReferenceType;
26
import com.intellij.psi.search.DelegatingGlobalSearchScope;
27
import com.intellij.psi.search.GlobalSearchScope;
28
import jet.typeinfo.TypeInfoVariance;
29 30
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
31 32 33 34 35 36 37 38
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.Modality;
39
import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite;
40 41 42
import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
43 44
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
45 46 47 48 49
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.descriptors.Visibility;
A
Andrey Breslav 已提交
50
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
51
import org.jetbrains.jet.lang.resolve.BindingContext;
52
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
53 54 55 56 57 58
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
import org.jetbrains.jet.lang.types.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.Variance;
59
import org.jetbrains.jet.plugin.JetFileType;
60
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
61 62 63
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
64

65 66 67
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
68
import java.util.HashMap;
69
import java.util.HashSet;
70 71 72
import java.util.List;
import java.util.Map;
import java.util.Set;
73 74 75 76 77

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
78 79
    
    public static String JAVA_ROOT = "<java_root>";
80

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

83 84
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
85
            throw new UnsupportedOperationException();
86 87
        }

88 89
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
90
            return visitor.visitDeclarationDescriptor(this, data);
91 92 93
        }
    };

A
Andrey Breslav 已提交
94
    /*package*/ static final DeclarationDescriptor JAVA_CLASS_OBJECT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_class_object_emulation>") {
A
Andrey Breslav 已提交
95 96 97
        @NotNull
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
98
            throw new UnsupportedOperationException();
A
Andrey Breslav 已提交
99 100 101 102 103 104 105
        }

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };
106 107 108 109 110 111 112 113 114
    
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
    
    private static class TypeParameterDescriptorInitialization {
        private final TypeParameterDescriptorOrigin origin;
        private final TypeParameterDescriptor descriptor;
115 116 117 118
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
119

120 121
        private TypeParameterDescriptorInitialization(TypeParameterDescriptor descriptor) {
            this.origin = TypeParameterDescriptorOrigin.JAVA;
122
            this.descriptor = descriptor;
123 124 125 126 127 128 129 130 131 132
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

        private TypeParameterDescriptorInitialization(TypeParameterDescriptor descriptor,
                List<JetType> upperBoundsForKotlin, List<JetType> lowerBoundsForKotlin) {
            this.origin = TypeParameterDescriptorOrigin.KOTLIN;
            this.descriptor = descriptor;
            this.upperBoundsForKotlin = upperBoundsForKotlin;
            this.lowerBoundsForKotlin = lowerBoundsForKotlin;
133 134
        }
    }
135 136


137
    private static abstract class ResolverScopeData {
138
        protected boolean kotlin;
139 140
        
        private Map<String, NamedMembers> namedMembersMap;
141
    }
A
Andrey Breslav 已提交
142

143
    private static class ResolverClassData extends ResolverScopeData {
144
        private MutableClassDescriptorLite classDescriptor;
145 146 147 148 149 150 151

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

152
    private static class ResolverNamespaceData extends ResolverScopeData {
153 154 155 156 157 158 159 160
        private JavaNamespaceDescriptor namespaceDescriptor;

        @NotNull
        public NamespaceDescriptor getNamespaceDescriptor() {
            return namespaceDescriptor;
        }
    }

161
    protected final Map<String, ResolverClassData> classDescriptorCache = Maps.newHashMap();
162 163 164
    protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

165
    private final Map<PsiTypeParameter, TypeParameterDescriptorInitialization> typeParameterDescriptorCache = Maps.newHashMap();
A
Andrey Breslav 已提交
166
    protected final Map<PsiMethod, FunctionDescriptor> methodDescriptorCache = Maps.newHashMap();
167 168 169 170 171 172
    protected final JavaPsiFacade javaFacade;
    protected final GlobalSearchScope javaSearchScope;
    protected final JavaSemanticServices semanticServices;

    public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
        this.javaFacade = JavaPsiFacade.getInstance(project);
173 174 175 176 177 178
        this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
            @Override
            public boolean contains(VirtualFile file) {
                return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
            }
        };
179 180 181
        this.semanticServices = semanticServices;
    }

182
    @Nullable
183 184
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
        String qualifiedName = psiClass.getQualifiedName();
185

186 187 188 189
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
190

191
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
192 193 194 195 196
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
            return kotlinClassDescriptor;
        }

197
        // Not let's take a descriptor of a Java class
198 199 200 201
        ResolverClassData classData = classDescriptorCache.get(qualifiedName);
        if (classData == null) {
            classData = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classData);
202
        }
203
        return classData.getClassDescriptor();
204 205 206 207
    }

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

209 210 211 212 213
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
        
214
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
215 216 217 218 219
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
            return kotlinClassDescriptor;
        }

220
        // Not let's take a descriptor of a Java class
221 222
        ResolverClassData classData = classDescriptorCache.get(qualifiedName);
        if (classData == null) {
223
            PsiClass psiClass = findClass(qualifiedName);
224 225 226
            if (psiClass == null) {
                return null;
            }
227
            classData = createJavaClassDescriptor(psiClass);
228
        }
229
        return classData.getClassDescriptor();
230 231
    }

232
    private ResolverClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
A
Andrey Breslav 已提交
233 234 235
        assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
        classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO

236
        String name = psiClass.getName();
237
        ResolverClassData classData = new ResolverClassData();
238 239 240
        ClassKind kind = psiClass.isInterface() ? ClassKind.TRAIT : ClassKind.CLASS;
        classData.classDescriptor = new MutableClassDescriptorLite(
                resolveParentDescriptor(psiClass), kind
241
        );
242
        classData.classDescriptor.setName(name);
243
        
244 245 246 247 248 249 250 251 252
        class OuterClassTypeVariableResolver implements TypeVariableResolver {

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
                throw new IllegalStateException("not implemented"); // TODO
            }
        }

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

255
        List<TypeParameterDescriptor> typeParameters = resolveClassTypeParameters(psiClass, classData, new OuterClassTypeVariableResolver());
256 257 258
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
259
        classData.classDescriptor.setModality(Modality.convertFromFlags(
260 261
                psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                !psiClass.hasModifierProperty(PsiModifier.FINAL))
A
Andrey Breslav 已提交
262
        );
263
        classData.classDescriptor.createTypeConstructor();
264
        classDescriptorCache.put(psiClass.getQualifiedName(), classData);
265
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
266

267
        initializeTypeParameters(psiClass);
268

269
        // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
A
Andrey Breslav 已提交
270
        supertypes.addAll(getSupertypes(psiClass));
271

272
        if (psiClass.isInterface()) {
273
            //classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
274 275 276 277 278 279 280
        }
        else {
            PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
            assert extendsListTypes.length == 0 || extendsListTypes.length == 1;
            JetType superclassType = extendsListTypes.length == 0
                                            ? JetStandardClasses.getAnyType()
                                            : semanticServices.getTypeTransformer().transformToType(extendsListTypes[0]);
281
            //classData.classDescriptor.setSuperclassType(superclassType);
282
        }
A
Andrey Breslav 已提交
283 284

        PsiMethod[] psiConstructors = psiClass.getConstructors();
285 286

        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
287 288 289 290 291
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
            if (!psiClass.isInterface()) {
292
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
293
                        classData.classDescriptor,
A
Andrey Breslav 已提交
294
                        Collections.<AnnotationDescriptor>emptyList(),
295
                        false);
296 297
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), Modality.FINAL, classData.classDescriptor.getVisibility());
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
298
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
299
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
300 301 302
            }
        }
        else {
303 304 305 306 307
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
308 309
                }

310
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
311
                        classData.classDescriptor,
A
Andrey Breslav 已提交
312
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
313
                        false);
314
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
315
                        constructor.getParameters(),
316 317
                        new TypeParameterListTypeVariableResolver(typeParameters) // TODO: outer too
                    );
318 319 320 321
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors, Modality.FINAL,
322
                                                 resolveVisibilityFromPsiModifiers(psiConstructor));
323
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
324
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
325
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
326
            }
A
Andrey Breslav 已提交
327
        }
328

329
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
330

331
        return classData;
332 333
    }

334
    private List<TypeParameterDescriptor> resolveClassTypeParameters(PsiClass psiClass, ResolverClassData classData, TypeVariableResolver typeVariableResolver) {
335 336 337 338 339 340
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor, typeVariableResolver);
341
        }
342

343
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
344 345
    }

346
    @NotNull
347
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
348 349 350 351 352
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
353 354 355
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372

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


373 374 375 376 377
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
        
        private final DeclarationDescriptor containingDeclaration;
        private final PsiTypeParameterListOwner psiOwner;
        private final String name;
378
        private final int index;
379
        private final TypeInfoVariance variance;
380
        private final TypeVariableResolver typeVariableResolver;
381 382

        protected JetSignatureTypeParameterVisitor(DeclarationDescriptor containingDeclaration, PsiTypeParameterListOwner psiOwner,
383
                String name, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver)
384
        {
385 386 387 388
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
            
389 390 391
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;
            this.name = name;
392
            this.index = index;
393
            this.variance = variance;
394
            this.typeVariableResolver = typeVariableResolver;
395 396 397 398
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
399
        
400 401
        @Override
        public JetSignatureVisitor visitClassBound() {
402
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
403 404
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
405 406 407
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
408 409 410 411 412 413 414
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
415
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
416 417 418 419 420 421 422 423 424 425 426 427 428 429 430
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
                    true, // TODO: wrong
                    JetSignatureUtils.translateVariance(variance),
                    name,
431
                    index);
432 433 434 435 436 437
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
            typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(typeParameter, upperBounds, lowerBounds));
            done(typeParameter);
        }
        
        protected abstract void done(TypeParameterDescriptor typeParameterDescriptor);
438 439
    }

440 441 442
    /**
     * @see #resolveMethodTypeParametersFromJetSignature(String, FunctionDescriptor)
     */
443
    private List<TypeParameterDescriptor> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz,
444
            final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) {
445
        final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>();
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460
        
        class MyTypeVariableResolver implements TypeVariableResolver {

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
                for (TypeParameterDescriptor typeParameter : r) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
                    }
                }
                return outerClassTypeVariableResolver.getTypeVariable(name);
            }
        }
        
461
        new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() {
462 463
            private int formalTypeParameterIndex = 0;
            
464 465
            @Override
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
466
                return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
467
                    @Override
468 469
                    protected void done(TypeParameterDescriptor typeParameterDescriptor) {
                        r.add(typeParameterDescriptor);
470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488
                    }
                };
            }

            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
        });
        return r;
    }

489 490 491
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
492
            return resolveClass(containingClass);
493 494 495 496 497 498 499
        }
        
        PsiJavaFile containingFile = (PsiJavaFile) psiClass.getContainingFile();
        String packageName = containingFile.getPackageName();
        return resolveNamespace(packageName);
    }

500
    private List<TypeParameterDescriptor> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
501 502
        List<TypeParameterDescriptor> result = Lists.newArrayList();
        for (PsiTypeParameter typeParameter : typeParameters) {
503
            TypeParameterDescriptor typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
504
            result.add(typeParameterDescriptor);
505 506 507 508
        }
        return result;
    }

509 510 511
    @NotNull
    private TypeParameterDescriptor makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
        assert typeParameterDescriptorCache.get(psiTypeParameter) == null : psiTypeParameter.getText();
512
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
513
                containingDeclaration,
A
Andrey Breslav 已提交
514
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
515
                false,
516
                Variance.INVARIANT,
517 518
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
519
        );
520
        typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(typeParameterDescriptor));
521 522 523
        return typeParameterDescriptor;
    }

524 525 526
    private void initializeTypeParameter(PsiTypeParameter typeParameter, TypeParameterDescriptorInitialization typeParameterDescriptorInitialization) {
        TypeParameterDescriptor typeParameterDescriptor = typeParameterDescriptorInitialization.descriptor;
        if (typeParameterDescriptorInitialization.origin == TypeParameterDescriptorOrigin.KOTLIN) {
527 528 529 530 531 532 533 534 535 536
            List<?> upperBounds = typeParameterDescriptorInitialization.upperBoundsForKotlin;
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
                for (JetType upperBound : typeParameterDescriptorInitialization.upperBoundsForKotlin) {
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
537 538 539 540 541 542 543 544 545 546 547 548
        } else {
            PsiClassType[] referencedTypes = typeParameter.getExtendsList().getReferencedTypes();
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0]));
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType));
                }
A
Andrey Breslav 已提交
549 550
            }
        }
551
        typeParameterDescriptor.setInitialized();
552 553 554 555
    }

    private void initializeTypeParameters(PsiTypeParameterListOwner typeParameterListOwner) {
        for (PsiTypeParameter psiTypeParameter : typeParameterListOwner.getTypeParameters()) {
556
            initializeTypeParameter(psiTypeParameter, resolveTypeParameterInitialization(psiTypeParameter));
557
        }
A
Andrey Breslav 已提交
558 559 560
    }

    @NotNull
561 562
    private TypeParameterDescriptorInitialization resolveTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
        TypeParameterDescriptorInitialization typeParameterDescriptor = typeParameterDescriptorCache.get(psiTypeParameter);
S
Stepan Koltsov 已提交
563 564 565 566
        if (typeParameterDescriptor == null) {
            // TODO: report properly without crashing compiler
            throw new IllegalStateException("failed to resolve type parameter: " + psiTypeParameter.getName());
        }
A
Andrey Breslav 已提交
567 568 569
        return typeParameterDescriptor;
    }

A
Andrey Breslav 已提交
570 571
    private Collection<? extends JetType> getSupertypes(PsiClass psiClass) {
        List<JetType> result = new ArrayList<JetType>();
572 573 574 575 576 577
        result.add(JetStandardClasses.getAnyType());
        transformSupertypeList(result, psiClass.getExtendsListTypes());
        transformSupertypeList(result, psiClass.getImplementsListTypes());
        return result;
    }

A
Andrey Breslav 已提交
578
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes) {
579
        for (PsiClassType type : extendsListTypes) {
A
Andrey Breslav 已提交
580
            JetType transform = semanticServices.getTypeTransformer().transformToType(type);
581 582 583 584 585

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

586
    public NamespaceDescriptor resolveNamespace(String qualifiedName) {
587 588 589 590 591 592
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

593
        PsiPackage psiPackage = findPackage(qualifiedName);
594
        if (psiPackage == null) {
595
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
596 597
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
598 599 600 601
        }
        return resolveNamespace(psiPackage);
    }

602 603 604 605
    private PsiClass findClass(String qualifiedName) {
        return javaFacade.findClass(qualifiedName, javaSearchScope);
    }

606
    /*package*/ PsiPackage findPackage(String qualifiedName) {
607 608 609
        return javaFacade.findPackage(qualifiedName);
    }

610
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
611 612 613 614 615
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
616
        }
617
        return namespaceData.namespaceDescriptor;
618 619
    }

A
Andrey Breslav 已提交
620
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
621 622 623 624 625
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
626
        }
627
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
628 629
    }

630 631
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
632
        String name = psiPackage.getName();
633
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
634
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
635
                Collections.<AnnotationDescriptor>emptyList(), // TODO
636
                name == null ? JAVA_ROOT : name,
637 638
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
639
        );
640

641 642 643 644 645
        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;
646 647
    }

648 649 650 651 652 653 654 655
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

656 657 658
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
659
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
660
                Collections.<AnnotationDescriptor>emptyList(), // TODO
661
                psiClass.getName(),
662 663
                psiClass.getQualifiedName(),
                false
664
        );
665 666 667
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
668
    }
669 670 671 672 673 674 675 676 677 678
    
    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;
        }
    }
679

680 681
    private ValueParameterDescriptors resolveParameterDescriptors(DeclarationDescriptor containingDeclaration,
            List<PsiParameterWrapper> parameters, TypeVariableResolver typeVariableResolver) {
682
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
683
        JetType receiverType = null;
684
        int indexDelta = 0;
685 686
        for (int i = 0, parametersLength = parameters.size(); i < parametersLength; i++) {
            PsiParameterWrapper parameter = parameters.get(i);
687
            JvmMethodParameterMeaning meaning = resolveParameterDescriptor(containingDeclaration, i + indexDelta, parameter, typeVariableResolver);
688 689
            if (meaning.kind == JvmMethodParameterKind.TYPE_INFO) {
                // TODO
690
                --indexDelta;
691 692 693 694 695 696
            } 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");
                }
697
                --indexDelta;
698
                receiverType = meaning.receiverType;
S
Stepan Koltsov 已提交
699
            }
700
        }
701
        return new ValueParameterDescriptors(receiverType, result);
702
    }
A
Andrey Breslav 已提交
703

704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736
    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
737
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
738 739 740 741 742 743 744
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

746
        boolean nullable = parameter.getJetValueParameter().nullable();
747

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

751 752
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
753 754
        }
        
755 756 757 758
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
759
        JetType outType;
760
        if (typeFromAnnotation.length() > 0) {
761
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
762 763 764
        } else {
            outType = semanticServices.getTypeTransformer().transformToType(psiType);
        }
765 766 767 768 769 770 771 772

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

773 774 775 776 777 778 779 780
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
781
                    false,
782
                    nullable ? TypeUtils.makeNullableAsSpecified(outType, nullable) : outType,
783
                    hasDefaultValue,
784 785 786
                    varargElementType
            ));
        }
787 788
    }

789 790
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull DeclarationDescriptor owner, PsiClass psiClass, String fieldName, boolean staticMembers) {
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
791

792 793 794
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
795 796
        }

797
        resolveNamedGroupProperties(owner, staticMembers, namedMembers, fieldName);
798

799 800 801 802 803
        return namedMembers.propertyDescriptors;
    }
    
    @NotNull
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
804

805 806 807 808 809 810
        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();
811
            if (namedMembers.propertyAccessors == null) {
812 813 814 815
                continue;
            }
            
            String propertyName = entry.getKey();
816

817 818
            resolveNamedGroupProperties(owner, staticMembers, namedMembers, propertyName);
            descriptors.addAll(namedMembers.propertyDescriptors);
819
        }
820
        return descriptors;
821
    }
822 823 824 825 826 827 828
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
829
            return psiTypeToKey(typeSource.getPsiType());
830 831
        }
    }
832 833 834 835 836 837 838 839 840 841 842 843 844

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

845 846 847 848 849
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
850

851 852 853 854 855
    private void resolveNamedGroupProperties(DeclarationDescriptor owner, boolean staticMembers, NamedMembers namedMembers, String propertyName) {
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
856
        if (namedMembers.propertyAccessors == null) {
857 858 859 860
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
        
861 862 863
        final List<TypeParameterDescriptor> classTypeParameters;
        if (!staticMembers) {
            classTypeParameters = ((ClassDescriptor) owner).getTypeConstructor().getParameters();
864
        } else {
865
            classTypeParameters = new ArrayList<TypeParameterDescriptor>(0);
866
        }
867

868 869 870 871 872 873
        TypeParameterListTypeVariableResolver typeVariableResolver = new TypeParameterListTypeVariableResolver(classTypeParameters);
        
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
874
        }
875 876
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
877

878
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
879

880 881 882 883 884 885 886
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
                map.put(key, value);
            }
887

888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905
            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();
            }
906
        }
907

908 909 910 911 912 913 914 915 916 917 918 919 920 921
        
        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;
            }
922

923 924 925 926 927 928 929 930 931 932
            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();
            }
933

934 935 936 937 938 939 940 941 942 943 944 945 946 947 948
            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,
                    propertyName);
949

950 951 952 953 954 955 956 957
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false);
            }
            if (members.setter != null) {
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false);
            }
958

959
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
960

961 962 963 964
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);

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

966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003
                if (anyMember == members.setter) {
                    typeParameters = resolveMethodTypeParameters(method, setterDescriptor, typeVariableResolver);
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
                    typeParameters = resolveMethodTypeParameters(method, getterDescriptor, typeVariableResolver);
                }
            }

            List<TypeParameterDescriptor> typeParametersForReceiver = new ArrayList<TypeParameterDescriptor>();
            typeParametersForReceiver.addAll(classTypeParameters);
            typeParametersForReceiver.addAll(typeParameters);
            TypeVariableResolver typeVariableResolverForPropertyInternals = new TypeParameterListTypeVariableResolver(typeParametersForReceiver);
            
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType());
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType());
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1004
            );
1005 1006 1007 1008 1009 1010 1011 1012 1013 1014
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
                // TODO: initialize
            }

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

1017
        namedMembers.propertyDescriptors = r;
1018
    }
1019

1020 1021 1022 1023
    private void resolveNamedGroupFunctions(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, boolean staticMembers, NamedMembers namedMembers, String functionName) {
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1024

1025 1026 1027
        if (namedMembers.methods == null) {
            namedMembers.functionDescriptors = Collections.emptySet();
            return;
1028
        }
1029 1030 1031 1032

        Set<FunctionDescriptor> functionDescriptors = new HashSet<FunctionDescriptor>(namedMembers.methods.size());
        for (PsiMethodWrapper method : namedMembers.methods) {
            functionDescriptors.add(resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutorForGenericSuperclasses, method));
1033
        }
1034
        namedMembers.functionDescriptors = functionDescriptors;
1035 1036
    }

1037
    private ResolverScopeData getResolverScopeData(DeclarationDescriptor owner, PsiClassWrapper psiClass) {
1038
        ResolverScopeData scopeData;
1039
        boolean staticMembers;
1040 1041
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
1042
            staticMembers = true;
1043
        } else if (owner instanceof ClassDescriptor) {
1044
            scopeData = classDescriptorCache.get(psiClass.getQualifiedName());
1045
            staticMembers = false;
1046 1047 1048 1049 1050 1051 1052
        } else {
            throw new IllegalStateException();
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1053 1054
        if (scopeData.namedMembersMap == null) {
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1055 1056
        }
        
1057
        return scopeData;
1058
    }
A
Andrey Breslav 已提交
1059

A
Andrey Breslav 已提交
1060
    @NotNull
A
Andrey Breslav 已提交
1061
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull DeclarationDescriptor owner, @NotNull PsiClass psiClass, @Nullable ClassDescriptor classDescriptor, @NotNull String methodName, boolean staticMembers) {
A
Andrey Breslav 已提交
1062

1063
        ResolverScopeData resolverScopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
A
Andrey Breslav 已提交
1064

1065 1066 1067 1068 1069
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
        if (namedMembers == null || namedMembers.methods == null) {
            return Collections.emptySet();
1070
        }
1071 1072 1073 1074 1075

        TypeSubstitutor typeSubstitutor = createSubstitutorForGenericSupertypes(classDescriptor);
        resolveNamedGroupFunctions(owner, psiClass, typeSubstitutor, staticMembers, namedMembers, methodName);
        
        return namedMembers.functionDescriptors;
1076 1077
    }

A
Andrey Breslav 已提交
1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088
    public TypeSubstitutor createSubstitutorForGenericSupertypes(ClassDescriptor classDescriptor) {
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }

1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108
    private static class TypeParameterListTypeVariableResolver implements TypeVariableResolver {

        private final List<TypeParameterDescriptor> typeParameters;

        private TypeParameterListTypeVariableResolver(List<TypeParameterDescriptor> typeParameters) {
            this.typeParameters = typeParameters;
        }

        @NotNull
        @Override
        public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
            for (TypeParameterDescriptor typeParameter : typeParameters) {
                if (typeParameter.getName().equals(name)) {
                    return typeParameter;
                }
            }
            throw new IllegalStateException("unresolver variable: " + name); // TODO: report properly
        }
    }

A
Andrey Breslav 已提交
1109
    @Nullable
1110
    public FunctionDescriptor resolveMethodToFunctionDescriptor(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, PsiMethodWrapper method) {
1111
        
1112
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1113 1114 1115
        if (returnType == null) {
            return null;
        }
1116
        FunctionDescriptor functionDescriptor = methodDescriptorCache.get(method.getPsiMethod());
A
Andrey Breslav 已提交
1117
        if (functionDescriptor != null) {
1118
            if (method.getPsiMethod().getContainingClass() != psiClass) {
A
Andrey Breslav 已提交
1119 1120 1121 1122
                functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
            }
            return functionDescriptor;
        }
1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139

        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 {
            ResolverClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1140
        // TODO: ugly
1141
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1142
            return null;
1143
        }
1144

S
Stepan Koltsov 已提交
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165
        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;
            }
        }

1166 1167
        DeclarationDescriptor classDescriptor;
        final List<TypeParameterDescriptor> classTypeParameters;
1168
        if (method.isStatic()) {
1169
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1170 1171 1172
            classTypeParameters = Collections.emptyList();
        }
        else {
1173
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1174 1175 1176
            classDescriptor = classClassDescriptor;
            classTypeParameters = classClassDescriptor.getTypeConstructor().getParameters();
        }
1177 1178 1179
        if (classDescriptor == null) {
            return null;
        }
S
Stepan Koltsov 已提交
1180
        NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1181 1182
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
1183
                method.getName()
A
Andrey Breslav 已提交
1184
        );
1185
        methodDescriptorCache.put(method.getPsiMethod(), functionDescriptorImpl);
1186 1187 1188 1189

        // TODO: add outer classes
        TypeParameterListTypeVariableResolver typeVariableResolverForParameters = new TypeParameterListTypeVariableResolver(classTypeParameters);

1190
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211

        class MethodTypeVariableResolver implements TypeVariableResolver {

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
                for (TypeParameterDescriptor typeParameter : methodTypeParameters) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
                    }
                }
                for (TypeParameterDescriptor typeParameter : classTypeParameters) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
                    }
                }
                throw new IllegalStateException("unresolver variable: " + name); // TODO: report properly
            }
        }


1212
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), new MethodTypeVariableResolver());
A
Andrey Breslav 已提交
1213
        functionDescriptorImpl.initialize(
1214
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1215
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1216
                methodTypeParameters,
1217
                valueParameterDescriptors.descriptors,
1218
                makeReturnType(returnType, method, new MethodTypeVariableResolver()),
1219 1220
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1221
        );
1222
        semanticServices.getTrace().record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1223
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
1224
        if (method.getPsiMethod().getContainingClass() != psiClass) {
A
Andrey Breslav 已提交
1225 1226 1227 1228
            substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
        }
        return substitutedFunctionDescriptor;
    }
1229

1230 1231
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
            @NotNull PsiMethodWrapper method,
1232
            @NotNull DeclarationDescriptor functionDescriptor,
1233
            @NotNull TypeVariableResolver classTypeVariableResolver) {
1234
        if (method.getJetMethod().typeParameters().length() > 0) {
1235
            List<TypeParameterDescriptor> r = resolveMethodTypeParametersFromJetSignature(
1236
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1237
            initializeTypeParameters(method.getPsiMethod());
1238
            return r;
1239
        }
1240

1241 1242
        List<TypeParameterDescriptor> typeParameters = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
        initializeTypeParameters(method.getPsiMethod());
1243 1244
        return typeParameters;
    }
1245 1246

    /**
1247
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, MutableClassDescriptorLite)
1248
     */
1249
    private List<TypeParameterDescriptor> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1250
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1251
    {
1252
        final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>();
1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267
        
        class MyTypeVariableResolver implements TypeVariableResolver {

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
                for (TypeParameterDescriptor typeParameter : r) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
                    }
                }
                return classTypeVariableResolver.getTypeVariable(name);
            }
        }
        
1268
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
1269 1270
            private int formalTypeParameterIndex = 0;
            
1271
            @Override
S
Stepan Koltsov 已提交
1272
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
1273
                
1274
                return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
1275
                    @Override
1276 1277
                    protected void done(TypeParameterDescriptor typeParameterDescriptor) {
                        r.add(typeParameterDescriptor);
1278 1279
                    }
                };
1280

1281 1282 1283 1284 1285
            }
        });
        return r;
    }

1286 1287 1288 1289
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method, TypeVariableResolver typeVariableResolver) {

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

S
Stepan Koltsov 已提交
1290
        JetType transformedType;
1291
        if (returnTypeFromAnnotation.length() > 0) {
1292
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1293 1294 1295
        } else {
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType);
        }
1296 1297
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
1298 1299 1300 1301 1302
        } else {
            return transformedType;
        }
    }

1303
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1304 1305 1306 1307 1308 1309
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1310 1311
    @NotNull
    private TypeParameterDescriptorInitialization resolveTypeParameterInitialization(PsiTypeParameter typeParameter) {
1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330
        PsiTypeParameterListOwner owner = typeParameter.getOwner();
        if (owner instanceof PsiClass) {
            PsiClass psiClass = (PsiClass) owner;
            return resolveTypeParameter(resolveClass(psiClass), typeParameter);
        }
        if (owner instanceof PsiMethod) {
            PsiMethod psiMethod = (PsiMethod) owner;
            PsiClass containingClass = psiMethod.getContainingClass();
            DeclarationDescriptor ownerOwner;
            TypeSubstitutor substitutorForGenericSupertypes;
            if (psiMethod.hasModifierProperty(PsiModifier.STATIC)) {
                substitutorForGenericSupertypes = TypeSubstitutor.EMPTY;
                return resolveTypeParameter(JAVA_METHOD_TYPE_PARAMETER_PARENT, typeParameter);
            }
            else {
                ClassDescriptor classDescriptor = resolveClass(containingClass);
                ownerOwner = classDescriptor;
                substitutorForGenericSupertypes = semanticServices.getDescriptorResolver().createSubstitutorForGenericSupertypes(classDescriptor);
            }
1331
            FunctionDescriptor functionDescriptor = resolveMethodToFunctionDescriptor(ownerOwner, containingClass, substitutorForGenericSupertypes, new PsiMethodWrapper(psiMethod));
1332 1333 1334 1335
            return resolveTypeParameter(functionDescriptor, typeParameter);
        }
        throw new IllegalStateException("Unknown parent type: " + owner);
    }
1336 1337 1338 1339

    public TypeParameterDescriptor resolveTypeParameter(PsiTypeParameter typeParameter) {
        return resolveTypeParameterInitialization(typeParameter).descriptor;
    }
1340 1341 1342 1343 1344 1345 1346 1347 1348

    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1349
}