001 /* 002 * Copyright 2010-2015 JetBrains s.r.o. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package org.jetbrains.kotlin.resolve; 018 019 import com.google.common.collect.Lists; 020 import com.google.common.collect.Maps; 021 import com.google.common.collect.Sets; 022 import com.intellij.psi.PsiElement; 023 import kotlin.Pair; 024 import kotlin.collections.CollectionsKt; 025 import kotlin.collections.SetsKt; 026 import kotlin.jvm.functions.Function0; 027 import kotlin.jvm.functions.Function1; 028 import org.jetbrains.annotations.NotNull; 029 import org.jetbrains.annotations.Nullable; 030 import org.jetbrains.kotlin.builtins.KotlinBuiltIns; 031 import org.jetbrains.kotlin.descriptors.*; 032 import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter; 033 import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget; 034 import org.jetbrains.kotlin.descriptors.annotations.Annotations; 035 import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations; 036 import org.jetbrains.kotlin.descriptors.impl.*; 037 import org.jetbrains.kotlin.diagnostics.Errors; 038 import org.jetbrains.kotlin.incremental.components.NoLookupLocation; 039 import org.jetbrains.kotlin.lexer.KtTokens; 040 import org.jetbrains.kotlin.name.FqName; 041 import org.jetbrains.kotlin.name.Name; 042 import org.jetbrains.kotlin.psi.*; 043 import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt; 044 import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo; 045 import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt; 046 import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil; 047 import org.jetbrains.kotlin.resolve.scopes.LexicalScope; 048 import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind; 049 import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope; 050 import org.jetbrains.kotlin.resolve.scopes.ScopeUtils; 051 import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt; 052 import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt; 053 import org.jetbrains.kotlin.storage.StorageManager; 054 import org.jetbrains.kotlin.types.*; 055 import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; 056 057 import java.util.*; 058 059 import static org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*; 060 import static org.jetbrains.kotlin.diagnostics.Errors.*; 061 import static org.jetbrains.kotlin.lexer.KtTokens.*; 062 import static org.jetbrains.kotlin.resolve.BindingContext.CONSTRUCTOR; 063 import static org.jetbrains.kotlin.resolve.BindingContext.PACKAGE_TO_FILES; 064 import static org.jetbrains.kotlin.resolve.DescriptorUtils.*; 065 import static org.jetbrains.kotlin.resolve.ModifiersChecker.resolveModalityFromModifiers; 066 import static org.jetbrains.kotlin.resolve.ModifiersChecker.resolveVisibilityFromModifiers; 067 068 public class DescriptorResolver { 069 public static final Name COPY_METHOD_NAME = Name.identifier("copy"); 070 071 @NotNull private final TypeResolver typeResolver; 072 @NotNull private final AnnotationResolver annotationResolver; 073 @NotNull private final StorageManager storageManager; 074 @NotNull private final KotlinBuiltIns builtIns; 075 @NotNull private final SupertypeLoopChecker supertypeLoopsResolver; 076 @NotNull private final VariableTypeResolver variableTypeResolver; 077 078 public DescriptorResolver( 079 @NotNull AnnotationResolver annotationResolver, 080 @NotNull KotlinBuiltIns builtIns, 081 @NotNull StorageManager storageManager, 082 @NotNull TypeResolver typeResolver, 083 @NotNull SupertypeLoopChecker supertypeLoopsResolver, 084 @NotNull VariableTypeResolver variableTypeResolver 085 ) { 086 this.annotationResolver = annotationResolver; 087 this.builtIns = builtIns; 088 this.storageManager = storageManager; 089 this.typeResolver = typeResolver; 090 this.supertypeLoopsResolver = supertypeLoopsResolver; 091 this.variableTypeResolver = variableTypeResolver; 092 } 093 094 public List<KotlinType> resolveSupertypes( 095 @NotNull LexicalScope scope, 096 @NotNull ClassDescriptor classDescriptor, 097 @NotNull KtClassOrObject jetClass, 098 BindingTrace trace 099 ) { 100 List<KotlinType> supertypes = Lists.newArrayList(); 101 List<KtSuperTypeListEntry> delegationSpecifiers = jetClass.getSuperTypeListEntries(); 102 Collection<KotlinType> declaredSupertypes = resolveSuperTypeListEntries( 103 scope, 104 delegationSpecifiers, 105 typeResolver, trace, false); 106 107 for (KotlinType declaredSupertype : declaredSupertypes) { 108 addValidSupertype(supertypes, declaredSupertype); 109 } 110 111 if (classDescriptor.getKind() == ClassKind.ENUM_CLASS && !containsClass(supertypes)) { 112 supertypes.add(0, builtIns.getEnumType(classDescriptor.getDefaultType())); 113 } 114 115 if (supertypes.isEmpty()) { 116 KotlinType defaultSupertype = getDefaultSupertype(jetClass, trace, classDescriptor.getKind() == ClassKind.ANNOTATION_CLASS); 117 addValidSupertype(supertypes, defaultSupertype); 118 } 119 120 return supertypes; 121 } 122 123 private static void addValidSupertype(List<KotlinType> supertypes, KotlinType declaredSupertype) { 124 if (!declaredSupertype.isError()) { 125 supertypes.add(declaredSupertype); 126 } 127 } 128 129 private boolean containsClass(Collection<KotlinType> result) { 130 for (KotlinType type : result) { 131 ClassifierDescriptor descriptor = type.getConstructor().getDeclarationDescriptor(); 132 if (descriptor instanceof ClassDescriptor && ((ClassDescriptor) descriptor).getKind() != ClassKind.INTERFACE) { 133 return true; 134 } 135 } 136 return false; 137 } 138 139 private KotlinType getDefaultSupertype(KtClassOrObject jetClass, BindingTrace trace, boolean isAnnotation) { 140 // TODO : beautify 141 if (jetClass instanceof KtEnumEntry) { 142 KtClassOrObject parent = KtStubbedPsiUtil.getContainingDeclaration(jetClass, KtClassOrObject.class); 143 ClassDescriptor parentDescriptor = trace.getBindingContext().get(BindingContext.CLASS, parent); 144 if (parentDescriptor.getTypeConstructor().getParameters().isEmpty()) { 145 return parentDescriptor.getDefaultType(); 146 } 147 else { 148 trace.report(NO_GENERICS_IN_SUPERTYPE_SPECIFIER.on(jetClass.getNameIdentifier())); 149 return ErrorUtils.createErrorType("Supertype not specified"); 150 } 151 } 152 else if (isAnnotation) { 153 return builtIns.getAnnotationType(); 154 } 155 return builtIns.getAnyType(); 156 } 157 158 public Collection<KotlinType> resolveSuperTypeListEntries( 159 LexicalScope extensibleScope, 160 List<KtSuperTypeListEntry> delegationSpecifiers, 161 @NotNull TypeResolver resolver, 162 BindingTrace trace, 163 boolean checkBounds 164 ) { 165 if (delegationSpecifiers.isEmpty()) { 166 return Collections.emptyList(); 167 } 168 Collection<KotlinType> result = Lists.newArrayList(); 169 for (KtSuperTypeListEntry delegationSpecifier : delegationSpecifiers) { 170 KtTypeReference typeReference = delegationSpecifier.getTypeReference(); 171 if (typeReference != null) { 172 KotlinType supertype = resolver.resolveType(extensibleScope, typeReference, trace, checkBounds); 173 if (DynamicTypesKt.isDynamic(supertype)) { 174 trace.report(DYNAMIC_SUPERTYPE.on(typeReference)); 175 } 176 else { 177 result.add(supertype); 178 KtTypeElement bareSuperType = checkNullableSupertypeAndStripQuestionMarks(trace, typeReference.getTypeElement()); 179 checkProjectionsInImmediateArguments(trace, bareSuperType); 180 } 181 } 182 else { 183 result.add(ErrorUtils.createErrorType("No type reference")); 184 } 185 } 186 return result; 187 } 188 189 @Nullable 190 private static KtTypeElement checkNullableSupertypeAndStripQuestionMarks(@NotNull BindingTrace trace, @Nullable KtTypeElement typeElement) { 191 while (typeElement instanceof KtNullableType) { 192 KtNullableType nullableType = (KtNullableType) typeElement; 193 typeElement = nullableType.getInnerType(); 194 // report only for innermost '?', the rest gets a 'redundant' warning 195 if (!(typeElement instanceof KtNullableType) && typeElement != null) { 196 trace.report(NULLABLE_SUPERTYPE.on(nullableType)); 197 } 198 } 199 return typeElement; 200 } 201 202 private static void checkProjectionsInImmediateArguments(@NotNull BindingTrace trace, @Nullable KtTypeElement typeElement) { 203 if (typeElement instanceof KtUserType) { 204 KtUserType userType = (KtUserType) typeElement; 205 List<KtTypeProjection> typeArguments = userType.getTypeArguments(); 206 for (KtTypeProjection typeArgument : typeArguments) { 207 if (typeArgument.getProjectionKind() != KtProjectionKind.NONE) { 208 trace.report(PROJECTION_IN_IMMEDIATE_ARGUMENT_TO_SUPERTYPE.on(typeArgument)); 209 } 210 } 211 } 212 } 213 214 @NotNull 215 public static SimpleFunctionDescriptor createComponentFunctionDescriptor( 216 int parameterIndex, 217 @NotNull PropertyDescriptor property, 218 @NotNull ValueParameterDescriptor parameter, 219 @NotNull ClassDescriptor classDescriptor, 220 @NotNull BindingTrace trace 221 ) { 222 Name functionName = DataClassUtilsKt.createComponentName(parameterIndex); 223 KotlinType returnType = property.getType(); 224 225 SimpleFunctionDescriptorImpl functionDescriptor = SimpleFunctionDescriptorImpl.create( 226 classDescriptor, 227 Annotations.Companion.getEMPTY(), 228 functionName, 229 CallableMemberDescriptor.Kind.SYNTHESIZED, 230 parameter.getSource() 231 ); 232 233 functionDescriptor.initialize( 234 null, 235 classDescriptor.getThisAsReceiverParameter(), 236 Collections.<TypeParameterDescriptor>emptyList(), 237 Collections.<ValueParameterDescriptor>emptyList(), 238 returnType, 239 Modality.FINAL, 240 property.getVisibility() 241 ); 242 functionDescriptor.setOperator(true); 243 244 trace.record(BindingContext.DATA_CLASS_COMPONENT_FUNCTION, parameter, functionDescriptor); 245 246 return functionDescriptor; 247 } 248 249 @NotNull 250 public static SimpleFunctionDescriptor createCopyFunctionDescriptor( 251 @NotNull Collection<ValueParameterDescriptor> constructorParameters, 252 @NotNull ClassDescriptor classDescriptor, 253 @NotNull BindingTrace trace 254 ) { 255 KotlinType returnType = classDescriptor.getDefaultType(); 256 257 SimpleFunctionDescriptorImpl functionDescriptor = SimpleFunctionDescriptorImpl.create( 258 classDescriptor, 259 Annotations.Companion.getEMPTY(), 260 COPY_METHOD_NAME, 261 CallableMemberDescriptor.Kind.SYNTHESIZED, 262 classDescriptor.getSource() 263 ); 264 265 List<ValueParameterDescriptor> parameterDescriptors = Lists.newArrayList(); 266 267 for (ValueParameterDescriptor parameter : constructorParameters) { 268 PropertyDescriptor propertyDescriptor = trace.getBindingContext().get(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameter); 269 // If parameter hasn't corresponding property, so it mustn't have default value as a parameter in copy function for data class 270 boolean declaresDefaultValue = propertyDescriptor != null; 271 ValueParameterDescriptorImpl parameterDescriptor = 272 new ValueParameterDescriptorImpl(functionDescriptor, null, parameter.getIndex(), parameter.getAnnotations(), 273 parameter.getName(), parameter.getType(), 274 declaresDefaultValue, 275 parameter.isCrossinline(), 276 parameter.isNoinline(), 277 parameter.getVarargElementType(), parameter.getSource()); 278 parameterDescriptors.add(parameterDescriptor); 279 if (declaresDefaultValue) { 280 trace.record(BindingContext.VALUE_PARAMETER_AS_PROPERTY, parameterDescriptor, propertyDescriptor); 281 } 282 } 283 284 functionDescriptor.initialize( 285 null, 286 classDescriptor.getThisAsReceiverParameter(), 287 Collections.<TypeParameterDescriptor>emptyList(), 288 parameterDescriptors, 289 returnType, 290 Modality.FINAL, 291 Visibilities.PUBLIC 292 ); 293 294 trace.record(BindingContext.DATA_CLASS_COPY_FUNCTION, classDescriptor, functionDescriptor); 295 return functionDescriptor; 296 } 297 298 public static Visibility getDefaultVisibility(KtModifierListOwner modifierListOwner, DeclarationDescriptor containingDescriptor) { 299 Visibility defaultVisibility; 300 if (containingDescriptor instanceof ClassDescriptor) { 301 KtModifierList modifierList = modifierListOwner.getModifierList(); 302 defaultVisibility = modifierList != null && modifierList.hasModifier(OVERRIDE_KEYWORD) 303 ? Visibilities.INHERITED 304 : Visibilities.DEFAULT_VISIBILITY; 305 } 306 else if (containingDescriptor instanceof FunctionDescriptor || containingDescriptor instanceof PropertyDescriptor) { 307 defaultVisibility = Visibilities.LOCAL; 308 } 309 else { 310 defaultVisibility = Visibilities.DEFAULT_VISIBILITY; 311 } 312 return defaultVisibility; 313 } 314 315 public static Modality getDefaultModality(DeclarationDescriptor containingDescriptor, Visibility visibility, boolean isBodyPresent) { 316 Modality defaultModality; 317 if (containingDescriptor instanceof ClassDescriptor) { 318 boolean isTrait = ((ClassDescriptor) containingDescriptor).getKind() == ClassKind.INTERFACE; 319 boolean isDefinitelyAbstract = isTrait && !isBodyPresent; 320 Modality basicModality = isTrait && !Visibilities.isPrivate(visibility) ? Modality.OPEN : Modality.FINAL; 321 defaultModality = isDefinitelyAbstract ? Modality.ABSTRACT : basicModality; 322 } 323 else { 324 defaultModality = Modality.FINAL; 325 } 326 return defaultModality; 327 } 328 329 @NotNull 330 public ValueParameterDescriptorImpl resolveValueParameterDescriptor( 331 LexicalScope scope, FunctionDescriptor owner, KtParameter valueParameter, int index, KotlinType type, BindingTrace trace 332 ) { 333 KotlinType varargElementType = null; 334 KotlinType variableType = type; 335 if (valueParameter.hasModifier(VARARG_KEYWORD)) { 336 varargElementType = type; 337 variableType = getVarargParameterType(type); 338 } 339 340 KtModifierList modifierList = valueParameter.getModifierList(); 341 342 Annotations allAnnotations = 343 annotationResolver.resolveAnnotationsWithoutArguments(scope, valueParameter.getModifierList(), trace); 344 Annotations valueParameterAnnotations = Annotations.Companion.getEMPTY(); 345 346 if (modifierList != null) { 347 if (valueParameter.hasValOrVar()) { 348 AnnotationSplitter annotationSplitter = AnnotationSplitter.create( 349 storageManager, allAnnotations, SetsKt.setOf(CONSTRUCTOR_PARAMETER)); 350 valueParameterAnnotations = annotationSplitter.getAnnotationsForTarget(CONSTRUCTOR_PARAMETER); 351 } 352 else { 353 valueParameterAnnotations = allAnnotations; 354 } 355 } 356 357 ValueParameterDescriptorImpl valueParameterDescriptor = new ValueParameterDescriptorImpl( 358 owner, 359 null, 360 index, 361 valueParameterAnnotations, 362 KtPsiUtil.safeName(valueParameter.getName()), 363 variableType, 364 valueParameter.hasDefaultValue(), 365 valueParameter.hasModifier(CROSSINLINE_KEYWORD), 366 valueParameter.hasModifier(NOINLINE_KEYWORD), 367 varargElementType, 368 KotlinSourceElementKt.toSourceElement(valueParameter) 369 ); 370 371 trace.record(BindingContext.VALUE_PARAMETER, valueParameter, valueParameterDescriptor); 372 return valueParameterDescriptor; 373 } 374 375 @NotNull 376 private KotlinType getVarargParameterType(@NotNull KotlinType elementType) { 377 KotlinType primitiveArrayType = builtIns.getPrimitiveArrayKotlinTypeByPrimitiveKotlinType(elementType); 378 if (primitiveArrayType != null) { 379 return primitiveArrayType; 380 } 381 return builtIns.getArrayType(Variance.OUT_VARIANCE, elementType); 382 } 383 384 public List<TypeParameterDescriptorImpl> resolveTypeParametersForCallableDescriptor( 385 DeclarationDescriptor containingDescriptor, 386 LexicalWritableScope extensibleScope, 387 LexicalScope scopeForAnnotationsResolve, 388 List<KtTypeParameter> typeParameters, 389 BindingTrace trace 390 ) { 391 List<TypeParameterDescriptorImpl> result = new ArrayList<TypeParameterDescriptorImpl>(); 392 for (int i = 0, typeParametersSize = typeParameters.size(); i < typeParametersSize; i++) { 393 KtTypeParameter typeParameter = typeParameters.get(i); 394 result.add(resolveTypeParameterForCallableDescriptor( 395 containingDescriptor, extensibleScope, scopeForAnnotationsResolve, typeParameter, i, trace)); 396 } 397 return result; 398 } 399 400 private TypeParameterDescriptorImpl resolveTypeParameterForCallableDescriptor( 401 DeclarationDescriptor containingDescriptor, 402 LexicalWritableScope extensibleScope, 403 LexicalScope scopeForAnnotationsResolve, 404 final KtTypeParameter typeParameter, 405 int index, 406 final BindingTrace trace 407 ) { 408 if (typeParameter.getVariance() != Variance.INVARIANT) { 409 assert !(containingDescriptor instanceof ClassifierDescriptor) : "This method is intended for functions/properties"; 410 trace.report(VARIANCE_ON_TYPE_PARAMETER_OF_FUNCTION_OR_PROPERTY.on(typeParameter)); 411 } 412 413 Annotations annotations = 414 annotationResolver.resolveAnnotationsWithArguments(scopeForAnnotationsResolve, typeParameter.getModifierList(), trace); 415 416 TypeParameterDescriptorImpl typeParameterDescriptor = TypeParameterDescriptorImpl.createForFurtherModification( 417 containingDescriptor, 418 annotations, 419 typeParameter.hasModifier(KtTokens.REIFIED_KEYWORD), 420 typeParameter.getVariance(), 421 KtPsiUtil.safeName(typeParameter.getName()), 422 index, 423 KotlinSourceElementKt.toSourceElement(typeParameter), 424 new Function1<KotlinType, Void>() { 425 @Override 426 public Void invoke(KotlinType type) { 427 trace.report(Errors.CYCLIC_GENERIC_UPPER_BOUND.on(typeParameter)); 428 return null; 429 } 430 }, 431 supertypeLoopsResolver 432 ); 433 trace.record(BindingContext.TYPE_PARAMETER, typeParameter, typeParameterDescriptor); 434 extensibleScope.addClassifierDescriptor(typeParameterDescriptor); 435 return typeParameterDescriptor; 436 } 437 438 @NotNull 439 public static ConstructorDescriptorImpl createAndRecordPrimaryConstructorForObject( 440 @Nullable KtClassOrObject object, 441 @NotNull ClassDescriptor classDescriptor, 442 @NotNull BindingTrace trace 443 ) { 444 ConstructorDescriptorImpl constructorDescriptor = 445 DescriptorFactory.createPrimaryConstructorForObject(classDescriptor, KotlinSourceElementKt.toSourceElement(object)); 446 if (object != null) { 447 KtPrimaryConstructor primaryConstructor = object.getPrimaryConstructor(); 448 trace.record(CONSTRUCTOR, primaryConstructor != null ? primaryConstructor : object, constructorDescriptor); 449 } 450 return constructorDescriptor; 451 } 452 453 static final class UpperBoundCheckRequest { 454 public final Name typeParameterName; 455 public final KtTypeReference upperBound; 456 public final KotlinType upperBoundType; 457 458 UpperBoundCheckRequest(Name typeParameterName, KtTypeReference upperBound, KotlinType upperBoundType) { 459 this.typeParameterName = typeParameterName; 460 this.upperBound = upperBound; 461 this.upperBoundType = upperBoundType; 462 } 463 } 464 465 public void resolveGenericBounds( 466 @NotNull KtTypeParameterListOwner declaration, 467 @NotNull DeclarationDescriptor descriptor, 468 LexicalScope scope, 469 List<TypeParameterDescriptorImpl> parameters, 470 BindingTrace trace 471 ) { 472 List<UpperBoundCheckRequest> upperBoundCheckRequests = Lists.newArrayList(); 473 474 List<KtTypeParameter> typeParameters = declaration.getTypeParameters(); 475 Map<Name, TypeParameterDescriptorImpl> parameterByName = Maps.newHashMap(); 476 for (int i = 0; i < typeParameters.size(); i++) { 477 KtTypeParameter ktTypeParameter = typeParameters.get(i); 478 TypeParameterDescriptorImpl typeParameterDescriptor = parameters.get(i); 479 480 parameterByName.put(typeParameterDescriptor.getName(), typeParameterDescriptor); 481 482 KtTypeReference extendsBound = ktTypeParameter.getExtendsBound(); 483 if (extendsBound != null) { 484 KotlinType type = typeResolver.resolveType(scope, extendsBound, trace, false); 485 typeParameterDescriptor.addUpperBound(type); 486 upperBoundCheckRequests.add(new UpperBoundCheckRequest(ktTypeParameter.getNameAsName(), extendsBound, type)); 487 } 488 } 489 for (KtTypeConstraint constraint : declaration.getTypeConstraints()) { 490 KtSimpleNameExpression subjectTypeParameterName = constraint.getSubjectTypeParameterName(); 491 if (subjectTypeParameterName == null) { 492 continue; 493 } 494 Name referencedName = subjectTypeParameterName.getReferencedNameAsName(); 495 TypeParameterDescriptorImpl typeParameterDescriptor = parameterByName.get(referencedName); 496 KtTypeReference boundTypeReference = constraint.getBoundTypeReference(); 497 KotlinType bound = null; 498 if (boundTypeReference != null) { 499 bound = typeResolver.resolveType(scope, boundTypeReference, trace, false); 500 upperBoundCheckRequests.add(new UpperBoundCheckRequest(referencedName, boundTypeReference, bound)); 501 } 502 503 if (typeParameterDescriptor != null) { 504 trace.record(BindingContext.REFERENCE_TARGET, subjectTypeParameterName, typeParameterDescriptor); 505 if (bound != null) { 506 typeParameterDescriptor.addUpperBound(bound); 507 } 508 } 509 } 510 511 for (TypeParameterDescriptorImpl parameter : parameters) { 512 parameter.addDefaultUpperBound(); 513 parameter.setInitialized(); 514 } 515 516 for (TypeParameterDescriptorImpl parameter : parameters) { 517 checkConflictingUpperBounds(trace, parameter, typeParameters.get(parameter.getIndex())); 518 } 519 520 if (!(declaration instanceof KtClass)) { 521 checkUpperBoundTypes(trace, upperBoundCheckRequests); 522 checkNamesInConstraints(declaration, descriptor, scope, trace); 523 } 524 } 525 526 public static void checkUpperBoundTypes(@NotNull BindingTrace trace, @NotNull List<UpperBoundCheckRequest> requests) { 527 if (requests.isEmpty()) return; 528 529 Set<Name> classBoundEncountered = new HashSet<Name>(); 530 Set<Pair<Name, TypeConstructor>> allBounds = new HashSet<Pair<Name, TypeConstructor>>(); 531 532 for (UpperBoundCheckRequest request : requests) { 533 Name typeParameterName = request.typeParameterName; 534 KotlinType upperBound = request.upperBoundType; 535 KtTypeReference upperBoundElement = request.upperBound; 536 537 if (!upperBound.isError()) { 538 if (!allBounds.add(new Pair<Name, TypeConstructor>(typeParameterName, upperBound.getConstructor()))) { 539 trace.report(REPEATED_BOUND.on(upperBoundElement)); 540 } 541 else { 542 ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(upperBound); 543 if (classDescriptor != null) { 544 ClassKind kind = classDescriptor.getKind(); 545 if (kind == ClassKind.CLASS || kind == ClassKind.ENUM_CLASS || kind == ClassKind.OBJECT) { 546 if (!classBoundEncountered.add(typeParameterName)) { 547 trace.report(ONLY_ONE_CLASS_BOUND_ALLOWED.on(upperBoundElement)); 548 } 549 } 550 } 551 } 552 } 553 554 checkUpperBoundType(upperBoundElement, upperBound, trace); 555 } 556 } 557 558 public static void checkConflictingUpperBounds( 559 @NotNull BindingTrace trace, 560 @NotNull TypeParameterDescriptor parameter, 561 @NotNull KtTypeParameter typeParameter 562 ) { 563 if (KotlinBuiltIns.isNothing(TypeIntersector.getUpperBoundsAsType(parameter))) { 564 trace.report(CONFLICTING_UPPER_BOUNDS.on(typeParameter, parameter)); 565 } 566 } 567 568 public void checkNamesInConstraints( 569 @NotNull KtTypeParameterListOwner declaration, 570 @NotNull DeclarationDescriptor descriptor, 571 @NotNull LexicalScope scope, 572 @NotNull BindingTrace trace 573 ) { 574 for (KtTypeConstraint constraint : declaration.getTypeConstraints()) { 575 KtSimpleNameExpression nameExpression = constraint.getSubjectTypeParameterName(); 576 if (nameExpression == null) continue; 577 578 Name name = nameExpression.getReferencedNameAsName(); 579 580 ClassifierDescriptor classifier = ScopeUtilsKt.findClassifier(scope, name, NoLookupLocation.FOR_NON_TRACKED_SCOPE); 581 if (classifier instanceof TypeParameterDescriptor && classifier.getContainingDeclaration() == descriptor) continue; 582 583 if (classifier != null) { 584 // To tell the user that we look only for locally defined type parameters 585 trace.report(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER.on(nameExpression, constraint, declaration)); 586 trace.record(BindingContext.REFERENCE_TARGET, nameExpression, classifier); 587 } 588 else { 589 trace.report(UNRESOLVED_REFERENCE.on(nameExpression, nameExpression)); 590 } 591 592 KtTypeReference boundTypeReference = constraint.getBoundTypeReference(); 593 if (boundTypeReference != null) { 594 typeResolver.resolveType(scope, boundTypeReference, trace, true); 595 } 596 } 597 } 598 599 public static void checkUpperBoundType( 600 KtTypeReference upperBound, 601 @NotNull KotlinType upperBoundType, 602 BindingTrace trace 603 ) { 604 if (DeclarationsCheckerKt.checkNotEnumEntry(upperBound, trace)) return; 605 if (!TypeUtils.canHaveSubtypes(KotlinTypeChecker.DEFAULT, upperBoundType)) { 606 trace.report(FINAL_UPPER_BOUND.on(upperBound, upperBoundType)); 607 } 608 if (DynamicTypesKt.isDynamic(upperBoundType)) { 609 trace.report(DYNAMIC_UPPER_BOUND.on(upperBound)); 610 } 611 if (KotlinBuiltIns.isExactExtensionFunctionType(upperBoundType)) { 612 trace.report(UPPER_BOUND_IS_EXTENSION_FUNCTION_TYPE.on(upperBound)); 613 } 614 } 615 616 @NotNull 617 public VariableDescriptor resolveLocalVariableDescriptor( 618 @NotNull LexicalScope scope, 619 @NotNull KtParameter parameter, 620 BindingTrace trace 621 ) { 622 KotlinType type = resolveParameterType(scope, parameter, trace); 623 return resolveLocalVariableDescriptor(parameter, type, trace, scope); 624 } 625 626 private KotlinType resolveParameterType(LexicalScope scope, KtParameter parameter, BindingTrace trace) { 627 KtTypeReference typeReference = parameter.getTypeReference(); 628 KotlinType type; 629 if (typeReference != null) { 630 type = typeResolver.resolveType(scope, typeReference, trace, true); 631 } 632 else { 633 // Error is reported by the parser 634 type = ErrorUtils.createErrorType("Annotation is absent"); 635 } 636 if (parameter.hasModifier(VARARG_KEYWORD)) { 637 return getVarargParameterType(type); 638 } 639 return type; 640 } 641 642 public VariableDescriptor resolveLocalVariableDescriptor( 643 @NotNull KtParameter parameter, 644 @NotNull KotlinType type, 645 BindingTrace trace, 646 @NotNull LexicalScope scope 647 ) { 648 VariableDescriptor variableDescriptor = new LocalVariableDescriptor( 649 scope.getOwnerDescriptor(), 650 annotationResolver.resolveAnnotationsWithArguments(scope, parameter.getModifierList(), trace), 651 KtPsiUtil.safeName(parameter.getName()), 652 type, 653 false, 654 KotlinSourceElementKt.toSourceElement(parameter) 655 ); 656 trace.record(BindingContext.VALUE_PARAMETER, parameter, variableDescriptor); 657 // Type annotations also should be resolved 658 ForceResolveUtil.forceResolveAllContents(type.getAnnotations()); 659 return variableDescriptor; 660 } 661 662 @NotNull 663 public PropertyDescriptor resolvePropertyDescriptor( 664 @NotNull DeclarationDescriptor containingDeclaration, 665 @NotNull LexicalScope scope, 666 @NotNull KtProperty property, 667 @NotNull final BindingTrace trace, 668 @NotNull DataFlowInfo dataFlowInfo 669 ) { 670 KtModifierList modifierList = property.getModifierList(); 671 boolean isVar = property.isVar(); 672 673 boolean hasBody = hasBody(property); 674 Visibility visibility = resolveVisibilityFromModifiers(property, getDefaultVisibility(property, containingDeclaration)); 675 Modality modality = containingDeclaration instanceof ClassDescriptor 676 ? resolveModalityFromModifiers(property, getDefaultModality(containingDeclaration, visibility, hasBody)) 677 : Modality.FINAL; 678 679 final AnnotationSplitter.PropertyWrapper wrapper = new AnnotationSplitter.PropertyWrapper(property); 680 681 Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, modifierList, trace); 682 AnnotationSplitter annotationSplitter = 683 new AnnotationSplitter(storageManager, allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() { 684 @Override 685 public Set<AnnotationUseSiteTarget> invoke() { 686 return AnnotationSplitter.getTargetSet(false, trace.getBindingContext(), wrapper); 687 } 688 }); 689 690 Annotations propertyAnnotations = new CompositeAnnotations(CollectionsKt.listOf( 691 annotationSplitter.getAnnotationsForTargets(PROPERTY, FIELD, PROPERTY_DELEGATE_FIELD), 692 annotationSplitter.getOtherAnnotations())); 693 694 PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create( 695 containingDeclaration, 696 propertyAnnotations, 697 modality, 698 visibility, 699 isVar, 700 KtPsiUtil.safeName(property.getName()), 701 CallableMemberDescriptor.Kind.DECLARATION, 702 KotlinSourceElementKt.toSourceElement(property), 703 modifierList != null && modifierList.hasModifier(KtTokens.LATEINIT_KEYWORD), 704 modifierList != null && modifierList.hasModifier(KtTokens.CONST_KEYWORD) 705 ); 706 wrapper.setDescriptor(propertyDescriptor); 707 708 List<TypeParameterDescriptorImpl> typeParameterDescriptors; 709 LexicalScope scopeWithTypeParameters; 710 KotlinType receiverType = null; 711 712 { 713 List<KtTypeParameter> typeParameters = property.getTypeParameters(); 714 if (typeParameters.isEmpty()) { 715 scopeWithTypeParameters = scope; 716 typeParameterDescriptors = Collections.emptyList(); 717 } 718 else { 719 LexicalWritableScope writableScope = new LexicalWritableScope( 720 scope, containingDeclaration, false, null, new TraceBasedRedeclarationHandler(trace), 721 LexicalScopeKind.PROPERTY_HEADER); 722 typeParameterDescriptors = resolveTypeParametersForCallableDescriptor( 723 propertyDescriptor, writableScope, scope, typeParameters, trace); 724 writableScope.changeLockLevel(LexicalWritableScope.LockLevel.READING); 725 resolveGenericBounds(property, propertyDescriptor, writableScope, typeParameterDescriptors, trace); 726 scopeWithTypeParameters = writableScope; 727 } 728 729 KtTypeReference receiverTypeRef = property.getReceiverTypeReference(); 730 if (receiverTypeRef != null) { 731 receiverType = typeResolver.resolveType(scopeWithTypeParameters, receiverTypeRef, trace, true); 732 } 733 } 734 735 ReceiverParameterDescriptor receiverDescriptor = 736 DescriptorFactory.createExtensionReceiverParameterForCallable(propertyDescriptor, receiverType); 737 738 KotlinType type = variableTypeResolver.process( 739 propertyDescriptor, ScopeUtils.makeScopeForPropertyInitializer(scopeWithTypeParameters, propertyDescriptor), 740 property, dataFlowInfo, true, trace 741 ); 742 743 propertyDescriptor.setType(type, typeParameterDescriptors, getDispatchReceiverParameterIfNeeded(containingDeclaration), 744 receiverDescriptor); 745 746 PropertyGetterDescriptorImpl getter = resolvePropertyGetterDescriptor( 747 scopeWithTypeParameters, property, propertyDescriptor, annotationSplitter, trace); 748 PropertySetterDescriptor setter = resolvePropertySetterDescriptor( 749 scopeWithTypeParameters, property, propertyDescriptor, annotationSplitter, trace); 750 751 propertyDescriptor.initialize(getter, setter); 752 753 trace.record(BindingContext.VARIABLE, property, propertyDescriptor); 754 return propertyDescriptor; 755 } 756 757 /*package*/ 758 static boolean hasBody(KtProperty property) { 759 boolean hasBody = property.hasDelegateExpressionOrInitializer(); 760 if (!hasBody) { 761 KtPropertyAccessor getter = property.getGetter(); 762 if (getter != null && getter.hasBody()) { 763 hasBody = true; 764 } 765 KtPropertyAccessor setter = property.getSetter(); 766 if (!hasBody && setter != null && setter.hasBody()) { 767 hasBody = true; 768 } 769 } 770 return hasBody; 771 } 772 773 774 @Nullable 775 /*package*/ static KotlinType transformAnonymousTypeIfNeeded( 776 @NotNull DeclarationDescriptorWithVisibility descriptor, 777 @NotNull KtNamedDeclaration declaration, 778 @NotNull KotlinType type, 779 @NotNull BindingTrace trace 780 ) { 781 ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor(); 782 if (classifier == null || !DescriptorUtils.isAnonymousObject(classifier) || DescriptorUtils.isLocal(descriptor)) { 783 return type; 784 } 785 786 boolean definedInClass = DescriptorUtils.getParentOfType(descriptor, ClassDescriptor.class) != null; 787 if (!definedInClass || !Visibilities.isPrivate(descriptor.getVisibility())) { 788 if (type.getConstructor().getSupertypes().size() == 1) { 789 return type.getConstructor().getSupertypes().iterator().next(); 790 } 791 else { 792 trace.report(AMBIGUOUS_ANONYMOUS_TYPE_INFERRED.on(declaration, type.getConstructor().getSupertypes())); 793 } 794 } 795 796 return type; 797 } 798 799 800 @Nullable 801 private PropertySetterDescriptor resolvePropertySetterDescriptor( 802 @NotNull LexicalScope scopeWithTypeParameters, 803 @NotNull KtProperty property, 804 @NotNull PropertyDescriptor propertyDescriptor, 805 @NotNull AnnotationSplitter annotationSplitter, 806 BindingTrace trace 807 ) { 808 KtPropertyAccessor setter = property.getSetter(); 809 PropertySetterDescriptorImpl setterDescriptor = null; 810 if (setter != null) { 811 Annotations annotations = new CompositeAnnotations(CollectionsKt.listOf( 812 annotationSplitter.getAnnotationsForTarget(PROPERTY_SETTER), 813 annotationResolver.resolveAnnotationsWithoutArguments(scopeWithTypeParameters, setter.getModifierList(), trace))); 814 KtParameter parameter = setter.getParameter(); 815 816 setterDescriptor = new PropertySetterDescriptorImpl(propertyDescriptor, annotations, 817 resolveModalityFromModifiers(setter, propertyDescriptor.getModality()), 818 resolveVisibilityFromModifiers(setter, propertyDescriptor.getVisibility()), 819 setter.hasBody(), false, setter.hasModifier(EXTERNAL_KEYWORD), 820 CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt 821 .toSourceElement(setter)); 822 KtTypeReference returnTypeReference = setter.getReturnTypeReference(); 823 if (returnTypeReference != null) { 824 KotlinType returnType = typeResolver.resolveType(scopeWithTypeParameters, returnTypeReference, trace, true); 825 if (!KotlinBuiltIns.isUnit(returnType)) { 826 trace.report(WRONG_SETTER_RETURN_TYPE.on(returnTypeReference)); 827 } 828 } 829 830 if (parameter != null) { 831 832 // This check is redundant: the parser does not allow a default value, but we'll keep it just in case 833 if (parameter.hasDefaultValue()) { 834 trace.report(SETTER_PARAMETER_WITH_DEFAULT_VALUE.on(parameter.getDefaultValue())); 835 } 836 837 KotlinType type; 838 KtTypeReference typeReference = parameter.getTypeReference(); 839 if (typeReference == null) { 840 type = propertyDescriptor.getType(); // TODO : this maybe unknown at this point 841 } 842 else { 843 type = typeResolver.resolveType(scopeWithTypeParameters, typeReference, trace, true); 844 KotlinType inType = propertyDescriptor.getType(); 845 if (inType != null) { 846 if (!TypeUtils.equalTypes(type, inType)) { 847 trace.report(WRONG_SETTER_PARAMETER_TYPE.on(typeReference, inType, type)); 848 } 849 } 850 else { 851 // TODO : the same check may be needed later??? 852 } 853 } 854 855 ValueParameterDescriptorImpl valueParameterDescriptor = 856 resolveValueParameterDescriptor(scopeWithTypeParameters, setterDescriptor, parameter, 0, type, trace); 857 setterDescriptor.initialize(valueParameterDescriptor); 858 } 859 else { 860 setterDescriptor.initializeDefault(); 861 } 862 863 trace.record(BindingContext.PROPERTY_ACCESSOR, setter, setterDescriptor); 864 } 865 else if (property.isVar()) { 866 Annotations setterAnnotations = annotationSplitter.getAnnotationsForTarget(PROPERTY_SETTER); 867 setterDescriptor = DescriptorFactory.createSetter(propertyDescriptor, setterAnnotations, !property.hasDelegate(), 868 /* isExternal = */ false, propertyDescriptor.getSource()); 869 } 870 871 if (!property.isVar()) { 872 if (setter != null) { 873 // trace.getErrorHandler().genericError(setter.asElement().getNode(), "A 'val'-property cannot have a setter"); 874 trace.report(VAL_WITH_SETTER.on(setter)); 875 } 876 } 877 return setterDescriptor; 878 } 879 880 @NotNull 881 private PropertyGetterDescriptorImpl resolvePropertyGetterDescriptor( 882 @NotNull LexicalScope scopeWithTypeParameters, 883 @NotNull KtProperty property, 884 @NotNull PropertyDescriptor propertyDescriptor, 885 @NotNull AnnotationSplitter annotationSplitter, 886 BindingTrace trace 887 ) { 888 PropertyGetterDescriptorImpl getterDescriptor; 889 KtPropertyAccessor getter = property.getGetter(); 890 if (getter != null) { 891 Annotations getterAnnotations = new CompositeAnnotations(CollectionsKt.listOf( 892 annotationSplitter.getAnnotationsForTarget(PROPERTY_GETTER), 893 annotationResolver.resolveAnnotationsWithoutArguments(scopeWithTypeParameters, getter.getModifierList(), trace))); 894 895 KotlinType outType = propertyDescriptor.getType(); 896 KotlinType returnType = outType; 897 KtTypeReference returnTypeReference = getter.getReturnTypeReference(); 898 if (returnTypeReference != null) { 899 returnType = typeResolver.resolveType(scopeWithTypeParameters, returnTypeReference, trace, true); 900 if (outType != null && !TypeUtils.equalTypes(returnType, outType)) { 901 trace.report(WRONG_GETTER_RETURN_TYPE.on(returnTypeReference, propertyDescriptor.getReturnType(), outType)); 902 } 903 } 904 905 getterDescriptor = new PropertyGetterDescriptorImpl(propertyDescriptor, getterAnnotations, 906 resolveModalityFromModifiers(getter, propertyDescriptor.getModality()), 907 resolveVisibilityFromModifiers(getter, propertyDescriptor.getVisibility()), 908 getter.hasBody(), false, getter.hasModifier(EXTERNAL_KEYWORD), 909 CallableMemberDescriptor.Kind.DECLARATION, null, KotlinSourceElementKt 910 .toSourceElement(getter)); 911 getterDescriptor.initialize(returnType); 912 trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor); 913 } 914 else { 915 Annotations getterAnnotations = annotationSplitter.getAnnotationsForTarget(PROPERTY_GETTER); 916 getterDescriptor = DescriptorFactory.createGetter(propertyDescriptor, getterAnnotations, !property.hasDelegate(), 917 /* isExternal = */ false); 918 getterDescriptor.initialize(propertyDescriptor.getType()); 919 } 920 return getterDescriptor; 921 } 922 923 @NotNull 924 public PropertyDescriptor resolvePrimaryConstructorParameterToAProperty( 925 @NotNull ClassDescriptor classDescriptor, 926 @NotNull ValueParameterDescriptor valueParameter, 927 @NotNull LexicalScope scope, 928 @NotNull KtParameter parameter, final BindingTrace trace 929 ) { 930 KotlinType type = resolveParameterType(scope, parameter, trace); 931 Name name = parameter.getNameAsSafeName(); 932 boolean isMutable = parameter.isMutable(); 933 KtModifierList modifierList = parameter.getModifierList(); 934 935 if (modifierList != null) { 936 if (modifierList.hasModifier(KtTokens.ABSTRACT_KEYWORD)) { 937 trace.report(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS.on(parameter)); 938 } 939 } 940 941 final AnnotationSplitter.PropertyWrapper propertyWrapper = new AnnotationSplitter.PropertyWrapper(parameter); 942 Annotations allAnnotations = annotationResolver.resolveAnnotationsWithoutArguments(scope, parameter.getModifierList(), trace); 943 AnnotationSplitter annotationSplitter = 944 new AnnotationSplitter(storageManager, allAnnotations, new Function0<Set<AnnotationUseSiteTarget>>() { 945 @Override 946 public Set<AnnotationUseSiteTarget> invoke() { 947 return AnnotationSplitter.getTargetSet(true, trace.getBindingContext(), propertyWrapper); 948 } 949 }); 950 951 Annotations propertyAnnotations = new CompositeAnnotations( 952 annotationSplitter.getAnnotationsForTargets(PROPERTY, FIELD), 953 annotationSplitter.getOtherAnnotations()); 954 955 PropertyDescriptorImpl propertyDescriptor = PropertyDescriptorImpl.create( 956 classDescriptor, 957 propertyAnnotations, 958 resolveModalityFromModifiers(parameter, Modality.FINAL), 959 resolveVisibilityFromModifiers(parameter, getDefaultVisibility(parameter, classDescriptor)), 960 isMutable, 961 name, 962 CallableMemberDescriptor.Kind.DECLARATION, 963 KotlinSourceElementKt.toSourceElement(parameter), 964 /* lateInit = */ false, 965 /* isConst = */ false 966 ); 967 propertyWrapper.setDescriptor(propertyDescriptor); 968 propertyDescriptor.setType(type, Collections.<TypeParameterDescriptor>emptyList(), 969 getDispatchReceiverParameterIfNeeded(classDescriptor), (ReceiverParameterDescriptor) null); 970 971 Annotations setterAnnotations = annotationSplitter.getAnnotationsForTarget(PROPERTY_SETTER); 972 Annotations getterAnnotations = new CompositeAnnotations(CollectionsKt.listOf( 973 annotationSplitter.getAnnotationsForTarget(PROPERTY_GETTER))); 974 975 PropertyGetterDescriptorImpl getter = DescriptorFactory.createDefaultGetter(propertyDescriptor, getterAnnotations); 976 PropertySetterDescriptor setter = 977 propertyDescriptor.isVar() ? DescriptorFactory.createDefaultSetter(propertyDescriptor, setterAnnotations) : null; 978 979 propertyDescriptor.initialize(getter, setter); 980 getter.initialize(propertyDescriptor.getType()); 981 982 trace.record(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, parameter, propertyDescriptor); 983 trace.record(BindingContext.VALUE_PARAMETER_AS_PROPERTY, valueParameter, propertyDescriptor); 984 return propertyDescriptor; 985 } 986 987 public static void checkBounds(@NotNull KtTypeReference typeReference, @NotNull KotlinType type, @NotNull BindingTrace trace) { 988 if (type.isError()) return; 989 990 KtTypeElement typeElement = typeReference.getTypeElement(); 991 if (typeElement == null) return; 992 993 List<TypeParameterDescriptor> parameters = type.getConstructor().getParameters(); 994 List<TypeProjection> arguments = type.getArguments(); 995 assert parameters.size() == arguments.size(); 996 997 List<KtTypeReference> jetTypeArguments = typeElement.getTypeArgumentsAsTypes(); 998 999 // A type reference from Kotlin code can yield a flexible type only if it's `ft<T1, T2>`, whose bounds should not be checked 1000 if (FlexibleTypesKt.isFlexible(type) && !DynamicTypesKt.isDynamic(type)) { 1001 assert jetTypeArguments.size() == 2 1002 : "Flexible type cannot be denoted in Kotlin otherwise than as ft<T1, T2>, but was: " 1003 + PsiUtilsKt.getElementTextWithContext(typeReference); 1004 // it's really ft<Foo, Bar> 1005 Flexibility flexibility = FlexibleTypesKt.flexibility(type); 1006 checkBounds(jetTypeArguments.get(0), flexibility.getLowerBound(), trace); 1007 checkBounds(jetTypeArguments.get(1), flexibility.getUpperBound(), trace); 1008 return; 1009 } 1010 1011 assert jetTypeArguments.size() <= arguments.size() : typeElement.getText() + ": " + jetTypeArguments + " - " + arguments; 1012 1013 TypeSubstitutor substitutor = TypeSubstitutor.create(type); 1014 for (int i = 0; i < jetTypeArguments.size(); i++) { 1015 KtTypeReference jetTypeArgument = jetTypeArguments.get(i); 1016 1017 if (jetTypeArgument == null) continue; 1018 1019 KotlinType typeArgument = arguments.get(i).getType(); 1020 checkBounds(jetTypeArgument, typeArgument, trace); 1021 1022 TypeParameterDescriptor typeParameterDescriptor = parameters.get(i); 1023 checkBounds(jetTypeArgument, typeArgument, typeParameterDescriptor, substitutor, trace); 1024 } 1025 } 1026 1027 public static void checkBounds( 1028 @NotNull KtTypeReference jetTypeArgument, 1029 @NotNull KotlinType typeArgument, 1030 @NotNull TypeParameterDescriptor typeParameterDescriptor, 1031 @NotNull TypeSubstitutor substitutor, 1032 @NotNull BindingTrace trace 1033 ) { 1034 for (KotlinType bound : typeParameterDescriptor.getUpperBounds()) { 1035 KotlinType substitutedBound = substitutor.safeSubstitute(bound, Variance.INVARIANT); 1036 if (!KotlinTypeChecker.DEFAULT.isSubtypeOf(typeArgument, substitutedBound)) { 1037 trace.report(UPPER_BOUND_VIOLATED.on(jetTypeArgument, substitutedBound, typeArgument)); 1038 } 1039 } 1040 } 1041 1042 public static boolean checkHasOuterClassInstance( 1043 @NotNull LexicalScope scope, 1044 @NotNull BindingTrace trace, 1045 @NotNull PsiElement reportErrorsOn, 1046 @NotNull ClassDescriptor target 1047 ) { 1048 ClassDescriptor classDescriptor = getContainingClass(scope); 1049 1050 if (!isInsideOuterClassOrItsSubclass(classDescriptor, target)) { 1051 return true; 1052 } 1053 1054 while (classDescriptor != null) { 1055 if (isSubclass(classDescriptor, target)) { 1056 return true; 1057 } 1058 1059 if (isStaticNestedClass(classDescriptor)) { 1060 trace.report(INACCESSIBLE_OUTER_CLASS_EXPRESSION.on(reportErrorsOn, classDescriptor)); 1061 return false; 1062 } 1063 classDescriptor = getParentOfType(classDescriptor, ClassDescriptor.class, true); 1064 } 1065 return true; 1066 } 1067 1068 private static boolean isInsideOuterClassOrItsSubclass(@Nullable DeclarationDescriptor nested, @NotNull ClassDescriptor outer) { 1069 if (nested == null) return false; 1070 1071 if (nested instanceof ClassDescriptor && isSubclass((ClassDescriptor) nested, outer)) return true; 1072 1073 return isInsideOuterClassOrItsSubclass(nested.getContainingDeclaration(), outer); 1074 } 1075 1076 @Nullable 1077 public static ClassDescriptor getContainingClass(@NotNull LexicalScope scope) { 1078 return getParentOfType(scope.getOwnerDescriptor(), ClassDescriptor.class, false); 1079 } 1080 1081 public static void registerFileInPackage(@NotNull BindingTrace trace, @NotNull KtFile file) { 1082 // Register files corresponding to this package 1083 // The trace currently does not support bi-di multimaps that would handle this task nicer 1084 FqName fqName = file.getPackageFqName(); 1085 Collection<KtFile> files = trace.get(PACKAGE_TO_FILES, fqName); 1086 if (files == null) { 1087 files = Sets.newIdentityHashSet(); 1088 } 1089 files.add(file); 1090 trace.record(BindingContext.PACKAGE_TO_FILES, fqName, files); 1091 } 1092 }