JavaDescriptorResolver.java 81.5 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 25 26 27 28 29 30
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiAnnotationMemberValue;
import com.intellij.psi.PsiAnnotationMethod;
import com.intellij.psi.PsiAnnotationParameterList;
import com.intellij.psi.PsiArrayType;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiClassType;
31
import com.intellij.psi.PsiElement;
32 33 34 35 36 37 38 39 40 41 42
import com.intellij.psi.PsiEllipsisType;
import com.intellij.psi.PsiLiteralExpression;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.PsiNameValuePair;
import com.intellij.psi.PsiPackage;
import com.intellij.psi.PsiPrimitiveType;
import com.intellij.psi.PsiType;
import com.intellij.psi.PsiTypeParameter;
import com.intellij.psi.PsiTypeParameterListOwner;
43
import jet.typeinfo.TypeInfoVariance;
44 45
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.ClassOrNamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorWithVisibility;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.Modality;
import org.jetbrains.jet.lang.descriptors.ModuleDescriptor;
import org.jetbrains.jet.lang.descriptors.MutableClassDescriptorLite;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptorParent;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyGetterDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertySetterDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptorImpl;
import org.jetbrains.jet.lang.descriptors.VariableDescriptor;
import org.jetbrains.jet.lang.descriptors.Visibilities;
import org.jetbrains.jet.lang.descriptors.Visibility;
A
Andrey Breslav 已提交
74
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
75
import org.jetbrains.jet.lang.psi.JetPsiUtil;
76
import org.jetbrains.jet.lang.resolve.BindingContext;
77
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
import org.jetbrains.jet.lang.resolve.BindingTrace;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.resolve.FqName;
import org.jetbrains.jet.lang.resolve.NamespaceFactory;
import org.jetbrains.jet.lang.resolve.NamespaceFactoryImpl;
import org.jetbrains.jet.lang.resolve.OverrideResolver;
import org.jetbrains.jet.lang.resolve.constants.ByteValue;
import org.jetbrains.jet.lang.resolve.constants.CharValue;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.constants.DoubleValue;
import org.jetbrains.jet.lang.resolve.constants.FloatValue;
import org.jetbrains.jet.lang.resolve.constants.IntValue;
import org.jetbrains.jet.lang.resolve.constants.LongValue;
import org.jetbrains.jet.lang.resolve.constants.NullValue;
import org.jetbrains.jet.lang.resolve.constants.ShortValue;
import org.jetbrains.jet.lang.resolve.constants.StringValue;
94
import org.jetbrains.jet.lang.resolve.java.kt.JetClassAnnotation;
95 96 97 98 99
import org.jetbrains.jet.lang.types.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.lang.types.Variance;
S
Stepan Koltsov 已提交
100
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
101
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
102
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
103 104 105
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
106

107
import javax.inject.Inject;
108 109 110 111 112 113 114 115
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
116 117 118 119 120

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

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

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

128 129
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
130
            throw new UnsupportedOperationException();
131 132
        }

133 134
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
135
            return visitor.visitDeclarationDescriptor(this, data);
136 137 138
        }
    };

A
Andrey Breslav 已提交
139
    /*package*/ static final DeclarationDescriptor JAVA_CLASS_OBJECT = new DeclarationDescriptorImpl(null, Collections.<AnnotationDescriptor>emptyList(), "<java_class_object_emulation>") {
A
Andrey Breslav 已提交
140 141 142
        @NotNull
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
143
            throw new UnsupportedOperationException();
A
Andrey Breslav 已提交
144 145 146 147 148 149 150
        }

        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
            return visitor.visitDeclarationDescriptor(this, data);
        }
    };
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168

    private static Visibility PACKAGE_VISIBILITY = new Visibility("package", false) {
        @Override
        protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
            NamespaceDescriptor parentPackage = DescriptorUtils.getParentOfType(what, NamespaceDescriptor.class);
            NamespaceDescriptor fromPackage = DescriptorUtils.getParentOfType(from, NamespaceDescriptor.class, false);
            assert parentPackage != null;
            return parentPackage.equals(fromPackage);
        }

        @Override
        protected Integer compareTo(@NotNull Visibility visibility) {
            if (this == visibility) return 0;
            if (visibility == Visibilities.PRIVATE) return 1;
            return -1;
        }
    };

169 170 171 172
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
173

174 175
    public static class TypeParameterDescriptorInitialization {
        @NotNull
176
        private final TypeParameterDescriptorOrigin origin;
177 178 179
        @NotNull
        final TypeParameterDescriptor descriptor;
        final PsiTypeParameter psiTypeParameter;
180 181 182 183
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
184

185
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
186
            this.origin = TypeParameterDescriptorOrigin.JAVA;
187
            this.descriptor = descriptor;
188
            this.psiTypeParameter = psiTypeParameter;
189 190 191 192
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

193
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter,
194 195 196
                List<JetType> upperBoundsForKotlin, List<JetType> lowerBoundsForKotlin) {
            this.origin = TypeParameterDescriptorOrigin.KOTLIN;
            this.descriptor = descriptor;
197
            this.psiTypeParameter = psiTypeParameter;
198 199
            this.upperBoundsForKotlin = upperBoundsForKotlin;
            this.lowerBoundsForKotlin = lowerBoundsForKotlin;
200 201
        }
    }
202 203


204 205 206
    static abstract class ResolverScopeData {
        @Nullable
        final PsiClass psiClass;
207 208 209
        @Nullable
        final PsiPackage psiPackage;
        final FqName fqName;
210
        final boolean staticMembers;
211
        final boolean kotlin;
212 213
        final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;

214
        protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
215 216 217
            checkPsiClassIsNotJet(psiClass);

            this.psiClass = psiClass;
218 219 220 221 222 223 224 225 226 227 228
            this.psiPackage = psiPackage;
            this.fqName = fqName;

            if (psiClass == null && psiPackage == null) {
                throw new IllegalStateException("both psiClass and psiPackage cannot be null");
            }

            if (fqName.lastSegmentIs(JvmAbi.PACKAGE_CLASS)) {
                throw new IllegalStateException("identified cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName);
            }

229
            this.staticMembers = staticMembers;
230 231
            this.kotlin = psiClass != null &&
                    (new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS));
232 233 234
            classOrNamespaceDescriptor = descriptor;
        }

235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250
        protected ResolverScopeData(boolean negative) {
            if (!negative) {
                throw new IllegalStateException();
            }
            this.psiClass = null;
            this.psiPackage = null;
            this.fqName = null;
            this.staticMembers = false;
            this.kotlin = false;
            this.classOrNamespaceDescriptor = null;
        }

        public boolean isPositive() {
            return this.classOrNamespaceDescriptor != null;
        }

251 252 253 254 255 256 257 258 259 260
        @NotNull
        public PsiElement getPsiPackageOrPsiClass() {
            if (psiPackage != null) {
                return psiPackage;
            }
            else {
                return psiClass;
            }
        }

261
        private Map<String, NamedMembers> namedMembersMap;
262 263 264
        
        @NotNull
        public abstract List<TypeParameterDescriptor> getTypeParameters();
265
    }
A
Andrey Breslav 已提交
266

267
    /** Class with instance members */
S
Stepan Koltsov 已提交
268
    static class ResolverBinaryClassData extends ResolverScopeData {
269
        private final MutableClassDescriptorLite classDescriptor;
270

271 272
        ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull MutableClassDescriptorLite classDescriptor) {
            super(psiClass, null, fqName, false, classDescriptor);
273
            this.classDescriptor = classDescriptor;
274 275
        }

276 277 278 279 280 281 282
        private ResolverBinaryClassData(boolean negative) {
            super(negative);
            this.classDescriptor = null;
        }

        static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);

283 284 285 286 287 288 289 290 291
        List<TypeParameterDescriptorInitialization> typeParameters;

        @NotNull
        public ClassDescriptor getClassDescriptor() {
            return classDescriptor;
        }

        @NotNull
        @Override
S
Stepan Koltsov 已提交
292 293
        public List<TypeParameterDescriptor> getTypeParameters() {
            return getClassDescriptor().getTypeConstructor().getParameters();
294
        }
S
Stepan Koltsov 已提交
295

296 297
    }

298
    /** Either package or class with static members */
299 300
    static class ResolverNamespaceData extends ResolverScopeData {
        private final NamespaceDescriptor namespaceDescriptor;
301

302 303
        ResolverNamespaceData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor) {
            super(psiClass, psiPackage, fqName, true, namespaceDescriptor);
304
            this.namespaceDescriptor = namespaceDescriptor;
305
        }
306

307 308 309 310 311 312 313
        private ResolverNamespaceData(boolean negative) {
            super(negative);
            this.namespaceDescriptor = null;
        }

        static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);

314 315
        private JavaPackageScope memberScope;

316 317 318 319 320
        @NotNull
        @Override
        public List<TypeParameterDescriptor> getTypeParameters() {
            return new ArrayList<TypeParameterDescriptor>(0);
        }
321 322
    }

S
Stepan Koltsov 已提交
323 324
    protected final Map<FqName, ResolverBinaryClassData> classDescriptorCache = Maps.newHashMap();
    protected final Map<FqName, ResolverNamespaceData> namespaceDescriptorCacheByFqn = Maps.newHashMap();
325

326 327
    protected Project project;
    protected JavaSemanticServices semanticServices;
328
    private NamespaceFactory namespaceFactory;
329
    private BindingTrace trace;
S
Stepan Koltsov 已提交
330
    private PsiClassFinder psiClassFinder;
331

332 333 334 335 336
    @Inject
    public void setProject(Project project) {
        this.project = project;
    }

337 338 339 340 341
    @Inject
    public void setNamespaceFactory(NamespaceFactoryImpl namespaceFactory) {
        this.namespaceFactory = namespaceFactory;
    }

342 343
    @Inject
    public void setSemanticServices(JavaSemanticServices semanticServices) {
344 345
        this.semanticServices = semanticServices;
    }
346

347 348 349 350 351
    @Inject
    public void setTrace(BindingTrace trace) {
        this.trace = trace;
    }

S
Stepan Koltsov 已提交
352 353 354 355
    @Inject
    public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
        this.psiClassFinder = psiClassFinder;
    }
356

357

358 359

    @Nullable
360
    public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
361 362 363 364 365 366 367
        List<Runnable> tasks = Lists.newArrayList();
        ClassDescriptor clazz = resolveClass(qualifiedName, searchRule, tasks);
        for (Runnable task : tasks) {
            task.run();
        }
        return clazz;
    }
368

369
    private ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule, @NotNull List<Runnable> tasks) {
S
Stepan Koltsov 已提交
370
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
371 372 373
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
374 375 376 377 378 379

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

380
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
381 382
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
383 384
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
S
Stepan Koltsov 已提交
385 386
            }
            else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
387
                return null;
S
Stepan Koltsov 已提交
388 389
            }
            else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
390
                return kotlinClassDescriptor;
S
Stepan Koltsov 已提交
391 392
            }
            else {
393 394
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
395 396
        }

397
        // Not let's take a descriptor of a Java class
398
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
399
        if (classData == null) {
400
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
401
            if (psiClass == null) {
402 403 404 405
                ResolverBinaryClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE);
                if (oldValue != null) {
                    throw new IllegalStateException("rewrite at " + qualifiedName);
                }
406 407
                return null;
            }
408
            classData = createJavaClassDescriptor(psiClass, tasks);
409
        }
410
        return classData.classDescriptor;
411 412
    }

413
    @NotNull
414
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
415 416
        FqName fqName = new FqName(psiClass.getQualifiedName());
        if (classDescriptorCache.containsKey(fqName)) {
417 418
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
419

420 421
        checkPsiClassIsNotJet(psiClass);

422
        String name = psiClass.getName();
423
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
S
Stepan Koltsov 已提交
424
        ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
425 426 427 428 429 430 431 432

        // class may be resolved during resolution of parent
        ResolverBinaryClassData classData = classDescriptorCache.get(fqName);
        if (classData != null) {
            return classData;
        }

        classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind));
433
        classDescriptorCache.put(fqName, classData);
434
        classData.classDescriptor.setName(name);
435
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList));
436

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

S
Stepan Koltsov 已提交
439
        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData);
440 441 442 443 444 445
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
446 447 448
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
449 450 451 452 453 454 455 456 457 458
        Modality modality;
        if (classData.classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) {
            modality = Modality.FINAL;
        }
        else {
            modality = Modality.convertFromFlags(
                    psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                    !psiClass.hasModifierProperty(PsiModifier.FINAL));
        }
        classData.classDescriptor.setModality(modality);
459
        classData.classDescriptor.createTypeConstructor();
460
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
461

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

S
Stepan Koltsov 已提交
464 465 466
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
467

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

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

473
        boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC);
474
        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
475 476 477 478
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
479
            if (!psiClass.isInterface()) {
480
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
481
                        classData.classDescriptor,
A
Andrey Breslav 已提交
482
                        Collections.<AnnotationDescriptor>emptyList(),
483
                        false);
484
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), classData.classDescriptor.getVisibility(), isStatic);
485
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
486
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
487
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
488
            }
489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
            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)) {
510
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
511 512 513 514 515 516 517 518
                        }

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
519
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
520 521 522 523 524
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

525
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
526 527
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
528
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
529
            }
530 531
        }
        else {
532 533 534 535 536
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
537 538
                }

539
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
540
                        classData.classDescriptor,
A
Andrey Breslav 已提交
541
                        Collections.<AnnotationDescriptor>emptyList(), // TODO
542
                        false);
S
Stepan Koltsov 已提交
543
                String context = "constructor of class " + psiClass.getQualifiedName();
544
                ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
545
                        constructor.getParameters(),
S
Stepan Koltsov 已提交
546
                        TypeVariableResolvers.classTypeVariableResolver(classData.classDescriptor, context));
547 548 549
                if (valueParameterDescriptors.receiverType != null) {
                    throw new IllegalStateException();
                }
550
                constructorDescriptor.initialize(typeParameters, valueParameterDescriptors.descriptors,
551
                        resolveVisibilityFromPsiModifiers(psiConstructor), isStatic);
552
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
553
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
554
                trace.record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
555
            }
A
Andrey Breslav 已提交
556
        }
557

558 559 560 561
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
562

563
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
564

565
        return classData;
566 567
    }

568
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
569
        if (psiClass instanceof JetJavaMirrorMarker) {
570
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
571 572 573
        }
    }

574 575 576 577 578 579 580 581 582 583
    @Nullable
    private PsiClass getInnerClassClassObject(@NotNull PsiClass outer) {
        for (PsiClass inner : outer.getInnerClasses()) {
            if (inner.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                return inner;
            }
        }
        return null;
    }

584 585 586 587 588 589
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
590 591 592 593 594
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

595 596
        checkPsiClassIsNotJet(psiClass);

597 598
        FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
        ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT));
599

600
        classDescriptorCache.put(fqName, classData);
601 602 603 604

        classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData.classDescriptor, new ArrayList<TypeParameterDescriptor>(0)));
        classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO
        classData.classDescriptor.setModality(Modality.FINAL);
605
        classData.classDescriptor.setVisibility(containing.getVisibility());
606 607
        classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classData.classDescriptor.createTypeConstructor();
608
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
609 610 611 612

        // TODO: wrong: class objects do not need visible constructors
        ConstructorDescriptorImpl constructor = new ConstructorDescriptorImpl(classData.classDescriptor, new ArrayList<AnnotationDescriptor>(0), true);
        constructor.setReturnType(classData.classDescriptor.getDefaultType());
613
        constructor.initialize(new ArrayList<TypeParameterDescriptor>(0), new ArrayList<ValueParameterDescriptor>(0), Visibilities.PUBLIC);
614 615 616

        classData.classDescriptor.addConstructor(constructor, null);
        return classData.classDescriptor;
617 618
    }

S
Stepan Koltsov 已提交
619
    private List<TypeParameterDescriptorInitialization> createUninitializedClassTypeParameters(PsiClass psiClass, ResolverBinaryClassData classData) {
620
        JetClassAnnotation jetClassAnnotation = JetClassAnnotation.get(psiClass);
621

622 623
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
624
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
625
        }
626

627
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
628 629
    }

630
    @NotNull
631
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
632 633 634 635 636
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
637 638 639
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
640

641
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
642 643

    private boolean isJavaLangObject(JetType type) {
644 645 646
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
647 648 649
    }


650
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
651 652

        @NotNull
653
        private final PsiTypeParameterListOwner psiOwner;
654
        @NotNull
655
        private final String name;
656
        @NotNull
657
        private final TypeVariableResolver typeVariableResolver;
658 659
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
660

661 662
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
663
        {
664 665 666
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
667

668 669
            this.psiOwner = psiOwner;
            this.name = name;
670
            this.typeVariableResolver = typeVariableResolver;
671
            this.typeParameterDescriptor = typeParameterDescriptor;
672 673 674 675
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
676
        
677 678
        @Override
        public JetSignatureVisitor visitClassBound() {
679
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
680 681
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
682 683 684
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
685 686 687 688 689 690 691
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
692
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
693 694 695 696 697 698 699 700 701
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720
            PsiTypeParameter psiTypeParameter = getPsiTypeParameterByName(psiOwner, name);
            TypeParameterDescriptorInitialization typeParameterDescriptorInitialization = new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter, upperBounds, lowerBounds);
            done(typeParameterDescriptorInitialization);
        }
        
        protected abstract void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor);
    }

    private class JetSignatureTypeParametersVisitor extends JetSignatureExceptionsAdapter {
        @NotNull
        private final DeclarationDescriptor containingDeclaration;
        @NotNull
        private final PsiTypeParameterListOwner psiOwner;

        private final List<TypeParameterDescriptor> previousTypeParameters = new ArrayList<TypeParameterDescriptor>();
        // note changes state in this method
        private final TypeVariableResolver typeVariableResolver;


S
Stepan Koltsov 已提交
721
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
722 723 724
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
725 726 727 728
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
729 730 731 732 733 734 735 736 737
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
738 739 740
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
741
                    reified,
742 743
                    JetSignatureUtils.translateVariance(variance),
                    name,
744 745 746 747 748 749 750 751 752 753 754
                    formalTypeParameterIndex++);

            previousTypeParameters.add(typeParameter);

            return new JetSignatureTypeParameterVisitor(psiOwner, name, typeVariableResolver, typeParameter) {
                @Override
                protected void done(@NotNull TypeParameterDescriptorInitialization typeParameterDescriptor) {
                    r.add(typeParameterDescriptor);
                    previousTypeParameters.add(typeParameterDescriptor.descriptor);
                }
            };
755
        }
756 757
    }

758
    /**
S
Stepan Koltsov 已提交
759
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor)
760
     */
S
Stepan Koltsov 已提交
761 762 763 764
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature,
            final PsiClass clazz, final ClassDescriptor classDescriptor) {
        String context = "class " + clazz.getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classDescriptor, clazz, context) {
765 766 767 768 769 770 771 772 773 774 775
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
776 777 778
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
779 780
    }

781 782 783 784
    @NotNull
    private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull PsiClass psiClass) {
        FqName fqName = new FqName(psiClass.getQualifiedName());

785 786
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
787 788 789 790 791 792
            FqName containerFqName = new FqName(containingClass.getQualifiedName());
            ClassDescriptor clazz = resolveClass(containerFqName, DescriptorSearchRule.INCLUDE_KOTLIN);
            if (clazz == null) {
                throw new IllegalStateException("PsiClass not found by name " + containerFqName + ", required to be container declaration of " + fqName);
            }
            return clazz;
793
        }
794

795 796 797 798 799
        NamespaceDescriptor ns = resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
        if (ns == null) {
            throw new IllegalStateException("cannot resolve namespace " + fqName.parent() + ", required to be container for " + fqName);
        }
        return ns;
800 801
    }

802 803
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
804
        for (PsiTypeParameter typeParameter : typeParameters) {
805
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
806
            result.add(typeParameterDescriptor);
807 808 809 810
        }
        return result;
    }

811
    @NotNull
812
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
813
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
814
                containingDeclaration,
A
Andrey Breslav 已提交
815
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
816
                false,
817
                Variance.INVARIANT,
818 819
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
820
        );
821
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
822 823
    }

824
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
825 826 827
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
828 829
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
S
Stepan Koltsov 已提交
830 831
            }
            else {
832
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
833 834 835 836 837
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
S
Stepan Koltsov 已提交
838 839
        }
        else {
840
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
841 842 843 844
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
A
Andrey Breslav 已提交
845
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
846 847 848
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
A
Andrey Breslav 已提交
849
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
850
                }
A
Andrey Breslav 已提交
851 852
            }
        }
853
        typeParameterDescriptor.setInitialized();
854 855
    }

S
Stepan Koltsov 已提交
856
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
857
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
858
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
859
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
860 861
            initializeTypeParameter(psiTypeParameter,
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
862
        }
A
Andrey Breslav 已提交
863 864
    }

865
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ClassDescriptor classDescriptor, List<TypeParameterDescriptor> typeParameters) {
866 867
        final List<JetType> result = new ArrayList<JetType>();

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

870
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
871
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
872 873 874 875 876 877 878 879 880 881
            
            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() {
882
                    return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
883 884 885 886 887 888 889 890 891 892 893
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
894
                    return visitSuperclass();
895 896
                }
            });
S
Stepan Koltsov 已提交
897 898
        }
        else {
S
Stepan Koltsov 已提交
899 900 901
            TypeVariableResolver typeVariableResolverForSupertypes = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
            transformSupertypeList(result, psiClass.getPsiClass().getExtendsListTypes(), typeVariableResolverForSupertypes, classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
            transformSupertypeList(result, psiClass.getPsiClass().getImplementsListTypes(), typeVariableResolverForSupertypes, classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS);
902
        }
903 904 905
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
906
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
907 908 909
            }
        }
        
910 911 912
        if (result.isEmpty()) {
            result.add(JetStandardClasses.getAnyType());
        }
913 914 915
        return result;
    }

916
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
917
        for (PsiClassType type : extendsListTypes) {
918
            PsiClass resolved = type.resolve();
S
Stepan Koltsov 已提交
919
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName().getFqName())) {
920 921
                continue;
            }
922 923 924
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
925
            
926
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
927 928 929 930 931

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

932
    @Nullable
933
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
934 935 936
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
937 938
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
S
Stepan Koltsov 已提交
939 940
            }
            else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
941
                return null;
S
Stepan Koltsov 已提交
942 943
            }
            else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
944 945
                // TODO: probably this is evil
                return kotlinNamespaceDescriptor;
S
Stepan Koltsov 已提交
946 947
            }
            else {
948 949
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
950 951
        }

952 953 954
        ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(qualifiedName);
        if (namespaceData != null) {
            return namespaceData.namespaceDescriptor;
955
        }
A
Andrey Breslav 已提交
956

957 958 959
        NamespaceDescriptorParent parentNs = resolveParentNamespace(qualifiedName);
        if (parentNs == null) {
            return null;
S
Stepan Koltsov 已提交
960 961
        }

962 963
        JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
                parentNs,
964
                Collections.<AnnotationDescriptor>emptyList(), // TODO
965 966
                qualifiedName.isRoot() ? "<root>" : qualifiedName.shortName(),
                qualifiedName
967
        );
S
Stepan Koltsov 已提交
968

969 970 971 972 973 974 975 976 977 978 979 980 981 982 983
        ResolverNamespaceData scopeData = createNamespaceResolverScopeData(qualifiedName, ns);
        if (scopeData == null) {
            return null;
        }

        trace.record(BindingContext.NAMESPACE, scopeData.getPsiPackageOrPsiClass(), ns);

        ns.setMemberScope(scopeData.memberScope);

        return scopeData.namespaceDescriptor;
    }

    private NamespaceDescriptorParent resolveParentNamespace(FqName fqName) {
        if (fqName.isRoot()) {
            return FAKE_ROOT_MODULE;
S
Stepan Koltsov 已提交
984 985
        }
        else {
986 987
            return resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
        }
988 989
    }

S
Stepan Koltsov 已提交
990
    @Nullable
S
Stepan Koltsov 已提交
991
    private ResolverNamespaceData createNamespaceResolverScopeData(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
992 993 994 995 996 997
        PsiPackage psiPackage;
        PsiClass psiClass;

        lookingForPsi:
        {
            psiClass = getPsiClassForJavaPackageScope(fqName);
998
            psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
999
            if (psiClass != null || psiPackage != null) {
1000
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER);
1001 1002 1003
                break lookingForPsi;
            }

1004
            psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1005 1006 1007
            if (psiClass != null) {
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
                break lookingForPsi;
1008
            }
S
Stepan Koltsov 已提交
1009

1010 1011 1012 1013
            ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
            if (oldValue != null) {
                throw new IllegalStateException("rewrite at " + fqName);
            }
1014
            return null;
S
Stepan Koltsov 已提交
1015 1016
        }

1017
        ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
1018

1019
        namespaceData.memberScope = new JavaPackageScope(fqName, semanticServices, namespaceData);
S
Stepan Koltsov 已提交
1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042

        ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, namespaceData);
        if (oldValue != null) {
            throw new IllegalStateException("rewrite at "  + fqName);
        }

        return namespaceData;
    }

    @Nullable
    public JavaPackageScope getJavaPackageScope(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
        ResolverNamespaceData resolverNamespaceData = namespaceDescriptorCacheByFqn.get(fqName);
        if (resolverNamespaceData == null) {
            resolverNamespaceData = createNamespaceResolverScopeData(fqName, ns);
        }
        if (resolverNamespaceData == null) {
            return null;
        }
        JavaPackageScope scope = resolverNamespaceData.memberScope;
        if (scope == null) {
            throw new IllegalStateException("fqn: " + fqName);
        }
        return scope;
S
Stepan Koltsov 已提交
1043 1044
    }

S
Stepan Koltsov 已提交
1045
    @Nullable
S
Stepan Koltsov 已提交
1046
    private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
1047
        return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1048
    }
1049

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

1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092
    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
1093
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
1094 1095 1096 1097 1098 1099 1100
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

1105 1106
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
1107 1108
        }
        
1109 1110 1111 1112
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
1113
        JetType outType;
1114
        if (typeFromAnnotation.length() > 0) {
1115
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1116 1117
        }
        else {
1118
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
1119
        }
1120 1121 1122

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
1123
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
S
Stepan Koltsov 已提交
1124 1125
        }
        else {
1126 1127 1128
            varargElementType = null;
        }

1129 1130
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
S
Stepan Koltsov 已提交
1131 1132
        }
        else {
S
Stepan Koltsov 已提交
1133 1134 1135 1136

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
S
Stepan Koltsov 已提交
1137 1138
            }
            else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1139
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
S
Stepan Koltsov 已提交
1140 1141
            }
            else {
S
Stepan Koltsov 已提交
1142 1143
                transformedType = outType;
            }
1144 1145 1146 1147 1148
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
1149
                    false,
S
Stepan Koltsov 已提交
1150
                    transformedType,
1151
                    hasDefaultValue,
1152 1153 1154
                    varargElementType
            ));
        }
1155 1156
    }

1157 1158 1159 1160 1161 1162 1163
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull String fieldName, @NotNull ResolverScopeData scopeData) {

        if (scopeData.psiClass == null) {
            return Collections.emptySet();
        }

        getResolverScopeData(scopeData);
1164

1165 1166 1167
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1168 1169
        }

1170 1171
        resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, fieldName,
                "class or namespace " + scopeData.psiClass.getQualifiedName());
1172

S
Stepan Koltsov 已提交
1173
        return namedMembers.propertyDescriptors;
1174 1175 1176
    }
    
    @NotNull
1177 1178 1179
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1180

1181
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1182 1183 1184 1185
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1186

1187
            resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, propertyName, "class or namespace " + scopeData.psiClass.getQualifiedName());
1188
            descriptors.addAll(namedMembers.propertyDescriptors);
1189
        }
1190

1191
        return descriptors;
1192
    }
1193 1194 1195 1196
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
S
Stepan Koltsov 已提交
1197 1198
        }
        else if (typeSource.getTypeString().length() > 0) {
1199
            return typeSource.getTypeString();
S
Stepan Koltsov 已提交
1200 1201
        }
        else {
1202
            return psiTypeToKey(typeSource.getPsiType());
1203 1204
        }
    }
1205 1206 1207 1208

    private Object psiTypeToKey(PsiType psiType) {
        if (psiType instanceof PsiClassType) {
            return ((PsiClassType) psiType).getClassName();
S
Stepan Koltsov 已提交
1209 1210
        }
        else if (psiType instanceof PsiPrimitiveType) {
1211
            return psiType.getPresentableText();
S
Stepan Koltsov 已提交
1212 1213
        }
        else if (psiType instanceof PsiArrayType) {
1214
            return Pair.create("[", psiTypeToKey(((PsiArrayType) psiType).getComponentType()));
S
Stepan Koltsov 已提交
1215 1216
        }
        else {
1217 1218 1219 1220
            throw new IllegalStateException("" + psiType.getClass());
        }
    }

1221 1222 1223 1224 1225
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1226

1227 1228 1229
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
1230 1231 1232 1233
            @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context) {
        getResolverScopeData(scopeData);

1234 1235 1236 1237
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1238
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1239
            namedMembers.propertyAccessors = Collections.emptyList();
1240
        }
1241

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

1244 1245 1246 1247
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1248
            boolean ext;
1249
        }
1250 1251
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1252

1253
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1254

1255 1256 1257 1258 1259
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1260
                value.ext = propertyAccessor.getReceiverType() != null;
1261 1262
                map.put(key, value);
            }
1263

1264 1265 1266 1267
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1268 1269 1270 1271 1272
            if (propertyAccessor.isGetter()) {
                if (value.getter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.getter = propertyAccessor;
S
Stepan Koltsov 已提交
1273 1274
            }
            else if (propertyAccessor.isSetter()) {
1275 1276 1277 1278
                if (value.setter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.setter = propertyAccessor;
S
Stepan Koltsov 已提交
1279 1280
            }
            else if (propertyAccessor.isField()) {
1281 1282 1283 1284
                if (value.field != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.field = propertyAccessor;
S
Stepan Koltsov 已提交
1285 1286
            }
            else {
1287 1288
                throw new IllegalStateException();
            }
1289
        }
1290

1291
        
S
Stepan Koltsov 已提交
1292
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1293

1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307
        int regularProperitesCount = 0;
        for (GroupingValue members : map.values()) {
            if (!members.ext) {
                ++regularProperitesCount;
            }
        }

        for (GroupingValue members : map.values()) {

            // we cannot have more then one property with given name even if java code
            // has several fields, getters and setter of different types
            if (!members.ext && regularProperitesCount > 1) {
                continue;
            }
1308

1309
            boolean isFinal;
1310 1311
            if (!scopeData.kotlin) {
                isFinal = true;
S
Stepan Koltsov 已提交
1312 1313
            }
            else if (members.setter == null && members.getter == null) {
1314
                isFinal = false;
S
Stepan Koltsov 已提交
1315 1316
            }
            else if (members.getter != null) {
1317
                isFinal = members.getter.getMember().isFinal();
S
Stepan Koltsov 已提交
1318 1319
            }
            else if (members.setter != null) {
1320
                isFinal = members.setter.getMember().isFinal();
S
Stepan Koltsov 已提交
1321 1322
            }
            else {
1323 1324
                isFinal = false;
            }
1325

1326 1327 1328
            PropertyAccessorData anyMember;
            if (members.getter != null) {
                anyMember = members.getter;
S
Stepan Koltsov 已提交
1329 1330
            }
            else if (members.field != null) {
1331
                anyMember = members.field;
S
Stepan Koltsov 已提交
1332 1333
            }
            else if (members.setter != null) {
1334
                anyMember = members.setter;
S
Stepan Koltsov 已提交
1335 1336
            }
            else {
1337 1338
                throw new IllegalStateException();
            }
1339

1340 1341 1342
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
S
Stepan Koltsov 已提交
1343 1344
            }
            else {
1345 1346
                isVar = members.setter != null;
            }
1347 1348 1349 1350 1351 1352 1353 1354 1355 1356

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


1357 1358
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1359
                    resolveAnnotations(anyMember.getMember().psiMember),
1360
                    modality,
1361
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
1362 1363
                    isVar,
                    false,
1364 1365
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1366

1367 1368 1369
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1370
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1371 1372
            }
            if (members.setter != null) {
1373
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1374
            }
1375

1376
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1377

S
Stepan Koltsov 已提交
1378
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1379 1380 1381

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

1383
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1384
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1385 1386 1387 1388 1389 1390
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1391
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1392 1393 1394
                }
            }

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

1397 1398 1399
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1400 1401
            }
            else {
1402
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1403
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1404 1405
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1406 1407 1408 1409 1410
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
S
Stepan Koltsov 已提交
1411 1412
            }
            else if (anyMember.getReceiverType().getTypeString().length() > 0) {
1413
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1414 1415
            }
            else {
1416
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1417 1418 1419 1420 1421 1422 1423
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1424
            );
1425 1426 1427 1428
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1429
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1430 1431
            }

1432
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1433
            
S
Stepan Koltsov 已提交
1434
            propertiesFromCurrent.add(propertyDescriptor);
1435
        }
1436

S
Stepan Koltsov 已提交
1437 1438 1439 1440 1441 1442 1443 1444

        Set<PropertyDescriptor> propertiesFromSupertypes = getPropertiesFromSupertypes(scopeData, propertyName);

        final Set<VariableDescriptor> properties = Sets.newHashSet();

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

1445
            OverrideResolver.generateOverridesInFunctionGroup(propertyName, null, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
S
Stepan Koltsov 已提交
1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460
                @Override
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    properties.add((PropertyDescriptor) fakeOverride);
                }

                @Override
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
                    // nop
                }
            });
        }

        properties.addAll(propertiesFromCurrent);

        namedMembers.propertyDescriptors = properties;
1461
    }
1462

S
Stepan Koltsov 已提交
1463 1464
    private void resolveNamedGroupFunctions(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass,
            TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1465 1466 1467
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1468 1469
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1470

1471
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1472
        for (PsiMethodWrapper method : namedMembers.methods) {
S
Stepan Koltsov 已提交
1473
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(psiClass, method, scopeData);
1474
            if (function != null) {
1475
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1476 1477 1478 1479 1480 1481
            }
        }

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

1482
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1483

1484
            OverrideResolver.generateOverridesInFunctionGroup(methodName, null, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1485
                @Override
S
Stepan Koltsov 已提交
1486 1487
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1488
                }
1489 1490

                @Override
S
Stepan Koltsov 已提交
1491
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1492 1493
                    // nop
                }
1494 1495 1496 1497 1498 1499 1500 1501 1502
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1503 1504
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1505 1506
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1507
                r.add((SimpleFunctionDescriptor) function);
1508
            }
1509
        }
1510
        return r;
1511 1512
    }

S
Stepan Koltsov 已提交
1513 1514 1515 1516 1517 1518 1519 1520 1521 1522
    private Set<PropertyDescriptor> getPropertiesFromSupertypes(ResolverScopeData scopeData, String propertyName) {
        Set<PropertyDescriptor> r = new HashSet<PropertyDescriptor>();
        for (JetType supertype : getSupertypes(scopeData)) {
            for (VariableDescriptor property : supertype.getMemberScope().getProperties(propertyName)) {
                r.add((PropertyDescriptor) property);
            }
        }
        return r;
    }

1523
    private void getResolverScopeData(@NotNull ResolverScopeData scopeData) {
1524
        if (scopeData.namedMembersMap == null) {
1525
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(scopeData);
1526 1527
        }
    }
A
Andrey Breslav 已提交
1528

A
Andrey Breslav 已提交
1529
    @NotNull
1530
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull String methodName, @NotNull ResolverScopeData scopeData) {
A
Andrey Breslav 已提交
1531

1532
        getResolverScopeData(scopeData);
1533

1534
        Map<String, NamedMembers> namedMembersMap = scopeData.namedMembersMap;
1535 1536

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1537
        if (namedMembers != null && namedMembers.methods != null) {
1538
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(scopeData);
1539

1540
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, typeSubstitutor, namedMembers, methodName, scopeData);
1541 1542

            return namedMembers.functionDescriptors;
S
Stepan Koltsov 已提交
1543 1544
        }
        else {
1545
            return Collections.emptySet();
1546
        }
1547 1548
    }

1549
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1550 1551 1552 1553 1554 1555 1556 1557 1558
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1559

1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570
    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;
S
Stepan Koltsov 已提交
1571 1572
            }
            else if (meaning.kind == JvmMethodParameterKind.REGULAR) {
1573
                result.add(meaning.valueParameterDescriptor);
S
Stepan Koltsov 已提交
1574 1575
            }
            else if (meaning.kind == JvmMethodParameterKind.RECEIVER) {
1576 1577 1578 1579 1580 1581 1582 1583 1584 1585
                if (receiverType != null) {
                    throw new IllegalStateException("more then one receiver");
                }
                --indexDelta;
                receiverType = meaning.receiverType;
            }
        }
        return new ValueParameterDescriptors(receiverType, result);
    }

A
Andrey Breslav 已提交
1586
    @Nullable
1587
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(
S
Stepan Koltsov 已提交
1588
            @NotNull final PsiClass psiClass, final PsiMethodWrapper method,
1589 1590 1591
            @NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1592

1593
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1594 1595 1596
        if (returnType == null) {
            return null;
        }
1597

1598
        // TODO: ugly
1599
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1600
            return null;
1601
        }
1602

S
Stepan Koltsov 已提交
1603
        if (scopeData.kotlin) {
S
Stepan Koltsov 已提交
1604 1605 1606 1607 1608 1609 1610
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1611
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
S
Stepan Koltsov 已提交
1612
                scopeData.classOrNamespaceDescriptor,
1613
                resolveAnnotations(method.getPsiMethod()),
1614 1615
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1616
        );
1617

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

S
Stepan Koltsov 已提交
1620
        final TypeVariableResolver typeVariableResolverForParameters = TypeVariableResolvers.classTypeVariableResolver(scopeData.classOrNamespaceDescriptor, context);
1621

1622
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1623

S
Stepan Koltsov 已提交
1624
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1625 1626


1627
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1628
        functionDescriptorImpl.initialize(
1629
                valueParameterDescriptors.receiverType,
S
Stepan Koltsov 已提交
1630
                DescriptorUtils.getExpectedThisObjectIfNeeded(scopeData.classOrNamespaceDescriptor),
1631
                methodTypeParameters,
1632
                valueParameterDescriptors.descriptors,
1633
                makeReturnType(returnType, method, methodTypeVariableResolver),
1634
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
1635 1636
                resolveVisibilityFromPsiModifiers(method.getPsiMethod()),
                /*isInline = */ false
A
Andrey Breslav 已提交
1637
        );
1638
        trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
1639
        BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1640
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1641 1642
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1643
        }
1644
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1645
    }
1646

1647
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
1648 1649 1650
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
1651
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation, tasks);
1652 1653 1654 1655 1656 1657 1658
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

1659 1660 1661 1662 1663 1664 1665 1666 1667
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner) {
        List<Runnable> tasks = Lists.newArrayList();
        List<AnnotationDescriptor> annotations = resolveAnnotations(owner, tasks);
        for (Runnable task : tasks) {
            task.run();
        }
        return annotations;
    }

1668
    @Nullable
1669 1670
    private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation, @NotNull List<Runnable> taskList) {
        final AnnotationDescriptor annotation = new AnnotationDescriptor();
1671 1672

        String qname = psiAnnotation.getQualifiedName();
S
Stepan Koltsov 已提交
1673
        if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName())) {
1674 1675 1676 1677
            // TODO
            return null;
        }

1678
        final ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
1679 1680 1681
        if (clazz == null) {
            return null;
        }
1682
        taskList.add(new Runnable() {
1683
            @Override
1684 1685
            public void run() {
                annotation.setAnnotationType(clazz.getDefaultType());
1686
            }
1687
        });
1688
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1689 1690 1691 1692

        PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();
        for (PsiNameValuePair psiNameValuePair : parameterList.getAttributes()) {
            PsiAnnotationMemberValue value = psiNameValuePair.getValue();
1693 1694 1695 1696
            if (!(value instanceof PsiLiteralExpression)) {
                // todo
                continue;
            }
1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718
            Object literalValue = ((PsiLiteralExpression) value).getValue();
            if(literalValue instanceof String)
                valueArguments.add(new StringValue((String) literalValue));
            else if(literalValue instanceof Byte)
                valueArguments.add(new ByteValue((Byte) literalValue));
            else if(literalValue instanceof Short)
                valueArguments.add(new ShortValue((Short) literalValue));
            else if(literalValue instanceof Character)
                valueArguments.add(new CharValue((Character) literalValue));
            else if(literalValue instanceof Integer)
                valueArguments.add(new IntValue((Integer) literalValue));
            else if(literalValue instanceof Long)
                valueArguments.add(new LongValue((Long) literalValue));
            else if(literalValue instanceof Float)
                valueArguments.add(new FloatValue((Float) literalValue));
            else if(literalValue instanceof Double)
                valueArguments.add(new DoubleValue((Double) literalValue));
            else if(literalValue == null)
                valueArguments.add(NullValue.NULL);
        }

        annotation.setValueArguments(valueArguments); // TODO
1719 1720 1721
        return annotation;
    }

1722 1723 1724
    public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1725

1726
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1727

1728
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1729 1730 1731 1732

        for (Map.Entry<String, NamedMembers> entry : scopeData.namedMembersMap.entrySet()) {
            String methodName = entry.getKey();
            NamedMembers namedMembers = entry.getValue();
1733
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, substitutorForGenericSupertypes, namedMembers, methodName, scopeData);
1734
            functions.addAll(namedMembers.functionDescriptors);
1735
        }
1736

1737 1738
        return functions;
    }
1739

1740 1741 1742
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
S
Stepan Koltsov 已提交
1743 1744
        }
        else if (scope instanceof ResolverNamespaceData) {
1745
            return Collections.emptyList();
S
Stepan Koltsov 已提交
1746 1747
        }
        else {
1748 1749 1750 1751 1752
            throw new IllegalStateException();
        }
    }

    private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
1753 1754
        if (scopeData instanceof ResolverBinaryClassData) {
            return createSubstitutorForGenericSupertypes(((ResolverBinaryClassData) scopeData).getClassDescriptor());
S
Stepan Koltsov 已提交
1755 1756
        }
        else {
1757 1758 1759 1760
            return TypeSubstitutor.EMPTY;
        }
    }

1761
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1762
            @NotNull PsiMethodWrapper method,
1763
            @NotNull DeclarationDescriptor functionDescriptor,
1764 1765
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1766
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1767
        if (method.getJetMethod().typeParameters().length() > 0) {
1768
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1769
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
S
Stepan Koltsov 已提交
1770 1771
        }
        else {
1772
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1773
        }
1774

S
Stepan Koltsov 已提交
1775 1776
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1777 1778 1779 1780 1781 1782 1783
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1784 1785
        return typeParameters;
    }
1786 1787

    /**
S
Stepan Koltsov 已提交
1788
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1789
     */
S
Stepan Koltsov 已提交
1790 1791
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1792
    {
S
Stepan Koltsov 已提交
1793 1794
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1795 1796
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1797 1798
    }

1799 1800
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1801 1802 1803

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

S
Stepan Koltsov 已提交
1804
        JetType transformedType;
1805
        if (returnTypeFromAnnotation.length() > 0) {
1806
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1807 1808
        }
        else {
1809
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1810
        }
1811 1812
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1813 1814
        }
        else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1815
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
S
Stepan Koltsov 已提交
1816 1817
        }
        else {
1818 1819 1820 1821
            return transformedType;
        }
    }

1822
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1823
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
1824 1825 1826 1827
               (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
                (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibilities.PROTECTED :
                 //Visibilities.PUBLIC));
                 PACKAGE_VISIBILITY));
1828 1829
    }

1830
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1831 1832 1833 1834
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1835 1836 1837
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1838 1839 1840 1841
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1842 1843 1844
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1845
            r.add(resolveClass(new FqName(innerPsiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN));
1846 1847 1848
        }
        return r;
    }
1849
}