JavaDescriptorResolver.java 82.5 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright 2010-2012 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

17 18
package org.jetbrains.jet.lang.resolve.java;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

            this.psiClass = psiClass;
218 219 220 221 222 223 224
            this.psiPackage = psiPackage;
            this.fqName = fqName;

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

225
            this.staticMembers = staticMembers;
226 227
            this.kotlin = psiClass != null &&
                    (new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS));
228
            classOrNamespaceDescriptor = descriptor;
229 230 231 232

            if (fqName.lastSegmentIs(JvmAbi.PACKAGE_CLASS) && psiClass != null && kotlin) {
                throw new IllegalStateException("Kotlin namespace cannot have last segment " + JvmAbi.PACKAGE_CLASS + ": " + fqName);
            }
233 234
        }

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
            for (PsiMethod psiConstructor : psiConstructors) {
542
                resolveConstructor(psiClass, classData, isStatic, psiConstructor);
543
            }
A
Andrey Breslav 已提交
544
        }
545

546 547 548 549
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
550

551
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
552

553
        return classData;
554 555
    }

556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581
    private void resolveConstructor(PsiClass psiClass, ResolverBinaryClassData classData, boolean aStatic, PsiMethod psiConstructor) {
        PsiMethodWrapper constructor = new PsiMethodWrapper(psiConstructor);

        if (constructor.getJetConstructor().hidden()) {
            return;
        }

        ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
                classData.classDescriptor,
                Collections.<AnnotationDescriptor>emptyList(), // TODO
                false);
        String context = "constructor of class " + psiClass.getQualifiedName();
        ValueParameterDescriptors valueParameterDescriptors = resolveParameterDescriptors(constructorDescriptor,
                constructor.getParameters(),
                TypeVariableResolvers.classTypeVariableResolver(classData.classDescriptor, context));
        if (valueParameterDescriptors.receiverType != null) {
            throw new IllegalStateException();
        }
        constructorDescriptor.initialize(classData.classDescriptor.getTypeConstructor().getParameters(),
                valueParameterDescriptors.descriptors,
                resolveVisibilityFromPsiModifiers(psiConstructor), aStatic);
        constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
        classData.classDescriptor.addConstructor(constructorDescriptor, null);
        trace.record(BindingContext.CONSTRUCTOR, psiConstructor, constructorDescriptor);
    }

582
    static void checkPsiClassIsNotJet(PsiClass psiClass) {
583
        if (psiClass instanceof JetJavaMirrorMarker) {
584
            throw new IllegalStateException("trying to resolve fake jet PsiClass as regular PsiClass: " + psiClass.getQualifiedName());
585 586 587
        }
    }

588 589 590 591 592 593 594 595 596 597
    @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;
    }

598 599 600 601 602 603
    /**
     * TODO
     * @see #createJavaNamespaceDescriptor(com.intellij.psi.PsiClass)
     */
    @Nullable
    private MutableClassDescriptorLite createClassObjectDescriptor(@NotNull ClassDescriptor containing, @NotNull PsiClass psiClass) {
604 605 606 607 608
        PsiClass classObjectPsiClass = getInnerClassClassObject(psiClass);
        if (classObjectPsiClass == null) {
            return null;
        }

609 610
        checkPsiClassIsNotJet(psiClass);

611 612
        FqName fqName = new FqName(classObjectPsiClass.getQualifiedName());
        ResolverBinaryClassData classData = new ResolverBinaryClassData(classObjectPsiClass, fqName, new MutableClassDescriptorLite(containing, ClassKind.OBJECT));
613

614
        classDescriptorCache.put(fqName, classData);
615

616
        classData.classDescriptor.setSupertypes(getSupertypes(new PsiClassWrapper(classObjectPsiClass), classData, new ArrayList<TypeParameterDescriptor>(0)));
617 618
        classData.classDescriptor.setName(JetPsiUtil.NO_NAME_PROVIDED); // TODO
        classData.classDescriptor.setModality(Modality.FINAL);
619
        classData.classDescriptor.setVisibility(containing.getVisibility());
620 621
        classData.classDescriptor.setTypeParameterDescriptors(new ArrayList<TypeParameterDescriptor>(0));
        classData.classDescriptor.createTypeConstructor();
622
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
623 624 625 626

        // 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());
627
        constructor.initialize(new ArrayList<TypeParameterDescriptor>(0), new ArrayList<ValueParameterDescriptor>(0), Visibilities.PUBLIC);
628 629 630

        classData.classDescriptor.addConstructor(constructor, null);
        return classData.classDescriptor;
631 632
    }

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

636 637
        if (jetClassAnnotation.signature().length() > 0) {
            return resolveClassTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
638
                    jetClassAnnotation.signature(), psiClass, classData.classDescriptor);
639
        }
640

641
        return makeUninitializedTypeParameters(classData.classDescriptor, psiClass.getTypeParameters());
642 643
    }

644
    @NotNull
645
    private PsiTypeParameter getPsiTypeParameterByName(PsiTypeParameterListOwner clazz, String name) {
646 647 648 649 650
        for (PsiTypeParameter typeParameter : clazz.getTypeParameters()) {
            if (typeParameter.getName().equals(name)) {
                return typeParameter; 
            }
        }
651 652 653
        throw new IllegalStateException("PsiTypeParameter '" + name + "' is not found");
    }

S
Stepan Koltsov 已提交
654

655
    private static final FqName JL_OBJECT = new FqName("java.lang.Object");
S
Stepan Koltsov 已提交
656 657

    private boolean isJavaLangObject(JetType type) {
658 659 660
        ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
        return classifierDescriptor instanceof ClassDescriptor &&
               DescriptorUtils.getFQName(classifierDescriptor).equals(JL_OBJECT.toUnsafe());
S
Stepan Koltsov 已提交
661 662 663
    }


664
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
665 666

        @NotNull
667
        private final PsiTypeParameterListOwner psiOwner;
668
        @NotNull
669
        private final String name;
670
        @NotNull
671
        private final TypeVariableResolver typeVariableResolver;
672 673
        @NotNull
        private final TypeParameterDescriptor typeParameterDescriptor;
674

675 676
        protected JetSignatureTypeParameterVisitor(PsiTypeParameterListOwner psiOwner,
                String name, TypeVariableResolver typeVariableResolver, TypeParameterDescriptor typeParameterDescriptor)
677
        {
678 679 680
            if (name.isEmpty()) {
                throw new IllegalStateException();
            }
681

682 683
            this.psiOwner = psiOwner;
            this.name = name;
684
            this.typeVariableResolver = typeVariableResolver;
685
            this.typeParameterDescriptor = typeParameterDescriptor;
686 687 688 689
        }

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

        @Override
        public JetSignatureVisitor visitInterfaceBound() {
706
            return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
707 708 709 710 711 712 713 714 715
                @Override
                protected void done(@NotNull JetType jetType) {
                    upperBounds.add(jetType);
                }
            };
        }

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

S
Stepan Koltsov 已提交
739 740 741 742
            this.typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(
                    previousTypeParameters,
                    containingDeclaration,
                    context);
743 744 745 746 747 748 749 750 751
        }

        private int formalTypeParameterIndex = 0;


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

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

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

            @Override
            public JetSignatureVisitor visitInterface() {
                // TODO
                return new JetSignatureAdapter();
            }
790 791 792
        };
        new JetSignatureReader(jetSignature).accept(jetSignatureTypeParametersVisitor);
        return jetSignatureTypeParametersVisitor.r;
793 794
    }

795 796 797 798
    @NotNull
    private ClassOrNamespaceDescriptor resolveParentDescriptor(@NotNull PsiClass psiClass) {
        FqName fqName = new FqName(psiClass.getQualifiedName());

799 800
        PsiClass containingClass = psiClass.getContainingClass();
        if (containingClass != null) {
801 802 803 804 805 806
            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;
807
        }
808

809 810 811 812 813
        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;
814 815
    }

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

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

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

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

S
Stepan Koltsov 已提交
870
    private void initializeTypeParameters(List<TypeParameterDescriptorInitialization> typeParametersInitialization, @NotNull DeclarationDescriptor typeParametersOwner, @NotNull String context) {
871
        List<TypeParameterDescriptor> prevTypeParameters = new ArrayList<TypeParameterDescriptor>();
872 873 874 875 876 877

        List<TypeParameterDescriptor> typeParameters = Lists.newArrayList();
        for (TypeParameterDescriptorInitialization typeParameterDescriptor : typeParametersInitialization) {
            typeParameters.add(typeParameterDescriptor.descriptor);
        }

878
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
879
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
880
            initializeTypeParameter(psiTypeParameter,
881
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
882
        }
A
Andrey Breslav 已提交
883 884
    }

885 886 887
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ResolverBinaryClassData classData, List<TypeParameterDescriptor> typeParameters) {
        ClassDescriptor classDescriptor = classData.classDescriptor;

888 889
        final List<JetType> result = new ArrayList<JetType>();

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

892
        if (psiClass.getJetClass().signature().length() > 0) {
S
Stepan Koltsov 已提交
893
            final TypeVariableResolver typeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(typeParameters, classDescriptor, context);
894 895 896 897 898 899 900 901 902 903
            
            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() {
904
                    return new JetTypeJetSignatureReader(semanticServices, JetStandardLibrary.getInstance(), typeVariableResolver) {
905 906 907 908 909 910 911 912 913 914 915
                        @Override
                        protected void done(@NotNull JetType jetType) {
                            if (!jetType.equals(JetStandardClasses.getAnyType())) {
                                result.add(jetType);
                            }
                        }
                    };
                }

                @Override
                public JetSignatureVisitor visitInterface() {
S
Stepan Koltsov 已提交
916
                    return visitSuperclass();
917 918
                }
            });
S
Stepan Koltsov 已提交
919 920
        }
        else {
S
Stepan Koltsov 已提交
921 922 923
            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);
924
        }
925 926 927
        
        for (JetType supertype : result) {
            if (ErrorUtils.isErrorType(supertype)) {
928
                trace.record(BindingContext.INCOMPLETE_HIERARCHY, classDescriptor);
929 930 931
            }
        }
        
932
        if (result.isEmpty()) {
933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
            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());
                }
            }
948
        }
949 950 951
        return result;
    }

952
    private void transformSupertypeList(List<JetType> result, PsiClassType[] extendsListTypes, TypeVariableResolver typeVariableResolver, boolean annotation) {
953
        for (PsiClassType type : extendsListTypes) {
954
            PsiClass resolved = type.resolve();
S
Stepan Koltsov 已提交
955
            if (resolved != null && resolved.getQualifiedName().equals(JvmStdlibNames.JET_OBJECT.getFqName().getFqName())) {
956 957
                continue;
            }
958 959 960
            if (annotation && resolved.getQualifiedName().equals("java.lang.annotation.Annotation")) {
                continue;
            }
961
            
962
            JetType transform = semanticServices.getTypeTransformer().transformToType(type, JavaTypeTransformer.TypeUsage.SUPERTYPE, typeVariableResolver);
963 964 965 966 967

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

968
    @Nullable
969
    public NamespaceDescriptor resolveNamespace(@NotNull FqName qualifiedName, @NotNull DescriptorSearchRule searchRule) {
970 971 972
        // First, let's check that there is no Kotlin package:
        NamespaceDescriptor kotlinNamespaceDescriptor = semanticServices.getKotlinNamespaceDescriptor(qualifiedName);
        if (kotlinNamespaceDescriptor != null) {
973 974
            if (searchRule == DescriptorSearchRule.ERROR_IF_FOUND_IN_KOTLIN) {
                throw new IllegalStateException("class must not be found in kotlin: " + qualifiedName);
S
Stepan Koltsov 已提交
975 976
            }
            else if (searchRule == DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN) {
977
                return null;
S
Stepan Koltsov 已提交
978 979
            }
            else if (searchRule == DescriptorSearchRule.INCLUDE_KOTLIN) {
980 981
                // TODO: probably this is evil
                return kotlinNamespaceDescriptor;
S
Stepan Koltsov 已提交
982 983
            }
            else {
984 985
                throw new IllegalStateException("unknown searchRule: " + searchRule);
            }
986 987
        }

988 989 990
        ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(qualifiedName);
        if (namespaceData != null) {
            return namespaceData.namespaceDescriptor;
991
        }
A
Andrey Breslav 已提交
992

993 994 995
        NamespaceDescriptorParent parentNs = resolveParentNamespace(qualifiedName);
        if (parentNs == null) {
            return null;
S
Stepan Koltsov 已提交
996 997
        }

998 999
        JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
                parentNs,
1000
                Collections.<AnnotationDescriptor>emptyList(), // TODO
1001 1002
                qualifiedName.isRoot() ? "<root>" : qualifiedName.shortName(),
                qualifiedName
1003
        );
S
Stepan Koltsov 已提交
1004

1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019
        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 已提交
1020 1021
        }
        else {
1022 1023
            return resolveNamespace(fqName.parent(), DescriptorSearchRule.INCLUDE_KOTLIN);
        }
1024 1025
    }

S
Stepan Koltsov 已提交
1026
    @Nullable
S
Stepan Koltsov 已提交
1027
    private ResolverNamespaceData createNamespaceResolverScopeData(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
1028 1029 1030 1031 1032 1033
        PsiPackage psiPackage;
        PsiClass psiClass;

        lookingForPsi:
        {
            psiClass = getPsiClassForJavaPackageScope(fqName);
1034
            psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
1035
            if (psiClass != null || psiPackage != null) {
1036
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER);
1037 1038 1039
                break lookingForPsi;
            }

1040
            psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1041 1042 1043
            if (psiClass != null) {
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
                break lookingForPsi;
1044
            }
S
Stepan Koltsov 已提交
1045

1046 1047 1048 1049
            ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
            if (oldValue != null) {
                throw new IllegalStateException("rewrite at " + fqName);
            }
1050
            return null;
S
Stepan Koltsov 已提交
1051 1052
        }

1053
        ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
1054

1055
        namespaceData.memberScope = new JavaPackageScope(fqName, semanticServices, namespaceData);
S
Stepan Koltsov 已提交
1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078

        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 已提交
1079 1080
    }

S
Stepan Koltsov 已提交
1081
    @Nullable
S
Stepan Koltsov 已提交
1082
    private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
1083
        return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1084
    }
1085

1086 1087 1088 1089 1090 1091 1092 1093 1094
    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;
        }
    }
1095

1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128
    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
1129
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
1130 1131 1132 1133 1134 1135 1136
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

1141 1142
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
1143 1144
        }
        
1145 1146 1147 1148
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
1149
        JetType outType;
1150
        if (typeFromAnnotation.length() > 0) {
1151
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1152 1153
        }
        else {
1154
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
1155
        }
1156 1157 1158

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
S
Stepan Koltsov 已提交
1159
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(TypeUtils.makeNotNullable(outType));
S
Stepan Koltsov 已提交
1160 1161
        }
        else {
1162 1163 1164
            varargElementType = null;
        }

1165 1166
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
S
Stepan Koltsov 已提交
1167 1168
        }
        else {
S
Stepan Koltsov 已提交
1169 1170 1171 1172

            JetType transformedType;
            if (parameter.getJetValueParameter().nullable()) {
                transformedType = TypeUtils.makeNullableAsSpecified(outType, parameter.getJetValueParameter().nullable());
S
Stepan Koltsov 已提交
1173 1174
            }
            else if (parameter.getPsiParameter().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1175
                transformedType = TypeUtils.makeNullableAsSpecified(outType, false);
S
Stepan Koltsov 已提交
1176 1177
            }
            else {
S
Stepan Koltsov 已提交
1178 1179
                transformedType = outType;
            }
1180 1181 1182 1183 1184
            return JvmMethodParameterMeaning.regular(new ValueParameterDescriptorImpl(
                    containingDeclaration,
                    i,
                    Collections.<AnnotationDescriptor>emptyList(), // TODO
                    name,
S
Stepan Koltsov 已提交
1185
                    false,
S
Stepan Koltsov 已提交
1186
                    transformedType,
1187
                    hasDefaultValue,
1188 1189 1190
                    varargElementType
            ));
        }
1191 1192
    }

1193 1194 1195 1196 1197 1198 1199
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull String fieldName, @NotNull ResolverScopeData scopeData) {

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

        getResolverScopeData(scopeData);
1200

1201 1202 1203
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1204 1205
        }

1206 1207
        resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, fieldName,
                "class or namespace " + scopeData.psiClass.getQualifiedName());
1208

S
Stepan Koltsov 已提交
1209
        return namedMembers.propertyDescriptors;
1210 1211 1212
    }
    
    @NotNull
1213 1214 1215
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1216

1217
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1218 1219 1220 1221
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1222

1223
            resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, propertyName, "class or namespace " + scopeData.psiClass.getQualifiedName());
1224
            descriptors.addAll(namedMembers.propertyDescriptors);
1225
        }
1226

1227
        return descriptors;
1228
    }
1229 1230 1231 1232
    
    private Object key(TypeSource typeSource) {
        if (typeSource == null) {
            return "";
S
Stepan Koltsov 已提交
1233 1234
        }
        else if (typeSource.getTypeString().length() > 0) {
1235
            return typeSource.getTypeString();
S
Stepan Koltsov 已提交
1236 1237
        }
        else {
1238
            return psiTypeToKey(typeSource.getPsiType());
1239 1240
        }
    }
1241 1242 1243 1244

    private Object psiTypeToKey(PsiType psiType) {
        if (psiType instanceof PsiClassType) {
            return ((PsiClassType) psiType).getClassName();
S
Stepan Koltsov 已提交
1245 1246
        }
        else if (psiType instanceof PsiPrimitiveType) {
1247
            return psiType.getPresentableText();
S
Stepan Koltsov 已提交
1248 1249
        }
        else if (psiType instanceof PsiArrayType) {
1250
            return Pair.create("[", psiTypeToKey(((PsiArrayType) psiType).getComponentType()));
S
Stepan Koltsov 已提交
1251 1252
        }
        else {
1253 1254 1255 1256
            throw new IllegalStateException("" + psiType.getClass());
        }
    }

1257 1258 1259 1260 1261
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1262

1263 1264 1265
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
1266 1267 1268 1269
            @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context) {
        getResolverScopeData(scopeData);

1270 1271 1272 1273
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1274
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1275
            namedMembers.propertyAccessors = Collections.emptyList();
1276
        }
1277

1278 1279 1280 1281
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1282
            boolean ext;
1283
        }
1284 1285
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1286

1287
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1288

1289 1290 1291 1292 1293
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1294
                value.ext = propertyAccessor.getReceiverType() != null;
1295 1296
                map.put(key, value);
            }
1297

1298 1299 1300 1301
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

1302 1303 1304 1305 1306
            if (propertyAccessor.isGetter()) {
                if (value.getter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.getter = propertyAccessor;
S
Stepan Koltsov 已提交
1307 1308
            }
            else if (propertyAccessor.isSetter()) {
1309 1310 1311 1312
                if (value.setter != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.setter = propertyAccessor;
S
Stepan Koltsov 已提交
1313 1314
            }
            else if (propertyAccessor.isField()) {
1315 1316 1317 1318
                if (value.field != null) {
                    throw new IllegalStateException("oops, duplicate key");
                }
                value.field = propertyAccessor;
S
Stepan Koltsov 已提交
1319 1320
            }
            else {
1321 1322
                throw new IllegalStateException();
            }
1323
        }
1324

1325
        
S
Stepan Koltsov 已提交
1326
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1327

1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341
        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;
            }
1342

1343
            boolean isFinal;
1344 1345
            if (!scopeData.kotlin) {
                isFinal = true;
S
Stepan Koltsov 已提交
1346 1347
            }
            else if (members.setter == null && members.getter == null) {
1348
                isFinal = false;
S
Stepan Koltsov 已提交
1349 1350
            }
            else if (members.getter != null) {
1351
                isFinal = members.getter.getMember().isFinal();
S
Stepan Koltsov 已提交
1352 1353
            }
            else if (members.setter != null) {
1354
                isFinal = members.setter.getMember().isFinal();
S
Stepan Koltsov 已提交
1355 1356
            }
            else {
1357 1358
                isFinal = false;
            }
1359

1360 1361 1362
            PropertyAccessorData anyMember;
            if (members.getter != null) {
                anyMember = members.getter;
S
Stepan Koltsov 已提交
1363 1364
            }
            else if (members.field != null) {
1365
                anyMember = members.field;
S
Stepan Koltsov 已提交
1366 1367
            }
            else if (members.setter != null) {
1368
                anyMember = members.setter;
S
Stepan Koltsov 已提交
1369 1370
            }
            else {
1371 1372
                throw new IllegalStateException();
            }
1373

1374 1375 1376
            boolean isVar;
            if (members.getter == null && members.setter == null) {
                isVar = !members.field.getMember().isFinal();
S
Stepan Koltsov 已提交
1377 1378
            }
            else {
1379 1380
                isVar = members.setter != null;
            }
1381 1382 1383 1384 1385 1386 1387 1388 1389 1390

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


1391 1392
            PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
                    owner,
A
Alex Tkachman 已提交
1393
                    resolveAnnotations(anyMember.getMember().psiMember),
1394
                    modality,
1395
                    resolveVisibilityFromPsiModifiers(anyMember.getMember().psiMember),
1396 1397
                    isVar,
                    false,
1398 1399
                    propertyName,
                    CallableMemberDescriptor.Kind.DECLARATION);
1400

1401 1402 1403
            PropertyGetterDescriptor getterDescriptor = null;
            PropertySetterDescriptor setterDescriptor = null;
            if (members.getter != null) {
1404
                getterDescriptor = new PropertyGetterDescriptor(propertyDescriptor, resolveAnnotations(members.getter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1405 1406
            }
            if (members.setter != null) {
1407
                setterDescriptor = new PropertySetterDescriptor(propertyDescriptor, resolveAnnotations(members.setter.getMember().psiMember), Modality.OPEN, Visibilities.PUBLIC, true, false, CallableMemberDescriptor.Kind.DECLARATION);
1408
            }
1409

1410
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1411

S
Stepan Koltsov 已提交
1412
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1413 1414 1415

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

1417
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1418
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor);
1419 1420 1421 1422 1423 1424
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1425
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor);
1426 1427 1428
                }
            }

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

1431 1432 1433
            JetType propertyType;
            if (anyMember.getType().getTypeString().length() > 0) {
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1434 1435
            }
            else {
1436
                propertyType = semanticServices.getTypeTransformer().transformToType(anyMember.getType().getPsiType(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1437
                if (anyMember.getType().getPsiNotNullOwner().getModifierList().findAnnotation(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName()) != null) {
S
Stepan Koltsov 已提交
1438 1439
                    propertyType = TypeUtils.makeNullableAsSpecified(propertyType, false);
                }
1440 1441 1442 1443 1444
            }
            
            JetType receiverType;
            if (anyMember.getReceiverType() == null) {
                receiverType = null;
S
Stepan Koltsov 已提交
1445 1446
            }
            else if (anyMember.getReceiverType().getTypeString().length() > 0) {
1447
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getTypeString(), typeVariableResolverForPropertyInternals);
S
Stepan Koltsov 已提交
1448 1449
            }
            else {
1450
                receiverType = semanticServices.getTypeTransformer().transformToType(anyMember.getReceiverType().getPsiType(), typeVariableResolverForPropertyInternals);
1451 1452 1453 1454 1455 1456 1457
            }

            propertyDescriptor.setType(
                    propertyType,
                    typeParameters,
                    DescriptorUtils.getExpectedThisObjectIfNeeded(owner),
                    receiverType
1458
            );
1459 1460 1461 1462
            if (getterDescriptor != null) {
                getterDescriptor.initialize(propertyType);
            }
            if (setterDescriptor != null) {
1463
                setterDescriptor.initialize(new ValueParameterDescriptorImpl(setterDescriptor, 0, Collections.<AnnotationDescriptor>emptyList(), "p0"/*TODO*/, false, propertyDescriptor.getType(), false, null));
1464 1465
            }

1466
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1467
            
S
Stepan Koltsov 已提交
1468
            propertiesFromCurrent.add(propertyDescriptor);
1469
        }
1470

S
Stepan Koltsov 已提交
1471 1472 1473 1474 1475 1476 1477 1478

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

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

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

1479
            OverrideResolver.generateOverridesInFunctionGroup(propertyName, null, propertiesFromSupertypes, propertiesFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
S
Stepan Koltsov 已提交
1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
                @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;
1495
    }
1496

S
Stepan Koltsov 已提交
1497 1498
    private void resolveNamedGroupFunctions(@NotNull ClassOrNamespaceDescriptor owner, PsiClass psiClass,
            TypeSubstitutor typeSubstitutorForGenericSuperclasses, NamedMembers namedMembers, String methodName, ResolverScopeData scopeData) {
1499 1500 1501
        if (namedMembers.functionDescriptors != null) {
            return;
        }
1502 1503
        
        final Set<FunctionDescriptor> functions = new HashSet<FunctionDescriptor>();
1504

1505
        Set<SimpleFunctionDescriptor> functionsFromCurrent = Sets.newHashSet();
1506
        for (PsiMethodWrapper method : namedMembers.methods) {
S
Stepan Koltsov 已提交
1507
            FunctionDescriptorImpl function = resolveMethodToFunctionDescriptor(psiClass, method, scopeData);
1508
            if (function != null) {
1509
                functionsFromCurrent.add((SimpleFunctionDescriptor) function);
1510 1511 1512 1513 1514 1515
            }
        }

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

1516
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1517

1518
            OverrideResolver.generateOverridesInFunctionGroup(methodName, null, functionsFromSupertypes, functionsFromCurrent, classDescriptor, new OverrideResolver.DescriptorSink() {
1519
                @Override
S
Stepan Koltsov 已提交
1520 1521
                public void addToScope(@NotNull CallableMemberDescriptor fakeOverride) {
                    functions.add((FunctionDescriptor) fakeOverride);
1522
                }
1523 1524

                @Override
S
Stepan Koltsov 已提交
1525
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1526 1527
                    // nop
                }
1528 1529 1530 1531 1532 1533 1534 1535 1536
            });

        }

        functions.addAll(functionsFromCurrent);

        namedMembers.functionDescriptors = functions;
    }
    
1537 1538
    private Set<SimpleFunctionDescriptor> getFunctionsFromSupertypes(ResolverScopeData scopeData, String methodName) {
        Set<SimpleFunctionDescriptor> r = new HashSet<SimpleFunctionDescriptor>();
1539 1540
        for (JetType supertype : getSupertypes(scopeData)) {
            for (FunctionDescriptor function : supertype.getMemberScope().getFunctions(methodName)) {
1541
                r.add((SimpleFunctionDescriptor) function);
1542
            }
1543
        }
1544
        return r;
1545 1546
    }

S
Stepan Koltsov 已提交
1547 1548 1549 1550 1551 1552 1553 1554 1555 1556
    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;
    }

1557
    private void getResolverScopeData(@NotNull ResolverScopeData scopeData) {
1558
        if (scopeData.namedMembersMap == null) {
1559
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(scopeData);
1560 1561
        }
    }
A
Andrey Breslav 已提交
1562

A
Andrey Breslav 已提交
1563
    @NotNull
1564
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull String methodName, @NotNull ResolverScopeData scopeData) {
A
Andrey Breslav 已提交
1565

1566
        getResolverScopeData(scopeData);
1567

1568
        Map<String, NamedMembers> namedMembersMap = scopeData.namedMembersMap;
1569 1570

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1571
        if (namedMembers != null && namedMembers.methods != null) {
1572
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(scopeData);
1573

1574
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, typeSubstitutor, namedMembers, methodName, scopeData);
1575 1576

            return namedMembers.functionDescriptors;
S
Stepan Koltsov 已提交
1577 1578
        }
        else {
1579
            return Collections.emptySet();
1580
        }
1581 1582
    }

1583
    private TypeSubstitutor createSubstitutorForGenericSupertypes(@Nullable ClassDescriptor classDescriptor) {
A
Andrey Breslav 已提交
1584 1585 1586 1587 1588 1589 1590 1591 1592
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
            typeSubstitutor = TypeUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
        }
        else {
            typeSubstitutor = TypeSubstitutor.EMPTY;
        }
        return typeSubstitutor;
    }
1593

1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
    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 已提交
1605 1606
            }
            else if (meaning.kind == JvmMethodParameterKind.REGULAR) {
1607
                result.add(meaning.valueParameterDescriptor);
S
Stepan Koltsov 已提交
1608 1609
            }
            else if (meaning.kind == JvmMethodParameterKind.RECEIVER) {
1610 1611 1612 1613 1614 1615 1616 1617 1618 1619
                if (receiverType != null) {
                    throw new IllegalStateException("more then one receiver");
                }
                --indexDelta;
                receiverType = meaning.receiverType;
            }
        }
        return new ValueParameterDescriptors(receiverType, result);
    }

A
Andrey Breslav 已提交
1620
    @Nullable
1621
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(
S
Stepan Koltsov 已提交
1622
            @NotNull final PsiClass psiClass, final PsiMethodWrapper method,
1623 1624 1625
            @NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1626

1627
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1628 1629 1630
        if (returnType == null) {
            return null;
        }
1631

1632
        // TODO: ugly
1633
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1634
            return null;
1635
        }
1636

S
Stepan Koltsov 已提交
1637
        if (scopeData.kotlin) {
S
Stepan Koltsov 已提交
1638 1639 1640 1641 1642 1643 1644
            // TODO: unless maybe class explicitly extends Object
            String ownerClassName = method.getPsiMethod().getContainingClass().getQualifiedName();
            if (ownerClassName.equals("java.lang.Object")) {
                return null;
            }
        }

1645
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
S
Stepan Koltsov 已提交
1646
                scopeData.classOrNamespaceDescriptor,
1647
                resolveAnnotations(method.getPsiMethod()),
1648 1649
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1650
        );
1651

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

S
Stepan Koltsov 已提交
1654
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl);
1655

S
Stepan Koltsov 已提交
1656
        TypeVariableResolver methodTypeVariableResolver = TypeVariableResolvers.typeVariableResolverFromTypeParameters(methodTypeParameters, functionDescriptorImpl, context);
1657 1658


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

1679
    private List<AnnotationDescriptor> resolveAnnotations(PsiModifierListOwner owner, @NotNull List<Runnable> tasks) {
1680 1681 1682
        PsiAnnotation[] psiAnnotations = owner.getModifierList().getAnnotations();
        List<AnnotationDescriptor> r = Lists.newArrayListWithCapacity(psiAnnotations.length);
        for (PsiAnnotation psiAnnotation : psiAnnotations) {
1683
            AnnotationDescriptor annotation = resolveAnnotation(psiAnnotation, tasks);
1684 1685 1686 1687 1688 1689 1690
            if (annotation != null) {
                r.add(annotation);
            }
        }
        return r;
    }

1691 1692 1693 1694 1695 1696 1697 1698 1699
    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;
    }

1700
    @Nullable
1701 1702
    private AnnotationDescriptor resolveAnnotation(PsiAnnotation psiAnnotation, @NotNull List<Runnable> taskList) {
        final AnnotationDescriptor annotation = new AnnotationDescriptor();
1703 1704

        String qname = psiAnnotation.getQualifiedName();
S
Stepan Koltsov 已提交
1705
        if (qname.startsWith("java.lang.annotation.") || qname.startsWith("jet.runtime.typeinfo.") || qname.equals(JvmAbi.JETBRAINS_NOT_NULL_ANNOTATION.getFqName().getFqName())) {
1706 1707 1708 1709
            // TODO
            return null;
        }

1710
        final ClassDescriptor clazz = resolveClass(new FqName(psiAnnotation.getQualifiedName()), DescriptorSearchRule.INCLUDE_KOTLIN, taskList);
1711 1712 1713
        if (clazz == null) {
            return null;
        }
1714
        taskList.add(new Runnable() {
1715
            @Override
1716 1717
            public void run() {
                annotation.setAnnotationType(clazz.getDefaultType());
1718
            }
1719
        });
1720
        ArrayList<CompileTimeConstant<?>> valueArguments = new ArrayList<CompileTimeConstant<?>>();
1721 1722 1723 1724

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

1754 1755 1756
    public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1757

1758
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1759

1760
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1761 1762 1763 1764

        for (Map.Entry<String, NamedMembers> entry : scopeData.namedMembersMap.entrySet()) {
            String methodName = entry.getKey();
            NamedMembers namedMembers = entry.getValue();
1765
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, substitutorForGenericSupertypes, namedMembers, methodName, scopeData);
1766
            functions.addAll(namedMembers.functionDescriptors);
1767
        }
1768

1769 1770
        return functions;
    }
1771

1772 1773 1774
    private Collection<JetType> getSupertypes(ResolverScopeData scope) {
        if (scope instanceof ResolverBinaryClassData) {
            return ((ResolverBinaryClassData) scope).classDescriptor.getSupertypes();
S
Stepan Koltsov 已提交
1775 1776
        }
        else if (scope instanceof ResolverNamespaceData) {
1777
            return Collections.emptyList();
S
Stepan Koltsov 已提交
1778 1779
        }
        else {
1780 1781 1782 1783 1784
            throw new IllegalStateException();
        }
    }

    private TypeSubstitutor typeSubstitutorForGenericSupertypes(ResolverScopeData scopeData) {
1785 1786
        if (scopeData instanceof ResolverBinaryClassData) {
            return createSubstitutorForGenericSupertypes(((ResolverBinaryClassData) scopeData).getClassDescriptor());
S
Stepan Koltsov 已提交
1787 1788
        }
        else {
1789 1790 1791 1792
            return TypeSubstitutor.EMPTY;
        }
    }

1793
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1794
            @NotNull PsiMethodWrapper method,
S
Stepan Koltsov 已提交
1795
            @NotNull DeclarationDescriptor functionDescriptor) {
1796

1797
        List<TypeParameterDescriptorInitialization> typeParametersIntialization;
1798
        if (method.getJetMethod().typeParameters().length() > 0) {
1799
            typeParametersIntialization = resolveMethodTypeParametersFromJetSignature(
S
Stepan Koltsov 已提交
1800
                    method.getJetMethod().typeParameters(), method.getPsiMethod(), functionDescriptor);
S
Stepan Koltsov 已提交
1801 1802
        }
        else {
1803
            typeParametersIntialization = makeUninitializedTypeParameters(functionDescriptor, method.getPsiMethod().getTypeParameters());
1804
        }
1805

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

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

1830 1831
    private JetType makeReturnType(PsiType returnType, PsiMethodWrapper method,
            @NotNull TypeVariableResolver typeVariableResolver) {
1832 1833 1834

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

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

1853
    private static Visibility resolveVisibilityFromPsiModifiers(PsiModifierListOwner modifierListOwner) {
1854
        return modifierListOwner.hasModifierProperty(PsiModifier.PUBLIC) ? Visibilities.PUBLIC :
1855 1856 1857 1858
               (modifierListOwner.hasModifierProperty(PsiModifier.PRIVATE) ? Visibilities.PRIVATE :
                (modifierListOwner.hasModifierProperty(PsiModifier.PROTECTED) ? Visibilities.PROTECTED :
                 //Visibilities.PUBLIC));
                 PACKAGE_VISIBILITY));
1859 1860
    }

1861
    public List<ClassDescriptor> resolveInnerClasses(DeclarationDescriptor owner, PsiClass psiClass, boolean staticMembers) {
1862 1863 1864 1865
        if (staticMembers) {
            return new ArrayList<ClassDescriptor>(0);
        }

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