JavaDescriptorResolver.java 74.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.BindingContext;
36
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
37
import org.jetbrains.jet.lang.resolve.OverrideResolver;
38
import org.jetbrains.jet.lang.resolve.constants.*;
M
Maxim Shafirov 已提交
39
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
40
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
41
import org.jetbrains.jet.lang.types.*;
S
Stepan Koltsov 已提交
42
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
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 java.util.*;
50 51 52 53 54

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
55 56
    
    public static String JAVA_ROOT = "<java_root>";
57

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

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

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

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

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

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

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

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


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

128 129 130 131
    static abstract class ResolverClassData extends ResolverScopeData {

        @NotNull
        public abstract ClassDescriptor getClassDescriptor();
132 133 134 135 136 137

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

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

        ResolverBinaryClassData() {
        }

146
        private MutableClassDescriptorLite classDescriptor;
147

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

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

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

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

188
    protected final Map<String, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
189 190 191
    protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

192 193 194
    protected final JavaPsiFacade javaFacade;
    protected final GlobalSearchScope javaSearchScope;
    protected final JavaSemanticServices semanticServices;
M
Maxim Shafirov 已提交
195
    private final AltClassFinder altClassFinder;
196 197 198

    public JavaDescriptorResolver(Project project, JavaSemanticServices semanticServices) {
        this.javaFacade = JavaPsiFacade.getInstance(project);
199 200 201 202 203 204
        this.javaSearchScope = new DelegatingGlobalSearchScope(GlobalSearchScope.allScope(project)) {
            @Override
            public boolean contains(VirtualFile file) {
                return myBaseScope.contains(file) && file.getFileType() != JetFileType.INSTANCE;
            }
        };
205
        this.semanticServices = semanticServices;
M
Maxim Shafirov 已提交
206
        altClassFinder = new AltClassFinder(project);
207
    }
208
    
209
    @Nullable
210
    ResolverClassData resolveClassData(@NotNull PsiClass psiClass) {
211
        String qualifiedName = psiClass.getQualifiedName();
212

213 214 215 216
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
217

218
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
219 220
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
221
            return new ResolverSrcClassData(kotlinClassDescriptor);
222 223
        }

224 225 226 227 228 229
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
            // must resolve containing class first, because inner class must have a reference to it
            resolveClass(containingClass);
        }

230
        // Not let's take a descriptor of a Java class
231
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
232 233 234
        if (classData == null) {
            classData = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classData);
235
        }
236 237 238 239 240 241 242 243 244 245 246
        return classData;
    }

    @Nullable
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
        ResolverClassData classData = resolveClassData(psiClass);
        if (classData != null) {
            return classData.getClassDescriptor();
        } else {
            return null;
        }
247 248 249 250
    }

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

252 253 254 255 256
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
        
257
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
258 259 260 261 262
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
            return kotlinClassDescriptor;
        }

263
        // Not let's take a descriptor of a Java class
264
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
265
        if (classData == null) {
266
            PsiClass psiClass = findClass(qualifiedName);
267 268 269
            if (psiClass == null) {
                return null;
            }
270
            classData = createJavaClassDescriptor(psiClass);
271
        }
272
        return classData.getClassDescriptor();
273 274
    }

275
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
276 277 278
        if (classDescriptorCache.containsKey(psiClass.getQualifiedName())) {
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
279

280 281
        checkPsiClassIsNotJet(psiClass);

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

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

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

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
298 299 300 301 302 303
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
304 305 306
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
307 308 309 310 311 312 313 314 315 316
        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);
317 318
        classData.classDescriptor.createTypeConstructor();
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
319

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

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

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

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

331
        boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC);
332
        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
333 334 335 336
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
337
            if (!psiClass.isInterface()) {
338
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
339
                        classData.classDescriptor,
A
Andrey Breslav 已提交
340
                        Collections.<AnnotationDescriptor>emptyList(),
341
                        false);
342
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), classData.classDescriptor.getVisibility(), isStatic);
343
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
344
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
345
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
346
            }
347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
            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)) {
368
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
369 370 371 372 373 374 375 376
                        }

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

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

                if (constructor.getJetConstructor().hidden()) {
                    continue;
395 396
                }

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

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

421
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
422

423
        return classData;
424 425
    }

426
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
427
        if (psiClass instanceof JetJavaMirrorMarker) {
S
Stepan Koltsov 已提交
428
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass);
429 430 431
        }
    }

432 433 434 435 436 437 438 439 440 441
    @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;
    }

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

453 454
        checkPsiClassIsNotJet(psiClass);

455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
        classData.kotlin = true;
        classData.classDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);

        classDescriptorCache.put(classObjectPsiClass.getQualifiedName(), classData);

        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();
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, classObjectPsiClass, semanticServices, false));

        // 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;
475 476
    }

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

486
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
487 488
    }

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

S
Stepan Koltsov 已提交
499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515

    // cache
    protected ClassDescriptor javaLangObject;

    @NotNull
    private ClassDescriptor getJavaLangObject() {
        if (javaLangObject == null) {
            javaLangObject = resolveClass("java.lang.Object");
        }
        return javaLangObject;
    }

    private boolean isJavaLangObject(JetType type) {
        return type.getConstructor().getDeclarationDescriptor() == getJavaLangObject();
    }


516
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
517 518

        @NotNull
519
        private final PsiTypeParameterListOwner psiOwner;
520
        @NotNull
521
        private final String name;
522
        @NotNull
523
        private final TypeVariableResolver typeVariableResolver;
524 525
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
526

527 528
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
529
        {
530 531 532
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
533

534 535
            this.psiOwner = psiOwner;
            this.name = name;
536
            this.typeVariableResolver = typeVariableResolver;
537
            this.typeParameterDescriptor = typeParameterDescriptor;
538 539 540 541
        }

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

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
558
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
559 560 561 562 563 564 565 566 567
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586
            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 已提交
587
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
588 589 590
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
591 592 593 594
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
595 596 597 598 599 600 601 602 603
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
604 605 606
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
607
                    reified,
608 609
                    JetSignatureUtils.translateVariance(variance),
                    name,
610 611 612 613 614 615 616 617 618 619 620
                    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);
                }
            };
621
        }
622 623
    }

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

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
642 643 644
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
645 646
    }

S
Stepan Koltsov 已提交
647
    private ClassOrNamespaceDescriptor resolveParentDescriptor(PsiClass psiClass) {
648 649
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
650
            return resolveClass(containingClass);
651
        }
652 653 654 655 656 657 658 659 660 661 662

        return resolveNamespace(packageNameOfClass(psiClass.getQualifiedName()));
    }

    private static String packageNameOfClass(@NotNull String qualifiedName) {
        int lastDot = qualifiedName.lastIndexOf('.');
        if (lastDot < 0) {
            return "";
        } else {
            return qualifiedName.substring(0, lastDot);
        }
663 664
    }

665 666
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
667
        for (PsiTypeParameter typeParameter : typeParameters) {
668
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
669
            result.add(typeParameterDescriptor);
670 671 672 673
        }
        return result;
    }

674
    @NotNull
675
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
676
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
677
                containingDeclaration,
A
Andrey Breslav 已提交
678
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
679
                false,
680
                Variance.INVARIANT,
681 682
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
683
        );
684
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
685 686
    }

687
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
688 689 690
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
691 692 693
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
694
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
695 696 697 698 699
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
700
        } else {
701
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
702 703 704 705
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
706
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
707 708 709
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
710
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
711
                }
A
Andrey Breslav 已提交
712 713
            }
        }
714
        typeParameterDescriptor.setInitialized();
715 716
    }

S
Stepan Koltsov 已提交
717
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
718
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
719
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
720
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
721
            initializeTypeParameter(psiTypeParameter, TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
722
        }
A
Andrey Breslav 已提交
723 724
    }

725
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
726 727
        final List<JetType> result = new ArrayList<JetType>();

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

730
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
731
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753
            
            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() {
                    return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
754
                    return visitSuperclass();
755 756 757
                }
            });
        } else {
S
Stepan Koltsov 已提交
758 759 760
            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);
761
        }
762 763 764 765 766 767 768
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
                semanticServices.getTrace().record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
            }
        }
        
769 770 771
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
772 773 774
        return result;
    }

775
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
776
        for (PsiClassType type : extendsListTypes) {
777 778 779 780
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
781 782 783
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
784
            
785
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
786 787 788 789 790

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

791 792
    @Nullable
    public NamespaceDescriptor resolveNamespace(@NotNull String qualifiedName) {
793 794 795 796 797 798
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

799
        PsiPackage psiPackage = findPackage(qualifiedName);
800
        if (psiPackage == null) {
801
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
802 803
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
804 805 806 807
        }
        return resolveNamespace(psiPackage);
    }

808 809
    @Nullable
    public PsiClass findClass(@NotNull String qualifiedName) {
810
        PsiClass original = javaFacade.findClass(qualifiedName, javaSearchScope);
M
Maxim Shafirov 已提交
811
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
812
        PsiClass result = original;
813 814 815 816 817
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

818 819 820 821 822 823
            result = altClass;
        }

        if (result != null) {
            String actualQualifiedName = result.getQualifiedName();
            if (!actualQualifiedName.equals(qualifiedName)) {
824
//                throw new IllegalStateException("requested " + qualifiedName + ", got " + actualQualifiedName);
825
            }
826
        }
827 828

        return result;
829 830
    }

831
    /*package*/ PsiPackage findPackage(String qualifiedName) {
832 833 834
        return javaFacade.findPackage(qualifiedName);
    }

835
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
836 837 838 839 840
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
841
        }
842
        return namespaceData.namespaceDescriptor;
843 844
    }

A
Andrey Breslav 已提交
845
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
846 847 848 849 850
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
851
        }
852
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
853 854
    }

855 856
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
857
        String name = psiPackage.getName();
858
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
859
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
860
                Collections.<AnnotationDescriptor>emptyList(), // TODO
861
                name == null ? JAVA_ROOT : name,
862 863
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
864
        );
865

866 867 868 869 870
        namespaceData.namespaceDescriptor.setMemberScope(new JavaPackageScope(psiPackage.getQualifiedName(), namespaceData.namespaceDescriptor, semanticServices));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiPackage, namespaceData.namespaceDescriptor);
        // TODO: hack
        namespaceData.kotlin = true;
        return namespaceData;
871 872
    }

873 874 875 876 877 878 879 880
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

881 882 883 884
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
885
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
886 887 888

        checkPsiClassIsNotJet(psiClass);

889 890
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
891
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
892
                Collections.<AnnotationDescriptor>emptyList(), // TODO
893
                psiClass.getName(),
894 895
                psiClass.getQualifiedName(),
                false
896
        );
897 898 899
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
900
    }
901 902 903 904 905 906 907 908 909 910
    
    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;
        }
    }
911

912 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 939 940 941 942 943 944
    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
945
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
946 947 948 949 950 951 952
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

957 958
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
959 960
        }
        
961 962 963 964
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
965
        JetType outType;
966
        if (typeFromAnnotation.length() > 0) {
967
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
968
        } else {
969
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
970
        }
971 972 973 974 975 976 977 978

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

979 980 981
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
S
Stepan Koltsov 已提交
982 983 984 985 986 987 988 989 990

            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;
            }
991 992 993 994 995
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
996
                    false,
S
Stepan Koltsov 已提交
997
                    transformedType,
998
                    hasDefaultValue,
999 1000 1001
                    varargElementType
            ));
        }
1002 1003
    }

S
Stepan Koltsov 已提交
1004
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, String fieldName, boolean staticMembers) {
1005
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
1006

1007 1008 1009
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1010
        }
1011
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
1012

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

1015 1016 1017 1018 1019 1020 1021
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
1022 1023 1024
    }
    
    @NotNull
S
Stepan Koltsov 已提交
1025
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, @NotNull PsiClass psiClass, boolean staticMembers) {
1026

1027 1028 1029 1030 1031 1032
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));
        
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
1033
            if (namedMembers.propertyAccessors == null) {
1034 1035 1036 1037
                continue;
            }
            
            String propertyName = entry.getKey();
1038

S
Stepan Koltsov 已提交
1039
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName, "class or namespace " + psiClass.getQualifiedName());
1040
            descriptors.addAll(namedMembers.propertyDescriptors);
1041
        }
1042 1043 1044 1045 1046 1047 1048 1049 1050 1051

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
1052
        return descriptors;
1053
    }
1054 1055 1056 1057 1058 1059 1060
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
1061
            return psiTypeToKey(typeSource.getPsiType());
1062 1063
        }
    }
1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076

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

1077 1078 1079 1080 1081
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1082

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

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

1100 1101 1102 1103
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1104
            boolean ext;
1105
        }
1106 1107
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1108

1109
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1110

1111 1112 1113 1114 1115
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1116
                value.ext = propertyAccessor.getReceiverType() != null;
1117 1118
                map.put(key, value);
            }
1119

1120 1121 1122 1123
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141
            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();
            }
1142
        }
1143

1144
        
1145 1146
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>(1);

1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160
        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;
            }
1161

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

1175 1176 1177 1178 1179 1180 1181 1182 1183 1184
            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();
            }
1185

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

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


1202 1203 1204
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
                    Collections.<AnnotationDescriptor>emptyList(),
1205
                    modality,
1206 1207 1208
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
                    isVar,
                    false,
1209 1210
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1211

1212 1213 1214
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1215
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1216 1217
            }
            if (members.setter != null) {
1218
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1219
            }
1220

1221
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1222

S
Stepan Koltsov 已提交
1223
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1224 1225 1226

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

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

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1236
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1237 1238 1239
                }
            }

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

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

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

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

1279
        namedMembers.propertyDescriptors = r;
1280
    }
1281

1282
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1283 1284 1285
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1286 1287
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1288

1289
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1290
        for (PsiMethodWrapper method : namedMembers.methods) {
1291 1292
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    method);
1293
            if (function != null) {
1294
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1295 1296 1297 1298 1299 1300
            }
        }

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

1301
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1302

S
Stepan Koltsov 已提交
1303
            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1304
                @Override
S
Stepan Koltsov 已提交
1305 1306
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1307
                }
1308 1309

                @Override
S
Stepan Koltsov 已提交
1310
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1311 1312
                    // nop
                }
1313 1314 1315 1316 1317 1318 1319 1320 1321
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1322 1323
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1324 1325
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1326
                r.add((SimpleFunctionDescriptor) function);
1327
            }
1328
        }
1329
        return r;
1330 1331
    }

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

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

1359
        ResolverScopeData resolverScopeData = getResolverScopeData(descriptor, new PsiClassWrapper(psiClass));
A
Andrey Breslav 已提交
1360

1361 1362 1363
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

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

1367 1368 1369
            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);

            return namedMembers.functionDescriptors;
1370
        } else {
1371
            return Collections.emptySet();
1372
        }
1373 1374
    }

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

1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409
    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 已提交
1410
    @Nullable
S
Stepan Koltsov 已提交
1411
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, final PsiMethodWrapper method) {
1412

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

1419 1420 1421 1422 1423 1424 1425 1426 1427
        boolean kotlin;
        if (owner instanceof JavaNamespaceDescriptor) {
            JavaNamespaceDescriptor javaNamespaceDescriptor = (JavaNamespaceDescriptor) owner;
            ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(javaNamespaceDescriptor.getQualifiedName());
            if (namespaceData == null) {
                throw new IllegalStateException("namespaceData not found by name " + javaNamespaceDescriptor.getQualifiedName());
            }
            kotlin = namespaceData.kotlin;
        } else {
1428
            ResolverBinaryClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
1429 1430 1431 1432 1433 1434
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1435
        // TODO: ugly
1436
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1437
            return null;
1438
        }
1439

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

1448
        ClassOrNamespaceDescriptor classDescriptor;
1449
        if (scopeData instanceof ResolverBinaryClassData) {
1450
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1451
            classDescriptor = classClassDescriptor;
1452 1453 1454
        }
        else {
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1455
        }
1456 1457 1458
        if (classDescriptor == null) {
            return null;
        }
1459

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

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

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

1471
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1472

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


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

1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
    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;
        }

        ClassDescriptor clazz = resolveClass(psiAnnotation.getQualifiedName());
        if (clazz == null) {
            return null;
        }
        annotation.setAnnotationType(clazz.getDefaultType());
1521 1522 1523 1524 1525 1526 1527 1528
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
        if("jet.runtime.Intrinsic".equals(psiAnnotation.getQualifiedName())) {
            // temporary hack
            valueArguments.add(new StringValue(psiAnnotation.findAttributeValue("value").getText()));
            annotation.setValueArguments(valueArguments); // TODO
        }
        else
            annotation.setValueArguments(valueArguments); // TODO
1529 1530 1531
        return annotation;
    }

1532
    public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, ClassOrNamespaceDescriptor containingDeclaration) {
1533 1534
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1535
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1536

1537
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1538 1539 1540 1541 1542

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

1546 1547
        return functions;
    }
1548

1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566
    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;
        }
    }

1567
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1568
            @NotNull PsiMethodWrapper method,
1569
            @NotNull DeclarationDescriptor functionDescriptor,
1570 1571
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1572
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1573
        if (method.getJetMethod().typeParameters().length() > 0) {
1574
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1575
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
1576
        } else {
1577
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1578
        }
1579

S
Stepan Koltsov 已提交
1580 1581
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1582 1583 1584 1585 1586 1587 1588
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1589 1590
        return typeParameters;
    }
1591 1592

    /**
S
Stepan Koltsov 已提交
1593
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1594
     */
S
Stepan Koltsov 已提交
1595 1596
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1597
    {
S
Stepan Koltsov 已提交
1598 1599
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1600 1601
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1602 1603
    }

1604 1605
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1606 1607 1608

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

S
Stepan Koltsov 已提交
1609
        JetType transformedType;
1610
        if (returnTypeFromAnnotation.length() > 0) {
1611
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1612
        } else {
1613
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1614
        }
1615 1616
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1617 1618
        } else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName()) != null) {
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
1619 1620 1621 1622 1623
        } else {
            return transformedType;
        }
    }

1624
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1625 1626 1627 1628 1629 1630
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1631
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1632 1633 1634 1635
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1636 1637 1638
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1639 1640 1641 1642
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1643 1644 1645
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1646 1647 1648 1649
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1650
}