JavaDescriptorResolver.java 82.3 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
import org.jetbrains.jet.lang.types.*;
S
Stepan Koltsov 已提交
96
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
97
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
98
import org.jetbrains.jet.rt.signature.JetSignatureAdapter;
99 100 101
import org.jetbrains.jet.rt.signature.JetSignatureExceptionsAdapter;
import org.jetbrains.jet.rt.signature.JetSignatureReader;
import org.jetbrains.jet.rt.signature.JetSignatureVisitor;
102

103
import javax.inject.Inject;
104 105 106 107 108 109 110 111
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;
112 113 114 115 116

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

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

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

124 125
        @Override
        public DeclarationDescriptor substitute(TypeSubstitutor substitutor) {
126
            throw new UnsupportedOperationException();
127 128
        }

129 130
        @Override
        public <R, D> R accept(DeclarationDescriptorVisitor<R, D> visitor, D data) {
131
            return visitor.visitDeclarationDescriptor(this, data);
132 133 134
        }
    };

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

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

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

165 166 167 168
    private enum TypeParameterDescriptorOrigin {
        JAVA,
        KOTLIN,
    }
169

170 171
    public static class TypeParameterDescriptorInitialization {
        @NotNull
172
        private final TypeParameterDescriptorOrigin origin;
173 174 175
        @NotNull
        final TypeParameterDescriptor descriptor;
        final PsiTypeParameter psiTypeParameter;
176 177 178 179
        @Nullable
        private final List<JetType> upperBoundsForKotlin;
        @Nullable
        private final List<JetType> lowerBoundsForKotlin;
180

181
        private TypeParameterDescriptorInitialization(@NotNull TypeParameterDescriptor descriptor, @NotNull PsiTypeParameter psiTypeParameter) {
182
            this.origin = TypeParameterDescriptorOrigin.JAVA;
183
            this.descriptor = descriptor;
184
            this.psiTypeParameter = psiTypeParameter;
185 186 187 188
            this.upperBoundsForKotlin = null;
            this.lowerBoundsForKotlin = null;
        }

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


200 201 202
    static abstract class ResolverScopeData {
        @Nullable
        final PsiClass psiClass;
203 204 205
        @Nullable
        final PsiPackage psiPackage;
        final FqName fqName;
206
        final boolean staticMembers;
207
        final boolean kotlin;
208 209
        final ClassOrNamespaceDescriptor classOrNamespaceDescriptor;

210
        protected ResolverScopeData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, boolean staticMembers, @NotNull ClassOrNamespaceDescriptor descriptor) {
211 212 213
            checkPsiClassIsNotJet(psiClass);

            this.psiClass = psiClass;
214 215 216 217 218 219 220
            this.psiPackage = psiPackage;
            this.fqName = fqName;

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

221
            this.staticMembers = staticMembers;
222 223
            this.kotlin = psiClass != null &&
                    (new PsiClassWrapper(psiClass).getJetClass().isDefined() || psiClass.getName().equals(JvmAbi.PACKAGE_CLASS));
224
            classOrNamespaceDescriptor = descriptor;
225 226 227 228

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

231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246
        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;
        }

247 248 249 250 251 252 253 254 255 256
        @NotNull
        public PsiElement getPsiPackageOrPsiClass() {
            if (psiPackage != null) {
                return psiPackage;
            }
            else {
                return psiClass;
            }
        }

257
        private Map<String, NamedMembers> namedMembersMap;
258 259 260
        
        @NotNull
        public abstract List<TypeParameterDescriptor> getTypeParameters();
261
    }
A
Andrey Breslav 已提交
262

263
    /** Class with instance members */
S
Stepan Koltsov 已提交
264
    static class ResolverBinaryClassData extends ResolverScopeData {
265
        private final MutableClassDescriptorLite classDescriptor;
266

267 268
        ResolverBinaryClassData(@NotNull PsiClass psiClass, @NotNull FqName fqName, @NotNull MutableClassDescriptorLite classDescriptor) {
            super(psiClass, null, fqName, false, classDescriptor);
269
            this.classDescriptor = classDescriptor;
270 271
        }

272 273 274 275 276 277 278
        private ResolverBinaryClassData(boolean negative) {
            super(negative);
            this.classDescriptor = null;
        }

        static final ResolverBinaryClassData NEGATIVE = new ResolverBinaryClassData(true);

279 280 281 282 283 284 285 286 287
        List<TypeParameterDescriptorInitialization> typeParameters;

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

        @NotNull
        @Override
S
Stepan Koltsov 已提交
288 289
        public List<TypeParameterDescriptor> getTypeParameters() {
            return getClassDescriptor().getTypeConstructor().getParameters();
290
        }
S
Stepan Koltsov 已提交
291

292 293
    }

294
    /** Either package or class with static members */
295 296
    static class ResolverNamespaceData extends ResolverScopeData {
        private final NamespaceDescriptor namespaceDescriptor;
297

298 299
        ResolverNamespaceData(@Nullable PsiClass psiClass, @Nullable PsiPackage psiPackage, @NotNull FqName fqName, @NotNull NamespaceDescriptor namespaceDescriptor) {
            super(psiClass, psiPackage, fqName, true, namespaceDescriptor);
300
            this.namespaceDescriptor = namespaceDescriptor;
301
        }
302

303 304 305 306 307 308 309
        private ResolverNamespaceData(boolean negative) {
            super(negative);
            this.namespaceDescriptor = null;
        }

        static final ResolverNamespaceData NEGATIVE = new ResolverNamespaceData(true);

310 311
        private JavaPackageScope memberScope;

312 313 314 315 316
        @NotNull
        @Override
        public List<TypeParameterDescriptor> getTypeParameters() {
            return new ArrayList<TypeParameterDescriptor>(0);
        }
317 318
    }

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

322 323
    protected Project project;
    protected JavaSemanticServices semanticServices;
324
    private NamespaceFactory namespaceFactory;
325
    private BindingTrace trace;
S
Stepan Koltsov 已提交
326
    private PsiClassFinder psiClassFinder;
327

328 329 330 331 332
    @Inject
    public void setProject(Project project) {
        this.project = project;
    }

333 334 335 336 337
    @Inject
    public void setNamespaceFactory(NamespaceFactoryImpl namespaceFactory) {
        this.namespaceFactory = namespaceFactory;
    }

338 339
    @Inject
    public void setSemanticServices(JavaSemanticServices semanticServices) {
340 341
        this.semanticServices = semanticServices;
    }
342

343 344 345 346 347
    @Inject
    public void setTrace(BindingTrace trace) {
        this.trace = trace;
    }

S
Stepan Koltsov 已提交
348 349 350 351
    @Inject
    public void setPsiClassFinder(PsiClassFinder psiClassFinder) {
        this.psiClassFinder = psiClassFinder;
    }
352

353

354

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

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

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

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

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

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

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

425 426
        checkPsiClassIsNotJet(psiClass);

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

        // 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));
438
        classDescriptorCache.put(fqName, classData);
439
        classData.classDescriptor.setName(name);
440
        classData.classDescriptor.setAnnotations(resolveAnnotations(psiClass, taskList));
441

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

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

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

S
Stepan Koltsov 已提交
469 470 471
        TypeVariableResolver resolverForTypeParameters = TypeVariableResolvers.classTypeVariableResolver(
                classData.classDescriptor,
                "class " + psiClass.getQualifiedName());
472

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

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

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

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

530
                constructorDescriptor.initialize(typeParameters, valueParameters, classData.classDescriptor.getVisibility(), isStatic);
531 532
                constructorDescriptor.setReturnType(classData.classDescriptor.getDefaultType());
                classData.classDescriptor.addConstructor(constructorDescriptor, null);
533
                trace.record(BindingContext.CONSTRUCTOR, psiClass, constructorDescriptor);
534
            }
535 536
        }
        else {
537
            for (PsiMethod psiConstructor : psiConstructors) {
538
                resolveConstructor(psiClass, classData, isStatic, psiConstructor);
539
            }
A
Andrey Breslav 已提交
540
        }
541

542 543 544 545
        MutableClassDescriptorLite classObject = createClassObjectDescriptor(classData.classDescriptor, psiClass);
        if (classObject != null) {
            classData.classDescriptor.setClassObjectDescriptor(classObject);
        }
546

547
        trace.record(BindingContext.CLASS, psiClass, classData.classDescriptor);
548

549
        return classData;
550 551
    }

552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577
    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);
    }

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

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

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

605 606
        checkPsiClassIsNotJet(psiClass);

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

610
        classDescriptorCache.put(fqName, classData);
611

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

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

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

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

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

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

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

S
Stepan Koltsov 已提交
650

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

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


660
    private abstract class JetSignatureTypeParameterVisitor extends JetSignatureExceptionsAdapter {
661 662

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

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

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

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

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

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

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

        private int formalTypeParameterIndex = 0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

884 885
        final List<JetType> result = new ArrayList<JetType>();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

1049
        ResolverNamespaceData namespaceData = new ResolverNamespaceData(psiClass, psiPackage, fqName, ns);
1050

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

        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 已提交
1075 1076
    }

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

1082 1083 1084 1085 1086 1087 1088 1089 1090
    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;
        }
    }
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 1123 1124
    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
1125
    private JvmMethodParameterMeaning resolveParameterDescriptor(DeclarationDescriptor containingDeclaration, int i,
1126 1127 1128 1129 1130 1131 1132
            PsiParameterWrapper parameter, TypeVariableResolver typeVariableResolver) {

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

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

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

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

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

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

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

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

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

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

        getResolverScopeData(scopeData);
1196

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

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

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

        getResolverScopeData(scopeData);
1212

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

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

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

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

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

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

1266 1267 1268 1269
        if (namedMembers.propertyDescriptors != null) {
            return;
        }
        
1270
        if (namedMembers.propertyAccessors == null) {
S
Stepan Koltsov 已提交
1271
            namedMembers.propertyAccessors = Collections.emptyList();
1272
        }
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);
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);
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
        TypeSubstitutor typeSubstitutor;
        if (classDescriptor != null) {
1582
            typeSubstitutor = SubstitutionUtils.buildDeepSubstitutor(classDescriptor.getDefaultType());
A
Andrey Breslav 已提交
1583 1584 1585 1586 1587 1588
        }
        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 List<TypeParameterDescriptor> methodTypeParameters = resolveMethodTypeParameters(method, functionDescriptorImpl);
1651

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


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

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

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

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

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

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

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

1750 1751 1752
    public List<FunctionDescriptor> resolveMethods(@NotNull ResolverScopeData scopeData) {

        getResolverScopeData(scopeData);
1753

1754
        TypeSubstitutor substitutorForGenericSupertypes = typeSubstitutorForGenericSupertypes(scopeData);
1755

1756
        List<FunctionDescriptor> functions = new ArrayList<FunctionDescriptor>();
1757 1758 1759 1760

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

1765 1766
        return functions;
    }
1767

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

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

1789
    private List<TypeParameterDescriptor> resolveMethodTypeParameters(
1790
            @NotNull PsiMethodWrapper method,
S
Stepan Koltsov 已提交
1791
            @NotNull DeclarationDescriptor functionDescriptor) {
1792

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

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

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

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

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

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

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

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

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