JavaDescriptorResolver.java 71.9 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.resolve.BindingContext;
35
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
36
import org.jetbrains.jet.lang.resolve.OverrideResolver;
M
Maxim Shafirov 已提交
37
import org.jetbrains.jet.lang.resolve.java.alt.AltClassFinder;
38
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
39
import org.jetbrains.jet.lang.types.*;
40
import org.jetbrains.jet.plugin.JetFileType;
41
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
42 43 44
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
45

46
import java.util.*;
47 48 49 50 51

/**
 * @author abreslav
 */
public class JavaDescriptorResolver {
52 53
    
    public static String JAVA_ROOT = "<java_root>";
54

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

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

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

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

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

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

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

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


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

125 126 127 128
    static abstract class ResolverClassData extends ResolverScopeData {

        @NotNull
        public abstract ClassDescriptor getClassDescriptor();
129 130 131 132 133 134

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

137
    /** Class with instance members */
138 139 140 141 142
    static class ResolverBinaryClassData extends ResolverClassData {

        ResolverBinaryClassData() {
        }

143
        private MutableClassDescriptorLite classDescriptor;
144

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

169
    /** Either package or class with static members */
170
    private static class ResolverNamespaceData extends ResolverScopeData {
171 172 173 174 175 176
        private JavaNamespaceDescriptor namespaceDescriptor;

        @NotNull
        public NamespaceDescriptor getNamespaceDescriptor() {
            return namespaceDescriptor;
        }
177 178 179 180 181 182

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

185
    protected final Map<String, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
186 187 188
    protected final Map<String, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
    protected final Map<PsiElement, ResolverNamespaceData> namespaceDescriptorCache = Maps.newHashMap();

189
    protected final Map<PsiMethod, FunctionDescriptorImpl> methodDescriptorCache = Maps.newHashMap();
190 191 192
    protected final JavaPsiFacade javaFacade;
    protected final GlobalSearchScope javaSearchScope;
    protected final JavaSemanticServices semanticServices;
M
Maxim Shafirov 已提交
193
    private final AltClassFinder altClassFinder;
194 195 196

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

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

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

222
        // Not let's take a descriptor of a Java class
223
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
224 225 226
        if (classData == null) {
            classData = createJavaClassDescriptor(psiClass);
            classDescriptorCache.put(qualifiedName, classData);
227
        }
228 229 230 231 232 233 234 235 236 237 238
        return classData;
    }

    @Nullable
    public ClassDescriptor resolveClass(@NotNull PsiClass psiClass) {
        ResolverClassData classData = resolveClassData(psiClass);
        if (classData != null) {
            return classData.getClassDescriptor();
        } else {
            return null;
        }
239 240 241 242
    }

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

244 245 246 247 248
        if (qualifiedName.endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
        
249
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
250 251 252 253 254
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
            return kotlinClassDescriptor;
        }

255
        // Not let's take a descriptor of a Java class
256
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
257
        if (classData == null) {
258
            PsiClass psiClass = findClass(qualifiedName);
259 260 261
            if (psiClass == null) {
                return null;
            }
262
            classData = createJavaClassDescriptor(psiClass);
263
        }
264
        return classData.getClassDescriptor();
265 266
    }

267
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass) {
A
Andrey Breslav 已提交
268 269 270
        assert !classDescriptorCache.containsKey(psiClass.getQualifiedName()) : psiClass.getQualifiedName();
        classDescriptorCache.put(psiClass.getQualifiedName(), null); // TODO

271
        String name = psiClass.getName();
272
        ResolverBinaryClassData classData = new ResolverBinaryClassData();
273
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
274 275
        DeclarationDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
        classData.classDescriptor = new MutableClassDescriptorLite(containingDeclaration, kind);
276
        classData.classDescriptor.setName(name);
277
        
A
Andrey Breslav 已提交
278
        List<JetType> supertypes = new ArrayList<JetType>();
279

280 281 282
        TypeVariableResolverFromOuters outerTypeVariableByNameResolver = new TypeVariableResolverFromOuters(containingDeclaration);

        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData, outerTypeVariableByNameResolver);
283 284 285 286 287 288
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
289 290 291
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
292
        classData.classDescriptor.setModality(Modality.convertFromFlags(
293 294
                psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                !psiClass.hasModifierProperty(PsiModifier.FINAL))
A
Andrey Breslav 已提交
295
        );
296
        classData.classDescriptor.createTypeConstructor();
297
        classDescriptorCache.put(psiClass.getQualifiedName(), classData);
298
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classData.classDescriptor, psiClass, semanticServices, false));
299

300
        initializeTypeParameters(classData.typeParameters, new TypeVariableResolverFromTypeDescriptors(new ArrayList<TypeParameterDescriptor>(), outerTypeVariableByNameResolver));
301

302
        TypeVariableResolverFromTypeDescriptors resolverForTypeParameters = new TypeVariableResolverFromTypeDescriptors(classData.getTypeParameters(), null);
303

304
        // TODO: ugly hack: tests crash if initializeTypeParameters called with class containing proper supertypes
305
        supertypes.addAll(getSupertypes(new PsiClassWrapper(psiClass), classData.getTypeParameters()));
306

307
        if (psiClass.isInterface()) {
308
            //classData.classDescriptor.setSuperclassType(JetStandardClasses.getAnyType()); // TODO : Make it java.lang.Object
309 310 311 312 313 314
        }
        else {
            PsiClassType[] extendsListTypes = psiClass.getExtendsListTypes();
            assert extendsListTypes.length == 0 || extendsListTypes.length == 1;
            JetType superclassType = extendsListTypes.length == 0
                                            ? JetStandardClasses.getAnyType()
315
                                            : semanticServices.getTypeTransformer().transformToType(extendsListTypes[0], resolverForTypeParameters);
316
            //classData.classDescriptor.setSuperclassType(superclassType);
317
        }
A
Andrey Breslav 已提交
318 319

        PsiMethod[] psiConstructors = psiClass.getConstructors();
320 321

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

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
366
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
367 368 369 370 371 372 373 374 375 376
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

                constructorDescriptor.initialize(typeParameters, valueParameters, Modality.FINAL, classData.classDescriptor.getVisibility());
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
            }
377 378
        }
        else {
379 380 381 382 383
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
384 385
                }

386
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
387
                        classData.classDescriptor,
A
Andrey Breslav 已提交
388
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
389
                        false);
390
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
391
                        constructor.getParameters(),
392
                        new TypeVariableResolverFromTypeDescriptors(classData.getTypeParameters(), null) // TODO: outer too
393
                    );
394 395 396 397
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors, Modality.FINAL,
398
                                                 resolveVisibilityFromPsiModifiers(psiConstructor));
399
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
400
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
401
                semanticServices.getTrace().record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
402
            }
A
Andrey Breslav 已提交
403
        }
404

405 406 407
        // TODO
        //classData.classDescriptor.setClassObjectDescriptor(createClassObjectDescriptor(classData.classDescriptor));

408
        semanticServices.getTrace().record(BindingContext.CLASS, psiClass, classData.classDescriptor);
409

410
        return classData;
411 412
    }

413 414 415 416 417 418 419 420 421 422 423 424 425 426 427
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
        MutableClassDescriptorLite classObjectDescriptor = new MutableClassDescriptorLite(containing, ClassKind.OBJECT);
        classObjectDescriptor.setName("<TODO>"); // TODO
        classObjectDescriptor.setModality(Modality.FINAL);
        classObjectDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classObjectDescriptor.createTypeConstructor();
        classObjectDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(classObjectDescriptor, psiClass, semanticServices, true));
        return classObjectDescriptor;
    }

428
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData, TypeVariableResolver typeVariableResolver) {
429 430 431 432 433
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
        classData.kotlin = jetClassAnnotation.isDefined();
        
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
434
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor, typeVariableResolver);
435
        }
436

437
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
438 439
    }

440
    @NotNull
441
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
442 443 444 445 446
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
447 448 449
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466

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


467 468 469 470 471
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
        
        private final DeclarationDescriptor containingDeclaration;
        private final PsiTypeParameterListOwner psiOwner;
        private final String name;
472
        private final boolean reified;
473
        private final int index;
474
        private final TypeInfoVariance variance;
475
        private final TypeVariableResolver typeVariableResolver;
476 477

        protected JetSignatureTypeParameterVisitor(DeclarationDescriptor containingDeclaration, PsiTypeParameterListOwner psiOwner,
478
                String name, boolean reified, int index, TypeInfoVariance variance, TypeVariableResolver typeVariableResolver)
479
        {
480 481 482 483
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
            
484 485 486
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;
            this.name = name;
487
            this.reified = reified;
488
            this.index = index;
489
            this.variance = variance;
490
            this.typeVariableResolver = typeVariableResolver;
491 492 493 494
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
495
        
496 497
        @Override
        public JetSignatureVisitor visitClassBound() {
498
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
499 500
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
501 502 503
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
504 505 506 507 508 509 510
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
511
            return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
512 513 514 515 516 517 518 519 520 521 522 523
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
524
                    reified,
525 526
                    JetSignatureUtils.translateVariance(variance),
                    name,
527
                    index);
528
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
529 530
            TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameter, psiTypeParameter, upperBounds, lowerBounds);
            done(typeParameterDescriptorInitialization);
531 532
        }
        
533
        protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
534 535
    }

536 537 538
    /**
     * @see #resolveMethodTypeParametersFromJetSignature(String, FunctionDescriptor)
     */
539
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature, final PsiClass clazz,
540
            final ClassDescriptor classDescriptor, final TypeVariableResolver outerClassTypeVariableResolver) {
541
        final List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>();
542
        
543
        class MyTypeVariableResolver implements TypeVariableResolver {
544 545 546 547

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
548 549 550
                for (TypeParameterDescriptorInitialization typeParameter : r) {
                    if (typeParameter.descriptor.getName().equals(name)) {
                        return typeParameter.descriptor;
551 552
                    }
                }
553
                return outerClassTypeVariableResolver.getTypeVariable(name);
554 555 556
            }
        }
        
557
        new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() {
558 559
            private int formalTypeParameterIndex = 0;
            
560
            @Override
561
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
562
                return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
563
                    @Override
564
                    protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
565
                        r.add(typeParameterDescriptor);
566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584
                    }
                };
            }

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

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

585 586 587
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
588
            return resolveClass(containingClass);
589 590 591 592 593 594 595
        }
        
        PsiJavaFile containingFile = (PsiJavaFile) psiClass.getContainingFile();
        String packageName = containingFile.getPackageName();
        return resolveNamespace(packageName);
    }

596 597
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
598
        for (PsiTypeParameter typeParameter : typeParameters) {
599
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
600
            result.add(typeParameterDescriptor);
601 602 603 604
        }
        return result;
    }

605
    @NotNull
606
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
607
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
608
                containingDeclaration,
A
Andrey Breslav 已提交
609
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
610
                false,
611
                Variance.INVARIANT,
612 613
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
614
        );
615
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
616 617
    }

618
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
619 620 621
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
622 623 624
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
625
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
626 627 628 629 630
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
631
        } else {
632
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
633 634 635 636
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
637
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
638 639 640
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
641
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
642
                }
A
Andrey Breslav 已提交
643 644
            }
        }
645
        typeParameterDescriptor.setInitialized();
646 647
    }

648
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, TypeVariableResolver typeVariableByPsiResolver) {
649
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
650
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
651 652
            prevTypeParameters.add(psiTypeParameter.descriptor);
            initializeTypeParameter(psiTypeParameter, new TypeVariableResolverFromTypeDescriptors(prevTypeParameters, typeVariableByPsiResolver));
S
Stepan Koltsov 已提交
653
        }
A
Andrey Breslav 已提交
654 655
    }

656
    private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, List<TypeParameterDescriptor> typeParameters) {
657 658 659
        final List<JetType> result = new ArrayList<JetType>();

        if (psiClass.getJetClass().signature().length() > 0) {
660
            final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(typeParameters, null);
661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
            
            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() {
                    return new JetTypeJetSignatureReader(semanticServices, semanticServices.getJetSemanticServices().getStandardLibrary(), typeVariableResolver) {
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }
            });
        } else {
694 695
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
696 697 698 699
        }
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
700 701 702
        return result;
    }

703
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver) {
704
        for (PsiClassType type : extendsListTypes) {
705 706 707 708 709
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
            
710
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
711 712 713 714 715

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

716 717
    @Nullable
    public NamespaceDescriptor resolveNamespace(@NotNull String qualifiedName) {
718 719 720 721 722 723
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

724
        PsiPackage psiPackage = findPackage(qualifiedName);
725
        if (psiPackage == null) {
726
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
727 728
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
729 730 731 732
        }
        return resolveNamespace(psiPackage);
    }

733
    public PsiClass findClass(String qualifiedName) {
734
        PsiClass original = javaFacade.findClass(qualifiedName, javaSearchScope);
M
Maxim Shafirov 已提交
735
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
736 737 738 739 740 741 742 743
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

            return altClass;
        }
        return original;
744 745
    }

746
    /*package*/ PsiPackage findPackage(String qualifiedName) {
747 748 749
        return javaFacade.findPackage(qualifiedName);
    }

750
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
751 752 753 754 755
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
756
        }
757
        return namespaceData.namespaceDescriptor;
758 759
    }

A
Andrey Breslav 已提交
760
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
761 762 763 764 765
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
766
        }
767
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
768 769
    }

770 771
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
772
        String name = psiPackage.getName();
773
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
774
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
775
                Collections.<AnnotationDescriptor>emptyList(), // TODO
776
                name == null ? JAVA_ROOT : name,
777 778
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
779
        );
780

781 782 783 784 785
        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;
786 787
    }

788 789 790 791 792 793 794 795
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

796 797 798 799
    /**
     * TODO
     * @see #createClassObjectDescriptor(org.jetbrains.jet.lang.descriptors.ClassDescriptor, com.intellij.psi.PsiClass)
     */
800 801 802
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull final PsiClass psiClass) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
803
                resolveParentDescriptor(psiClass),
A
Andrey Breslav 已提交
804
                Collections.<AnnotationDescriptor>emptyList(), // TODO
805
                psiClass.getName(),
806 807
                psiClass.getQualifiedName(),
                false
808
        );
809 810 811
        namespaceData.namespaceDescriptor.setMemberScope(new JavaClassMembersScope(namespaceData.namespaceDescriptor, psiClass, semanticServices, true));
        semanticServices.getTrace().record(BindingContext.NAMESPACE, psiClass, namespaceData.namespaceDescriptor);
        return namespaceData;
812
    }
813 814 815 816 817 818 819 820 821 822
    
    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;
        }
    }
823

824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856
    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
857
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
858 859 860 861 862 863 864
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

866
        boolean nullable = parameter.getJetValueParameter().nullable();
867

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

871 872
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
873 874
        }
        
875 876 877 878
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
879
        JetType outType;
880
        if (typeFromAnnotation.length() > 0) {
881
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
882
        } else {
883
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
884
        }
885 886 887 888 889 890 891 892

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

893 894 895 896 897 898 899 900
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
901
                    false,
902
                    nullable ? TypeUtils.makeNullableAsSpecified(outType, nullable) : outType,
903
                    hasDefaultValue,
904 905 906
                    varargElementType
            ));
        }
907 908
    }

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

912 913 914
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
915
        }
916
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
917

918
        resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, fieldName);
919

920 921 922 923 924 925 926
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
927 928 929
    }
    
    @NotNull
930
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, boolean staticMembers) {
931

932 933 934 935 936 937
        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();
938
            if (namedMembers.propertyAccessors == null) {
939 940 941 942
                continue;
            }
            
            String propertyName = entry.getKey();
943

944
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName);
945
            descriptors.addAll(namedMembers.propertyDescriptors);
946
        }
947 948 949 950 951 952 953 954 955 956

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
957
        return descriptors;
958
    }
959 960 961 962 963 964 965
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
966
            return psiTypeToKey(typeSource.getPsiType());
967 968
        }
    }
969 970 971 972 973 974 975 976 977 978 979 980 981

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

982 983 984 985 986
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
987

988 989 990 991
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
            boolean staticMembers, NamedMembers namedMembers, String propertyName) {
992 993 994 995
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
996
        if (namedMembers.propertyAccessors == null) {
997 998 999
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
1000

1001
        final List<TypeParameterDescriptor> classTypeParameterDescriptorInitialization = scopeData.getTypeParameters();
1002

1003
        TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(scopeData.getTypeParameters(), null);
1004

1005 1006 1007 1008
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1009
        }
1010 1011
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1012

1013
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1014

1015 1016 1017 1018 1019 1020 1021
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
                map.put(key, value);
            }
1022

1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
            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();
            }
1041
        }
1042

1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056
        
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
        
        for (GroupingValue members : map.values()) {
            boolean isFinal;
            if (members.setter == null && members.getter == null) {
                isFinal = false;
            } else if (members.getter != null) {
                isFinal = members.getter.getMember().isFinal();
            } else if (members.setter != null) {
                isFinal = members.setter.getMember().isFinal();
            } else {
                isFinal = false;
            }
1057

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067
            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();
            }
1068

1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
            } else {
                isVar = members.setter != null;
            }
            
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
                    Collections.<AnnotationDescriptor>emptyList(),
                    isFinal && !staticMembers ? Modality.FINAL : Modality.OPEN, // TODO: abstract
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
                    isVar,
                    false,
1083 1084
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1085

1086 1087 1088
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1089
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1090 1091
            }
            if (members.setter != null) {
1092
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1093
            }
1094

1095
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1096

1097
            List<TypeParameterDescriptor> typeParametersInitialization = new ArrayList<TypeParameterDescriptor>(0);
1098 1099 1100

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

1102
                if (anyMember == members.setter) {
1103
                    typeParametersInitialization = resolveMethodTypeParameters(method, setterDescriptor, typeVariableResolver);
1104 1105 1106 1107 1108 1109
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
1110
                    typeParametersInitialization = resolveMethodTypeParameters(method, getterDescriptor, typeVariableResolver);
1111 1112 1113
                }
            }

1114
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
1115 1116
            for (TypeParameterDescriptor typeParameter : typeParametersInitialization) {
                typeParameters.add(typeParameter);
1117 1118
            }

1119
            List<TypeParameterDescriptor> typeParametersForReceiver = new ArrayList<TypeParameterDescriptor>();
1120 1121
            typeParametersForReceiver.addAll(classTypeParameterDescriptorInitialization);
            typeParametersForReceiver.addAll(typeParametersInitialization);
1122
            TypeVariableResolver typeVariableResolverForPropertyInternals = new TypeVariableResolverFromTypeDescriptors(typeParametersForReceiver, null);
1123

1124 1125 1126 1127
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1128
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
1129 1130 1131 1132 1133 1134 1135 1136
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1137
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1138 1139 1140 1141 1142 1143 1144
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1145
            );
1146 1147 1148 1149
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1150
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getOutType(), false, null));
1151 1152 1153 1154 1155
            }

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

1158
        namedMembers.propertyDescriptors = r;
1159
    }
1160

1161
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1162 1163 1164
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1165 1166
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1167

1168
        Set<NamedFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1169
        for (PsiMethodWrapper method : namedMembers.methods) {
1170 1171 1172
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    typeSubstitutorForGenericSuperclasses,
                    method);
1173
            if (function != null) {
1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201
                functionsFromCurrent.add((NamedFunctionDescriptor) function);
            }
        }

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

            Set<NamedFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);

            OverrideResolver.generateOverridesInFunctionGroup(methodName, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink<NamedFunctionDescriptor>() {
                @Override
                public void addToScope(NamedFunctionDescriptor fakeOverride) {
                    functions.add(fakeOverride);
                }
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
    private Set<NamedFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<NamedFunctionDescriptor> r = new HashSet<NamedFunctionDescriptor>();
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
                r.add((NamedFunctionDescriptor) function);
1202
            }
1203
        }
1204
        return r;
1205 1206
    }

1207
    private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) {
1208
        ResolverScopeData scopeData;
1209
        boolean staticMembers;
1210 1211
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
1212
            staticMembers = true;
1213
        } else if (owner instanceof ClassDescriptor) {
1214
            scopeData = classDescriptorCache.get(psiClass.getQualifiedName());
1215
            staticMembers = false;
1216
        } else {
1217
            throw new IllegalStateException("unknown owner: " + owner.getClass().getName());
1218 1219 1220 1221 1222
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1223 1224
        if (scopeData.namedMembersMap == null) {
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1225 1226
        }
        
1227
        return scopeData;
1228
    }
A
Andrey Breslav 已提交
1229

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

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

1235 1236 1237
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1238 1239
        if (namedMembers != null && namedMembers.methods != null) {
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);
1240

1241 1242 1243
            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);

            return namedMembers.functionDescriptors;
1244
        } else {
1245
            return Collections.emptySet();
1246
        }
1247 1248
    }

1249
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1250 1251 1252 1253 1254 1255 1256 1257 1258
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293
    
    private static boolean equal(@NotNull PsiClass c1, @NotNull PsiClass c2) {
        return c1.getQualifiedName().equals(c2.getQualifiedName());
    }
    
    private static boolean equal(@NotNull PsiMethod m1, @NotNull PsiMethod m2) {
        // TODO dummy
        return m1.getName().equals(m2.getName()) && equal(m1.getContainingClass(), m2.getContainingClass());
    }

    private static boolean equal(@NotNull PsiTypeParameterListOwner o1, @NotNull PsiTypeParameterListOwner o2) {
        if (o1 == o2) {
            return true;
        }
        if (o1 instanceof PsiClass && o2 instanceof PsiClass) {
            return equal((PsiClass) o1, (PsiClass) o2);
        }
        if (o1 instanceof PsiMethod && o2 instanceof PsiMethod) {
            return equal((PsiMethod) o1, (PsiMethod) o2);
        }
        if ((o1 instanceof PsiClass || o1 instanceof PsiMethod) && (o2 instanceof PsiClass || o2 instanceof PsiMethod)) {
            return false;
        }
        throw new IllegalStateException(o1.getClass() + ", " + o2.getClass());
    }
    
    public static boolean equal(@NotNull PsiTypeParameter p1, @NotNull PsiTypeParameter p2) {
        if (p1 == p2) {
            return true;
        }
        if (p1.getIndex() != p2.getIndex()) {
            return false;
        }
        return equal(p1.getOwner(), p2.getOwner());
    }
1294

1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318
    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 已提交
1319
    @Nullable
1320 1321
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, final PsiMethodWrapper method) {

1322
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1323 1324 1325
        if (returnType == null) {
            return null;
        }
1326
        FunctionDescriptorImpl functionDescriptor = methodDescriptorCache.get(method.getPsiMethod());
A
Andrey Breslav 已提交
1327
        if (functionDescriptor != null) {
1328
            if (method.getPsiMethod().getContainingClass() != psiClass) {
1329 1330
                //functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
                throw new IllegalStateException();
A
Andrey Breslav 已提交
1331 1332 1333
            }
            return functionDescriptor;
        }
1334

1335 1336
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));

1337 1338 1339 1340 1341 1342 1343 1344 1345
        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 {
1346
            ResolverBinaryClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
1347 1348 1349 1350 1351 1352
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1353
        // TODO: ugly
1354
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1355
            return null;
1356
        }
1357

S
Stepan Koltsov 已提交
1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378
        if (kotlin) {
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
            
            if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_TYPEINFO_METHOD) && method.getParameters().size() == 0) {
                return null;
            }
            
            if (method.getName().equals(JvmStdlibNames.JET_OBJECT_GET_OUTER_OBJECT_METHOD) && method.getParameters().size() == 0) {
                return null;
            }

            // TODO: check signature
            if (method.getName().equals(JvmAbi.SET_TYPE_INFO_METHOD)) {
                return null;
            }
        }

1379 1380
        ClassOrNamespaceDescriptor classDescriptor;
        final List<TypeParameterDescriptor> classTypeParameters = scopeData.getTypeParameters();
1381
        if (scopeData instanceof ResolverBinaryClassData) {
1382
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1383
            classDescriptor = classClassDescriptor;
1384 1385 1386
        }
        else {
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1387
        }
1388 1389 1390
        if (classDescriptor == null) {
            return null;
        }
S
Stepan Koltsov 已提交
1391
        NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1392 1393
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
1394 1395
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1396
        );
1397
        methodDescriptorCache.put(method.getPsiMethod(), functionDescriptorImpl);
1398

1399
        TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(classDescriptor);
1400

1401
        final List<TypeParameterDescriptor> methodTypeParametersInitialization = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1402
        List<TypeParameterDescriptor> methodTypeParameters = new ArrayList<TypeParameterDescriptor>();
1403 1404
        for (TypeParameterDescriptor typeParameterDescriptorInitialization : methodTypeParametersInitialization) {
            methodTypeParameters.add(typeParameterDescriptorInitialization);
1405
        }
1406 1407 1408 1409 1410

        class MethodTypeVariableResolver implements TypeVariableResolver {
            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
1411 1412 1413
                for (TypeParameterDescriptor typeParameter : methodTypeParametersInitialization) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
1414 1415 1416 1417 1418 1419 1420 1421 1422
                    }
                }
                for (TypeParameterDescriptor typeParameter : classTypeParameters) {
                    if (typeParameter.getName().equals(name)) {
                        return typeParameter;
                    }
                }
                throw new IllegalStateException("unresolver variable: " + name); // TODO: report properly
            }
1423

1424 1425 1426
        }


1427
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), new MethodTypeVariableResolver());
A
Andrey Breslav 已提交
1428
        functionDescriptorImpl.initialize(
1429
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1430
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1431
                methodTypeParameters,
1432
                valueParameterDescriptors.descriptors,
1433
                makeReturnType(returnType, method, new MethodTypeVariableResolver()),
1434 1435
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1436
        );
1437
        semanticServices.getTrace().record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1438
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
1439
        if (method.getPsiMethod().getContainingClass() != psiClass) {
1440 1441
            //substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
            throw new IllegalStateException();
A
Andrey Breslav 已提交
1442
        }
1443
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1444
    }
1445

1446
    public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, ClassOrNamespaceDescriptor containingDeclaration) {
1447 1448
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1449
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1450

1451
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1452 1453 1454 1455 1456

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

1460 1461
        return functions;
    }
1462

1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480
    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;
        }
    }

1481
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1482
            @NotNull PsiMethodWrapper method,
1483
            @NotNull DeclarationDescriptor functionDescriptor,
1484 1485
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1486
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1487
        if (method.getJetMethod().typeParameters().length() > 0) {
1488
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
1489
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1490
        } else {
1491
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1492
        }
1493

1494 1495 1496 1497 1498 1499 1500 1501
        initializeTypeParameters(typeParametersIntialization, classTypeVariableResolver);
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1502 1503
        return typeParameters;
    }
1504 1505

    /**
1506
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor, TypeVariableResolver)
1507
     */
1508
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1509
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1510
    {
1511
        final List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>();
1512

1513
        class MyTypeVariableResolver implements TypeVariableResolver {
1514 1515 1516 1517

            @NotNull
            @Override
            public TypeParameterDescriptor getTypeVariable(@NotNull String name) {
1518 1519 1520
                for (TypeParameterDescriptorInitialization typeParameter : r) {
                    if (typeParameter.descriptor.getName().equals(name)) {
                        return typeParameter.descriptor;
1521 1522
                    }
                }
1523
                return classTypeVariableResolver.getTypeVariable(name);
1524 1525 1526
            }
        }
        
1527
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
1528 1529
            private int formalTypeParameterIndex = 0;
            
1530
            @Override
1531
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
1532
                
1533
                return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, reified, formalTypeParameterIndex++, variance, new MyTypeVariableResolver()) {
1534
                    @Override
1535
                    protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
1536
                        r.add(typeParameterDescriptor);
1537 1538
                    }
                };
1539

1540 1541 1542 1543 1544
            }
        });
        return r;
    }

1545 1546
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1547 1548 1549

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

S
Stepan Koltsov 已提交
1550
        JetType transformedType;
1551
        if (returnTypeFromAnnotation.length() > 0) {
1552
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1553
        } else {
1554
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1555
        }
1556 1557
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
1558 1559 1560 1561 1562
        } else {
            return transformedType;
        }
    }

1563
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1564 1565 1566 1567 1568 1569
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1570
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1571 1572 1573 1574
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1575 1576 1577
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1578 1579 1580 1581
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1582 1583 1584 1585
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1586
}