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 225 226 227 228
            this.psiPackage = psiPackage;
            this.fqName = fqName;

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

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

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

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

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

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

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

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

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

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

        static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);

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

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

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

296 297
    }

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

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

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

        static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);

314 315
        private JavaPackageScope memberScope;

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

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

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

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

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

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

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

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

357

358

359 360 361 362 363 364 365 366 367
    @Nullable
    private ClassDescriptor resolveJavaLangObject() {
        ClassDescriptor clazz = resolveClass(JdkNames.JL_OBJECT.getFqName(), DescriptorSearchRule.IGNORE_IF_FOUND_IN_KOTLIN);
        if (clazz == null) {
            // TODO: warning
        }
        return clazz;
    }

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

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

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

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

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

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

429 430
        checkPsiClassIsNotJet(psiClass);

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

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

        classData = new ResolverBinaryClassData(psiClass, fqName, new MutableClassDescriptorLite(containingDeclaration, kind));
442
        classDescriptorCache.put(fqName, classData);
443
        classData.classDescriptor.setName(name);
444
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList));
445

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

S
Stepan Koltsov 已提交
448
        classData.typeParameters = createUninitializedClassTypeParameters(psiClass, classData);
449 450 451 452 453 454
        
        List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>();
        for (TypeParameterDescriptorInitialization typeParameter : classData.typeParameters) {
            typeParameters.add(typeParameter.descriptor);
        }
        
455 456 457
        classData.classDescriptor.setTypeParameterDescriptors(typeParameters);
        classData.classDescriptor.setSupertypes(supertypes);
        classData.classDescriptor.setVisibility(resolveVisibilityFromPsiModifiers(psiClass));
458 459 460 461 462 463 464 465 466 467
        Modality modality;
        if (classData.classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS) {
            modality = Modality.FINAL;
        }
        else {
            modality = Modality.convertFromFlags(
                    psiClass.hasModifierProperty(PsiModifier.ABSTRACT) || psiClass.isInterface(),
                    !psiClass.hasModifierProperty(PsiModifier.FINAL));
        }
        classData.classDescriptor.setModality(modality);
468
        classData.classDescriptor.createTypeConstructor();
469
        classData.classDescriptor.setScopeForMemberLookup(new JavaClassMembersScope(semanticServices, classData));
470

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

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

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

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

482
        boolean isStatic = psiClass.hasModifierProperty(PsiModifier.STATIC);
483
        if (psiConstructors.length == 0) {
A
Andrey Breslav 已提交
484 485 486 487
            // We need to create default constructors for classes and abstract classes.
            // Example:
            // class Kotlin() : Java() {}
            // abstract public class Java {}
488
            if (!psiClass.isInterface()) {
489
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
490
                        classData.classDescriptor,
A
Andrey Breslav 已提交
491
                        Collections.<AnnotationDescriptor>emptyList(),
492
                        false);
493
                constructorDescriptor.initialize(typeParameters, Collections.<ValueParameterDescriptor>emptyList(), classData.classDescriptor.getVisibility(), isStatic);
494
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
495
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
496
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
497
            }
498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518
            if (psiClass.isAnnotationType()) {
                // A constructor for an annotation type takes all the "methods" in the @interface as parameters
                ConstructorDescriptorImpl constructorDescriptor = new ConstructorDescriptorImpl(
                        classData.classDescriptor,
                        Collections.<AnnotationDescriptor>emptyList(),
                        false);

                List<ValueParameterDescriptor> valueParameters = Lists.newArrayList();
                PsiMethod[] methods = psiClass.getMethods();
                for (int i = 0; i < methods.length; i++) {
                    PsiMethod method = methods[i];
                    if (method instanceof PsiAnnotationMethod) {
                        PsiAnnotationMethod annotationMethod = (PsiAnnotationMethod) method;
                        assert annotationMethod.getParameterList().getParameters().length == 0;

                        PsiType returnType = annotationMethod.getReturnType();

                        // We take the following heuristical convention:
                        // if the last method of the @interface is an array, we convert it into a vararg
                        JetType varargElementType = null;
                        if (i == methods.length - 1 && (returnType instanceof PsiArrayType)) {
519
                            varargElementType = semanticServices.getTypeTransformer().transformToType(((PsiArrayType) returnType).getComponentType(), resolverForTypeParameters);
520 521 522 523 524 525 526 527
                        }

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

534
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
535 536
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
537
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
538
            }
539 540
        }
        else {
541
            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
        for (TypeParameterDescriptorInitialization psiTypeParameter : typeParametersInitialization) {
873
            prevTypeParameters.add(psiTypeParameter.descriptor);
S
Stepan Koltsov 已提交
874 875
            initializeTypeParameter(psiTypeParameter,
                    TypeVariableResolvers.typeVariableResolverFromTypeParameters(prevTypeParameters, typeParametersOwner, context));
S
Stepan Koltsov 已提交
876
        }
A
Andrey Breslav 已提交
877 878
    }

879 880 881
    private Collection<JetType> getSupertypes(PsiClassWrapper psiClass, ResolverBinaryClassData classData, List<TypeParameterDescriptor> typeParameters) {
        ClassDescriptor classDescriptor = classData.classDescriptor;

882 883
        final List<JetType> result = new ArrayList<JetType>();

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

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

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

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

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

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

982 983 984
        ResolverNamespaceData namespaceData = namespaceDescriptorCacheByFqn.get(qualifiedName);
        if (namespaceData != null) {
            return namespaceData.namespaceDescriptor;
985
        }
A
Andrey Breslav 已提交
986

987 988 989
        NamespaceDescriptorParent parentNs = resolveParentNamespace(qualifiedName);
        if (parentNs == null) {
            return null;
S
Stepan Koltsov 已提交
990 991
        }

992 993
        JavaNamespaceDescriptor ns = new JavaNamespaceDescriptor(
                parentNs,
994
                Collections.<AnnotationDescriptor>emptyList(), // TODO
995 996
                qualifiedName.isRoot() ? "<root>" : qualifiedName.shortName(),
                qualifiedName
997
        );
S
Stepan Koltsov 已提交
998

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

S
Stepan Koltsov 已提交
1020
    @Nullable
S
Stepan Koltsov 已提交
1021
    private ResolverNamespaceData createNamespaceResolverScopeData(@NotNull FqName fqName, @NotNull NamespaceDescriptor ns) {
1022 1023 1024 1025 1026 1027
        PsiPackage psiPackage;
        PsiClass psiClass;

        lookingForPsi:
        {
            psiClass = getPsiClassForJavaPackageScope(fqName);
1028
            psiPackage = semanticServices.getPsiClassFinder().findPsiPackage(fqName);
1029
            if (psiClass != null || psiPackage != null) {
1030
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.PROPER);
1031 1032 1033
                break lookingForPsi;
            }

1034
            psiClass = psiClassFinder.findPsiClass(fqName, PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1035 1036 1037
            if (psiClass != null) {
                trace.record(JavaBindingContext.JAVA_NAMESPACE_KIND, ns, JavaNamespaceKind.CLASS_STATICS);
                break lookingForPsi;
1038
            }
S
Stepan Koltsov 已提交
1039

1040 1041 1042 1043
            ResolverNamespaceData oldValue = namespaceDescriptorCacheByFqn.put(fqName, ResolverNamespaceData.NEGATIVE);
            if (oldValue != null) {
                throw new IllegalStateException("rewrite at " + fqName);
            }
1044
            return null;
S
Stepan Koltsov 已提交
1045 1046
        }

1047
        ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
1048

1049
        namespaceData.memberScope = new JavaPackageScope(fqName, semanticServices, namespaceData);
S
Stepan Koltsov 已提交
1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072

        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 已提交
1073 1074
    }

S
Stepan Koltsov 已提交
1075
    @Nullable
S
Stepan Koltsov 已提交
1076
    private PsiClass getPsiClassForJavaPackageScope(@NotNull FqName packageFQN) {
1077
        return psiClassFinder.findPsiClass(packageFQN.child(JvmAbi.PACKAGE_CLASS), PsiClassFinder.RuntimeClassesHandleMode.IGNORE);
1078
    }
1079

1080 1081 1082 1083 1084 1085 1086 1087 1088
    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;
        }
    }
1089

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

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

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

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

1135 1136
        if (parameter.getJetValueParameter().name().length() > 0) {
            name = parameter.getJetValueParameter().name();
1137 1138
        }
        
1139 1140 1141 1142
        String typeFromAnnotation = parameter.getJetValueParameter().type();
        boolean receiver = parameter.getJetValueParameter().receiver();
        boolean hasDefaultValue = parameter.getJetValueParameter().hasDefaultValue();

S
Stepan Koltsov 已提交
1143
        JetType outType;
1144
        if (typeFromAnnotation.length() > 0) {
1145
            outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
S
Stepan Koltsov 已提交
1146 1147
        }
        else {
1148
            outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
S
Stepan Koltsov 已提交
1149
        }
1150 1151 1152

        JetType varargElementType;
        if (psiType instanceof PsiEllipsisType) {
1153
            varargElementType = JetStandardLibrary.getInstance().getArrayElementType(outType);
S
Stepan Koltsov 已提交
1154 1155
        }
        else {
1156 1157 1158
            varargElementType = null;
        }

1159 1160
        if (receiver) {
            return JvmMethodParameterMeaning.receiver(outType);
S
Stepan Koltsov 已提交
1161 1162
        }
        else {
S
Stepan Koltsov 已提交
1163 1164 1165 1166

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

1187 1188 1189 1190 1191 1192 1193
    public Set<VariableDescriptor> resolveFieldGroupByName(@NotNull String fieldName, @NotNull ResolverScopeData scopeData) {

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

        getResolverScopeData(scopeData);
1194

1195 1196 1197
        NamedMembers namedMembers = scopeData.namedMembersMap.get(fieldName);
        if (namedMembers == null) {
            return Collections.emptySet();
1198 1199
        }

1200 1201
        resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, fieldName,
                "class or namespace " + scopeData.psiClass.getQualifiedName());
1202

S
Stepan Koltsov 已提交
1203
        return namedMembers.propertyDescriptors;
1204 1205 1206
    }
    
    @NotNull
1207 1208 1209
    public Set<VariableDescriptor> resolveFieldGroup(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1210

1211
        Set<VariableDescriptor> descriptors = Sets.newHashSet();
1212 1213 1214 1215
        Map<String, NamedMembers> membersForProperties = scopeData.namedMembersMap;
        for (Map.Entry<String, NamedMembers> entry : membersForProperties.entrySet()) {
            NamedMembers namedMembers = entry.getValue();
            String propertyName = entry.getKey();
1216

1217
            resolveNamedGroupProperties(scopeData.classOrNamespaceDescriptor, scopeData, namedMembers, propertyName, "class or namespace " + scopeData.psiClass.getQualifiedName());
1218
            descriptors.addAll(namedMembers.propertyDescriptors);
1219
        }
1220

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

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

1251 1252 1253 1254 1255
    private Object propertyKeyForGrouping(PropertyAccessorData propertyAccessor) {
        Object type = key(propertyAccessor.getType());
        Object receiverType = key(propertyAccessor.getReceiverType());
        return Pair.create(type, receiverType);
    }
1256

1257 1258 1259
    private void resolveNamedGroupProperties(
            @NotNull ClassOrNamespaceDescriptor owner,
            @NotNull ResolverScopeData scopeData,
1260 1261 1262 1263
            @NotNull NamedMembers namedMembers, @NotNull String propertyName,
            @NotNull String context) {
        getResolverScopeData(scopeData);

1264 1265 1266 1267
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1268
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1269
            namedMembers.propertyAccessors = Collections.emptyList();
1270
        }
1271

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

1274 1275 1276 1277
        class GroupingValue {
            PropertyAccessorData getter;
            PropertyAccessorData setter;
            PropertyAccessorData field;
1278
            boolean ext;
1279
        }
1280 1281
        
        Map<Object, GroupingValue> map = new HashMap<Object, GroupingValue>();
1282

1283
        for (PropertyAccessorData propertyAccessor : namedMembers.propertyAccessors) {
1284

1285 1286 1287 1288 1289
            Object key = propertyKeyForGrouping(propertyAccessor);
            
            GroupingValue value = map.get(key);
            if (value == null) {
                value = new GroupingValue();
1290
                value.ext = propertyAccessor.getReceiverType() != null;
1291 1292
                map.put(key, value);
            }
1293

1294 1295 1296 1297
            if (value.ext != (propertyAccessor.getReceiverType() != null)) {
                throw new IllegalStateException("internal error, incorrect key");
            }

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

1321
        
S
Stepan Koltsov 已提交
1322
        Set<PropertyDescriptor> propertiesFromCurrent = new HashSet<PropertyDescriptor>(1);
1323

1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337
        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;
            }
1338

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

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

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

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


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

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

1406
            propertyDescriptor.initialize(getterDescriptor, setterDescriptor);
1407

S
Stepan Koltsov 已提交
1408
            List<TypeParameterDescriptor> typeParameters = new ArrayList<TypeParameterDescriptor>(0);
1409 1410 1411

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

1413
                if (anyMember == members.setter) {
S
Stepan Koltsov 已提交
1414
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1415 1416 1417 1418 1419 1420
                }
            }
            if (members.getter != null) {
                PsiMethodWrapper method = (PsiMethodWrapper) members.getter.getMember();

                if (anyMember == members.getter) {
S
Stepan Koltsov 已提交
1421
                    typeParameters = resolveMethodTypeParameters(method, propertyDescriptor, typeVariableResolver);
1422 1423 1424
                }
            }

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

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

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

1462
            trace.record(BindingContext.VARIABLE, anyMember.getMember().psiMember, propertyDescriptor);
1463
            
S
Stepan Koltsov 已提交
1464
            propertiesFromCurrent.add(propertyDescriptor);
1465
        }
1466

S
Stepan Koltsov 已提交
1467 1468 1469 1470 1471 1472 1473 1474

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

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

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

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

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

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

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

1512
            Set<SimpleFunctionDescriptor> functionsFromSupertypes = getFunctionsFromSupertypes(scopeData, methodName);
1513

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

                @Override
S
Stepan Koltsov 已提交
1521
                public void conflict(@NotNull CallableMemberDescriptor fromSuper, @NotNull CallableMemberDescriptor fromCurrent) {
1522 1523
                    // nop
                }
1524 1525 1526 1527 1528 1529 1530 1531 1532
            });

        }

        functions.addAll(functionsFromCurrent);

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

S
Stepan Koltsov 已提交
1543 1544 1545 1546 1547 1548 1549 1550 1551 1552
    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;
    }

1553
    private void getResolverScopeData(@NotNull ResolverScopeData scopeData) {
1554
        if (scopeData.namedMembersMap == null) {
1555
            scopeData.namedMembersMap = JavaDescriptorResolverHelper.getNamedMembers(scopeData);
1556 1557
        }
    }
A
Andrey Breslav 已提交
1558

A
Andrey Breslav 已提交
1559
    @NotNull
1560
    public Set<FunctionDescriptor> resolveFunctionGroup(@NotNull String methodName, @NotNull ResolverScopeData scopeData) {
A
Andrey Breslav 已提交
1561

1562
        getResolverScopeData(scopeData);
1563

1564
        Map<String, NamedMembers> namedMembersMap = scopeData.namedMembersMap;
1565 1566

        NamedMembers namedMembers = namedMembersMap.get(methodName);
1567
        if (namedMembers != null && namedMembers.methods != null) {
1568
            TypeSubstitutor typeSubstitutor = typeSubstitutorForGenericSupertypes(scopeData);
1569

1570
            resolveNamedGroupFunctions(scopeData.classOrNamespaceDescriptor, scopeData.psiClass, typeSubstitutor, namedMembers, methodName, scopeData);
1571 1572

            return namedMembers.functionDescriptors;
S
Stepan Koltsov 已提交
1573 1574
        }
        else {
1575
            return Collections.emptySet();
1576
        }
1577 1578
    }

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

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

A
Andrey Breslav 已提交
1616
    @Nullable
1617
    private FunctionDescriptorImpl resolveMethodToFunctionDescriptor(
S
Stepan Koltsov 已提交
1618
            @NotNull final PsiClass psiClass, final PsiMethodWrapper method,
1619 1620 1621
            @NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1622

1623
        PsiType returnType = method.getReturnType();
A
Andrey Breslav 已提交
1624 1625 1626
        if (returnType == null) {
            return null;
        }
1627

1628
        // TODO: ugly
1629
        if (method.getJetMethod().kind() == JvmStdlibNames.JET_METHOD_KIND_PROPERTY) {
1630
            return null;
1631
        }
1632

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

1641
        SimpleFunctionDescriptorImpl functionDescriptorImpl = new SimpleFunctionDescriptorImpl(
S
Stepan Koltsov 已提交
1642
                scopeData.classOrNamespaceDescriptor,
1643
                resolveAnnotations(method.getPsiMethod()),
1644 1645
                method.getName(),
                CallableMemberDescriptor.Kind.DECLARATION
A
Andrey Breslav 已提交
1646
        );
1647

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

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

1652
        final List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl, typeVariableResolverForParameters);
1653

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


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

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

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

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

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

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

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

1752 1753 1754
    public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1755

1756
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1757

1758
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1759 1760 1761 1762

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

1767 1768
        return functions;
    }
1769

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

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

1791
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1792
            @NotNull PsiMethodWrapper method,
1793
            @NotNull DeclarationDescriptor functionDescriptor,
1794 1795
            @NotNull TypeVariableResolver classTypeVariableResolver) {

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

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

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

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

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

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

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

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

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