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

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

19
import com.google.common.collect.Lists;
A
Andrey Breslav 已提交
20
import com.google.common.collect.Maps;
A
Andrey Breslav 已提交
21
import com.google.common.collect.Sets;
22
import com.intellij.openapi.project.Project;
23
import com.intellij.openapi.util.Pair;
24
import com.intellij.psi.*;
25
import jet.typeinfo.TypeInfoVariance;
26 27
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
28
import org.jetbrains.jet.lang.descriptors.*;
A
Andrey Breslav 已提交
29
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
30
import org.jetbrains.jet.lang.psi.JetPsiUtil;
31
import org.jetbrains.jet.lang.resolve.*;
32
import org.jetbrains.jet.lang.resolve.constants.*;
33
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
34
import org.jetbrains.jet.lang.types.*;
S
Stepan Koltsov 已提交
35
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
36
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
37
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
38 39 40
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
41

42
import javax.inject.Inject;
43
import java.util.*;
44 45 46 47 48

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
49
    
S
Stepan Koltsov 已提交
50
    public static final String JAVA_ROOT = "<java_root>";
51

S
Stepan Koltsov 已提交
52 53
    public static final ModuleDescriptor FAKE_ROOT_MODULE = new ModuleDescriptor(JAVA_ROOT);

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

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

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

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

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96

    private static Visibility PACKAGE_VISIBILITY = new Visibility("package", false) {
        @Override
        protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
            NamespaceDescriptor parentPackage = DescriptorUtils.getParentOfType(what, NamespaceDescriptor.class);
            NamespaceDescriptor fromPackage = DescriptorUtils.getParentOfType(from, NamespaceDescriptor.class, false);
            assert parentPackage != null;
            return parentPackage.equals(fromPackage);
        }

        @Override
        protected Integer compareTo(@NotNull Visibility visibility) {
            if (this == visibility) return 0;
            if (visibility == Visibilities.PRIVATE) return 1;
            return -1;
        }
    };

97 98 99 100
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
101

102 103
    public static class TypeParameterDescriptorInitialization {
        @NotNull
104
        private final TypeParameterDescriptorOrigin origin;
105 106 107
        @NotNull
        final TypeParameterDescriptor descriptor;
        final PsiTypeParameter psiTypeParameter;
108 109 110 111
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
112

113
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
114
            this.origin = TypeParameterDescriptorOrigin.JAVA;
115
            this.descriptor = descriptor;
116
            this.psiTypeParameter = psiTypeParameter;
117 118 119 120
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

121
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter,
122 123 124
                List<JetType> upperBoundsForKotlin, List<JetType> lowerBoundsForKotlin) {
            this.origin = TypeParameterDescriptorOrigin.KOTLIN;
            this.descriptor = descriptor;
125
            this.psiTypeParameter = psiTypeParameter;
126 127
            this.upperBoundsForKotlin = upperBoundsForKotlin;
            this.lowerBoundsForKotlin = lowerBoundsForKotlin;
128 129
        }
    }
130 131


132
    private static abstract class ResolverScopeData {
133
        protected boolean kotlin;
134 135
        
        private Map<String, NamedMembers> namedMembersMap;
136 137 138
        
        @NotNull
        public abstract List<TypeParameterDescriptor> getTypeParameters();
139
    }
A
Andrey Breslav 已提交
140

141 142 143 144
    static abstract class ResolverClassData extends ResolverScopeData {

        @NotNull
        public abstract ClassDescriptor getClassDescriptor();
145 146 147 148 149 150

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

153
    /** Class with instance members */
154 155 156 157 158
    static class ResolverBinaryClassData extends ResolverClassData {

        ResolverBinaryClassData() {
        }

159
        private MutableClassDescriptorLite classDescriptor;
160

161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
        List<TypeParameterDescriptorInitialization> typeParameters;

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

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

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

        @Override
179 180 181 182 183 184
        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }
    }

185
    /** Either package or class with static members */
186
    private static class ResolverNamespaceData extends ResolverScopeData {
187
        private JavaNamespaceDescriptor namespaceDescriptor;
188 189 190 191 192

        @NotNull
        public NamespaceDescriptor getNamespaceDescriptor() {
            return namespaceDescriptor;
        }
193 194 195 196 197 198

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

S
Stepan Koltsov 已提交
201 202
    protected final Map<FqName, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
    protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
203 204
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

205 206
    protected Project project;
    protected JavaSemanticServices semanticServices;
207
    private NamespaceFactory namespaceFactory;
208
    private BindingTrace trace;
S
Stepan Koltsov 已提交
209
    private PsiClassFinder psiClassFinder;
210

211 212 213 214 215
    @Inject
    public void setProject(Project project) {
        this.project = project;
    }

216 217 218 219 220
    @Inject
    public void setNamespaceFactory(NamespaceFactoryImpl namespaceFactory) {
        this.namespaceFactory = namespaceFactory;
    }

221 222
    @Inject
    public void setSemanticServices(JavaSemanticServices semanticServices) {
223 224
        this.semanticServices = semanticServices;
    }
225

226 227 228 229 230
    @Inject
    public void setTrace(BindingTrace trace) {
        this.trace = trace;
    }

S
Stepan Koltsov 已提交
231 232 233 234
    @Inject
    public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
        this.psiClassFinder = psiClassFinder;
    }
235

236

237 238

    @Nullable
239
    public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
240

S
Stepan Koltsov 已提交
241
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
242 243 244
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
245 246 247 248 249 250

        ClassDescriptor builtinClassDescriptor = semanticServices.getKotlinBuiltinClassDescriptor(qualifiedName);
        if (builtinClassDescriptor != null) {
            return builtinClassDescriptor;
        }

251
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
252 253
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
254 255 256 257 258 259 260 261 262
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
            } else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
                return null;
            } else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
                return kotlinClassDescriptor;
            } else {
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
263 264
        }

265
        // Not let's take a descriptor of a Java class
266
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
267
        if (classData == null) {
S
Stepan Koltsov 已提交
268
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
269 270 271
            if (psiClass == null) {
                return null;
            }
272
            classData = createJavaClassDescriptor(psiClass);
273
        }
274
        return classData.getClassDescriptor();
275 276
    }

277
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
S
Stepan Koltsov 已提交
278
        if (classDescriptorCache.containsKey(new FqName(psiClass.getQualifiedName()))) {
279 280
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
281

282 283
        checkPsiClassIsNotJet(psiClass);

284
        String name = psiClass.getName();
285
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
S
Stepan Koltsov 已提交
286
        classDescriptorCache.put(new FqName(psiClass.getQualifiedName()), classData);
287
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
S
Stepan Koltsov 已提交
288
        ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
289
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
290
        classData.classDescriptor.setName(name);
291 292
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass));

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

S
Stepan Koltsov 已提交
295 296 297
        TypeVariableResolver outerTypeVariableByNameResolver = TypeVariableResolvers.classTypeVariableResolver(
                (ClassOrNamespaceDescriptor) classData.classDescriptor.getContainingDeclaration(),
                "class " + psiClass.getQualifiedName());
298 299

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

S
Stepan Koltsov 已提交
322
        initializeTypeParameters(classData.typeParameters, classData.classDescriptor, "class " + psiClass.getQualifiedName());
323

S
Stepan Koltsov 已提交
324 325 326
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
327

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

A
Andrey Breslav 已提交
331
        PsiMethod[] psiConstructors = psiClass.getConstructors();
332

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

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

                        PsiType returnType = annotationMethod.getReturnType();

                        // We take the following heuristical convention:
                        // if the last method of the @interface is an array, we convert it into a vararg
                        JetType varargElementType = null;
                        if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) {
370
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
371 372 373 374 375 376 377 378
                        }

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

385
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
386 387
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
388
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
389
            }
390 391
        }
        else {
392 393 394 395 396
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
397 398
                }

399
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
400
                        classData.classDescriptor,
A
Andrey Breslav 已提交
401
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
402
                        false);
S
Stepan Koltsov 已提交
403
                String context = "constructor of class " + psiClass.getQualifiedName();
404
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
405
                        constructor.getParameters(),
S
Stepan Koltsov 已提交
406
                        TypeVariableResolvers.classTypeVariableResolver(classData.classDescriptor, context));
407 408 409
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
410
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors,
411
                        resolveVisibilityFromPsiModifiers(psiConstructor), isStatic);
412
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
413
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
414
                trace.record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
415
            }
A
Andrey Breslav 已提交
416
        }
417

418 419 420 421
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
422

423
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
424

425
        return classData;
426 427
    }

428
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
429
        if (psiClass instanceof JetJavaMirrorMarker) {
430
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
431 432 433
        }
    }

434 435 436 437 438 439 440 441 442 443
    @Nullable
    private PsiClass getInnerClassClassObject(@NotNull PsiClass outer) {
        for (PsiClass inner : outer.getInnerClasses()) {
            if (inner.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                return inner;
            }
        }
        return null;
    }

444 445 446 447 448 449
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
450 451 452 453 454
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

455 456
        checkPsiClassIsNotJet(psiClass);

457 458 459 460
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
        classData.kotlin = true;
        classData.classDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);

S
Stepan Koltsov 已提交
461
        classDescriptorCache.put(new FqName(classObjectPsiClass.getQualifiedName()), classData);
462 463 464 465

        classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList<TypeParameterDescriptor>(0)));
        classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO
        classData.classDescriptor.setModality(Modality.FINAL);
466
        classData.classDescriptor.setVisibility(containing.getVisibility());
467 468
        classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classData.classDescriptor.createTypeConstructor();
469
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false));
470 471 472 473

        // TODO: wrong: class objects do not need visible constructors
        ConstructorDescriptorImpl constructor = new ConstructorDescriptorImpl(classData.classDescriptor, new ArrayList<AnnotationDescriptor>(0), true);
        constructor.setReturnType(classData.classDescriptor.getDefaultType());
474
        constructor.initialize(new ArrayList<TypeParameterDescriptor>(0), new ArrayList<ValueParameterDescriptor>(0), Visibilities.PUBLIC);
475 476 477

        classData.classDescriptor.addConstructor(constructor, null);
        return classData.classDescriptor;
478 479
    }

480
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData, TypeVariableResolver typeVariableResolver) {
481 482 483 484 485
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
486
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
487
        }
488

489
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
490 491
    }

492
    @NotNull
493
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
494 495 496 497 498
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
499 500 501
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
502

503
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
504 505

    private boolean isJavaLangObject(JetType type) {
506 507 508
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
509 510 511
    }


512
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
513 514

        @NotNull
515
        private final PsiTypeParameterListOwner psiOwner;
516
        @NotNull
517
        private final String name;
518
        @NotNull
519
        private final TypeVariableResolver typeVariableResolver;
520 521
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
522

523 524
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
525
        {
526 527 528
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
529

530 531
            this.psiOwner = psiOwner;
            this.name = name;
532
            this.typeVariableResolver = typeVariableResolver;
533
            this.typeParameterDescriptor = typeParameterDescriptor;
534 535 536 537
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
538
        
539 540
        @Override
        public JetSignatureVisitor visitClassBound() {
541
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
542 543
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
544 545 546
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
547 548 549 550 551 552 553
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
554
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
555 556 557 558 559 560 561 562 563
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
            TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter, upperBounds, lowerBounds);
            done(typeParameterDescriptorInitialization);
        }
        
        protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
    }

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

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


S
Stepan Koltsov 已提交
583
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
584 585 586
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
587 588 589 590
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
591 592 593 594 595 596 597 598 599
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
600 601 602
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
603
                    reified,
604 605
                    JetSignatureUtils.translateVariance(variance),
                    name,
606 607 608 609 610 611 612 613 614 615 616
                    formalTypeParameterIndex++);

            previousTypeParameters.add(typeParameter);

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

620
    /**
S
Stepan Koltsov 已提交
621
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor)
622
     */
S
Stepan Koltsov 已提交
623 624 625 626
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature,
            final PsiClass clazz, final ClassDescriptor classDescriptor) {
        String context = "class " + clazz.getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classDescriptor, clazz, context) {
627 628 629 630 631 632 633 634 635 636 637
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
638 639 640
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
641 642
    }

S
Stepan Koltsov 已提交
643
    private ClassOrNamespaceDescriptor resolveParentDescriptor(PsiClass psiClass) {
644 645
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
646
            return resolveClass(new FqName(containingClass.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
647
        }
648

649
        return resolveNamespace(new FqName(psiClass.getQualifiedName()).parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
650 651
    }

652 653
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
654
        for (PsiTypeParameter typeParameter : typeParameters) {
655
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
656
            result.add(typeParameterDescriptor);
657 658 659 660
        }
        return result;
    }

661
    @NotNull
662
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
663
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
664
                containingDeclaration,
A
Andrey Breslav 已提交
665
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
666
                false,
667
                Variance.INVARIANT,
668 669
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
670
        );
671
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
672 673
    }

674
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
675 676 677
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
678 679 680
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
681
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
682 683 684 685 686
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
687
        } else {
688
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
689 690 691 692
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
A
Andrey Breslav 已提交
693
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
694 695 696
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
A
Andrey Breslav 已提交
697
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
698
                }
A
Andrey Breslav 已提交
699 700
            }
        }
701
        typeParameterDescriptor.setInitialized();
702 703
    }

S
Stepan Koltsov 已提交
704
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
705
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
706
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
707
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
708 709
            initializeTypeParameter(psiTypeParameter,
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
710
        }
A
Andrey Breslav 已提交
711 712
    }

713
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
714 715
        final List<JetType> result = new ArrayList<JetType>();

S
Stepan Koltsov 已提交
716 717
        String context = "class " + psiClass.getQualifiedName();

718
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
719
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
720 721 722 723 724 725 726 727 728 729
            
            new JetSignatureReader(psiClass.getJetClass().signature()).accept(new JetSignatureExceptionsAdapter() {
                @Override
                public JetSignatureVisitor visitFormalTypeParameter(String name, TypeInfoVariance variance, boolean reified) {
                    // TODO: collect
                    return new JetSignatureAdapter();
                }

                @Override
                public JetSignatureVisitor visitSuperclass() {
730
                    return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
731 732 733 734 735 736 737 738 739 740 741
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
742
                    return visitSuperclass();
743 744 745
                }
            });
        } else {
S
Stepan Koltsov 已提交
746 747 748
            TypeVariableResolver typeVariableResolverForSupertypes = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), typeVariableResolverForSupertypes, classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), typeVariableResolverForSupertypes, classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
749
        }
750 751 752
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
753
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
754 755 756
            }
        }
        
757 758 759
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
760 761 762
        return result;
    }

763
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
764
        for (PsiClassType type : extendsListTypes) {
765
            PsiClass resolved = type.resolve();
S
Stepan Koltsov 已提交
766
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName().getFqName())) {
767 768
                continue;
            }
769 770 771
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
772
            
773
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
774 775 776 777 778

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

779
    @Nullable
780
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
781 782 783
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
784 785 786 787 788 789 790 791 792 793
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
            } else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
                return null;
            } else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
                // TODO: probably this is evil
                return kotlinNamespaceDescriptor;
            } else {
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
794 795
        }

S
Stepan Koltsov 已提交
796
        PsiPackage psiPackage = psiClassFinder.findPsiPackage(qualifiedName);
797
        if (psiPackage == null) {
S
Stepan Koltsov 已提交
798
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
799 800
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
801
        }
802
        return resolveNamespace(psiPackage);
803 804
    }

805 806 807 808 809 810
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(new FqName(psiPackage.getQualifiedName()), namespaceData);
811
        }
812
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
813 814
    }

815 816 817 818 819 820
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(new FqName(psiClass.getQualifiedName()), namespaceData);
S
Stepan Koltsov 已提交
821
        }
822 823
        return namespaceData.namespaceDescriptor;
    }
S
Stepan Koltsov 已提交
824

825 826 827 828 829 830 831 832 833 834 835
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        String name = psiPackage.getName();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
                (NamespaceDescriptorParent) resolveParentDescriptor(psiPackage),
                Collections.<AnnotationDescriptor>emptyList(), // TODO
                name == null ? JAVA_ROOT : name,
                name == null ? FqName.ROOT : new FqName(psiPackage.getQualifiedName()),
                true
        );
        trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, false);
S
Stepan Koltsov 已提交
836

837 838 839 840 841
        namespaceData.namespaceDescriptor.setMemberScope(createJavaPackageScope(new FqName(psiPackage.getQualifiedName()), namespaceData.namespaceDescriptor));
        trace.record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor);
        // TODO: hack
        namespaceData.kotlin = true;
        return namespaceData;
842 843
    }

844 845 846
    public JavaPackageScope createJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
        return new JavaPackageScope(fqName, ns, semanticServices);
    }
847

848 849 850 851 852
    @NotNull
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return FAKE_ROOT_MODULE;
S
Stepan Koltsov 已提交
853
        }
854 855
        return resolveNamespace(parentPackage);
    }
856

857 858 859 860 861
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
S
Stepan Koltsov 已提交
862

863
        checkPsiClassIsNotJet(psiClass);
S
Stepan Koltsov 已提交
864

865 866 867 868 869 870 871 872 873
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
                (NamespaceDescriptorParent) resolveParentDescriptor(psiClass),
                Collections.<AnnotationDescriptor>emptyList(), // TODO
                psiClass.getName(),
                new FqName(psiClass.getQualifiedName()),
                false
        );
        trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, true);
874

875 876 877
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        trace.record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
878
    }
879
    
880 881 882 883 884 885 886 887 888
    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;
        }
    }
889

890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922
    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
923
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
924 925 926 927 928 929 930
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

935 936
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
937 938
        }
        
939 940 941 942
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
943
        JetType outType;
944
        if (typeFromAnnotation.length() > 0) {
945
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
946
        } else {
947
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
948
        }
949 950 951

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
952
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
953 954 955 956
        } else {
            varargElementType = null;
        }

957 958 959
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
S
Stepan Koltsov 已提交
960 961 962 963

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
S
Stepan Koltsov 已提交
964
            } else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
965 966 967 968
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
            } else {
                transformedType = outType;
            }
969 970 971 972 973
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
974
                    false,
S
Stepan Koltsov 已提交
975
                    transformedType,
976
                    hasDefaultValue,
977 978 979
                    varargElementType
            ));
        }
980 981
    }

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

985 986 987
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
988
        }
989
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
990

S
Stepan Koltsov 已提交
991
        resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, fieldName, "class or namespace " + psiClass.getQualifiedName());
992

993 994 995 996 997 998 999
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
1000 1001 1002
    }
    
    @NotNull
1003
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) {
1004

1005 1006
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
        
1007
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1008 1009 1010 1011
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1012

S
Stepan Koltsov 已提交
1013
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName, "class or namespace " + psiClass.getQualifiedName());
1014
            descriptors.addAll(namedMembers.propertyDescriptors);
1015
        }
1016

1017
        return descriptors;
1018
    }
1019 1020 1021 1022 1023 1024 1025
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
1026
            return psiTypeToKey(typeSource.getPsiType());
1027 1028
        }
    }
1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041

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

1042 1043 1044 1045 1046
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1047

1048 1049 1050
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
S
Stepan Koltsov 已提交
1051 1052 1053
            boolean staticMembers, @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context
            ) {
1054 1055 1056 1057
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1058
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1059
            namedMembers.propertyAccessors = Collections.emptyList();
1060
        }
1061

S
Stepan Koltsov 已提交
1062
        TypeVariableResolver typeVariableResolver = TypeVariableResolvers.classTypeVariableResolver(owner, context);
1063

1064 1065 1066 1067
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1068
            boolean ext;
1069
        }
1070 1071
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1072

1073
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1074

1075 1076 1077 1078 1079
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1080
                value.ext = propertyAccessor.getReceiverType() != null;
1081 1082
                map.put(key, value);
            }
1083

1084 1085 1086 1087
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105
            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();
            }
1106
        }
1107

1108
        
S
Stepan Koltsov 已提交
1109
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1110

1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124
        int regularProperitesCount = 0;
        for (GroupingValue members : map.values()) {
            if (!members.ext) {
                ++regularProperitesCount;
            }
        }

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

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

1126
            boolean isFinal;
1127 1128 1129
            if (!scopeData.kotlin) {
                isFinal = true;
            } else if (members.setter == null && members.getter == null) {
1130 1131 1132 1133 1134 1135 1136 1137
                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;
            }
1138

1139 1140 1141 1142 1143 1144 1145 1146 1147 1148
            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();
            }
1149

1150 1151 1152 1153 1154 1155
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
            } else {
                isVar = members.setter != null;
            }
1156 1157 1158 1159 1160 1161 1162 1163 1164 1165

            Modality modality;
            if (isFinal) {
                modality = Modality.FINAL;
            }
            else {
                modality = anyMember.getMember().isAbstract() ? Modality.ABSTRACT : Modality.OPEN;
            }


1166 1167
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1168
                    resolveAnnotations(anyMember.getMember().psiMember),
1169
                    modality,
1170
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
1171 1172
                    isVar,
                    false,
1173 1174
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1175

1176 1177 1178
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1179
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1180 1181
            }
            if (members.setter != null) {
1182
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1183
            }
1184

1185
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1186

S
Stepan Koltsov 已提交
1187
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1188 1189 1190

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

1192
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1193
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1194 1195 1196 1197 1198 1199
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1200
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1201 1202 1203
                }
            }

S
Stepan Koltsov 已提交
1204
            TypeVariableResolver typeVariableResolverForPropertyInternals = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, propertyDescriptor, "property " + propertyName + " in " + context);
1205

1206 1207 1208 1209
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1210
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1211
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1212 1213
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1214 1215 1216 1217 1218 1219 1220 1221
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1222
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1223 1224 1225 1226 1227 1228 1229
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1230
            );
1231 1232 1233 1234
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1235
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1236 1237
            }

1238
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1239
            
S
Stepan Koltsov 已提交
1240
            propertiesFromCurrent.add(propertyDescriptor);
1241
        }
1242

S
Stepan Koltsov 已提交
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266

        Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName);

        final Set<VariableDescriptor> properties = Sets.newHashSet();

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

            OverrideResolver.generateOverridesInFunctionGroup(propertyName, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
                @Override
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    properties.add((PropertyDescriptor) fakeOverride);
                }

                @Override
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
                    // nop
                }
            });
        }

        properties.addAll(propertiesFromCurrent);

        namedMembers.propertyDescriptors = properties;
1267
    }
1268

1269
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1270 1271 1272
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1273 1274
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1275

1276
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1277
        for (PsiMethodWrapper method : namedMembers.methods) {
1278 1279
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    method);
1280
            if (function != null) {
1281
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1282 1283 1284 1285 1286 1287
            }
        }

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

1288
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1289

S
Stepan Koltsov 已提交
1290
            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1291
                @Override
S
Stepan Koltsov 已提交
1292 1293
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1294
                }
1295 1296

                @Override
S
Stepan Koltsov 已提交
1297
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1298 1299
                    // nop
                }
1300 1301 1302 1303 1304 1305 1306 1307 1308
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1309 1310
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1311 1312
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1313
                r.add((SimpleFunctionDescriptor) function);
1314
            }
1315
        }
1316
        return r;
1317 1318
    }

S
Stepan Koltsov 已提交
1319 1320 1321 1322 1323 1324 1325 1326 1327 1328
    private Set<PropertyDescriptor> getPropertiesFromSupertypes(ResolverScopeData scopeData, String propertyName) {
        Set<PropertyDescriptor> r = new HashSet<PropertyDescriptor>();
        for (JetType supertype : getSupertypes(scopeData)) {
            for (VariableDescriptor property : supertype.getMemberScope().getProperties(propertyName)) {
                r.add((PropertyDescriptor) property);
            }
        }
        return r;
    }

1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345
    private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) {
        // TODO: store scopeData in Java*Scope
        ResolverScopeData scopeData;
        boolean staticMembers;
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
            staticMembers = true;
        } else if (owner instanceof ClassDescriptor) {
            scopeData = classDescriptorCache.get(new FqName(psiClass.getQualifiedName()));
            staticMembers = false;
        } else {
            throw new IllegalStateException("unknown owner: " + owner.getClass().getName());
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1346
        if (scopeData.namedMembersMap == null) {
1347
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1348
        }
1349 1350
        
        return scopeData;
1351
    }
A
Andrey Breslav 已提交
1352

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

1356 1357 1358
        ResolverScopeData resolverScopeData = getResolverScopeData(descriptor, new PsiClassWrapper(psiClass));

        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;
1359 1360

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1361
        if (namedMembers != null && namedMembers.methods != null) {
1362 1363 1364
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);

            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);
1365 1366

            return namedMembers.functionDescriptors;
1367
        } else {
1368
            return Collections.emptySet();
1369
        }
1370 1371
    }

1372
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1373 1374 1375 1376 1377 1378 1379 1380 1381
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1382

1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406
    private ValueParameterDescriptors resolveParameterDescriptors(DeclarationDescriptor containingDeclaration,
            List<PsiParameterWrapper> parameters, TypeVariableResolver typeVariableResolver) {
        List<ValueParameterDescriptor> result = new ArrayList<ValueParameterDescriptor>();
        JetType receiverType = null;
        int indexDelta = 0;
        for (int i = 0, parametersLength = parameters.size(); i < parametersLength; i++) {
            PsiParameterWrapper parameter = parameters.get(i);
            JvmMethodParameterMeaning meaning = resolveParameterDescriptor(containingDeclaration, i + indexDelta, parameter, typeVariableResolver);
            if (meaning.kind == JvmMethodParameterKind.TYPE_INFO) {
                // TODO
                --indexDelta;
            } else if (meaning.kind == JvmMethodParameterKind.REGULAR) {
                result.add(meaning.valueParameterDescriptor);
            } else if (meaning.kind == JvmMethodParameterKind.RECEIVER) {
                if (receiverType != null) {
                    throw new IllegalStateException("more then one receiver");
                }
                --indexDelta;
                receiverType = meaning.receiverType;
            }
        }
        return new ValueParameterDescriptors(receiverType, result);
    }

A
Andrey Breslav 已提交
1407
    @Nullable
1408
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, final PsiMethodWrapper method) {
1409

1410
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1411 1412 1413
        if (returnType == null) {
            return null;
        }
1414
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
1415

1416
        boolean kotlin;
1417 1418 1419
        if (owner instanceof JavaNamespaceDescriptor) {
            JavaNamespaceDescriptor javaNamespaceDescriptor = (JavaNamespaceDescriptor) owner;
            ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(javaNamespaceDescriptor.getQualifiedName());
1420
            if (namespaceData == null) {
1421
                throw new IllegalStateException("namespaceData not found by name " + javaNamespaceDescriptor.getQualifiedName());
1422 1423 1424
            }
            kotlin = namespaceData.kotlin;
        } else {
S
Stepan Koltsov 已提交
1425
            ResolverBinaryClassData classData = classDescriptorCache.get(new FqName(psiClass.getQualifiedName()));
1426 1427 1428 1429 1430 1431
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1432
        // TODO: ugly
1433
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1434
            return null;
1435
        }
1436

S
Stepan Koltsov 已提交
1437 1438 1439 1440 1441 1442 1443 1444
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1445
        ClassOrNamespaceDescriptor classDescriptor;
1446
        if (scopeData instanceof ResolverBinaryClassData) {
1447 1448
            ClassDescriptor classClassDescriptor = resolveClass(new FqName(method.getPsiMethod().getContainingClass().getQualifiedName()),
                    DescriptorSearchRule.INCLUDE_KOTLIN);
1449
            classDescriptor = classClassDescriptor;
1450 1451
        }
        else {
1452
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1453
        }
1454 1455 1456
        if (classDescriptor == null) {
            return null;
        }
1457

1458
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1459
                owner,
1460
                resolveAnnotations(method.getPsiMethod()),
1461 1462
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1463
        );
1464

S
Stepan Koltsov 已提交
1465 1466 1467
        String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName();

        final TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(classDescriptor, context);
1468

1469
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1470

S
Stepan Koltsov 已提交
1471
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1472 1473


1474
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1475
        functionDescriptorImpl.initialize(
1476
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1477
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1478
                methodTypeParameters,
1479
                valueParameterDescriptors.descriptors,
1480
                makeReturnType(returnType, method, methodTypeVariableResolver),
1481
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
1482 1483
                resolveVisibilityFromPsiModifiers(method.getPsiMethod()),
                /*isInline = */ false
A
Andrey Breslav 已提交
1484
        );
1485
        trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1486
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1487 1488
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1489
        }
1490
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1491
    }
1492

1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation);
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

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

        String qname = psiAnnotation.getQualifiedName();
S
Stepan Koltsov 已提交
1510
        if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName())) {
1511 1512 1513 1514
            // TODO
            return null;
        }

1515
        ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
1516 1517 1518 1519
        if (clazz == null) {
            return null;
        }
        annotation.setAnnotationType(clazz.getDefaultType());
1520
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548

        PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();
        for (PsiNameValuePair psiNameValuePair : parameterList.getAttributes()) {
            PsiAnnotationMemberValue value = psiNameValuePair.getValue();
            // todo
            assert value instanceof PsiLiteralExpression;
            Object literalValue = ((PsiLiteralExpression) value).getValue();
            if(literalValue instanceof String)
                valueArguments.add(new StringValue((String) literalValue));
            else if(literalValue instanceof Byte)
                valueArguments.add(new ByteValue((Byte) literalValue));
            else if(literalValue instanceof Short)
                valueArguments.add(new ShortValue((Short) literalValue));
            else if(literalValue instanceof Character)
                valueArguments.add(new CharValue((Character) literalValue));
            else if(literalValue instanceof Integer)
                valueArguments.add(new IntValue((Integer) literalValue));
            else if(literalValue instanceof Long)
                valueArguments.add(new LongValue((Long) literalValue));
            else if(literalValue instanceof Float)
                valueArguments.add(new FloatValue((Float) literalValue));
            else if(literalValue instanceof Double)
                valueArguments.add(new DoubleValue((Double) literalValue));
            else if(literalValue == null)
                valueArguments.add(NullValue.NULL);
        }

        annotation.setValueArguments(valueArguments); // TODO
1549 1550 1551
        return annotation;
    }

1552 1553 1554
    public List<FunctionDescriptor> resolveMethods(@NotNull PsiClass psiClass, @NotNull ClassOrNamespaceDescriptor containingDeclaration) {
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1555
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1556

1557
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1558 1559 1560 1561

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

1566 1567
        return functions;
    }
1568

1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
        } else if (scope instanceof ResolverNamespaceData) {
            return Collections.emptyList();
        } else {
            throw new IllegalStateException();
        }
    }

    private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
        if (scopeData instanceof ResolverClassData) {
1581
            return createSubstitutorForGenericSupertypes(((ResolverClassData)scopeData).getClassDescriptor());
1582 1583 1584 1585 1586
        } else {
            return TypeSubstitutor.EMPTY;
        }
    }

1587
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1588
            @NotNull PsiMethodWrapper method,
1589
            @NotNull DeclarationDescriptor functionDescriptor,
1590 1591
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1592
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1593
        if (method.getJetMethod().typeParameters().length() > 0) {
1594
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1595
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
1596
        } else {
1597
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1598
        }
1599

S
Stepan Koltsov 已提交
1600 1601
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1602 1603 1604 1605 1606 1607 1608
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1609 1610
        return typeParameters;
    }
1611 1612

    /**
S
Stepan Koltsov 已提交
1613
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1614
     */
S
Stepan Koltsov 已提交
1615 1616
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1617
    {
S
Stepan Koltsov 已提交
1618 1619
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1620 1621
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1622 1623
    }

1624 1625
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1626 1627 1628

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

S
Stepan Koltsov 已提交
1629
        JetType transformedType;
1630
        if (returnTypeFromAnnotation.length() > 0) {
1631
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1632
        } else {
1633
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1634
        }
1635 1636
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1637
        } else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1638
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
1639 1640 1641 1642 1643
        } else {
            return transformedType;
        }
    }

1644
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1645
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
1646 1647 1648 1649
               (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
                (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibilities.PROTECTED :
                 //Visibilities.PUBLIC));
                 PACKAGE_VISIBILITY));
1650 1651
    }

1652
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1653 1654 1655 1656
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1657 1658 1659
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1660 1661 1662 1663
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1664 1665 1666
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1667
            r.add(resolveClass(new FqName(innerPsiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN));
1668 1669 1670
        }
        return r;
    }
1671
}