JavaDescriptorResolver.java 77.0 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.*;
S
Stepan Koltsov 已提交
37
import org.jetbrains.jet.lang.resolve.constants.StringValue;
M
Maxim Shafirov 已提交
38
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
39
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
40
import org.jetbrains.jet.lang.types.*;
S
Stepan Koltsov 已提交
41
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
42
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
43
import org.jetbrains.jet.plugin.JetFileType;
44
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
45 46 47
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
48

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

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

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

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

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

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

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

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

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

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

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


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

131 132 133 134
    static abstract class ResolverClassData extends ResolverScopeData {

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

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

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

        ResolverBinaryClassData() {
        }

149
        private MutableClassDescriptorLite classDescriptor;
150

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

175
    /** Either package or class with static members */
176
    private static class ResolverNamespaceData extends ResolverScopeData {
S
Stepan Koltsov 已提交
177 178
        private NamespaceDescriptor namespaceDescriptor;
        private JavaClassOrPackageScope scope;
179 180 181 182 183

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

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

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

196 197 198 199 200
    protected JavaPsiFacade javaFacade;
    protected Project project;
    protected GlobalSearchScope javaSearchScope ;
    protected JavaSemanticServices semanticServices;
    private AltClassFinder altClassFinder;
201
    private NamespaceFactory namespaceFactory;
202
    private BindingTrace trace;
203

204 205 206 207
    @Inject
    public void setProject(Project project) {
        this.project = project;
        this.altClassFinder = new AltClassFinder(project);
208 209 210 211 212 213
        this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
            @Override
            public boolean contains(VirtualFile file) {
                return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
            }
        };
214 215 216
        this.javaFacade = JavaPsiFacade.getInstance(project);
    }

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

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

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

232 233


234
    @Nullable
235
    ResolverClassData resolveClassData(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
S
Stepan Koltsov 已提交
236
        FqName qualifiedName = new FqName(psiClass.getQualifiedName());
237

S
Stepan Koltsov 已提交
238
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
239 240 241
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
242

243 244 245 246 247
        ClassDescriptor builtinClassDescriptor = semanticServices.getKotlinBuiltinClassDescriptor(qualifiedName);
        if (builtinClassDescriptor != null) {
            return new ResolverSrcClassData(builtinClassDescriptor);
        }

248
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
249 250
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
251 252 253 254 255 256 257 258 259 260
            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);
            }
261 262
        }

263 264 265
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
            // must resolve containing class first, because inner class must have a reference to it
266
            resolveClass(containingClass, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
267 268
        }

269
        // Not let's take a descriptor of a Java class
270
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
271 272 273
        if (classData == null) {
            classData = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classData);
274
        }
275 276 277 278
        return classData;
    }

    @Nullable
279 280
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass, @NotNull DescriptorSearchRule searchRule) {
        ResolverClassData classData = resolveClassData(psiClass, searchRule);
281 282 283 284 285
        if (classData != null) {
            return classData.getClassDescriptor();
        } else {
            return null;
        }
286 287 288
    }

    @Nullable
289
    public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
290

S
Stepan Koltsov 已提交
291
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
292 293 294
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
295 296 297 298 299 300

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

301
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
302 303
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
304 305 306 307 308 309 310 311 312
            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);
            }
313 314
        }

315
        // Not let's take a descriptor of a Java class
316
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
317
        if (classData == null) {
318
            PsiClass psiClass = findClass(qualifiedName);
319 320 321
            if (psiClass == null) {
                return null;
            }
322
            classData = createJavaClassDescriptor(psiClass);
323
        }
324
        return classData.getClassDescriptor();
325 326
    }

327
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
S
Stepan Koltsov 已提交
328
        if (classDescriptorCache.containsKey(new FqName(psiClass.getQualifiedName()))) {
329 330
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
331

332 333
        checkPsiClassIsNotJet(psiClass);

334
        String name = psiClass.getName();
335
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
S
Stepan Koltsov 已提交
336
        classDescriptorCache.put(new FqName(psiClass.getQualifiedName()), classData);
337
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
S
Stepan Koltsov 已提交
338
        ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
339
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
340
        classData.classDescriptor.setName(name);
341 342
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass));

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

S
Stepan Koltsov 已提交
345 346 347
        TypeVariableResolver outerTypeVariableByNameResolver = TypeVariableResolvers.classTypeVariableResolver(
                (ClassOrNamespaceDescriptor) classData.classDescriptor.getContainingDeclaration(),
                "class " + psiClass.getQualifiedName());
348 349

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
350 351 352 353 354 355
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
356 357 358
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
359 360 361 362 363 364 365 366 367 368
        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);
369
        classData.classDescriptor.createTypeConstructor();
S
Stepan Koltsov 已提交
370
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false, classData));
371

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

S
Stepan Koltsov 已提交
374 375 376
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
377

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

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

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

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
429
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
430 431 432 433 434
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

435
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
436 437
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
438
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
439
            }
440 441
        }
        else {
442 443 444 445 446
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
447 448
                }

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

468 469 470 471
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
472

473
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
474

475
        return classData;
476 477
    }

478
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
479
        if (psiClass instanceof JetJavaMirrorMarker) {
480
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
481 482 483
        }
    }

484 485 486 487 488 489 490 491 492 493
    @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;
    }

494 495 496 497 498 499
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
500 501 502 503 504
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

505 506
        checkPsiClassIsNotJet(psiClass);

507 508 509 510
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
        classData.kotlin = true;
        classData.classDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);

S
Stepan Koltsov 已提交
511
        classDescriptorCache.put(new FqName(classObjectPsiClass.getQualifiedName()), classData);
512 513 514 515 516 517

        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();
S
Stepan Koltsov 已提交
518
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false, classData));
519 520 521 522 523 524 525 526

        // 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;
527 528
    }

529
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData, TypeVariableResolver typeVariableResolver) {
530 531 532 533 534
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
535
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
536
        }
537

538
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
539 540
    }

541
    @NotNull
542
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
543 544 545 546 547
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
548 549 550
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
551

552
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
553 554

    private boolean isJavaLangObject(JetType type) {
555 556 557
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
558 559 560
    }


561
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
562 563

        @NotNull
564
        private final PsiTypeParameterListOwner psiOwner;
565
        @NotNull
566
        private final String name;
567
        @NotNull
568
        private final TypeVariableResolver typeVariableResolver;
569 570
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
571

572 573
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
574
        {
575 576 577
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
578

579 580
            this.psiOwner = psiOwner;
            this.name = name;
581
            this.typeVariableResolver = typeVariableResolver;
582
            this.typeParameterDescriptor = typeParameterDescriptor;
583 584 585 586
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
587
        
588 589
        @Override
        public JetSignatureVisitor visitClassBound() {
590
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
591 592
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
593 594 595
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
596 597 598 599 600 601 602
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
603
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
604 605 606 607 608 609 610 611 612
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631
            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 已提交
632
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
633 634 635
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
636 637 638 639
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
640 641 642 643 644 645 646 647 648
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
649 650 651
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
652
                    reified,
653 654
                    JetSignatureUtils.translateVariance(variance),
                    name,
655 656 657 658 659 660 661 662 663 664 665
                    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);
                }
            };
666
        }
667 668
    }

669
    /**
S
Stepan Koltsov 已提交
670
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor)
671
     */
S
Stepan Koltsov 已提交
672 673 674 675
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature,
            final PsiClass clazz, final ClassDescriptor classDescriptor) {
        String context = "class " + clazz.getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classDescriptor, clazz, context) {
676 677 678 679 680 681 682 683 684 685 686
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
687 688 689
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
690 691
    }

S
Stepan Koltsov 已提交
692
    private ClassOrNamespaceDescriptor resolveParentDescriptor(PsiClass psiClass) {
693 694
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
695
            return resolveClass(containingClass, DescriptorSearchRule.INCLUDE_KOTLIN);
696
        }
697

698
        return resolveNamespace(new FqName(psiClass.getQualifiedName()).parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
699 700
    }

701 702
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
703
        for (PsiTypeParameter typeParameter : typeParameters) {
704
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
705
            result.add(typeParameterDescriptor);
706 707 708 709
        }
        return result;
    }

710
    @NotNull
711
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
712
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
713
                containingDeclaration,
A
Andrey Breslav 已提交
714
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
715
                false,
716
                Variance.INVARIANT,
717 718
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
719
        );
720
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
721 722
    }

723
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
724 725 726
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
727 728 729
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
730
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
731 732 733 734 735
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
736
        } else {
737
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
738 739 740 741
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
742
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
743 744 745
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
746
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
747
                }
A
Andrey Breslav 已提交
748 749
            }
        }
750
        typeParameterDescriptor.setInitialized();
751 752
    }

S
Stepan Koltsov 已提交
753
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
754
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
755
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
756
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
757
            initializeTypeParameter(psiTypeParameter, TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
758
        }
A
Andrey Breslav 已提交
759 760
    }

761
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
762 763
        final List<JetType> result = new ArrayList<JetType>();

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

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

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
790
                    return visitSuperclass();
791 792 793
                }
            });
        } else {
S
Stepan Koltsov 已提交
794 795 796
            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);
797
        }
798 799 800
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
801
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
802 803 804
            }
        }
        
805 806 807
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
808 809 810
        return result;
    }

811
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
812
        for (PsiClassType type : extendsListTypes) {
813 814 815 816
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
817 818 819
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
820
            
821
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
822 823 824 825 826

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

827
    @Nullable
828
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
829 830 831
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
832 833 834 835 836 837 838 839 840 841
            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);
            }
842 843
        }

S
Stepan Koltsov 已提交
844 845 846
        PsiClassOrPsiPackage psiElement = findPsiElementForNamespace(qualifiedName);
        if (psiElement == null) {
            return null;
847
        }
S
Stepan Koltsov 已提交
848 849

        return resolveNamespace(psiElement);
850 851
    }

852
    @Nullable
S
Stepan Koltsov 已提交
853 854
    public PsiClass findClass(@NotNull FqName qualifiedName) {
        PsiClass original = javaFacade.findClass(qualifiedName.getFqName(), javaSearchScope);
M
Maxim Shafirov 已提交
855
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
856
        PsiClass result = original;
857 858 859 860 861
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

862 863 864 865
            result = altClass;
        }

        if (result != null) {
S
Stepan Koltsov 已提交
866
            FqName actualQualifiedName = new FqName(result.getQualifiedName());
867
            if (!actualQualifiedName.equals(qualifiedName)) {
868
//                throw new IllegalStateException("requested " + qualifiedName + ", got " + actualQualifiedName);
869
            }
870
        }
871 872

        return result;
873 874
    }

S
Stepan Koltsov 已提交
875 876
    /*package*/ PsiPackage findPackage(@NotNull FqName qualifiedName) {
        return javaFacade.findPackage(qualifiedName.getFqName());
877 878
    }

S
Stepan Koltsov 已提交
879 880 881 882 883
    @Nullable
    private PsiClassOrPsiPackage findPsiElementForNamespace(@NotNull FqName fqName) {
        PsiPackage psiPackage = findPackage(fqName);
        if (psiPackage != null) {
            return new PsiClassOrPsiPackage(psiPackage);
884
        }
S
Stepan Koltsov 已提交
885 886 887 888 889
        PsiClass psiClass = findClass(fqName);
        if (psiClass != null) {
            return new PsiClassOrPsiPackage(psiClass);
        }
        return null;
890 891
    }

S
Stepan Koltsov 已提交
892 893 894
    @NotNull
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClassOrPsiPackage psi) {
        return namespaceFactory.createNamespaceDescriptorPathIfNeeded(psi.getFqName(), psi.getPsiElement());
A
Andrey Breslav 已提交
895 896
    }

S
Stepan Koltsov 已提交
897 898 899 900 901
    private static class PsiClassOrPsiPackage {
        @NotNull
        private final PsiElement psiElement;
        @NotNull
        private final FqName fqName;
902

S
Stepan Koltsov 已提交
903 904 905 906
        private PsiClassOrPsiPackage(@NotNull PsiClass psiElement) {
            this.psiElement = psiElement;
            this.fqName = new FqName(psiElement.getQualifiedName());
        }
907

S
Stepan Koltsov 已提交
908 909 910 911
        private PsiClassOrPsiPackage(@NotNull PsiPackage psiElement) {
            this.psiElement = psiElement;
            this.fqName = new FqName(psiElement.getQualifiedName());
        }
S
Stepan Koltsov 已提交
912

S
Stepan Koltsov 已提交
913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938
        public boolean isClass() {
            return psiElement instanceof PsiClass;
        }

        public boolean isPackage() {
            return psiElement instanceof PsiPackage;
        }

        @NotNull
        public PsiClass getPsiClass() {
            return (PsiClass)psiElement;
        }

        @NotNull
        public PsiPackage getPsiPackage() {
            return (PsiPackage)psiElement;
        }

        @NotNull
        public PsiElement getPsiElement() {
            return psiElement;
        }

        @NotNull
        public FqName getFqName() {
            return fqName;
939 940 941
        }
    }

S
Stepan Koltsov 已提交
942 943 944 945 946 947
    @Nullable
    public JavaClassOrPackageScope resolveJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor namespace) {
        PsiClassOrPsiPackage psi = findPsiElementForNamespace(fqName);
        if (psi == null) {
            return null;
        }
948

S
Stepan Koltsov 已提交
949 950 951 952
        ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(fqName);
        if (namespaceData != null) {
            throw new IllegalStateException("cache must be empty for ns " + fqName);
        }
953

S
Stepan Koltsov 已提交
954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970
        namespaceData = new ResolverNamespaceData();
        namespaceDescriptorCache.put(psi.getPsiElement(), namespaceData);
        namespaceDescriptorCacheByFqn.put(fqName, namespaceData);

        if (psi.isClass()) {
            checkPsiClassIsNotJet(psi.getPsiClass());
        }

        namespaceData.namespaceDescriptor = namespace;
        namespaceData.kotlin = psi.isPackage();
        trace.record(JavaBindingContext.NAMESPACE_IS_CLASS_STATICS, namespaceData.namespaceDescriptor, psi.isClass());

        if (psi.isClass()) {
            namespaceData.scope = new JavaClassMembersScope(namespace, psi.getPsiClass(), semanticServices, true, namespaceData);
        } else {
            namespaceData.scope = new JavaPackageScope(fqName, namespace, semanticServices, namespaceData);
        }
971

S
Stepan Koltsov 已提交
972
        return namespaceData.scope;
973
    }
S
Stepan Koltsov 已提交
974

975 976 977 978 979 980 981 982 983
    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;
        }
    }
984

985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017
    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
1018
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
1019 1020 1021 1022 1023 1024 1025
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

1030 1031
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
1032 1033
        }
        
1034 1035 1036 1037
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
1038
        JetType outType;
1039
        if (typeFromAnnotation.length() > 0) {
1040
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1041
        } else {
1042
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
1043
        }
1044 1045 1046

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
1047
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
1048 1049 1050 1051
        } else {
            varargElementType = null;
        }

1052 1053 1054
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
S
Stepan Koltsov 已提交
1055 1056 1057 1058 1059 1060 1061 1062 1063

            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;
            }
1064 1065 1066 1067 1068
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
1069
                    false,
S
Stepan Koltsov 已提交
1070
                    transformedType,
1071
                    hasDefaultValue,
1072 1073 1074
                    varargElementType
            ));
        }
1075 1076
    }

S
Stepan Koltsov 已提交
1077 1078 1079 1080 1081 1082
    public Set<VariableDescriptor> resolveFieldGroupByName(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull PsiClass psiClass,
            String fieldName,
            boolean staticMembers,
            @NotNull ResolverScopeData scopeData) {
1083

1084 1085 1086
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1087
        }
1088
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
1089

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

1092 1093 1094 1095 1096 1097 1098
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
1099 1100 1101
    }
    
    @NotNull
S
Stepan Koltsov 已提交
1102 1103 1104 1105 1106
    public Set<VariableDescriptor> resolveFieldGroup(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull PsiClass psiClass,
            boolean staticMembers,
            @NotNull ResolverScopeData scopeData) {
1107

1108
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1109 1110 1111
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
1112
            if (namedMembers.propertyAccessors == null) {
1113 1114 1115 1116
                continue;
            }
            
            String propertyName = entry.getKey();
1117

S
Stepan Koltsov 已提交
1118
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName, "class or namespace " + psiClass.getQualifiedName());
1119
            descriptors.addAll(namedMembers.propertyDescriptors);
1120
        }
1121 1122 1123 1124 1125 1126 1127 1128 1129 1130

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
1131
        return descriptors;
1132
    }
1133 1134 1135 1136 1137 1138 1139
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
1140
            return psiTypeToKey(typeSource.getPsiType());
1141 1142
        }
    }
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155

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

1156 1157 1158 1159 1160
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1161

1162 1163 1164
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
S
Stepan Koltsov 已提交
1165 1166 1167
            boolean staticMembers, @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context
            ) {
1168 1169 1170 1171
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1172
        if (namedMembers.propertyAccessors == null) {
1173 1174 1175
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
1176

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

1179 1180 1181 1182
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1183
            boolean ext;
1184
        }
1185 1186
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1187

1188
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1189

1190 1191 1192 1193 1194
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1195
                value.ext = propertyAccessor.getReceiverType() != null;
1196 1197
                map.put(key, value);
            }
1198

1199 1200 1201 1202
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220
            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();
            }
1221
        }
1222

1223
        
1224 1225
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>(1);

1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239
        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;
            }
1240

1241
            boolean isFinal;
1242 1243 1244
            if (!scopeData.kotlin) {
                isFinal = true;
            } else if (members.setter == null && members.getter == null) {
1245 1246 1247 1248 1249 1250 1251 1252
                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;
            }
1253

1254 1255 1256 1257 1258 1259 1260 1261 1262 1263
            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();
            }
1264

1265 1266 1267 1268 1269 1270
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
            } else {
                isVar = members.setter != null;
            }
1271 1272 1273 1274 1275 1276 1277 1278 1279 1280

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


1281 1282
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1283
                    resolveAnnotations(anyMember.getMember().psiMember),
1284
                    modality,
1285 1286 1287
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
                    isVar,
                    false,
1288 1289
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1290

1291 1292 1293
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
A
Alex Tkachman 已提交
1294
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1295 1296
            }
            if (members.setter != null) {
A
Alex Tkachman 已提交
1297
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1298
            }
1299

1300
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1301

S
Stepan Koltsov 已提交
1302
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1303 1304 1305

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

1307
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1308
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1309 1310 1311 1312 1313 1314
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1315
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1316 1317 1318
                }
            }

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

1321 1322 1323 1324
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1325
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1326 1327 1328
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1329 1330 1331 1332 1333 1334 1335 1336
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1337
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1338 1339 1340 1341 1342 1343 1344
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1345
            );
1346 1347 1348 1349
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1350
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1351 1352
            }

1353
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1354 1355
            
            r.add(propertyDescriptor);
1356
        }
1357

1358
        namedMembers.propertyDescriptors = r;
1359
    }
1360

S
Stepan Koltsov 已提交
1361
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1362 1363 1364
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1365 1366
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1367

1368
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1369
        for (PsiMethodWrapper method : namedMembers.methods) {
S
Stepan Koltsov 已提交
1370
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass, method, scopeData);
1371
            if (function != null) {
1372
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1373 1374 1375 1376 1377 1378
            }
        }

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

1379
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1380

S
Stepan Koltsov 已提交
1381
            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1382
                @Override
S
Stepan Koltsov 已提交
1383 1384
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1385
                }
1386 1387

                @Override
S
Stepan Koltsov 已提交
1388
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1389 1390
                    // nop
                }
1391 1392 1393 1394 1395 1396 1397 1398 1399
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1400 1401
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1402 1403
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1404
                r.add((SimpleFunctionDescriptor) function);
1405
            }
1406
        }
1407
        return r;
1408 1409
    }

S
Stepan Koltsov 已提交
1410
    void initializeResolverScopeData(@NotNull ResolverScopeData scopeData, @Nullable PsiClass psiClass, boolean staticMembers) {
1411
        if (scopeData.namedMembersMap == null) {
S
Stepan Koltsov 已提交
1412 1413 1414 1415 1416 1417
            if (psiClass != null) {
                scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(
                        new PsiClassWrapper(psiClass), staticMembers, scopeData.kotlin);
            } else {
                scopeData.namedMembersMap = Maps.newHashMap();
            }
1418 1419
        }
    }
A
Andrey Breslav 已提交
1420

A
Andrey Breslav 已提交
1421
    @NotNull
S
Stepan Koltsov 已提交
1422 1423 1424 1425 1426 1427
    public Set<FunctionDescriptor> resolveFunctionGroup(
            @NotNull ClassOrNamespaceDescriptor descriptor,
            @NotNull PsiClass psiClass,
            @NotNull String methodName,
            boolean staticMembers,
            @NotNull ResolverScopeData scopeData) {
A
Andrey Breslav 已提交
1428

S
Stepan Koltsov 已提交
1429
        Map<String, NamedMembers> namedMembersMap = scopeData.namedMembersMap;
1430 1431

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1432
        if (namedMembers != null && namedMembers.methods != null) {
S
Stepan Koltsov 已提交
1433
            resolveNamedGroupFunctions(descriptor, psiClass, namedMembers, methodName, scopeData);
1434 1435

            return namedMembers.functionDescriptors;
1436
        } else {
1437
            return Collections.emptySet();
1438
        }
1439 1440
    }

1441
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1442 1443 1444 1445 1446 1447 1448 1449 1450
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1451

1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475
    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 已提交
1476
    @Nullable
S
Stepan Koltsov 已提交
1477 1478 1479 1480 1481
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(
            ClassOrNamespaceDescriptor owner,
            final PsiClass psiClass,
            final PsiMethodWrapper method,
            @NotNull ResolverScopeData scopeData) {
1482

1483
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1484 1485 1486
        if (returnType == null) {
            return null;
        }
1487

1488
        boolean kotlin;
S
Stepan Koltsov 已提交
1489 1490 1491 1492
        if (owner instanceof NamespaceDescriptor) {
            NamespaceDescriptor javaNamespaceDescriptor = (NamespaceDescriptor) owner;
            FqName fqName = DescriptorUtils.getFQName(javaNamespaceDescriptor).toSafe();
            ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(fqName);
1493
            if (namespaceData == null) {
S
Stepan Koltsov 已提交
1494
                throw new IllegalStateException("namespaceData not found by name " + fqName);
1495 1496 1497
            }
            kotlin = namespaceData.kotlin;
        } else {
S
Stepan Koltsov 已提交
1498
            ResolverBinaryClassData classData = classDescriptorCache.get(new FqName(psiClass.getQualifiedName()));
1499 1500 1501 1502 1503 1504
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1505
        // TODO: ugly
1506
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1507
            return null;
1508
        }
1509

S
Stepan Koltsov 已提交
1510 1511 1512 1513 1514 1515 1516 1517
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1518
        ClassOrNamespaceDescriptor classDescriptor;
1519
        if (scopeData instanceof ResolverBinaryClassData) {
1520
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass(), DescriptorSearchRule.INCLUDE_KOTLIN);
1521
            classDescriptor = classClassDescriptor;
1522 1523
        }
        else {
S
Stepan Koltsov 已提交
1524
            classDescriptor = resolveNamespace(new PsiClassOrPsiPackage(method.getPsiMethod().getContainingClass()));
1525
        }
1526 1527 1528
        if (classDescriptor == null) {
            return null;
        }
1529

1530
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1531
                owner,
1532
                resolveAnnotations(method.getPsiMethod()),
1533 1534
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1535
        );
1536

S
Stepan Koltsov 已提交
1537 1538 1539
        String context = "method " + method.getName() + " in class " + psiClass.getQualifiedName();

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

1541
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1542

S
Stepan Koltsov 已提交
1543
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1544 1545


1546
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1547
        functionDescriptorImpl.initialize(
1548
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1549
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1550
                methodTypeParameters,
1551
                valueParameterDescriptors.descriptors,
1552
                makeReturnType(returnType, method, methodTypeVariableResolver),
1553 1554
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1555
        );
1556
        trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1557
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1558 1559
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1560
        }
1561
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1562
    }
1563

1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585
    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;
        }

1586
        ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN);
1587 1588 1589 1590
        if (clazz == null) {
            return null;
        }
        annotation.setAnnotationType(clazz.getDefaultType());
1591
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619

        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
1620 1621 1622
        return annotation;
    }

S
Stepan Koltsov 已提交
1623 1624 1625 1626
    public List<FunctionDescriptor> resolveMethods(
            @NotNull PsiClass psiClass,
            @NotNull ClassOrNamespaceDescriptor containingDeclaration,
            @NotNull ResolverScopeData scopeData) {
1627
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1628

1629
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1630 1631 1632 1633

        for (Map.Entry<String, NamedMembers> entry : scopeData.namedMembersMap.entrySet()) {
            String methodName = entry.getKey();
            NamedMembers namedMembers = entry.getValue();
S
Stepan Koltsov 已提交
1634
            resolveNamedGroupFunctions(containingDeclaration, psiClass, namedMembers, methodName, scopeData);
1635
            functions.addAll(namedMembers.functionDescriptors);
1636
        }
1637

1638 1639
        return functions;
    }
1640

1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658
    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;
        }
    }

1659
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1660
            @NotNull PsiMethodWrapper method,
1661
            @NotNull DeclarationDescriptor functionDescriptor,
1662 1663
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1664
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1665
        if (method.getJetMethod().typeParameters().length() > 0) {
1666
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1667
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
1668
        } else {
1669
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1670
        }
1671

S
Stepan Koltsov 已提交
1672 1673
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1674 1675 1676 1677 1678 1679 1680
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1681 1682
        return typeParameters;
    }
1683 1684

    /**
S
Stepan Koltsov 已提交
1685
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1686
     */
S
Stepan Koltsov 已提交
1687 1688
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1689
    {
S
Stepan Koltsov 已提交
1690 1691
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1692 1693
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1694 1695
    }

1696 1697
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1698 1699 1700

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

S
Stepan Koltsov 已提交
1701
        JetType transformedType;
1702
        if (returnTypeFromAnnotation.length() > 0) {
1703
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1704
        } else {
1705
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1706
        }
1707 1708
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1709 1710
        } else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
1711 1712 1713 1714 1715
        } else {
            return transformedType;
        }
    }

1716
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1717 1718 1719 1720 1721 1722
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1723
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1724 1725 1726 1727
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1728 1729 1730
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1731 1732 1733 1734
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1735 1736 1737
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1738
            r.add(resolveClass(innerPsiClass, DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN));
1739 1740 1741
        }
        return r;
    }
1742
}