Rename UpperBoundCheckerTask -> UpperBoundCheckRequest
This commit is contained in:
@@ -157,25 +157,25 @@ class DeclarationsChecker(
|
|||||||
|
|
||||||
if (classOrObject !is KtClass) return
|
if (classOrObject !is KtClass) return
|
||||||
|
|
||||||
val tasks = ArrayList<DescriptorResolver.UpperBoundCheckerTask>()
|
val upperBoundCheckRequests = ArrayList<DescriptorResolver.UpperBoundCheckRequest>()
|
||||||
|
|
||||||
for (typeParameter in classOrObject.typeParameters) {
|
for (typeParameter in classOrObject.typeParameters) {
|
||||||
val typeReference = typeParameter.extendsBound ?: continue
|
val typeReference = typeParameter.extendsBound ?: continue
|
||||||
val type = typeReference.type() ?: continue
|
val type = typeReference.type() ?: continue
|
||||||
tasks.add(DescriptorResolver.UpperBoundCheckerTask(typeParameter.nameAsName, typeReference, type))
|
upperBoundCheckRequests.add(DescriptorResolver.UpperBoundCheckRequest(typeParameter.nameAsName, typeReference, type))
|
||||||
}
|
}
|
||||||
|
|
||||||
for (constraint in classOrObject.typeConstraints) {
|
for (constraint in classOrObject.typeConstraints) {
|
||||||
val typeReference = constraint.boundTypeReference ?: continue
|
val typeReference = constraint.boundTypeReference ?: continue
|
||||||
val type = typeReference.type() ?: continue
|
val type = typeReference.type() ?: continue
|
||||||
val name = constraint.subjectTypeParameterName?.getReferencedNameAsName() ?: continue
|
val name = constraint.subjectTypeParameterName?.getReferencedNameAsName() ?: continue
|
||||||
tasks.add(DescriptorResolver.UpperBoundCheckerTask(name, typeReference, type))
|
upperBoundCheckRequests.add(DescriptorResolver.UpperBoundCheckRequest(name, typeReference, type))
|
||||||
}
|
}
|
||||||
|
|
||||||
DescriptorResolver.checkUpperBoundTypes(trace, tasks)
|
DescriptorResolver.checkUpperBoundTypes(trace, upperBoundCheckRequests)
|
||||||
|
|
||||||
for (task in tasks) {
|
for (request in upperBoundCheckRequests) {
|
||||||
DescriptorResolver.checkBounds(task.upperBound, task.upperBoundType, trace)
|
DescriptorResolver.checkBounds(request.upperBound, request.upperBoundType, trace)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -47,7 +47,10 @@ import org.jetbrains.kotlin.resolve.constants.ConstantValue;
|
|||||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
|
||||||
import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt;
|
import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
|
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.*;
|
import org.jetbrains.kotlin.resolve.scopes.JetScopeUtils;
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind;
|
||||||
|
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt;
|
import org.jetbrains.kotlin.resolve.scopes.utils.ScopeUtilsKt;
|
||||||
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElementKt;
|
||||||
import org.jetbrains.kotlin.storage.StorageManager;
|
import org.jetbrains.kotlin.storage.StorageManager;
|
||||||
@@ -458,12 +461,12 @@ public class DescriptorResolver {
|
|||||||
return constructorDescriptor;
|
return constructorDescriptor;
|
||||||
}
|
}
|
||||||
|
|
||||||
static final class UpperBoundCheckerTask {
|
static final class UpperBoundCheckRequest {
|
||||||
public final Name typeParameterName;
|
public final Name typeParameterName;
|
||||||
public final KtTypeReference upperBound;
|
public final KtTypeReference upperBound;
|
||||||
public final KotlinType upperBoundType;
|
public final KotlinType upperBoundType;
|
||||||
|
|
||||||
UpperBoundCheckerTask(Name typeParameterName, KtTypeReference upperBound, KotlinType upperBoundType) {
|
UpperBoundCheckRequest(Name typeParameterName, KtTypeReference upperBound, KotlinType upperBoundType) {
|
||||||
this.typeParameterName = typeParameterName;
|
this.typeParameterName = typeParameterName;
|
||||||
this.upperBound = upperBound;
|
this.upperBound = upperBound;
|
||||||
this.upperBoundType = upperBoundType;
|
this.upperBoundType = upperBoundType;
|
||||||
@@ -477,7 +480,7 @@ public class DescriptorResolver {
|
|||||||
List<TypeParameterDescriptorImpl> parameters,
|
List<TypeParameterDescriptorImpl> parameters,
|
||||||
BindingTrace trace
|
BindingTrace trace
|
||||||
) {
|
) {
|
||||||
List<UpperBoundCheckerTask> deferredUpperBoundCheckerTasks = Lists.newArrayList();
|
List<UpperBoundCheckRequest> upperBoundCheckRequests = Lists.newArrayList();
|
||||||
|
|
||||||
List<KtTypeParameter> typeParameters = declaration.getTypeParameters();
|
List<KtTypeParameter> typeParameters = declaration.getTypeParameters();
|
||||||
Map<Name, TypeParameterDescriptorImpl> parameterByName = Maps.newHashMap();
|
Map<Name, TypeParameterDescriptorImpl> parameterByName = Maps.newHashMap();
|
||||||
@@ -491,7 +494,7 @@ public class DescriptorResolver {
|
|||||||
if (extendsBound != null) {
|
if (extendsBound != null) {
|
||||||
KotlinType type = typeResolver.resolveType(scope, extendsBound, trace, false);
|
KotlinType type = typeResolver.resolveType(scope, extendsBound, trace, false);
|
||||||
typeParameterDescriptor.addUpperBound(type);
|
typeParameterDescriptor.addUpperBound(type);
|
||||||
deferredUpperBoundCheckerTasks.add(new UpperBoundCheckerTask(ktTypeParameter.getNameAsName(), extendsBound, type));
|
upperBoundCheckRequests.add(new UpperBoundCheckRequest(ktTypeParameter.getNameAsName(), extendsBound, type));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (KtTypeConstraint constraint : declaration.getTypeConstraints()) {
|
for (KtTypeConstraint constraint : declaration.getTypeConstraints()) {
|
||||||
@@ -505,7 +508,7 @@ public class DescriptorResolver {
|
|||||||
KotlinType bound = null;
|
KotlinType bound = null;
|
||||||
if (boundTypeReference != null) {
|
if (boundTypeReference != null) {
|
||||||
bound = typeResolver.resolveType(scope, boundTypeReference, trace, false);
|
bound = typeResolver.resolveType(scope, boundTypeReference, trace, false);
|
||||||
deferredUpperBoundCheckerTasks.add(new UpperBoundCheckerTask(referencedName, boundTypeReference, bound));
|
upperBoundCheckRequests.add(new UpperBoundCheckRequest(referencedName, boundTypeReference, bound));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (typeParameterDescriptor != null) {
|
if (typeParameterDescriptor != null) {
|
||||||
@@ -526,21 +529,21 @@ public class DescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(declaration instanceof KtClass)) {
|
if (!(declaration instanceof KtClass)) {
|
||||||
checkUpperBoundTypes(trace, deferredUpperBoundCheckerTasks);
|
checkUpperBoundTypes(trace, upperBoundCheckRequests);
|
||||||
checkNamesInConstraints(declaration, descriptor, scope, trace);
|
checkNamesInConstraints(declaration, descriptor, scope, trace);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void checkUpperBoundTypes(@NotNull BindingTrace trace, @NotNull List<UpperBoundCheckerTask> tasks) {
|
public static void checkUpperBoundTypes(@NotNull BindingTrace trace, @NotNull List<UpperBoundCheckRequest> requests) {
|
||||||
if (tasks.isEmpty()) return;
|
if (requests.isEmpty()) return;
|
||||||
|
|
||||||
Set<Name> classBoundEncountered = new HashSet<Name>();
|
Set<Name> classBoundEncountered = new HashSet<Name>();
|
||||||
Set<Pair<Name, TypeConstructor>> allBounds = new HashSet<Pair<Name, TypeConstructor>>();
|
Set<Pair<Name, TypeConstructor>> allBounds = new HashSet<Pair<Name, TypeConstructor>>();
|
||||||
|
|
||||||
for (UpperBoundCheckerTask checkerTask : tasks) {
|
for (UpperBoundCheckRequest request : requests) {
|
||||||
Name typeParameterName = checkerTask.typeParameterName;
|
Name typeParameterName = request.typeParameterName;
|
||||||
KotlinType upperBound = checkerTask.upperBoundType;
|
KotlinType upperBound = request.upperBoundType;
|
||||||
KtTypeReference upperBoundElement = checkerTask.upperBound;
|
KtTypeReference upperBoundElement = request.upperBound;
|
||||||
|
|
||||||
if (!upperBound.isError()) {
|
if (!upperBound.isError()) {
|
||||||
if (!allBounds.add(new Pair<Name, TypeConstructor>(typeParameterName, upperBound.getConstructor()))) {
|
if (!allBounds.add(new Pair<Name, TypeConstructor>(typeParameterName, upperBound.getConstructor()))) {
|
||||||
|
|||||||
Reference in New Issue
Block a user