JavaDescriptorResolver.java 60.3 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 10 11 12 13 14 15 16 17 18
import com.intellij.psi.JavaPsiFacade;
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;
19
import com.intellij.psi.PsiPrimitiveType;
20 21 22
import com.intellij.psi.PsiType;
import com.intellij.psi.PsiTypeParameter;
import com.intellij.psi.PsiTypeParameterListOwner;
23 24
import com.intellij.psi.PsiTypeVariable;
import com.intellij.psi.impl.source.PsiClassReferenceType;
25
import com.intellij.psi.search.DelegatingGlobalSearchScope;
26
import com.intellij.psi.search.GlobalSearchScope;
27
import jet.typeinfo.TypeInfoVariance;
28 29
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
30 31 32 33 34 35 36 37
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;
38
import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite;
39 40 41
import org.jetbrains.jet.lang.descriptors.NamedFunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
42 43
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
44 45 46 47 48
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 已提交
49
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
50
import org.jetbrains.jet.lang.resolve.BindingContext;
51
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
52 53 54 55 56 57
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;
58
import org.jetbrains.jet.plugin.JetFileType;
59
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
60 61 62
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
63

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

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

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

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

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

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

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

119 120
        private TypeParameterDescriptorInitialization(TypeParameterDescriptor descriptor) {
            this.origin = TypeParameterDescriptorOrigin.JAVA;
121
            this.descriptor = descriptor;
122 123 124 125 126 127 128 129 130 131
            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;
132 133
        }
    }
134 135


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

266
        initializeTypeParameters(psiClass);
267

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

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

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

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

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

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

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

330
        return classData;
331 332
    }

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

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

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

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

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


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

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

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

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
414
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
415 416 417 418 419 420 421 422 423 424 425 426 427 428 429
                @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,
430
                    index);
431 432 433 434 435 436
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
            typeParameterDescriptorCache.put(psiTypeParameter, new TypeParameterDescriptorInitialization(typeParameter, upperBounds, lowerBounds));
            done(typeParameter);
        }
        
        protected abstract void done(TypeParameterDescriptor typeParameterDescriptor);
437 438
    }

439 440 441
    /**
     * @see #resolveMethodTypeParametersFromJetSignature(String, FunctionDescriptor)
     */
442
    private List<TypeParameterDescriptor> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz,
443
            final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) {
444
        final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>();
445 446 447 448 449 450 451 452 453 454 455 456 457 458 459
        
        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);
            }
        }
        
460
        new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() {
461 462
            private int formalTypeParameterIndex = 0;
            
463 464
            @Override
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
465
                return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
466
                    @Override
467 468
                    protected void done(TypeParameterDescriptor typeParameterDescriptor) {
                        r.add(typeParameterDescriptor);
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487
                    }
                };
            }

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

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

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

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

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

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

            // TODO: lower bounds
536 537 538 539 540 541 542 543 544 545 546 547
        } 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 已提交
548 549
            }
        }
550
        typeParameterDescriptor.setInitialized();
551 552 553 554
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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
    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
736
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
737 738 739 740 741 742 743
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

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

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

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

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

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

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

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

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

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

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

816 817
            resolveNamedGroupProperties(owner, staticMembers, namedMembers, propertyName);
            descriptors.addAll(namedMembers.propertyDescriptors);
818
        }
819
        return descriptors;
820
    }
821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
            if (typeSource.getPsiType() instanceof PsiClassType) {
                return ((PsiClassType) typeSource.getPsiType()).getClassName();
            } else if (typeSource.getPsiType() instanceof PsiPrimitiveType) {
                return typeSource.getPsiType().getPresentableText();
            } else {
                throw new IllegalStateException("" + typeSource.getPsiType().getClass());
            }
        }
    }
    
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
843

844 845 846 847 848
    private void resolveNamedGroupProperties(DeclarationDescriptor owner, boolean staticMembers, NamedMembers namedMembers, String propertyName) {
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
849
        if (namedMembers.propertyAccessors == null) {
850 851 852 853
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
        
854 855 856
        final List<TypeParameterDescriptor> classTypeParameters;
        if (!staticMembers) {
            classTypeParameters = ((ClassDescriptor) owner).getTypeConstructor().getParameters();
857
        } else {
858
            classTypeParameters = new ArrayList<TypeParameterDescriptor>(0);
859
        }
860

861 862 863 864 865 866
        TypeParameterListTypeVariableResolver typeVariableResolver = new TypeParameterListTypeVariableResolver(classTypeParameters);
        
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
867
        }
868 869
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
870

871
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
872

873 874 875 876 877 878 879
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
                map.put(key, value);
            }
880

881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
            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();
            }
899
        }
900

901 902 903 904 905 906 907 908 909 910 911 912 913 914
        
        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;
            }
915

916 917 918 919 920 921 922 923 924 925
            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();
            }
926

927 928 929 930 931 932 933 934 935 936 937 938 939 940 941
            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);
942

943 944 945 946 947 948 949 950
            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);
            }
951

952
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
953

954 955 956 957
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);

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

959 960 961 962 963 964 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
                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
997
            );
998 999 1000 1001 1002 1003 1004 1005 1006 1007
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
                // TODO: initialize
            }

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

1010
        namedMembers.propertyDescriptors = r;
1011
    }
1012

1013 1014 1015 1016
    private void resolveNamedGroupFunctions(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, boolean staticMembers, NamedMembers namedMembers, String functionName) {
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1017

1018 1019 1020
        if (namedMembers.methods == null) {
            namedMembers.functionDescriptors = Collections.emptySet();
            return;
1021
        }
1022 1023 1024 1025

        Set<FunctionDescriptor> functionDescriptors = new HashSet<FunctionDescriptor>(namedMembers.methods.size());
        for (PsiMethodWrapper method : namedMembers.methods) {
            functionDescriptors.add(resolveMethodToFunctionDescriptor(owner, psiClass, typeSubstitutorForGenericSuperclasses, method));
1026
        }
1027
        namedMembers.functionDescriptors = functionDescriptors;
1028 1029
    }

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

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

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

1058 1059 1060 1061 1062
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
        if (namedMembers == null || namedMembers.methods == null) {
            return Collections.emptySet();
1063
        }
1064 1065 1066 1067 1068

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

A
Andrey Breslav 已提交
1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081
    public TypeSubstitutor createSubstitutorForGenericSupertypes(ClassDescriptor classDescriptor) {
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }

1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
    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 已提交
1102
    @Nullable
1103
    public FunctionDescriptor resolveMethodToFunctionDescriptor(DeclarationDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, PsiMethodWrapper method) {
1104
        
1105
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1106 1107 1108
        if (returnType == null) {
            return null;
        }
1109
        FunctionDescriptor functionDescriptor = methodDescriptorCache.get(method.getPsiMethod());
A
Andrey Breslav 已提交
1110
        if (functionDescriptor != null) {
1111
            if (method.getPsiMethod().getContainingClass() != psiClass) {
A
Andrey Breslav 已提交
1112 1113 1114 1115
                functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
            }
            return functionDescriptor;
        }
1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132

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

1133
        // TODO: ugly
1134
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1135
            return null;
1136
        }
1137

S
Stepan Koltsov 已提交
1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158
        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;
            }
        }

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

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

1183
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204

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


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

1223 1224
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
            @NotNull PsiMethodWrapper method,
1225
            @NotNull DeclarationDescriptor functionDescriptor,
1226
            @NotNull TypeVariableResolver classTypeVariableResolver) {
1227
        if (method.getJetMethod().typeParameters().length() > 0) {
1228
            List<TypeParameterDescriptor> r = resolveMethodTypeParametersFromJetSignature(
1229
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1230
            initializeTypeParameters(method.getPsiMethod());
1231
            return r;
1232
        }
1233

1234 1235
        List<TypeParameterDescriptor> typeParameters = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
        initializeTypeParameters(method.getPsiMethod());
1236 1237
        return typeParameters;
    }
1238 1239

    /**
1240
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, MutableClassDescriptorLite)
1241
     */
1242
    private List<TypeParameterDescriptor> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1243
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1244
    {
1245
        final List<TypeParameterDescriptor> r = new ArrayList<TypeParameterDescriptor>();
1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260
        
        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);
            }
        }
        
1261
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
1262 1263
            private int formalTypeParameterIndex = 0;
            
1264
            @Override
S
Stepan Koltsov 已提交
1265
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance) {
1266
                
1267
                return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
1268
                    @Override
1269 1270
                    protected void done(TypeParameterDescriptor typeParameterDescriptor) {
                        r.add(typeParameterDescriptor);
1271 1272
                    }
                };
1273

1274 1275 1276 1277 1278
            }
        });
        return r;
    }

1279 1280 1281 1282
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method, TypeVariableResolver typeVariableResolver) {

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

S
Stepan Koltsov 已提交
1283
        JetType transformedType;
1284
        if (returnTypeFromAnnotation.length() > 0) {
1285
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1286 1287 1288
        } else {
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType);
        }
1289 1290
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
1291 1292 1293 1294 1295
        } else {
            return transformedType;
        }
    }

1296
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1297 1298 1299 1300 1301 1302
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1303 1304
    @NotNull
    private TypeParameterDescriptorInitialization resolveTypeParameterInitialization(PsiTypeParameter typeParameter) {
1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323
        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);
            }
1324
            FunctionDescriptor functionDescriptor = resolveMethodToFunctionDescriptor(ownerOwner, containingClass, substitutorForGenericSupertypes, new PsiMethodWrapper(psiMethod));
1325 1326 1327 1328
            return resolveTypeParameter(functionDescriptor, typeParameter);
        }
        throw new IllegalStateException("Unknown parent type: " + owner);
    }
1329 1330 1331 1332

    public TypeParameterDescriptor resolveTypeParameter(PsiTypeParameter typeParameter) {
        return resolveTypeParameterInitialization(typeParameter).descriptor;
    }
1333 1334 1335 1336 1337 1338 1339 1340 1341

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