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

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

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

48
import javax.inject.Inject;
49
import java.util.*;
50 51 52 53 54

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

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

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

62 63
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
64
            throw new UnsupportedOperationException();
65 66
        }

67 68
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
69
            return visitor.visitDeclarationDescriptor(this, data);
70 71 72
        }
    };

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

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };
85 86 87 88 89
    
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
90

91 92
    public static class TypeParameterDescriptorInitialization {
        @NotNull
93
        private final TypeParameterDescriptorOrigin origin;
94 95 96
        @NotNull
        final TypeParameterDescriptor descriptor;
        final PsiTypeParameter psiTypeParameter;
97 98 99 100
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
101

102
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
103
            this.origin = TypeParameterDescriptorOrigin.JAVA;
104
            this.descriptor = descriptor;
105
            this.psiTypeParameter = psiTypeParameter;
106 107 108 109
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

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


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

130 131 132 133
    static abstract class ResolverClassData extends ResolverScopeData {

        @NotNull
        public abstract ClassDescriptor getClassDescriptor();
134 135 136 137 138 139

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

142
    /** Class with instance members */
143 144 145 146 147
    static class ResolverBinaryClassData extends ResolverClassData {

        ResolverBinaryClassData() {
        }

148
        private MutableClassDescriptorLite classDescriptor;
149

150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167
        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
168 169 170 171 172 173
        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }
    }

174
    /** Either package or class with static members */
175
    private static class ResolverNamespaceData extends ResolverScopeData {
176
        private JavaNamespaceDescriptor namespaceDescriptor;
177 178 179 180 181

        @NotNull
        public NamespaceDescriptor getNamespaceDescriptor() {
            return namespaceDescriptor;
        }
182 183 184 185 186 187

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

S
Stepan Koltsov 已提交
190 191
    protected final Map<FqName, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
    protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
192 193
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

194 195
    protected Project project;
    protected JavaSemanticServices semanticServices;
196
    private NamespaceFactory namespaceFactory;
197
    private BindingTrace trace;
S
Stepan Koltsov 已提交
198
    private PsiClassFinder psiClassFinder;
199

200 201 202 203 204
    @Inject
    public void setProject(Project project) {
        this.project = project;
    }

205 206 207 208 209
    @Inject
    public void setNamespaceFactory(NamespaceFactoryImpl namespaceFactory) {
        this.namespaceFactory = namespaceFactory;
    }

210 211
    @Inject
    public void setSemanticServices(JavaSemanticServices semanticServices) {
212 213
        this.semanticServices = semanticServices;
    }
214

215 216 217 218 219
    @Inject
    public void setTrace(BindingTrace trace) {
        this.trace = trace;
    }

S
Stepan Koltsov 已提交
220 221 222 223
    @Inject
    public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
        this.psiClassFinder = psiClassFinder;
    }
224

225
    @Nullable
226
    ResolverClassData resolveClassData(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
S
Stepan Koltsov 已提交
227
        FqName qualifiedName = new FqName(psiClass.getQualifiedName());
228

S
Stepan Koltsov 已提交
229
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
230 231 232
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
233

234 235 236 237 238
        ClassDescriptor builtinClassDescriptor = semanticServices.getKotlinBuiltinClassDescriptor(qualifiedName);
        if (builtinClassDescriptor != null) {
            return new ResolverSrcClassData(builtinClassDescriptor);
        }

239
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
240 241
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
242 243 244 245 246 247 248 249 250 251
            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 new ResolverSrcClassData(kotlinClassDescriptor);
            } else {
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
252 253
        }

254 255 256
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
            // must resolve containing class first, because inner class must have a reference to it
257
            resolveClass(containingClass, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
258 259
        }

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

    @Nullable
270 271
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
        ResolverClassData classData = resolveClassData(psiClass, searchRule);
272 273 274 275 276
        if (classData != null) {
            return classData.getClassDescriptor();
        } else {
            return null;
        }
277 278 279
    }

    @Nullable
280
    public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
281

S
Stepan Koltsov 已提交
282
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
283 284 285
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
286 287 288 289 290 291

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

292
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
293 294
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
295 296 297 298 299 300 301 302 303
            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);
            }
304 305
        }

306
        // Not let's take a descriptor of a Java class
307
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
308
        if (classData == null) {
S
Stepan Koltsov 已提交
309
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
310 311 312
            if (psiClass == null) {
                return null;
            }
313
            classData = createJavaClassDescriptor(psiClass);
314
        }
315
        return classData.getClassDescriptor();
316 317
    }

318
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
S
Stepan Koltsov 已提交
319
        if (classDescriptorCache.containsKey(new FqName(psiClass.getQualifiedName()))) {
320 321
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
322

323 324
        checkPsiClassIsNotJet(psiClass);

325
        String name = psiClass.getName();
326
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
S
Stepan Koltsov 已提交
327
        classDescriptorCache.put(new FqName(psiClass.getQualifiedName()), classData);
328
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
S
Stepan Koltsov 已提交
329
        ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
330
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
331
        classData.classDescriptor.setName(name);
332 333
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass));

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

S
Stepan Koltsov 已提交
336 337 338
        TypeVariableResolver outerTypeVariableByNameResolver = TypeVariableResolvers.classTypeVariableResolver(
                (ClassOrNamespaceDescriptor) classData.classDescriptor.getContainingDeclaration(),
                "class " + psiClass.getQualifiedName());
339 340

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
341 342 343 344 345 346
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
347 348 349
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
350 351 352 353 354 355 356 357 358 359
        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);
360
        classData.classDescriptor.createTypeConstructor();
361
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
362

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

S
Stepan Koltsov 已提交
365 366 367
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
368

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

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

374
        boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC);
375
        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
376 377 378 379
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
380
            if (!psiClass.isInterface()) {
381
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
382
                        classData.classDescriptor,
A
Andrey Breslav 已提交
383
                        Collections.<AnnotationDescriptor>emptyList(),
384
                        false);
385
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), classData.classDescriptor.getVisibility(), isStatic);
386
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
387
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
388
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
389
            }
390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
            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)) {
411
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
412 413 414 415 416 417 418 419
                        }

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
420
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
421 422 423 424 425
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

426
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
427 428
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
429
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
430
            }
431 432
        }
        else {
433 434 435 436 437
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
438 439
                }

440
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
441
                        classData.classDescriptor,
A
Andrey Breslav 已提交
442
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
443
                        false);
S
Stepan Koltsov 已提交
444
                String context = "constructor of class " + psiClass.getQualifiedName();
445
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
446
                        constructor.getParameters(),
S
Stepan Koltsov 已提交
447
                        TypeVariableResolvers.classTypeVariableResolver(classData.classDescriptor, context));
448 449 450
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
451
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors,
452
                        resolveVisibilityFromPsiModifiers(psiConstructor), isStatic);
453
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
454
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
455
                trace.record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
456
            }
A
Andrey Breslav 已提交
457
        }
458

459 460 461 462
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
463

464
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
465

466
        return classData;
467 468
    }

469
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
470
        if (psiClass instanceof JetJavaMirrorMarker) {
471
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
472 473 474
        }
    }

475 476 477 478 479 480 481 482 483 484
    @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;
    }

485 486 487 488 489 490
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
491 492 493 494 495
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

496 497
        checkPsiClassIsNotJet(psiClass);

498 499 500 501
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
        classData.kotlin = true;
        classData.classDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);

S
Stepan Koltsov 已提交
502
        classDescriptorCache.put(new FqName(classObjectPsiClass.getQualifiedName()), classData);
503 504 505 506 507 508

        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);
        classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classData.classDescriptor.createTypeConstructor();
509
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false));
510 511 512 513 514 515 516 517

        // 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());
        constructor.initialize(new ArrayList<TypeParameterDescriptor>(0), new ArrayList<ValueParameterDescriptor>(0), Visibility.PUBLIC);

        classData.classDescriptor.addConstructor(constructor, null);
        return classData.classDescriptor;
518 519
    }

520
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData, TypeVariableResolver typeVariableResolver) {
521 522 523 524 525
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
526
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
527
        }
528

529
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
530 531
    }

532
    @NotNull
533
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
534 535 536 537 538
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
539 540 541
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
542

543
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
544 545

    private boolean isJavaLangObject(JetType type) {
546 547 548
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
549 550 551
    }


552
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
553 554

        @NotNull
555
        private final PsiTypeParameterListOwner psiOwner;
556
        @NotNull
557
        private final String name;
558
        @NotNull
559
        private final TypeVariableResolver typeVariableResolver;
560 561
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
562

563 564
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
565
        {
566 567 568
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
569

570 571
            this.psiOwner = psiOwner;
            this.name = name;
572
            this.typeVariableResolver = typeVariableResolver;
573
            this.typeParameterDescriptor = typeParameterDescriptor;
574 575 576 577
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
578
        
579 580
        @Override
        public JetSignatureVisitor visitClassBound() {
581
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
582 583
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
584 585 586
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
587 588 589 590 591 592 593
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
594
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
595 596 597 598 599 600 601 602 603
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622
            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 已提交
623
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
624 625 626
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
627 628 629 630
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
631 632 633 634 635 636 637 638 639
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
640 641 642
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
643
                    reified,
644 645
                    JetSignatureUtils.translateVariance(variance),
                    name,
646 647 648 649 650 651 652 653 654 655 656
                    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);
                }
            };
657
        }
658 659
    }

660
    /**
S
Stepan Koltsov 已提交
661
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor)
662
     */
S
Stepan Koltsov 已提交
663 664 665 666
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature,
            final PsiClass clazz, final ClassDescriptor classDescriptor) {
        String context = "class " + clazz.getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classDescriptor, clazz, context) {
667 668 669 670 671 672 673 674 675 676 677
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
678 679 680
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
681 682
    }

S
Stepan Koltsov 已提交
683
    private ClassOrNamespaceDescriptor resolveParentDescriptor(PsiClass psiClass) {
684 685
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
686
            return resolveClass(containingClass, DescriptorSearchRule.INCLUDE_KOTLIN);
687
        }
688

689
        return resolveNamespace(new FqName(psiClass.getQualifiedName()).parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
690 691
    }

692 693
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
694
        for (PsiTypeParameter typeParameter : typeParameters) {
695
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
696
            result.add(typeParameterDescriptor);
697 698 699 700
        }
        return result;
    }

701
    @NotNull
702
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
703
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
704
                containingDeclaration,
A
Andrey Breslav 已提交
705
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
706
                false,
707
                Variance.INVARIANT,
708 709
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
710
        );
711
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
712 713
    }

714
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
715 716 717
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
718 719 720
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
721
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
722 723 724 725 726
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
727
        } else {
728
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
729 730 731 732
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
A
Andrey Breslav 已提交
733
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
734 735 736
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
A
Andrey Breslav 已提交
737
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
738
                }
A
Andrey Breslav 已提交
739 740
            }
        }
741
        typeParameterDescriptor.setInitialized();
742 743
    }

S
Stepan Koltsov 已提交
744
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
745
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
746
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
747
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
748 749
            initializeTypeParameter(psiTypeParameter,
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
750
        }
A
Andrey Breslav 已提交
751 752
    }

753
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
754 755
        final List<JetType> result = new ArrayList<JetType>();

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

758
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
759
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
760 761 762 763 764 765 766 767 768 769
            
            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() {
770
                    return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
771 772 773 774 775 776 777 778 779 780 781
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
782
                    return visitSuperclass();
783 784 785
                }
            });
        } else {
S
Stepan Koltsov 已提交
786 787 788
            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);
789
        }
790 791 792
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
793
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
794 795 796
            }
        }
        
797 798 799
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
800 801 802
        return result;
    }

803
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
804
        for (PsiClassType type : extendsListTypes) {
805 806 807 808
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
809 810 811
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
812
            
813
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
814 815 816 817 818

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

819
    @Nullable
820
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
821 822 823
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
824 825 826 827 828 829 830 831 832 833
            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);
            }
834 835
        }

S
Stepan Koltsov 已提交
836
        PsiPackage psiPackage = psiClassFinder.findPsiPackage(qualifiedName);
837
        if (psiPackage == null) {
S
Stepan Koltsov 已提交
838
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName);
839 840
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
841
        }
842
        return resolveNamespace(psiPackage);
843 844
    }

845 846 847 848 849 850
    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);
851
        }
852
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
853 854
    }

855 856 857 858 859 860
    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 已提交
861
        }
862 863
        return namespaceData.namespaceDescriptor;
    }
S
Stepan Koltsov 已提交
864

865 866 867 868 869 870 871 872 873 874 875
    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 已提交
876

877 878 879 880 881
        namespaceData.namespaceDescriptor.setMemberScope(createJavaPackageScope(new FqName(psiPackage.getQualifiedName()), namespaceData.namespaceDescriptor));
        trace.record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor);
        // TODO: hack
        namespaceData.kotlin = true;
        return namespaceData;
882 883
    }

884 885 886
    public JavaPackageScope createJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
        return new JavaPackageScope(fqName, ns, semanticServices);
    }
887

888 889 890 891 892
    @NotNull
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return FAKE_ROOT_MODULE;
S
Stepan Koltsov 已提交
893
        }
894 895
        return resolveNamespace(parentPackage);
    }
896

897 898 899 900 901
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
S
Stepan Koltsov 已提交
902

903
        checkPsiClassIsNotJet(psiClass);
S
Stepan Koltsov 已提交
904

905 906 907 908 909 910 911 912 913
        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);
914

915 916 917
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        trace.record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
918
    }
919
    
920 921 922 923 924 925 926 927 928
    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;
        }
    }
929

930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962
    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
963
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
964 965 966 967 968 969 970
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

975 976
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
977 978
        }
        
979 980 981 982
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
983
        JetType outType;
984
        if (typeFromAnnotation.length() > 0) {
985
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
986
        } else {
987
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
988
        }
989 990 991

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
992
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
993 994 995 996
        } else {
            varargElementType = null;
        }

997 998 999
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
S
Stepan Koltsov 已提交
1000 1001 1002 1003 1004 1005 1006 1007 1008

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
            } else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
            } else {
                transformedType = outType;
            }
1009 1010 1011 1012 1013
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
1014
                    false,
S
Stepan Koltsov 已提交
1015
                    transformedType,
1016
                    hasDefaultValue,
1017 1018 1019
                    varargElementType
            ));
        }
1020 1021
    }

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

1025 1026 1027
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1028
        }
1029
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
1030

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

1033 1034 1035 1036 1037 1038 1039
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
1040 1041 1042
    }
    
    @NotNull
1043
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) {
1044

1045 1046
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
        
1047
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1048 1049 1050 1051
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1052

S
Stepan Koltsov 已提交
1053
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName, "class or namespace " + psiClass.getQualifiedName());
1054
            descriptors.addAll(namedMembers.propertyDescriptors);
1055
        }
1056

1057
        return descriptors;
1058
    }
1059 1060 1061 1062 1063 1064 1065
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
1066
            return psiTypeToKey(typeSource.getPsiType());
1067 1068
        }
    }
1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081

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

1082 1083 1084 1085 1086
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1087

1088 1089 1090
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
S
Stepan Koltsov 已提交
1091 1092 1093
            boolean staticMembers, @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context
            ) {
1094 1095 1096 1097
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1098
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1099
            namedMembers.propertyAccessors = Collections.emptyList();
1100
        }
1101

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

1104 1105 1106 1107
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1108
            boolean ext;
1109
        }
1110 1111
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1112

1113
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1114

1115 1116 1117 1118 1119
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1120
                value.ext = propertyAccessor.getReceiverType() != null;
1121 1122
                map.put(key, value);
            }
1123

1124 1125 1126 1127
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145
            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();
            }
1146
        }
1147

1148
        
S
Stepan Koltsov 已提交
1149
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1150

1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164
        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;
            }
1165

1166
            boolean isFinal;
1167 1168 1169
            if (!scopeData.kotlin) {
                isFinal = true;
            } else if (members.setter == null && members.getter == null) {
1170 1171 1172 1173 1174 1175 1176 1177
                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;
            }
1178

1179 1180 1181 1182 1183 1184 1185 1186 1187 1188
            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();
            }
1189

1190 1191 1192 1193 1194 1195
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
            } else {
                isVar = members.setter != null;
            }
1196 1197 1198 1199 1200 1201 1202 1203 1204 1205

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


1206 1207
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1208
                    resolveAnnotations(anyMember.getMember().psiMember),
1209
                    modality,
1210 1211 1212
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
                    isVar,
                    false,
1213 1214
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1215

1216 1217 1218
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
A
Alex Tkachman 已提交
1219
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1220 1221
            }
            if (members.setter != null) {
A
Alex Tkachman 已提交
1222
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1223
            }
1224

1225
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1226

S
Stepan Koltsov 已提交
1227
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1228 1229 1230

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

1232
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1233
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1234 1235 1236 1237 1238 1239
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1240
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1241 1242 1243
                }
            }

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

1246 1247 1248 1249
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1250
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1251 1252 1253
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1254 1255 1256 1257 1258 1259 1260 1261
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1262
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1263 1264 1265 1266 1267 1268 1269
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1270
            );
1271 1272 1273 1274
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1275
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1276 1277
            }

1278
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1279
            
S
Stepan Koltsov 已提交
1280
            propertiesFromCurrent.add(propertyDescriptor);
1281
        }
1282

S
Stepan Koltsov 已提交
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306

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

1309
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1310 1311 1312
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1313 1314
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1315

1316
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1317
        for (PsiMethodWrapper method : namedMembers.methods) {
1318 1319
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    method);
1320
            if (function != null) {
1321
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1322 1323 1324 1325 1326 1327
            }
        }

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

1328
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1329

S
Stepan Koltsov 已提交
1330
            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1331
                @Override
S
Stepan Koltsov 已提交
1332 1333
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1334
                }
1335 1336

                @Override
S
Stepan Koltsov 已提交
1337
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1338 1339
                    // nop
                }
1340 1341 1342 1343 1344 1345 1346 1347 1348
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1349 1350
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1351 1352
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1353
                r.add((SimpleFunctionDescriptor) function);
1354
            }
1355
        }
1356
        return r;
1357 1358
    }

S
Stepan Koltsov 已提交
1359 1360 1361 1362 1363 1364 1365 1366 1367 1368
    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;
    }

1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385
    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();
        }
        
1386
        if (scopeData.namedMembersMap == null) {
1387
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1388
        }
1389 1390
        
        return scopeData;
1391
    }
A
Andrey Breslav 已提交
1392

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

1396 1397 1398
        ResolverScopeData resolverScopeData = getResolverScopeData(descriptor, new PsiClassWrapper(psiClass));

        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;
1399 1400

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1401
        if (namedMembers != null && namedMembers.methods != null) {
1402 1403 1404
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);

            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);
1405 1406

            return namedMembers.functionDescriptors;
1407
        } else {
1408
            return Collections.emptySet();
1409
        }
1410 1411
    }

1412
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1413 1414 1415 1416 1417 1418 1419 1420 1421
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1422

1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446
    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 已提交
1447
    @Nullable
1448
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, final PsiMethodWrapper method) {
1449

1450
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1451 1452 1453
        if (returnType == null) {
            return null;
        }
1454
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
1455

1456
        boolean kotlin;
1457 1458 1459
        if (owner instanceof JavaNamespaceDescriptor) {
            JavaNamespaceDescriptor javaNamespaceDescriptor = (JavaNamespaceDescriptor) owner;
            ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(javaNamespaceDescriptor.getQualifiedName());
1460
            if (namespaceData == null) {
1461
                throw new IllegalStateException("namespaceData not found by name " + javaNamespaceDescriptor.getQualifiedName());
1462 1463 1464
            }
            kotlin = namespaceData.kotlin;
        } else {
S
Stepan Koltsov 已提交
1465
            ResolverBinaryClassData classData = classDescriptorCache.get(new FqName(psiClass.getQualifiedName()));
1466 1467 1468 1469 1470 1471
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1472
        // TODO: ugly
1473
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1474
            return null;
1475
        }
1476

S
Stepan Koltsov 已提交
1477 1478 1479 1480 1481 1482 1483 1484
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1485
        ClassOrNamespaceDescriptor classDescriptor;
1486
        if (scopeData instanceof ResolverBinaryClassData) {
1487
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass(), DescriptorSearchRule.INCLUDE_KOTLIN);
1488
            classDescriptor = classClassDescriptor;
1489 1490
        }
        else {
1491
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1492
        }
1493 1494 1495
        if (classDescriptor == null) {
            return null;
        }
1496

1497
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1498
                owner,
1499
                resolveAnnotations(method.getPsiMethod()),
1500 1501
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1502
        );
1503

S
Stepan Koltsov 已提交
1504 1505 1506
        String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName();

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

1508
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1509

S
Stepan Koltsov 已提交
1510
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1511 1512


1513
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1514
        functionDescriptorImpl.initialize(
1515
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1516
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1517
                methodTypeParameters,
1518
                valueParameterDescriptors.descriptors,
1519
                makeReturnType(returnType, method, methodTypeVariableResolver),
1520 1521
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1522
        );
1523
        trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1524
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1525 1526
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1527
        }
1528
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1529
    }
1530

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation);
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

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

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

1553
        ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
1554 1555 1556 1557
        if (clazz == null) {
            return null;
        }
        annotation.setAnnotationType(clazz.getDefaultType());
1558
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586

        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
1587 1588 1589
        return annotation;
    }

1590 1591 1592
    public List<FunctionDescriptor> resolveMethods(@NotNull PsiClass psiClass, @NotNull ClassOrNamespaceDescriptor containingDeclaration) {
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1593
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1594

1595
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1596 1597 1598 1599

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

1604 1605
        return functions;
    }
1606

1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
        } else if (scope instanceof ResolverNamespaceData) {
            return Collections.emptyList();
        } else {
            throw new IllegalStateException();
        }
    }

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

1625
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1626
            @NotNull PsiMethodWrapper method,
1627
            @NotNull DeclarationDescriptor functionDescriptor,
1628 1629
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1630
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1631
        if (method.getJetMethod().typeParameters().length() > 0) {
1632
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1633
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
1634
        } else {
1635
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1636
        }
1637

S
Stepan Koltsov 已提交
1638 1639
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1640 1641 1642 1643 1644 1645 1646
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1647 1648
        return typeParameters;
    }
1649 1650

    /**
S
Stepan Koltsov 已提交
1651
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1652
     */
S
Stepan Koltsov 已提交
1653 1654
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1655
    {
S
Stepan Koltsov 已提交
1656 1657
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1658 1659
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1660 1661
    }

1662 1663
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1664 1665 1666

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

S
Stepan Koltsov 已提交
1667
        JetType transformedType;
1668
        if (returnTypeFromAnnotation.length() > 0) {
1669
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1670
        } else {
1671
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1672
        }
1673 1674
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1675 1676
        } else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
1677 1678 1679 1680 1681
        } else {
            return transformedType;
        }
    }

1682
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1683 1684 1685 1686 1687 1688
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1689
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1690 1691 1692 1693
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1694 1695 1696
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1697 1698 1699 1700
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1701 1702 1703
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1704
            r.add(resolveClass(innerPsiClass, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN));
1705 1706 1707
        }
        return r;
    }
1708
}