JavaDescriptorResolver.java 70.6 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
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor, TypeVariableResolver) 
538
     */
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 544 545 546
        final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
        // note changes state in this method
        final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, outerClassTypeVariableResolver);

547
        new JetSignatureReader(jetSignature).accept(new JetSignatureExceptionsAdapter() {
548 549
            private int formalTypeParameterIndex = 0;
            
550
            @Override
551
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
552
                return new JetSignatureTypeParameterVisitor(classDescriptor, clazz, name, reified, formalTypeParameterIndex++, variance, typeVariableResolver) {
553
                    @Override
554
                    protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
555
                        r.add(typeParameterDescriptor);
556
                        previousTypeParameters.add(typeParameterDescriptor.descriptor);
557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575
                    }
                };
            }

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

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

576 577 578
    private DeclarationDescriptor resolveParentDescriptor(PsiClass psiClass) {
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
579
            return resolveClass(containingClass);
580 581 582 583 584 585 586
        }
        
        PsiJavaFile containingFile = (PsiJavaFile) psiClass.getContainingFile();
        String packageName = containingFile.getPackageName();
        return resolveNamespace(packageName);
    }

587 588
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
589
        for (PsiTypeParameter typeParameter : typeParameters) {
590
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
591
            result.add(typeParameterDescriptor);
592 593 594 595
        }
        return result;
    }

596
    @NotNull
597
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
598
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
599
                containingDeclaration,
A
Andrey Breslav 已提交
600
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
601
                false,
602
                Variance.INVARIANT,
603 604
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
605
        );
606
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
607 608
    }

609
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
610 611 612
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
613 614 615
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            } else {
616
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
617 618 619 620 621
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
622
        } else {
623
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
624 625 626 627
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
628
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], typeVariableByPsiResolver));
629 630 631
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
632
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, typeVariableByPsiResolver));
633
                }
A
Andrey Breslav 已提交
634 635
            }
        }
636
        typeParameterDescriptor.setInitialized();
637 638
    }

639
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, TypeVariableResolver typeVariableByPsiResolver) {
640
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
641
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
642 643
            prevTypeParameters.add(psiTypeParameter.descriptor);
            initializeTypeParameter(psiTypeParameter, new TypeVariableResolverFromTypeDescriptors(prevTypeParameters, typeVariableByPsiResolver));
S
Stepan Koltsov 已提交
644
        }
A
Andrey Breslav 已提交
645 646
    }

647
    private Collection<? extends JetType> getSupertypes(PsiClassWrapper psiClass, List<TypeParameterDescriptor> typeParameters) {
648 649 650
        final List<JetType> result = new ArrayList<JetType>();

        if (psiClass.getJetClass().signature().length() > 0) {
651
            final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(typeParameters, null);
652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684
            
            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 {
685 686
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), new TypeVariableResolverFromTypeDescriptors(typeParameters, null));
687 688 689 690
        }
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
691 692 693
        return result;
    }

694
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver) {
695
        for (PsiClassType type : extendsListTypes) {
696 697 698 699 700
            PsiClass resolved = type.resolve();
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName())) {
                continue;
            }
            
701
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
702 703 704 705 706

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

707 708
    @Nullable
    public NamespaceDescriptor resolveNamespace(@NotNull String qualifiedName) {
709 710 711 712 713 714
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
            return kotlinNamespaceDescriptor;
        }

715
        PsiPackage psiPackage = findPackage(qualifiedName);
716
        if (psiPackage == null) {
717
            PsiClass psiClass = findClass(qualifiedName);
A
Andrey Breslav 已提交
718 719
            if (psiClass == null) return null;
            return resolveNamespace(psiClass);
720 721 722 723
        }
        return resolveNamespace(psiPackage);
    }

724
    public PsiClass findClass(String qualifiedName) {
725
        PsiClass original = javaFacade.findClass(qualifiedName, javaSearchScope);
M
Maxim Shafirov 已提交
726
        PsiClass altClass = altClassFinder.findClass(qualifiedName);
727 728 729 730 731 732 733 734
        if (altClass != null) {
            if (altClass instanceof ClsClassImpl) {
                altClass.putUserData(ClsClassImpl.DELEGATE_KEY, original);
            }

            return altClass;
        }
        return original;
735 736
    }

737
    /*package*/ PsiPackage findPackage(String qualifiedName) {
738 739 740
        return javaFacade.findPackage(qualifiedName);
    }

741
    private NamespaceDescriptor resolveNamespace(@NotNull PsiPackage psiPackage) {
742 743 744 745 746
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiPackage);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiPackage);
            namespaceDescriptorCache.put(psiPackage, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiPackage.getQualifiedName(), namespaceData);
747
        }
748
        return namespaceData.namespaceDescriptor;
749 750
    }

A
Andrey Breslav 已提交
751
    private NamespaceDescriptor resolveNamespace(@NotNull PsiClass psiClass) {
752 753 754 755 756
        ResolverNamespaceData namespaceData = namespaceDescriptorCache.get(psiClass);
        if (namespaceData == null) {
            namespaceData = createJavaNamespaceDescriptor(psiClass);
            namespaceDescriptorCache.put(psiClass, namespaceData);
            namespaceDescriptorCacheByFqn.put(psiClass.getQualifiedName(), namespaceData);
A
Andrey Breslav 已提交
757
        }
758
        return namespaceData.namespaceDescriptor;
A
Andrey Breslav 已提交
759 760
    }

761 762
    private ResolverNamespaceData createJavaNamespaceDescriptor(@NotNull PsiPackage psiPackage) {
        ResolverNamespaceData namespaceData = new ResolverNamespaceData();
763
        String name = psiPackage.getName();
764
        namespaceData.namespaceDescriptor = new JavaNamespaceDescriptor(
765
                resolveParentDescriptor(psiPackage),
A
Andrey Breslav 已提交
766
                Collections.<AnnotationDescriptor>emptyList(), // TODO
767
                name == null ? JAVA_ROOT : name,
768 769
                name == null ? JAVA_ROOT : psiPackage.getQualifiedName(),
                true
770
        );
771

772 773 774 775 776
        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;
777 778
    }

779 780 781 782 783 784 785 786
    private DeclarationDescriptor resolveParentDescriptor(@NotNull PsiPackage psiPackage) {
        PsiPackage parentPackage = psiPackage.getParentPackage();
        if (parentPackage == null) {
            return null;
        }
        return resolveNamespace(parentPackage);
    }

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

815 816 817 818 819 820 821 822 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
    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
848
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
849 850 851 852 853 854 855
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

857
        boolean nullable = parameter.getJetValueParameter().nullable();
858

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

862 863
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
864 865
        }
        
866 867 868 869
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
870
        JetType outType;
871
        if (typeFromAnnotation.length() > 0) {
872
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
873
        } else {
874
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
875
        }
876 877 878 879 880 881 882 883

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

884 885 886 887 888 889 890 891
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
        } else {
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
892
                    false,
893
                    nullable ? TypeUtils.makeNullableAsSpecified(outType, nullable) : outType,
894
                    hasDefaultValue,
895 896 897
                    varargElementType
            ));
        }
898 899
    }

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

903 904 905
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
906
        }
907
        Set<VariableDescriptor> r = new HashSet<VariableDescriptor>();
908

909
        resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, fieldName);
910

911 912 913 914 915 916 917
        r.addAll(namedMembers.propertyDescriptors);

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

        return r;
918 919 920
    }
    
    @NotNull
921
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass, boolean staticMembers) {
922

923 924 925 926 927 928
        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();
929
            if (namedMembers.propertyAccessors == null) {
930 931 932 933
                continue;
            }
            
            String propertyName = entry.getKey();
934

935
            resolveNamedGroupProperties(owner, scopeData, staticMembers, namedMembers, propertyName);
936
            descriptors.addAll(namedMembers.propertyDescriptors);
937
        }
938 939 940 941 942 943 944 945 946 947

        for (JetType supertype : getSupertypes(scopeData)) {
            for (DeclarationDescriptor descriptor : supertype.getMemberScope().getAllDescriptors()) {
                // TODO: ugly
                if (descriptor instanceof VariableDescriptor) {
                    descriptors.add((VariableDescriptor) descriptor);
                }
            }
        }
        
948
        return descriptors;
949
    }
950 951 952 953 954 955 956
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
        } else if (typeSource.getTypeString().length() > 0) {
            return typeSource.getTypeString();
        } else {
957
            return psiTypeToKey(typeSource.getPsiType());
958 959
        }
    }
960 961 962 963 964 965 966 967 968 969 970 971 972

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

973 974 975 976 977
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
978

979 980 981 982
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
            boolean staticMembers, NamedMembers namedMembers, String propertyName) {
983 984 985 986
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
987
        if (namedMembers.propertyAccessors == null) {
988 989 990
            namedMembers.propertyDescriptors = Collections.emptySet();
            return;
        }
991

992
        final List<TypeParameterDescriptor> classTypeParameterDescriptorInitialization = scopeData.getTypeParameters();
993

994
        TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(scopeData.getTypeParameters(), null);
995

996 997 998 999
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1000
        }
1001 1002
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1003

1004
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1005

1006 1007 1008 1009 1010 1011 1012
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
                map.put(key, value);
            }
1013

1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031
            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();
            }
1032
        }
1033

1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047
        
        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;
            }
1048

1049 1050 1051 1052 1053 1054 1055 1056 1057 1058
            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();
            }
1059

1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073
            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,
1074 1075
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1076

1077 1078 1079
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1080
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1081 1082
            }
            if (members.setter != null) {
1083
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, Collections.<AnnotationDescriptor>emptyList(), Modality.OPEN, Visibility.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1084
            }
1085

1086
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1087

1088
            List<TypeParameterDescriptor> typeParametersInitialization = new ArrayList<TypeParameterDescriptor>(0);
1089 1090 1091

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

1093
                if (anyMember == members.setter) {
1094
                    typeParametersInitialization = resolveMethodTypeParameters(method, setterDescriptor, typeVariableResolver);
1095 1096 1097 1098 1099 1100
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
1101
                    typeParametersInitialization = resolveMethodTypeParameters(method, getterDescriptor, typeVariableResolver);
1102 1103 1104
                }
            }

1105
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
1106 1107
            for (TypeParameterDescriptor typeParameter : typeParametersInitialization) {
                typeParameters.add(typeParameter);
1108 1109
            }

1110
            List<TypeParameterDescriptor> typeParametersForReceiver = new ArrayList<TypeParameterDescriptor>();
1111 1112
            typeParametersForReceiver.addAll(classTypeParameterDescriptorInitialization);
            typeParametersForReceiver.addAll(typeParametersInitialization);
1113
            TypeVariableResolver typeVariableResolverForPropertyInternals = new TypeVariableResolverFromTypeDescriptors(typeParametersForReceiver, null);
1114

1115 1116 1117 1118
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1119
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
1120 1121 1122 1123 1124 1125 1126 1127
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
            } else if (anyMember.getReceiverType().getTypeString().length() > 0) {
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
            } else {
1128
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1129 1130 1131 1132 1133 1134 1135
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1136
            );
1137 1138 1139 1140
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1141
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getOutType(), false, null));
1142 1143 1144 1145 1146
            }

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

1149
        namedMembers.propertyDescriptors = r;
1150
    }
1151

1152
    private void resolveNamedGroupFunctions(ClassOrNamespaceDescriptor owner, PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1153 1154 1155
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1156 1157
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1158

1159
        Set<NamedFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1160
        for (PsiMethodWrapper method : namedMembers.methods) {
1161 1162 1163
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(owner, psiClass,
                    typeSubstitutorForGenericSuperclasses,
                    method);
1164
            if (function != null) {
1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192
                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);
1193
            }
1194
        }
1195
        return r;
1196 1197
    }

1198
    private ResolverScopeData getResolverScopeData(@NotNull ClassOrNamespaceDescriptor owner, PsiClassWrapper psiClass) {
1199
        ResolverScopeData scopeData;
1200
        boolean staticMembers;
1201 1202
        if (owner instanceof JavaNamespaceDescriptor) {
            scopeData = namespaceDescriptorCacheByFqn.get(((JavaNamespaceDescriptor) owner).getQualifiedName());
1203
            staticMembers = true;
1204
        } else if (owner instanceof ClassDescriptor) {
1205
            scopeData = classDescriptorCache.get(psiClass.getQualifiedName());
1206
            staticMembers = false;
1207
        } else {
1208
            throw new IllegalStateException("unknown owner: " + owner.getClass().getName());
1209 1210 1211 1212 1213
        }
        if (scopeData == null) {
            throw new IllegalStateException();
        }
        
1214 1215
        if (scopeData.namedMembersMap == null) {
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(psiClass, staticMembers, scopeData.kotlin);
1216 1217
        }
        
1218
        return scopeData;
1219
    }
A
Andrey Breslav 已提交
1220

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

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

1226 1227 1228
        Map<String, NamedMembers> namedMembersMap = resolverScopeData.namedMembersMap;

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1229 1230
        if (namedMembers != null && namedMembers.methods != null) {
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(resolverScopeData);
1231

1232 1233 1234
            resolveNamedGroupFunctions(descriptor, psiClass, typeSubstitutor, namedMembers, methodName, resolverScopeData);

            return namedMembers.functionDescriptors;
1235
        } else {
1236
            return Collections.emptySet();
1237
        }
1238 1239
    }

1240
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1241 1242 1243 1244 1245 1246 1247 1248 1249
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1250 1251 1252 1253 1254 1255 1256 1257 1258 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
    
    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());
    }
1285

1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309
    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 已提交
1310
    @Nullable
1311 1312
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(ClassOrNamespaceDescriptor owner, final PsiClass psiClass, TypeSubstitutor typeSubstitutorForGenericSuperclasses, final PsiMethodWrapper method) {

1313
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1314 1315 1316
        if (returnType == null) {
            return null;
        }
1317
        FunctionDescriptorImpl functionDescriptor = methodDescriptorCache.get(method.getPsiMethod());
A
Andrey Breslav 已提交
1318
        if (functionDescriptor != null) {
1319
            if (method.getPsiMethod().getContainingClass() != psiClass) {
1320 1321
                //functionDescriptor = functionDescriptor.substitute(typeSubstitutorForGenericSuperclasses);
                throw new IllegalStateException();
A
Andrey Breslav 已提交
1322 1323 1324
            }
            return functionDescriptor;
        }
1325

1326 1327
        ResolverScopeData scopeData = getResolverScopeData(owner, new PsiClassWrapper(psiClass));

1328 1329 1330 1331 1332 1333 1334 1335 1336
        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 {
1337
            ResolverBinaryClassData classData = classDescriptorCache.get(psiClass.getQualifiedName());
1338 1339 1340 1341 1342 1343
            if (classData == null) {
                throw new IllegalStateException("classData not found by name " + psiClass.getQualifiedName());
            }
            kotlin = classData.kotlin;
        }

1344
        // TODO: ugly
1345
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1346
            return null;
1347
        }
1348

S
Stepan Koltsov 已提交
1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369
        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;
            }
        }

1370
        ClassOrNamespaceDescriptor classDescriptor;
1371
        if (scopeData instanceof ResolverBinaryClassData) {
1372
            ClassDescriptor classClassDescriptor = resolveClass(method.getPsiMethod().getContainingClass());
1373
            classDescriptor = classClassDescriptor;
1374 1375 1376
        }
        else {
            classDescriptor = resolveNamespace(method.getPsiMethod().getContainingClass());
1377
        }
1378 1379 1380
        if (classDescriptor == null) {
            return null;
        }
1381

S
Stepan Koltsov 已提交
1382
        NamedFunctionDescriptorImpl functionDescriptorImpl = new NamedFunctionDescriptorImpl(
A
Andrey Breslav 已提交
1383 1384
                owner,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
1385 1386
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1387
        );
1388
        methodDescriptorCache.put(method.getPsiMethod(), functionDescriptorImpl);
1389

1390
        final TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(classDescriptor);
1391

1392
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1393

1394
        TypeVariableResolver methodTypeVariableResolver = new TypeVariableResolverFromTypeDescriptors(methodTypeParameters, typeVariableResolverForParameters);
1395 1396


1397
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1398
        functionDescriptorImpl.initialize(
1399
                valueParameterDescriptors.receiverType,
A
Andrey Breslav 已提交
1400
                DescriptorUtils.getExpectedThisObjectIfNeeded(classDescriptor),
1401
                methodTypeParameters,
1402
                valueParameterDescriptors.descriptors,
1403
                makeReturnType(returnType, method, methodTypeVariableResolver),
1404 1405
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
                resolveVisibilityFromPsiModifiers(method.getPsiMethod())
A
Andrey Breslav 已提交
1406
        );
1407
        semanticServices.getTrace().record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1408
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
1409
        if (method.getPsiMethod().getContainingClass() != psiClass) {
1410 1411
            //substitutedFunctionDescriptor = functionDescriptorImpl.substitute(typeSubstitutorForGenericSuperclasses);
            throw new IllegalStateException();
A
Andrey Breslav 已提交
1412
        }
1413
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1414
    }
1415

1416
    public List<FunctionDescriptor> resolveMethods(PsiClass psiClass, ClassOrNamespaceDescriptor containingDeclaration) {
1417 1418
        ResolverScopeData scopeData = getResolverScopeData(containingDeclaration, new PsiClassWrapper(psiClass));

1419
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1420

1421
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1422 1423 1424 1425 1426

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

1430 1431
        return functions;
    }
1432

1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450
    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;
        }
    }

1451
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1452
            @NotNull PsiMethodWrapper method,
1453
            @NotNull DeclarationDescriptor functionDescriptor,
1454 1455
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1456
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1457
        if (method.getJetMethod().typeParameters().length() > 0) {
1458
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
1459
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor, classTypeVariableResolver);
1460
        } else {
1461
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1462
        }
1463

1464 1465 1466 1467 1468 1469 1470 1471
        initializeTypeParameters(typeParametersIntialization, classTypeVariableResolver);
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1472 1473
        return typeParameters;
    }
1474 1475

    /**
1476
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor, TypeVariableResolver)
1477
     */
1478
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature, final PsiMethod method,
1479
            final DeclarationDescriptor functionDescriptor, final TypeVariableResolver classTypeVariableResolver)
1480
    {
1481
        final List<TypeParameterDescriptorInitialization> r = new ArrayList<TypeParameterDescriptorInitialization>();
1482

1483 1484 1485
        final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
        // note changes state in this method
        final TypeVariableResolver typeVariableResolver = new TypeVariableResolverFromTypeDescriptors(previousTypeParameters, classTypeVariableResolver);
1486

1487
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(new JetSignatureExceptionsAdapter() {
1488 1489
            private int formalTypeParameterIndex = 0;
            
1490
            @Override
1491
            public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
1492
                
1493
                return new JetSignatureTypeParameterVisitor(functionDescriptor, method, name, reified, formalTypeParameterIndex++, variance, typeVariableResolver) {
1494
                    @Override
1495
                    protected void done(TypeParameterDescriptorInitialization typeParameterDescriptor) {
1496
                        r.add(typeParameterDescriptor);
1497
                        previousTypeParameters.add(typeParameterDescriptor.descriptor);
1498 1499
                    }
                };
1500

1501 1502 1503 1504 1505
            }
        });
        return r;
    }

1506 1507
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1508 1509 1510

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

S
Stepan Koltsov 已提交
1511
        JetType transformedType;
1512
        if (returnTypeFromAnnotation.length() > 0) {
1513
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1514
        } else {
1515
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1516
        }
1517 1518
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
1519 1520 1521 1522 1523
        } else {
            return transformedType;
        }
    }

1524
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1525 1526 1527 1528 1529 1530
        //TODO report error
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibility.PUBLIC :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibility.PRIVATE :
                                        (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibility.PROTECTED : Visibility.INTERNAL));
    }

1531
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1532 1533 1534 1535
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1536 1537 1538
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1539 1540 1541 1542
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1543 1544 1545 1546
            r.add(resolveClass(innerPsiClass));
        }
        return r;
    }
1547
}