JavaDescriptorResolver.java 82.4 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 360 361 362 363 364 365 366 367
    @Nullable
    private ClassDescriptor resolveJavaLangObject() {
        ClassDescriptor clazz = resolveClass(JdkNames.JL_OBJECT.getFqName(), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
        if (clazz == null) {
            // TODO: warning
        }
        return clazz;
    }

368
    @Nullable
369
    public ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
370 371 372 373 374 375 376
        List<Runnable> tasks = Lists.newArrayList();
        ClassDescriptor clazz = resolveClass(qualifiedName, searchRule, tasks);
        for (Runnable task : tasks) {
            task.run();
        }
        return clazz;
    }
377

378
    private ClassDescriptor resolveClass(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule, @NotNull List<Runnable> tasks) {
S
Stepan Koltsov 已提交
379
        if (qualifiedName.getFqName().endsWith(JvmAbi.TRAIT_IMPL_SUFFIX)) {
380 381 382
            // TODO: only if -$$TImpl class is created by Kotlin
            return null;
        }
383 384 385 386 387 388

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

389
        // First, let's check that this is a real Java class, not a Java's view on a Kotlin class:
390 391
        ClassDescriptor kotlinClassDescriptor = semanticServices.getKotlinClassDescriptor(qualifiedName);
        if (kotlinClassDescriptor != null) {
392 393
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
S
Stepan Koltsov 已提交
394 395
            }
            else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
396
                return null;
S
Stepan Koltsov 已提交
397 398
            }
            else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
399
                return kotlinClassDescriptor;
S
Stepan Koltsov 已提交
400 401
            }
            else {
402 403
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
404 405
        }

406
        // Not let's take a descriptor of a Java class
407
        ResolverBinaryClassData classData = classDescriptorCache.get(qualifiedName);
408
        if (classData == null) {
409
            PsiClass psiClass = psiClassFinder.findPsiClass(qualifiedName, PsiClassFinder.RuntimeClassesHandleMode.THROW);
410
            if (psiClass == null) {
411 412 413 414
                ResolverBinaryClassData oldValue = classDescriptorCache.put(qualifiedName, ResolverBinaryClassData.NEGATIVE);
                if (oldValue != null) {
                    throw new IllegalStateException("rewrite at " + qualifiedName);
                }
415 416
                return null;
            }
417
            classData = createJavaClassDescriptor(psiClass, tasks);
418
        }
419
        return classData.classDescriptor;
420 421
    }

422
    @NotNull
423
    private ResolverBinaryClassData createJavaClassDescriptor(@NotNull final PsiClass psiClass, List<Runnable> taskList) {
424 425
        FqName fqName = new FqName(psiClass.getQualifiedName());
        if (classDescriptorCache.containsKey(fqName)) {
426 427
            throw new IllegalStateException(psiClass.getQualifiedName());
        }
A
Andrey Breslav 已提交
428

429 430
        checkPsiClassIsNotJet(psiClass);

431
        String name = psiClass.getName();
432
        ClassKind kind = psiClass.isInterface() ? (psiClass.isAnnotationType() ? ClassKind.ANNOTATION_CLASS : ClassKind.TRAIT) : ClassKind.CLASS;
S
Stepan Koltsov 已提交
433
        ClassOrNamespaceDescriptor containingDeclaration = resolveParentDescriptor(psiClass);
434 435 436 437 438 439 440 441

        // 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));
442
        classDescriptorCache.put(fqName, classData);
443
        classData.classDescriptor.setName(name);
444
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList));
445

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

S
Stepan Koltsov 已提交
448
        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData);
449 450 451 452 453 454
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
455 456 457
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
458 459 460 461 462 463 464 465 466 467
        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);
468
        classData.classDescriptor.createTypeConstructor();
469
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
470

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

S
Stepan Koltsov 已提交
473 474 475
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
476

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

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

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

                        valueParameters.add(new ValueParameterDescriptorImpl(
                                constructorDescriptor,
                                i,
                                Collections.<AnnotationDescriptor>emptyList(),
                                method.getName(),
                                false,
528
                                semanticServices.getTypeTransformer().transformToType(returnType, resolverForTypeParameters),
529 530 531 532 533
                                annotationMethod.getDefaultValue() != null,
                                varargElementType));
                    }
                }

534
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
535 536
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
537
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
538
            }
539 540
        }
        else {
541 542 543 544 545
            for (PsiMethod psiConstructor : psiConstructors) {
                PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

                if (constructor.getJetConstructor().hidden()) {
                    continue;
546 547
                }

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

567 568 569 570
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
571

572
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
573

574
        return classData;
575 576
    }

577
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
578
        if (psiClass instanceof JetJavaMirrorMarker) {
579
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
580 581 582
        }
    }

583 584 585 586 587 588 589 590 591 592
    @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;
    }

593 594 595 596 597 598
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
599 600 601 602 603
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

604 605
        checkPsiClassIsNotJet(psiClass);

606 607
        FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
        ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT));
608

609
        classDescriptorCache.put(fqName, classData);
610

611
        classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData, new ArrayList<TypeParameterDescriptor>(0)));
612 613
        classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO
        classData.classDescriptor.setModality(Modality.FINAL);
614
        classData.classDescriptor.setVisibility(containing.getVisibility());
615 616
        classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classData.classDescriptor.createTypeConstructor();
617
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
618 619 620 621

        // 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());
622
        constructor.initialize(new ArrayList<TypeParameterDescriptor>(0), new ArrayList<ValueParameterDescriptor>(0), Visibilities.PUBLIC);
623 624 625

        classData.classDescriptor.addConstructor(constructor, null);
        return classData.classDescriptor;
626 627
    }

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

631 632
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
633
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
634
        }
635

636
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
637 638
    }

639
    @NotNull
640
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
641 642 643 644 645
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
646 647 648
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
649

650
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
651 652

    private boolean isJavaLangObject(JetType type) {
653 654 655
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
656 657 658
    }


659
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
660 661

        @NotNull
662
        private final PsiTypeParameterListOwner psiOwner;
663
        @NotNull
664
        private final String name;
665
        @NotNull
666
        private final TypeVariableResolver typeVariableResolver;
667 668
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
669

670 671
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
672
        {
673 674 675
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
676

677 678
            this.psiOwner = psiOwner;
            this.name = name;
679
            this.typeVariableResolver = typeVariableResolver;
680
            this.typeParameterDescriptor = typeParameterDescriptor;
681 682 683 684
        }

        List<JetType> upperBounds = new ArrayList<JetType>();
        List<JetType> lowerBounds = new ArrayList<JetType>();
S
Stepan Koltsov 已提交
685
        
686 687
        @Override
        public JetSignatureVisitor visitClassBound() {
688
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
689 690
                @Override
                protected void done(@NotNull JetType jetType) {
S
Stepan Koltsov 已提交
691 692 693
                    if (isJavaLangObject(jetType)) {
                        return;
                    }
694 695 696 697 698 699 700
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
701
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
702 703 704 705 706 707 708 709 710
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

        @Override
        public void visitFormalTypeParameterEnd() {
711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729
            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 已提交
730
        private JetSignatureTypeParametersVisitor(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameterListOwner psiOwner, @NotNull String context) {
731 732 733
            this.containingDeclaration = containingDeclaration;
            this.psiOwner = psiOwner;

S
Stepan Koltsov 已提交
734 735 736 737
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
738 739 740 741 742 743 744 745 746
        }

        private int formalTypeParameterIndex = 0;


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

        @Override
        public JetSignatureVisitor visitFormalTypeParameter(final String name, final TypeInfoVariance variance, boolean reified) {
747 748 749
            TypeParameterDescriptor typeParameter = TypeParameterDescriptor.createForFurtherModification(
                    containingDeclaration,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO: wrong
750
                    reified,
751 752
                    JetSignatureUtils.translateVariance(variance),
                    name,
753 754 755 756 757 758 759 760 761 762 763
                    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);
                }
            };
764
        }
765 766
    }

767
    /**
S
Stepan Koltsov 已提交
768
     * @see #resolveMethodTypeParametersFromJetSignature(String, com.intellij.psi.PsiMethod, org.jetbrains.jet.lang.descriptors.DeclarationDescriptor)
769
     */
S
Stepan Koltsov 已提交
770 771 772 773
    private List<TypeParameterDescriptorInitialization> resolveClassTypeParametersFromJetSignature(String jetSignature,
            final PsiClass clazz, final ClassDescriptor classDescriptor) {
        String context = "class " + clazz.getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(classDescriptor, clazz, context) {
774 775 776 777 778 779 780 781 782 783 784
            @Override
            public JetSignatureVisitor visitSuperclass() {
                // TODO
                return new JetSignatureAdapter();
            }

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
785 786 787
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
788 789
    }

790 791 792 793
    @NotNull
    private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull PsiClass psiClass) {
        FqName fqName = new FqName(psiClass.getQualifiedName());

794 795
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
796 797 798 799 800 801
            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;
802
        }
803

804 805 806 807 808
        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;
809 810
    }

811 812
    private List<TypeParameterDescriptorInitialization> makeUninitializedTypeParameters(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter[] typeParameters) {
        List<TypeParameterDescriptorInitialization> result = Lists.newArrayList();
813
        for (PsiTypeParameter typeParameter : typeParameters) {
814
            TypeParameterDescriptorInitialization typeParameterDescriptor = makeUninitializedTypeParameter(containingDeclaration, typeParameter);
A
Andrey Breslav 已提交
815
            result.add(typeParameterDescriptor);
816 817 818 819
        }
        return result;
    }

820
    @NotNull
821
    private TypeParameterDescriptorInitialization makeUninitializedTypeParameter(@NotNull DeclarationDescriptor containingDeclaration, @NotNull PsiTypeParameter psiTypeParameter) {
822
        TypeParameterDescriptor typeParameterDescriptor = TypeParameterDescriptor.createForFurtherModification(
823
                containingDeclaration,
A
Andrey Breslav 已提交
824
                Collections.<AnnotationDescriptor>emptyList(), // TODO
A
Andrey Breslav 已提交
825
                false,
826
                Variance.INVARIANT,
827 828
                psiTypeParameter.getName(),
                psiTypeParameter.getIndex()
829
        );
830
        return new TypeParameterDescriptorInitialization(typeParameterDescriptor, psiTypeParameter);
831 832
    }

833
    private void initializeTypeParameter(TypeParameterDescriptorInitialization typeParameter, TypeVariableResolver typeVariableByPsiResolver) {
834 835 836
        TypeParameterDescriptor typeParameterDescriptor = typeParameter.descriptor;
        if (typeParameter.origin == TypeParameterDescriptorOrigin.KOTLIN) {
            List<?> upperBounds = typeParameter.upperBoundsForKotlin;
837 838
            if (upperBounds.size() == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
S
Stepan Koltsov 已提交
839 840
            }
            else {
841
                for (JetType upperBound : typeParameter.upperBoundsForKotlin) {
842 843 844 845 846
                    typeParameterDescriptor.addUpperBound(upperBound);
                }
            }

            // TODO: lower bounds
S
Stepan Koltsov 已提交
847 848
        }
        else {
849
            PsiClassType[] referencedTypes = typeParameter.psiTypeParameter.getExtendsList().getReferencedTypes();
850 851 852 853
            if (referencedTypes.length == 0){
                typeParameterDescriptor.addUpperBound(JetStandardClasses.getNullableAnyType());
            }
            else if (referencedTypes.length == 1) {
A
Andrey Breslav 已提交
854
                typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedTypes[0], JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
855 856 857
            }
            else {
                for (PsiClassType referencedType : referencedTypes) {
A
Andrey Breslav 已提交
858
                    typeParameterDescriptor.addUpperBound(semanticServices.getTypeTransformer().transformToType(referencedType, JavaTypeTransformer.TypeUsage.UPPER_BOUND, typeVariableByPsiResolver));
859
                }
A
Andrey Breslav 已提交
860 861
            }
        }
862
        typeParameterDescriptor.setInitialized();
863 864
    }

S
Stepan Koltsov 已提交
865
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
866
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
867
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
868
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
869 870
            initializeTypeParameter(psiTypeParameter,
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
871
        }
A
Andrey Breslav 已提交
872 873
    }

874 875 876
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ResolverBinaryClassData classData, List<TypeParameterDescriptor> typeParameters) {
        ClassDescriptor classDescriptor = classData.classDescriptor;

877 878
        final List<JetType> result = new ArrayList<JetType>();

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

881
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
882
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
883 884 885 886 887 888 889 890 891 892
            
            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() {
893
                    return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
894 895 896 897 898 899 900 901 902 903 904
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
905
                    return visitSuperclass();
906 907
                }
            });
S
Stepan Koltsov 已提交
908 909
        }
        else {
S
Stepan Koltsov 已提交
910 911 912
            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);
913
        }
914 915 916
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
917
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
918 919 920
            }
        }
        
921
        if (result.isEmpty()) {
922 923 924 925 926 927 928 929 930 931 932 933 934 935 936
            if (classData.kotlin
                    || psiClass.getQualifiedName().equals(JdkNames.JL_OBJECT.getFqName().getFqName())
                    // TODO: annotations
                    || classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) {
                result.add(JetStandardClasses.getAnyType());
            }
            else {
                ClassDescriptor object = resolveJavaLangObject();
                if (object != null) {
                    result.add(object.getDefaultType());
                }
                else {
                    result.add(JetStandardClasses.getAnyType());
                }
            }
937
        }
938 939 940
        return result;
    }

941
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
942
        for (PsiClassType type : extendsListTypes) {
943
            PsiClass resolved = type.resolve();
S
Stepan Koltsov 已提交
944
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName().getFqName())) {
945 946
                continue;
            }
947 948 949
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
950
            
951
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, typeVariableResolver);
952 953 954 955 956

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

957
    @Nullable
958
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
959 960 961
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
962 963
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
S
Stepan Koltsov 已提交
964 965
            }
            else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
966
                return null;
S
Stepan Koltsov 已提交
967 968
            }
            else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
969 970
                // TODO: probably this is evil
                return kotlinNamespaceDescriptor;
S
Stepan Koltsov 已提交
971 972
            }
            else {
973 974
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
975 976
        }

977 978 979
        ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(qualifiedName);
        if (namespaceData != null) {
            return namespaceData.namespaceDescriptor;
980
        }
A
Andrey Breslav 已提交
981

982 983 984
        NamespaceDescriptorParent parentNs = resolveParentNamespace(qualifiedName);
        if (parentNs == null) {
            return null;
S
Stepan Koltsov 已提交
985 986
        }

987 988
        JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
                parentNs,
989
                Collections.<AnnotationDescriptor>emptyList(), // TODO
990 991
                qualifiedName.isRoot() ? "<root>" : qualifiedName.shortName(),
                qualifiedName
992
        );
S
Stepan Koltsov 已提交
993

994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008
        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 已提交
1009 1010
        }
        else {
1011 1012
            return resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
        }
1013 1014
    }

S
Stepan Koltsov 已提交
1015
    @Nullable
S
Stepan Koltsov 已提交
1016
    private ResolverNamespaceData createNamespaceResolverScopeData(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
1017 1018 1019 1020 1021 1022
        PsiPackage psiPackage;
        PsiClass psiClass;

        lookingForPsi:
        {
            psiClass = getPsiClassForJavaPackageScope(fqName);
1023
            psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
1024
            if (psiClass != null || psiPackage != null) {
1025
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER);
1026 1027 1028
                break lookingForPsi;
            }

1029
            psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1030 1031 1032
            if (psiClass != null) {
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
                break lookingForPsi;
1033
            }
S
Stepan Koltsov 已提交
1034

1035 1036 1037 1038
            ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
            if (oldValue != null) {
                throw new IllegalStateException("rewrite at " + fqName);
            }
1039
            return null;
S
Stepan Koltsov 已提交
1040 1041
        }

1042
        ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
1043

1044
        namespaceData.memberScope = new JavaPackageScope(fqName, semanticServices, namespaceData);
S
Stepan Koltsov 已提交
1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067

        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 已提交
1068 1069
    }

S
Stepan Koltsov 已提交
1070
    @Nullable
S
Stepan Koltsov 已提交
1071
    private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
1072
        return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1073
    }
1074

1075 1076 1077 1078 1079 1080 1081 1082 1083
    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;
        }
    }
1084

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117
    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
1118
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
1119 1120 1121 1122 1123 1124 1125
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

1130 1131
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
1132 1133
        }
        
1134 1135 1136 1137
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
1138
        JetType outType;
1139
        if (typeFromAnnotation.length() > 0) {
1140
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1141 1142
        }
        else {
1143
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
1144
        }
1145 1146 1147

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
1148
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
S
Stepan Koltsov 已提交
1149 1150
        }
        else {
1151 1152 1153
            varargElementType = null;
        }

1154 1155
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
S
Stepan Koltsov 已提交
1156 1157
        }
        else {
S
Stepan Koltsov 已提交
1158 1159 1160 1161

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
S
Stepan Koltsov 已提交
1162 1163
            }
            else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1164
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
S
Stepan Koltsov 已提交
1165 1166
            }
            else {
S
Stepan Koltsov 已提交
1167 1168
                transformedType = outType;
            }
1169 1170 1171 1172 1173
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
1174
                    false,
S
Stepan Koltsov 已提交
1175
                    transformedType,
1176
                    hasDefaultValue,
1177 1178 1179
                    varargElementType
            ));
        }
1180 1181
    }

1182 1183 1184 1185 1186 1187 1188
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull String fieldName, @NotNull ResolverScopeData scopeData) {

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

        getResolverScopeData(scopeData);
1189

1190 1191 1192
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1193 1194
        }

1195 1196
        resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, fieldName,
                "class or namespace " + scopeData.psiClass.getQualifiedName());
1197

S
Stepan Koltsov 已提交
1198
        return namedMembers.propertyDescriptors;
1199 1200 1201
    }
    
    @NotNull
1202 1203 1204
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1205

1206
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1207 1208 1209 1210
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1211

1212
            resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, propertyName, "class or namespace " + scopeData.psiClass.getQualifiedName());
1213
            descriptors.addAll(namedMembers.propertyDescriptors);
1214
        }
1215

1216
        return descriptors;
1217
    }
1218 1219 1220 1221
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
S
Stepan Koltsov 已提交
1222 1223
        }
        else if (typeSource.getTypeString().length() > 0) {
1224
            return typeSource.getTypeString();
S
Stepan Koltsov 已提交
1225 1226
        }
        else {
1227
            return psiTypeToKey(typeSource.getPsiType());
1228 1229
        }
    }
1230 1231 1232 1233

    private Object psiTypeToKey(PsiType psiType) {
        if (psiType instanceof PsiClassType) {
            return ((PsiClassType) psiType).getClassName();
S
Stepan Koltsov 已提交
1234 1235
        }
        else if (psiType instanceof PsiPrimitiveType) {
1236
            return psiType.getPresentableText();
S
Stepan Koltsov 已提交
1237 1238
        }
        else if (psiType instanceof PsiArrayType) {
1239
            return Pair.create("[", psiTypeToKey(((PsiArrayType) psiType).getComponentType()));
S
Stepan Koltsov 已提交
1240 1241
        }
        else {
1242 1243 1244 1245
            throw new IllegalStateException("" + psiType.getClass());
        }
    }

1246 1247 1248 1249 1250
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1251

1252 1253 1254
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
1255 1256 1257 1258
            @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context) {
        getResolverScopeData(scopeData);

1259 1260 1261 1262
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1263
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1264
            namedMembers.propertyAccessors = Collections.emptyList();
1265
        }
1266

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

1269 1270 1271 1272
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1273
            boolean ext;
1274
        }
1275 1276
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1277

1278
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1279

1280 1281 1282 1283 1284
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1285
                value.ext = propertyAccessor.getReceiverType() != null;
1286 1287
                map.put(key, value);
            }
1288

1289 1290 1291 1292
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1293 1294 1295 1296 1297
            if (propertyAccessor.isGetter()) {
                if (value.getter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.getter = propertyAccessor;
S
Stepan Koltsov 已提交
1298 1299
            }
            else if (propertyAccessor.isSetter()) {
1300 1301 1302 1303
                if (value.setter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.setter = propertyAccessor;
S
Stepan Koltsov 已提交
1304 1305
            }
            else if (propertyAccessor.isField()) {
1306 1307 1308 1309
                if (value.field != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.field = propertyAccessor;
S
Stepan Koltsov 已提交
1310 1311
            }
            else {
1312 1313
                throw new IllegalStateException();
            }
1314
        }
1315

1316
        
S
Stepan Koltsov 已提交
1317
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1318

1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332
        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;
            }
1333

1334
            boolean isFinal;
1335 1336
            if (!scopeData.kotlin) {
                isFinal = true;
S
Stepan Koltsov 已提交
1337 1338
            }
            else if (members.setter == null && members.getter == null) {
1339
                isFinal = false;
S
Stepan Koltsov 已提交
1340 1341
            }
            else if (members.getter != null) {
1342
                isFinal = members.getter.getMember().isFinal();
S
Stepan Koltsov 已提交
1343 1344
            }
            else if (members.setter != null) {
1345
                isFinal = members.setter.getMember().isFinal();
S
Stepan Koltsov 已提交
1346 1347
            }
            else {
1348 1349
                isFinal = false;
            }
1350

1351 1352 1353
            PropertyAccessorData anyMember;
            if (members.getter != null) {
                anyMember = members.getter;
S
Stepan Koltsov 已提交
1354 1355
            }
            else if (members.field != null) {
1356
                anyMember = members.field;
S
Stepan Koltsov 已提交
1357 1358
            }
            else if (members.setter != null) {
1359
                anyMember = members.setter;
S
Stepan Koltsov 已提交
1360 1361
            }
            else {
1362 1363
                throw new IllegalStateException();
            }
1364

1365 1366 1367
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
S
Stepan Koltsov 已提交
1368 1369
            }
            else {
1370 1371
                isVar = members.setter != null;
            }
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381

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


1382 1383
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1384
                    resolveAnnotations(anyMember.getMember().psiMember),
1385
                    modality,
1386
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
1387 1388
                    isVar,
                    false,
1389 1390
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1391

1392 1393 1394
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1395
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1396 1397
            }
            if (members.setter != null) {
1398
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1399
            }
1400

1401
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1402

S
Stepan Koltsov 已提交
1403
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1404 1405 1406

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

1408
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1409
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1410 1411 1412 1413 1414 1415
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1416
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1417 1418 1419
                }
            }

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

1422 1423 1424
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1425 1426
            }
            else {
1427
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1428
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1429 1430
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1431 1432 1433 1434 1435
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
S
Stepan Koltsov 已提交
1436 1437
            }
            else if (anyMember.getReceiverType().getTypeString().length() > 0) {
1438
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1439 1440
            }
            else {
1441
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1442 1443 1444 1445 1446 1447 1448
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1449
            );
1450 1451 1452 1453
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1454
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1455 1456
            }

1457
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1458
            
S
Stepan Koltsov 已提交
1459
            propertiesFromCurrent.add(propertyDescriptor);
1460
        }
1461

S
Stepan Koltsov 已提交
1462 1463 1464 1465 1466 1467 1468 1469

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

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

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

1470
            OverrideResolver.generateOverridesInFunctionGroup(propertyName, null, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
S
Stepan Koltsov 已提交
1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485
                @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;
1486
    }
1487

S
Stepan Koltsov 已提交
1488 1489
    private void resolveNamedGroupFunctions(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass,
            TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1490 1491 1492
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1493 1494
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1495

1496
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1497
        for (PsiMethodWrapper method : namedMembers.methods) {
S
Stepan Koltsov 已提交
1498
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(psiClass, method, scopeData);
1499
            if (function != null) {
1500
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1501 1502 1503 1504 1505 1506
            }
        }

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

1507
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1508

1509
            OverrideResolver.generateOverridesInFunctionGroup(methodName, null, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1510
                @Override
S
Stepan Koltsov 已提交
1511 1512
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1513
                }
1514 1515

                @Override
S
Stepan Koltsov 已提交
1516
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1517 1518
                    // nop
                }
1519 1520 1521 1522 1523 1524 1525 1526 1527
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1528 1529
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1530 1531
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1532
                r.add((SimpleFunctionDescriptor) function);
1533
            }
1534
        }
1535
        return r;
1536 1537
    }

S
Stepan Koltsov 已提交
1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
    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;
    }

1548
    private void getResolverScopeData(@NotNull ResolverScopeData scopeData) {
1549
        if (scopeData.namedMembersMap == null) {
1550
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(scopeData);
1551 1552
        }
    }
A
Andrey Breslav 已提交
1553

A
Andrey Breslav 已提交
1554
    @NotNull
1555
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull String methodName, @NotNull ResolverScopeData scopeData) {
A
Andrey Breslav 已提交
1556

1557
        getResolverScopeData(scopeData);
1558

1559
        Map<String, NamedMembers> namedMembersMap = scopeData.namedMembersMap;
1560 1561

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1562
        if (namedMembers != null && namedMembers.methods != null) {
1563
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(scopeData);
1564

1565
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, typeSubstitutor, namedMembers, methodName, scopeData);
1566 1567

            return namedMembers.functionDescriptors;
S
Stepan Koltsov 已提交
1568 1569
        }
        else {
1570
            return Collections.emptySet();
1571
        }
1572 1573
    }

1574
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1575 1576 1577 1578 1579 1580 1581 1582 1583
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1584

1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595
    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 已提交
1596 1597
            }
            else if (meaning.kind == JvmMethodParameterKind.REGULAR) {
1598
                result.add(meaning.valueParameterDescriptor);
S
Stepan Koltsov 已提交
1599 1600
            }
            else if (meaning.kind == JvmMethodParameterKind.RECEIVER) {
1601 1602 1603 1604 1605 1606 1607 1608 1609 1610
                if (receiverType != null) {
                    throw new IllegalStateException("more then one receiver");
                }
                --indexDelta;
                receiverType = meaning.receiverType;
            }
        }
        return new ValueParameterDescriptors(receiverType, result);
    }

A
Andrey Breslav 已提交
1611
    @Nullable
1612
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(
S
Stepan Koltsov 已提交
1613
            @NotNull final PsiClass psiClass, final PsiMethodWrapper method,
1614 1615 1616
            @NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1617

1618
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1619 1620 1621
        if (returnType == null) {
            return null;
        }
1622

1623
        // TODO: ugly
1624
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1625
            return null;
1626
        }
1627

S
Stepan Koltsov 已提交
1628
        if (scopeData.kotlin) {
S
Stepan Koltsov 已提交
1629 1630 1631 1632 1633 1634 1635
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1636
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
S
Stepan Koltsov 已提交
1637
                scopeData.classOrNamespaceDescriptor,
1638
                resolveAnnotations(method.getPsiMethod()),
1639 1640
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1641
        );
1642

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

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

1647
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1648

S
Stepan Koltsov 已提交
1649
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1650 1651


1652
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(functionDescriptorImpl, method.getParameters(), methodTypeVariableResolver);
A
Andrey Breslav 已提交
1653
        functionDescriptorImpl.initialize(
1654
                valueParameterDescriptors.receiverType,
S
Stepan Koltsov 已提交
1655
                DescriptorUtils.getExpectedThisObjectIfNeeded(scopeData.classOrNamespaceDescriptor),
1656
                methodTypeParameters,
1657
                valueParameterDescriptors.descriptors,
1658
                makeReturnType(returnType, method, methodTypeVariableResolver),
1659
                Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
1660 1661
                resolveVisibilityFromPsiModifiers(method.getPsiMethod()),
                /*isInline = */ false
A
Andrey Breslav 已提交
1662
        );
1663
        trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
1664
        BindingContextUtils.recordFunctionDeclarationToDescriptor(trace, method.getPsiMethod(), functionDescriptorImpl);
A
Andrey Breslav 已提交
1665
        FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
S
Stepan Koltsov 已提交
1666 1667
        if (method.getPsiMethod().getContainingClass() != psiClass && !method.isStatic()) {
            throw new IllegalStateException("non-static method in subclass");
A
Andrey Breslav 已提交
1668
        }
1669
        return (FunctionDescriptorImpl) substitutedFunctionDescriptor;
A
Andrey Breslav 已提交
1670
    }
1671

1672
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
1673 1674 1675
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
1676
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation, tasks);
1677 1678 1679 1680 1681 1682 1683
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

1684 1685 1686 1687 1688 1689 1690 1691 1692
    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;
    }

1693
    @Nullable
1694 1695
    private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation, @NotNull List<Runnable> taskList) {
        final AnnotationDescriptor annotation = new AnnotationDescriptor();
1696 1697

        String qname = psiAnnotation.getQualifiedName();
S
Stepan Koltsov 已提交
1698
        if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName())) {
1699 1700 1701 1702
            // TODO
            return null;
        }

1703
        final ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
1704 1705 1706
        if (clazz == null) {
            return null;
        }
1707
        taskList.add(new Runnable() {
1708
            @Override
1709 1710
            public void run() {
                annotation.setAnnotationType(clazz.getDefaultType());
1711
            }
1712
        });
1713
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1714 1715 1716 1717

        PsiAnnotationParameterList parameterList = psiAnnotation.getParameterList();
        for (PsiNameValuePair psiNameValuePair : parameterList.getAttributes()) {
            PsiAnnotationMemberValue value = psiNameValuePair.getValue();
1718 1719 1720 1721
            if (!(value instanceof PsiLiteralExpression)) {
                // todo
                continue;
            }
1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743
            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
1744 1745 1746
        return annotation;
    }

1747 1748 1749
    public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1750

1751
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1752

1753
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1754 1755 1756 1757

        for (Map.Entry<String, NamedMembers> entry : scopeData.namedMembersMap.entrySet()) {
            String methodName = entry.getKey();
            NamedMembers namedMembers = entry.getValue();
1758
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, substitutorForGenericSupertypes, namedMembers, methodName, scopeData);
1759
            functions.addAll(namedMembers.functionDescriptors);
1760
        }
1761

1762 1763
        return functions;
    }
1764

1765 1766 1767
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
S
Stepan Koltsov 已提交
1768 1769
        }
        else if (scope instanceof ResolverNamespaceData) {
1770
            return Collections.emptyList();
S
Stepan Koltsov 已提交
1771 1772
        }
        else {
1773 1774 1775 1776 1777
            throw new IllegalStateException();
        }
    }

    private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
1778 1779
        if (scopeData instanceof ResolverBinaryClassData) {
            return createSubstitutorForGenericSupertypes(((ResolverBinaryClassData) scopeData).getClassDescriptor());
S
Stepan Koltsov 已提交
1780 1781
        }
        else {
1782 1783 1784 1785
            return TypeSubstitutor.EMPTY;
        }
    }

1786
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1787
            @NotNull PsiMethodWrapper method,
1788
            @NotNull DeclarationDescriptor functionDescriptor,
1789 1790
            @NotNull TypeVariableResolver classTypeVariableResolver) {

1791
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1792
        if (method.getJetMethod().typeParameters().length() > 0) {
1793
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1794
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
S
Stepan Koltsov 已提交
1795 1796
        }
        else {
1797
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1798
        }
1799

S
Stepan Koltsov 已提交
1800 1801
        String context = "method " + method.getName() + " in class " + method.getPsiMethod().getContainingClass().getQualifiedName();
        initializeTypeParameters(typeParametersIntialization, functionDescriptor, context);
1802 1803 1804 1805 1806 1807 1808
        
        List<TypeParameterDescriptor> typeParameters = Lists.newArrayListWithCapacity(typeParametersIntialization.size());
        
        for (TypeParameterDescriptorInitialization tpdi : typeParametersIntialization) {
            typeParameters.add(tpdi.descriptor);
        }
        
1809 1810
        return typeParameters;
    }
1811 1812

    /**
S
Stepan Koltsov 已提交
1813
     * @see #resolveClassTypeParametersFromJetSignature(String, com.intellij.psi.PsiClass, org.jetbrains.jet.lang.descriptors.ClassDescriptor)
1814
     */
S
Stepan Koltsov 已提交
1815 1816
    private List<TypeParameterDescriptorInitialization> resolveMethodTypeParametersFromJetSignature(String jetSignature,
            final PsiMethod method, final DeclarationDescriptor functionDescriptor)
1817
    {
S
Stepan Koltsov 已提交
1818 1819
        String context = "method " + method.getName() + " in class " + method.getContainingClass().getQualifiedName();
        JetSignatureTypeParametersVisitor jetSignatureTypeParametersVisitor = new JetSignatureTypeParametersVisitor(functionDescriptor, method, context);
1820 1821
        new JetSignatureReader(jetSignature).acceptFormalTypeParametersOnly(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
1822 1823
    }

1824 1825
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1826 1827 1828

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

S
Stepan Koltsov 已提交
1829
        JetType transformedType;
1830
        if (returnTypeFromAnnotation.length() > 0) {
1831
            transformedType = semanticServices.getTypeTransformer().transformToType(returnTypeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1832 1833
        }
        else {
1834
            transformedType = semanticServices.getTypeTransformer().transformToType(returnType, typeVariableResolver);
S
Stepan Koltsov 已提交
1835
        }
1836 1837
        if (method.getJetMethod().returnTypeNullable()) {
            return TypeUtils.makeNullableAsSpecified(transformedType, true);
S
Stepan Koltsov 已提交
1838 1839
        }
        else if (method.getPsiMethod().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1840
            return TypeUtils.makeNullableAsSpecified(transformedType, false);
S
Stepan Koltsov 已提交
1841 1842
        }
        else {
1843 1844 1845 1846
            return transformedType;
        }
    }

1847
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1848
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
1849 1850 1851 1852
               (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
                (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibilities.PROTECTED :
                 //Visibilities.PUBLIC));
                 PACKAGE_VISIBILITY));
1853 1854
    }

1855
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1856 1857 1858 1859
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

1860 1861 1862
        PsiClass[] innerPsiClasses = psiClass.getInnerClasses();
        List<ClassDescriptor> r = new ArrayList<ClassDescriptor>(innerPsiClasses.length);
        for (PsiClass innerPsiClass : innerPsiClasses) {
1863 1864 1865 1866
            if (innerPsiClass.hasModifierProperty(PsiModifier.PRIVATE)) {
                // TODO: hack against inner classes
                continue;
            }
1867 1868 1869
            if (innerPsiClass.getName().equals(JvmAbi.CLASS_OBJECT_CLASS_NAME)) {
                continue;
            }
1870
            r.add(resolveClass(new FqName(innerPsiClass.getQualifiedName()), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN));
1871 1872 1873
        }
        return r;
    }
1874
}