KT-14274: resolve type alias constructors calls in supertypes list as type alias constructors.
Support @Deprecated for type aliases, including type alias constructors.
This commit is contained in:
@@ -1639,7 +1639,7 @@ public class ExpressionCodegen extends KtVisitor<StackValue, StackValue> impleme
|
|||||||
|
|
||||||
ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor();
|
ConstructorDescriptor primaryConstructor = classDescriptor.getUnsubstitutedPrimaryConstructor();
|
||||||
assert primaryConstructor != null : "There should be primary constructor for object literal";
|
assert primaryConstructor != null : "There should be primary constructor for object literal";
|
||||||
ResolvedCall<ClassConstructorDescriptor> superCall = getDelegationConstructorCall(bindingContext, primaryConstructor);
|
ResolvedCall<ConstructorDescriptor> superCall = getDelegationConstructorCall(bindingContext, primaryConstructor);
|
||||||
if (superCall != null) {
|
if (superCall != null) {
|
||||||
// For an anonymous object, we should also generate all non-default arguments that it captures for its super call
|
// For an anonymous object, we should also generate all non-default arguments that it captures for its super call
|
||||||
ConstructorDescriptor superConstructor = superCall.getResultingDescriptor();
|
ConstructorDescriptor superConstructor = superCall.getResultingDescriptor();
|
||||||
|
|||||||
@@ -1049,10 +1049,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
|
|
||||||
markLineNumberForConstructor(constructorDescriptor, constructor, codegen);
|
markLineNumberForConstructor(constructorDescriptor, constructor, codegen);
|
||||||
|
|
||||||
ResolvedCall<ClassConstructorDescriptor> constructorDelegationCall =
|
ResolvedCall<ConstructorDescriptor> constructorDelegationCall =
|
||||||
getDelegationConstructorCall(bindingContext, constructorDescriptor);
|
getDelegationConstructorCall(bindingContext, constructorDescriptor);
|
||||||
ConstructorDescriptor delegateConstructor = constructorDelegationCall == null ? null :
|
ConstructorDescriptor delegateConstructor = constructorDelegationCall == null ? null :
|
||||||
constructorDelegationCall.getResultingDescriptor();
|
constructorDelegationCall.getResultingDescriptor();
|
||||||
|
|
||||||
generateDelegatorToConstructorCall(iv, codegen, constructorDescriptor, constructorDelegationCall);
|
generateDelegatorToConstructorCall(iv, codegen, constructorDescriptor, constructorDelegationCall);
|
||||||
if (!isSameClassConstructor(delegateConstructor)) {
|
if (!isSameClassConstructor(delegateConstructor)) {
|
||||||
@@ -1383,7 +1383,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
@NotNull InstructionAdapter iv,
|
@NotNull InstructionAdapter iv,
|
||||||
@NotNull ExpressionCodegen codegen,
|
@NotNull ExpressionCodegen codegen,
|
||||||
@NotNull ClassConstructorDescriptor constructorDescriptor,
|
@NotNull ClassConstructorDescriptor constructorDescriptor,
|
||||||
@Nullable ResolvedCall<ClassConstructorDescriptor> delegationConstructorCall
|
@Nullable ResolvedCall<ConstructorDescriptor> delegationConstructorCall
|
||||||
) {
|
) {
|
||||||
if (delegationConstructorCall == null) {
|
if (delegationConstructorCall == null) {
|
||||||
genSimpleSuperCall(iv);
|
genSimpleSuperCall(iv);
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.codegen.signature.JvmSignatureWriter;
|
|||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableAccessorDescriptor;
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableAccessorDescriptor;
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor;
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor;
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor;
|
||||||
import org.jetbrains.kotlin.fileClasses.FileClasses;
|
import org.jetbrains.kotlin.fileClasses.FileClasses;
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo;
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassInfo;
|
||||||
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
|
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil;
|
||||||
@@ -934,6 +935,9 @@ public class KotlinTypeMapper {
|
|||||||
if (f instanceof FunctionImportedFromObject) {
|
if (f instanceof FunctionImportedFromObject) {
|
||||||
return mapSignature(((FunctionImportedFromObject) f).getCallableFromObject(), kind, skipGenericSignature);
|
return mapSignature(((FunctionImportedFromObject) f).getCallableFromObject(), kind, skipGenericSignature);
|
||||||
}
|
}
|
||||||
|
else if (f instanceof TypeAliasConstructorDescriptor) {
|
||||||
|
return mapSignature(((TypeAliasConstructorDescriptor) f).getUnderlyingConstructorDescriptor(), kind, valueParameters, skipGenericSignature);
|
||||||
|
}
|
||||||
|
|
||||||
checkOwnerCompatibility(f);
|
checkOwnerCompatibility(f);
|
||||||
|
|
||||||
@@ -1272,7 +1276,7 @@ public class KotlinTypeMapper {
|
|||||||
// We may generate a slightly wrong signature for a local class / anonymous object in light classes mode but we don't care,
|
// We may generate a slightly wrong signature for a local class / anonymous object in light classes mode but we don't care,
|
||||||
// because such classes are not accessible from the outside world
|
// because such classes are not accessible from the outside world
|
||||||
if (classBuilderMode.generateBodies) {
|
if (classBuilderMode.generateBodies) {
|
||||||
ResolvedCall<ClassConstructorDescriptor> superCall = findFirstDelegatingSuperCall(descriptor);
|
ResolvedCall<ConstructorDescriptor> superCall = findFirstDelegatingSuperCall(descriptor);
|
||||||
if (superCall == null) return;
|
if (superCall == null) return;
|
||||||
writeSuperConstructorCallParameters(sw, descriptor, superCall, captureThis != null);
|
writeSuperConstructorCallParameters(sw, descriptor, superCall, captureThis != null);
|
||||||
}
|
}
|
||||||
@@ -1281,7 +1285,7 @@ public class KotlinTypeMapper {
|
|||||||
private void writeSuperConstructorCallParameters(
|
private void writeSuperConstructorCallParameters(
|
||||||
@NotNull JvmSignatureWriter sw,
|
@NotNull JvmSignatureWriter sw,
|
||||||
@NotNull ClassConstructorDescriptor descriptor,
|
@NotNull ClassConstructorDescriptor descriptor,
|
||||||
@NotNull ResolvedCall<ClassConstructorDescriptor> superCall,
|
@NotNull ResolvedCall<ConstructorDescriptor> superCall,
|
||||||
boolean hasOuter
|
boolean hasOuter
|
||||||
) {
|
) {
|
||||||
ConstructorDescriptor superDescriptor = SamCodegenUtil.resolveSamAdapter(superCall.getResultingDescriptor());
|
ConstructorDescriptor superDescriptor = SamCodegenUtil.resolveSamAdapter(superCall.getResultingDescriptor());
|
||||||
@@ -1320,13 +1324,13 @@ public class KotlinTypeMapper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ResolvedCall<ClassConstructorDescriptor> findFirstDelegatingSuperCall(@NotNull ClassConstructorDescriptor descriptor) {
|
private ResolvedCall<ConstructorDescriptor> findFirstDelegatingSuperCall(@NotNull ConstructorDescriptor descriptor) {
|
||||||
ClassDescriptor classDescriptor = descriptor.getContainingDeclaration();
|
ClassifierDescriptorWithTypeParameters constructorOwner = descriptor.getContainingDeclaration();
|
||||||
while (true) {
|
while (true) {
|
||||||
ResolvedCall<ClassConstructorDescriptor> next = getDelegationConstructorCall(bindingContext, descriptor);
|
ResolvedCall<ConstructorDescriptor> next = getDelegationConstructorCall(bindingContext, descriptor);
|
||||||
if (next == null) return null;
|
if (next == null) return null;
|
||||||
descriptor = next.getResultingDescriptor();
|
descriptor = next.getResultingDescriptor();
|
||||||
if (descriptor.getContainingDeclaration() != classDescriptor) return next;
|
if (descriptor.getContainingDeclaration() != constructorOwner) return next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ public interface BindingContext {
|
|||||||
*/
|
*/
|
||||||
WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.createSimpleSlice();
|
WritableSlice<PsiElement, SimpleFunctionDescriptor> FUNCTION = Slices.createSimpleSlice();
|
||||||
WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.createSimpleSlice();
|
WritableSlice<PsiElement, ConstructorDescriptor> CONSTRUCTOR = Slices.createSimpleSlice();
|
||||||
WritableSlice<ConstructorDescriptor, ResolvedCall<ClassConstructorDescriptor>> CONSTRUCTOR_RESOLVED_DELEGATION_CALL =
|
WritableSlice<ConstructorDescriptor, ResolvedCall<ConstructorDescriptor>> CONSTRUCTOR_RESOLVED_DELEGATION_CALL =
|
||||||
Slices.createSimpleSlice();
|
Slices.createSimpleSlice();
|
||||||
WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.createSimpleSlice();
|
WritableSlice<PsiElement, VariableDescriptor> VARIABLE = Slices.createSimpleSlice();
|
||||||
WritableSlice<KtParameter, VariableDescriptor> VALUE_PARAMETER = Slices.createSimpleSlice();
|
WritableSlice<KtParameter, VariableDescriptor> VALUE_PARAMETER = Slices.createSimpleSlice();
|
||||||
|
|||||||
@@ -222,7 +222,7 @@ public class BindingContextUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public static ResolvedCall<ClassConstructorDescriptor> getDelegationConstructorCall(
|
public static ResolvedCall<ConstructorDescriptor> getDelegationConstructorCall(
|
||||||
@NotNull BindingContext bindingContext,
|
@NotNull BindingContext bindingContext,
|
||||||
@NotNull ConstructorDescriptor constructorDescriptor
|
@NotNull ConstructorDescriptor constructorDescriptor
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -231,7 +231,7 @@ public class BodyResolver {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private ConstructorDescriptor getDelegatedConstructor(@NotNull ConstructorDescriptor constructor) {
|
private ConstructorDescriptor getDelegatedConstructor(@NotNull ConstructorDescriptor constructor) {
|
||||||
ResolvedCall<ClassConstructorDescriptor> call = trace.get(CONSTRUCTOR_RESOLVED_DELEGATION_CALL, constructor);
|
ResolvedCall<ConstructorDescriptor> call = trace.get(CONSTRUCTOR_RESOLVED_DELEGATION_CALL, constructor);
|
||||||
return call == null || !call.getStatus().isSuccess() ? null : call.getResultingDescriptor().getOriginal();
|
return call == null || !call.getStatus().isSuccess() ? null : call.getResultingDescriptor().getOriginal();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -430,7 +430,7 @@ public class BodyResolver {
|
|||||||
@NotNull ResolvedCall<?> call
|
@NotNull ResolvedCall<?> call
|
||||||
) {
|
) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
trace.record(CONSTRUCTOR_RESOLVED_DELEGATION_CALL, constructor, (ResolvedCall<ClassConstructorDescriptor>) call);
|
trace.record(CONSTRUCTOR_RESOLVED_DELEGATION_CALL, constructor, (ResolvedCall<ConstructorDescriptor>) call);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkSupertypeList(
|
private void checkSupertypeList(
|
||||||
|
|||||||
@@ -307,7 +307,7 @@ public class CallResolver {
|
|||||||
return resolveCallForInvoke(context.replaceCall(call), tracingForInvoke);
|
return resolveCallForInvoke(context.replaceCall(call), tracingForInvoke);
|
||||||
}
|
}
|
||||||
|
|
||||||
private OverloadResolutionResults<ClassConstructorDescriptor> resolveCallForConstructor(
|
private OverloadResolutionResults<ConstructorDescriptor> resolveCallForConstructor(
|
||||||
@NotNull BasicCallResolutionContext context,
|
@NotNull BasicCallResolutionContext context,
|
||||||
@NotNull KtConstructorCalleeExpression expression
|
@NotNull KtConstructorCalleeExpression expression
|
||||||
) {
|
) {
|
||||||
@@ -340,17 +340,17 @@ public class CallResolver {
|
|||||||
return checkArgumentTypesAndFail(context);
|
return checkArgumentTypesAndFail(context);
|
||||||
}
|
}
|
||||||
|
|
||||||
Pair<Collection<ResolutionCandidate<ClassConstructorDescriptor>>, BasicCallResolutionContext> candidatesAndContext =
|
Pair<Collection<ResolutionCandidate<ConstructorDescriptor>>, BasicCallResolutionContext> candidatesAndContext =
|
||||||
prepareCandidatesAndContextForConstructorCall(constructedType, context);
|
prepareCandidatesAndContextForConstructorCall(constructedType, context);
|
||||||
|
|
||||||
Collection<ResolutionCandidate<ClassConstructorDescriptor>> candidates = candidatesAndContext.getFirst();
|
Collection<ResolutionCandidate<ConstructorDescriptor>> candidates = candidatesAndContext.getFirst();
|
||||||
context = candidatesAndContext.getSecond();
|
context = candidatesAndContext.getSecond();
|
||||||
|
|
||||||
return computeTasksFromCandidatesAndResolvedCall(context, functionReference, candidates);
|
return computeTasksFromCandidatesAndResolvedCall(context, functionReference, candidates);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public OverloadResolutionResults<ClassConstructorDescriptor> resolveConstructorDelegationCall(
|
public OverloadResolutionResults<ConstructorDescriptor> resolveConstructorDelegationCall(
|
||||||
@NotNull BindingTrace trace, @NotNull LexicalScope scope, @NotNull DataFlowInfo dataFlowInfo,
|
@NotNull BindingTrace trace, @NotNull LexicalScope scope, @NotNull DataFlowInfo dataFlowInfo,
|
||||||
@NotNull ClassConstructorDescriptor constructorDescriptor,
|
@NotNull ClassConstructorDescriptor constructorDescriptor,
|
||||||
@NotNull KtConstructorDelegationCall call
|
@NotNull KtConstructorDelegationCall call
|
||||||
@@ -380,7 +380,7 @@ public class CallResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private OverloadResolutionResults<ClassConstructorDescriptor> resolveConstructorDelegationCall(
|
private OverloadResolutionResults<ConstructorDescriptor> resolveConstructorDelegationCall(
|
||||||
@NotNull BasicCallResolutionContext context,
|
@NotNull BasicCallResolutionContext context,
|
||||||
@NotNull KtConstructorDelegationCall call,
|
@NotNull KtConstructorDelegationCall call,
|
||||||
@NotNull KtConstructorDelegationReferenceExpression calleeExpression,
|
@NotNull KtConstructorDelegationReferenceExpression calleeExpression,
|
||||||
@@ -420,9 +420,9 @@ public class CallResolver {
|
|||||||
calleeConstructor.getContainingDeclaration().getDefaultType() :
|
calleeConstructor.getContainingDeclaration().getDefaultType() :
|
||||||
DescriptorUtils.getSuperClassType(currentClassDescriptor);
|
DescriptorUtils.getSuperClassType(currentClassDescriptor);
|
||||||
|
|
||||||
Pair<Collection<ResolutionCandidate<ClassConstructorDescriptor>>, BasicCallResolutionContext> candidatesAndContext =
|
Pair<Collection<ResolutionCandidate<ConstructorDescriptor>>, BasicCallResolutionContext> candidatesAndContext =
|
||||||
prepareCandidatesAndContextForConstructorCall(superType, context);
|
prepareCandidatesAndContextForConstructorCall(superType, context);
|
||||||
Collection<ResolutionCandidate<ClassConstructorDescriptor>> candidates = candidatesAndContext.getFirst();
|
Collection<ResolutionCandidate<ConstructorDescriptor>> candidates = candidatesAndContext.getFirst();
|
||||||
context = candidatesAndContext.getSecond();
|
context = candidatesAndContext.getSecond();
|
||||||
|
|
||||||
TracingStrategy tracing = call.isImplicit() ?
|
TracingStrategy tracing = call.isImplicit() ?
|
||||||
@@ -441,17 +441,15 @@ public class CallResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static Pair<Collection<ResolutionCandidate<ClassConstructorDescriptor>>, BasicCallResolutionContext> prepareCandidatesAndContextForConstructorCall(
|
private static Pair<Collection<ResolutionCandidate<ConstructorDescriptor>>, BasicCallResolutionContext> prepareCandidatesAndContextForConstructorCall(
|
||||||
@NotNull KotlinType superType,
|
@NotNull KotlinType superType,
|
||||||
@NotNull BasicCallResolutionContext context
|
@NotNull BasicCallResolutionContext context
|
||||||
) {
|
) {
|
||||||
if (!(superType.getConstructor().getDeclarationDescriptor() instanceof ClassDescriptor)) {
|
if (!(superType.getConstructor().getDeclarationDescriptor() instanceof ClassDescriptor)) {
|
||||||
return new Pair<Collection<ResolutionCandidate<ClassConstructorDescriptor>>, BasicCallResolutionContext>(
|
return new Pair<Collection<ResolutionCandidate<ConstructorDescriptor>>, BasicCallResolutionContext>(
|
||||||
Collections.<ResolutionCandidate<ClassConstructorDescriptor>>emptyList(), context);
|
Collections.<ResolutionCandidate<ConstructorDescriptor>>emptyList(), context);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClassDescriptor superClass = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor();
|
|
||||||
|
|
||||||
// If any constructor has type parameter (currently it only can be true for ones from Java), try to infer arguments for them
|
// If any constructor has type parameter (currently it only can be true for ones from Java), try to infer arguments for them
|
||||||
// Otherwise use NO_EXPECTED_TYPE and knownTypeParametersSubstitutor
|
// Otherwise use NO_EXPECTED_TYPE and knownTypeParametersSubstitutor
|
||||||
boolean anyConstructorHasDeclaredTypeParameters =
|
boolean anyConstructorHasDeclaredTypeParameters =
|
||||||
@@ -462,10 +460,10 @@ public class CallResolver {
|
|||||||
context = context.replaceExpectedType(superType);
|
context = context.replaceExpectedType(superType);
|
||||||
}
|
}
|
||||||
|
|
||||||
Collection<ResolutionCandidate<ClassConstructorDescriptor>> candidates =
|
Collection<ResolutionCandidate<ConstructorDescriptor>> candidates =
|
||||||
CallResolverUtilKt.createResolutionCandidatesForConstructors(context.scope, context.call, superClass, knownTypeParametersSubstitutor);
|
CallResolverUtilKt.createResolutionCandidatesForConstructors(context.scope, context.call, superType, knownTypeParametersSubstitutor);
|
||||||
|
|
||||||
return new Pair<Collection<ResolutionCandidate<ClassConstructorDescriptor>>, BasicCallResolutionContext>(candidates, context);
|
return new Pair<Collection<ResolutionCandidate<ConstructorDescriptor>>, BasicCallResolutionContext>(candidates, context);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean anyConstructorHasDeclaredTypeParameters(@Nullable ClassifierDescriptor classDescriptor) {
|
private static boolean anyConstructorHasDeclaredTypeParameters(@Nullable ClassifierDescriptor classDescriptor) {
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.builtins.getReceiverTypeFromFunctionType
|
|||||||
import org.jetbrains.kotlin.builtins.isExtensionFunctionType
|
import org.jetbrains.kotlin.builtins.isExtensionFunctionType
|
||||||
import org.jetbrains.kotlin.coroutines.getExpectedTypeForCoroutineControllerHandleResult
|
import org.jetbrains.kotlin.coroutines.getExpectedTypeForCoroutineControllerHandleResult
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptorImpl
|
||||||
import org.jetbrains.kotlin.incremental.KotlinLookupLocation
|
import org.jetbrains.kotlin.incremental.KotlinLookupLocation
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
@@ -200,9 +202,18 @@ fun getEffectiveExpectedType(parameterDescriptor: ValueParameterDescriptor, argu
|
|||||||
fun createResolutionCandidatesForConstructors(
|
fun createResolutionCandidatesForConstructors(
|
||||||
lexicalScope: LexicalScope,
|
lexicalScope: LexicalScope,
|
||||||
call: Call,
|
call: Call,
|
||||||
classWithConstructors: ClassDescriptor,
|
typeWithConstructors: KotlinType,
|
||||||
knownSubstitutor: TypeSubstitutor? = null
|
knownSubstitutor: TypeSubstitutor? = null
|
||||||
): Collection<ResolutionCandidate<ClassConstructorDescriptor>> {
|
): Collection<ResolutionCandidate<ConstructorDescriptor>> {
|
||||||
|
val classWithConstructors = typeWithConstructors.constructor.declarationDescriptor as ClassDescriptor
|
||||||
|
|
||||||
|
val unwrappedType = typeWithConstructors.unwrap()
|
||||||
|
val typeAliasDescriptor =
|
||||||
|
if (unwrappedType is AbbreviatedType)
|
||||||
|
unwrappedType.abbreviation.constructor.declarationDescriptor as? TypeAliasDescriptor
|
||||||
|
else
|
||||||
|
null
|
||||||
|
|
||||||
val constructors = classWithConstructors.constructors
|
val constructors = classWithConstructors.constructors
|
||||||
|
|
||||||
if (constructors.isEmpty()) return emptyList()
|
if (constructors.isEmpty()) return emptyList()
|
||||||
@@ -212,7 +223,7 @@ fun createResolutionCandidatesForConstructors(
|
|||||||
|
|
||||||
if (classWithConstructors.isInner) {
|
if (classWithConstructors.isInner) {
|
||||||
val outerClassType = (classWithConstructors.containingDeclaration as? ClassDescriptor)?.defaultType ?: return emptyList()
|
val outerClassType = (classWithConstructors.containingDeclaration as? ClassDescriptor)?.defaultType ?: return emptyList()
|
||||||
val substitutedOuterClassType = knownSubstitutor?.let { it.substitute(outerClassType, Variance.INVARIANT) } ?: outerClassType
|
val substitutedOuterClassType = knownSubstitutor?.substitute(outerClassType, Variance.INVARIANT) ?: outerClassType
|
||||||
|
|
||||||
val receiver = lexicalScope.getImplicitReceiversHierarchy().firstOrNull {
|
val receiver = lexicalScope.getImplicitReceiversHierarchy().firstOrNull {
|
||||||
KotlinTypeChecker.DEFAULT.isSubtypeOf(it.type, substitutedOuterClassType)
|
KotlinTypeChecker.DEFAULT.isSubtypeOf(it.type, substitutedOuterClassType)
|
||||||
@@ -226,9 +237,22 @@ fun createResolutionCandidatesForConstructors(
|
|||||||
dispatchReceiver = null
|
dispatchReceiver = null
|
||||||
}
|
}
|
||||||
|
|
||||||
return constructors.map { ResolutionCandidate.create(call, it, dispatchReceiver, receiverKind, knownSubstitutor) }
|
return constructors.map {
|
||||||
|
val constructorDescriptor = it.getConstructorDescriptorForResolution(knownSubstitutor, typeAliasDescriptor)
|
||||||
|
ResolutionCandidate.create(call, constructorDescriptor, dispatchReceiver, receiverKind, knownSubstitutor)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun ClassConstructorDescriptor.getConstructorDescriptorForResolution(
|
||||||
|
knownSubstitutor: TypeSubstitutor?,
|
||||||
|
typeAliasDescriptor: TypeAliasDescriptor?
|
||||||
|
): ConstructorDescriptor =
|
||||||
|
if (typeAliasDescriptor != null)
|
||||||
|
TypeAliasConstructorDescriptorImpl.create(typeAliasDescriptor, this, knownSubstitutor ?: TypeSubstitutor.EMPTY)
|
||||||
|
?: throw AssertionError("Failed to create type alias constructor with substitutor: $knownSubstitutor")
|
||||||
|
else
|
||||||
|
this
|
||||||
|
|
||||||
fun KtLambdaExpression.getCorrespondingParameterForFunctionArgument(
|
fun KtLambdaExpression.getCorrespondingParameterForFunctionArgument(
|
||||||
bindingContext: BindingContext
|
bindingContext: BindingContext
|
||||||
): ValueParameterDescriptor? {
|
): ValueParameterDescriptor? {
|
||||||
|
|||||||
+9
-2
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.checkers
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.psi.KtConstructorCalleeExpression
|
import org.jetbrains.kotlin.psi.KtConstructorCalleeExpression
|
||||||
import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression
|
import org.jetbrains.kotlin.psi.KtConstructorDelegationReferenceExpression
|
||||||
@@ -32,7 +33,13 @@ object ProtectedConstructorCallChecker : CallChecker {
|
|||||||
val constructorOwner = descriptor.containingDeclaration.original
|
val constructorOwner = descriptor.containingDeclaration.original
|
||||||
val scopeOwner = context.scope.ownerDescriptor
|
val scopeOwner = context.scope.ownerDescriptor
|
||||||
|
|
||||||
if (descriptor.visibility.normalize() != Visibilities.PROTECTED) return
|
val actualConstructor =
|
||||||
|
if (descriptor is TypeAliasConstructorDescriptor)
|
||||||
|
descriptor.underlyingConstructorDescriptor
|
||||||
|
else
|
||||||
|
descriptor
|
||||||
|
|
||||||
|
if (actualConstructor.visibility.normalize() != Visibilities.PROTECTED) return
|
||||||
// Error already reported
|
// Error already reported
|
||||||
if (!Visibilities.isVisibleWithAnyReceiver(descriptor, scopeOwner)) return
|
if (!Visibilities.isVisibleWithAnyReceiver(descriptor, scopeOwner)) return
|
||||||
|
|
||||||
@@ -52,7 +59,7 @@ object ProtectedConstructorCallChecker : CallChecker {
|
|||||||
// And without ProtectedConstructorCallChecker such calls would be allowed only because they are performed within subclass
|
// And without ProtectedConstructorCallChecker such calls would be allowed only because they are performed within subclass
|
||||||
// of constructor owner
|
// of constructor owner
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
if (Visibilities.findInvisibleMember(Visibilities.FALSE_IF_PROTECTED, descriptor, scopeOwner) == descriptor) {
|
if (Visibilities.findInvisibleMember(Visibilities.FALSE_IF_PROTECTED, descriptor, scopeOwner) == actualConstructor) {
|
||||||
context.trace.report(Errors.PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL.on(reportOn, descriptor))
|
context.trace.report(Errors.PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL.on(reportOn, descriptor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -137,6 +138,11 @@ private fun DeclarationDescriptor.getDeprecationByAnnotation(): DeprecatedByAnno
|
|||||||
val classAnnotation = classDescriptor.getDeclaredDeprecatedAnnotation()
|
val classAnnotation = classDescriptor.getDeclaredDeprecatedAnnotation()
|
||||||
if (classAnnotation != null)
|
if (classAnnotation != null)
|
||||||
return DeprecatedByAnnotation(classAnnotation, classDescriptor)
|
return DeprecatedByAnnotation(classAnnotation, classDescriptor)
|
||||||
|
if (this is TypeAliasConstructorDescriptor) {
|
||||||
|
val underlyingConstructorDeprecation = underlyingConstructorDescriptor.getDeprecationByAnnotation()
|
||||||
|
if (underlyingConstructorDeprecation != null)
|
||||||
|
return underlyingConstructorDeprecation
|
||||||
|
}
|
||||||
}
|
}
|
||||||
is PropertyAccessorDescriptor -> {
|
is PropertyAccessorDescriptor -> {
|
||||||
val propertyDescriptor = correspondingProperty
|
val propertyDescriptor = correspondingProperty
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
open class Cell<T>(val value: T)
|
||||||
|
|
||||||
|
typealias CT<T> = Cell<T>
|
||||||
|
typealias CStr = Cell<String>
|
||||||
|
|
||||||
|
class C1 : CT<String>("O")
|
||||||
|
class C2 : CStr("K")
|
||||||
|
|
||||||
|
fun box(): String =
|
||||||
|
C1().value + C2().value
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
@Deprecated("Deprecated class")
|
||||||
|
open class DeprecatedClass
|
||||||
|
|
||||||
|
open class WithDeprecatedCtor(val x: Int) {
|
||||||
|
@Deprecated("Deprecated constructor")
|
||||||
|
constructor() : this(0)
|
||||||
|
}
|
||||||
|
|
||||||
|
typealias DeprecatedClassAlias = <!DEPRECATION!>DeprecatedClass<!>
|
||||||
|
typealias WithDeprecatedCtorAlias = WithDeprecatedCtor
|
||||||
|
|
||||||
|
class Test1 : <!DEPRECATION!>DeprecatedClassAlias<!>()
|
||||||
|
|
||||||
|
class Test2 : <!DEPRECATION!>WithDeprecatedCtorAlias<!>()
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
@kotlin.Deprecated(message = "Deprecated class") public open class DeprecatedClass {
|
||||||
|
public constructor DeprecatedClass()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test1 : DeprecatedClassAlias /* = DeprecatedClass */ {
|
||||||
|
public constructor Test1()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test2 : WithDeprecatedCtorAlias /* = WithDeprecatedCtor */ {
|
||||||
|
public constructor Test2()
|
||||||
|
public final override /*1*/ /*fake_override*/ val x: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class WithDeprecatedCtor {
|
||||||
|
@kotlin.Deprecated(message = "Deprecated constructor") public constructor WithDeprecatedCtor()
|
||||||
|
public constructor WithDeprecatedCtor(/*0*/ x: kotlin.Int)
|
||||||
|
public final val x: kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
public typealias DeprecatedClassAlias = DeprecatedClass
|
||||||
|
public typealias WithDeprecatedCtorAlias = WithDeprecatedCtor
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
open class Base {
|
||||||
|
companion object
|
||||||
|
}
|
||||||
|
interface IFoo
|
||||||
|
open class CG<T>
|
||||||
|
interface IG<T>
|
||||||
|
|
||||||
|
@Deprecated("Obsolete")
|
||||||
|
typealias Obsolete = Base
|
||||||
|
|
||||||
|
@Deprecated("Obsolete")
|
||||||
|
typealias IObsolete = IFoo
|
||||||
|
|
||||||
|
fun test1(x: <!DEPRECATION!>Obsolete<!>) = x
|
||||||
|
fun test1a(x: List<<!DEPRECATION!>Obsolete<!>>) = x
|
||||||
|
|
||||||
|
val test2 = <!DEPRECATION!>Obsolete<!>()
|
||||||
|
|
||||||
|
val test3 = <!DEPRECATION!>Obsolete<!>
|
||||||
|
|
||||||
|
class Test4: <!DEPRECATION!>Obsolete<!>()
|
||||||
|
class Test4a: <!DEPRECATION!>IObsolete<!>
|
||||||
|
class Test4b: IG<<!DEPRECATION!>Obsolete<!>>
|
||||||
|
class Test4c: CG<<!DEPRECATION!>Obsolete<!>>()
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public val test2: Base
|
||||||
|
public val test3: Base.Companion
|
||||||
|
public fun test1(/*0*/ x: Obsolete /* = Base */): Obsolete /* = Base */
|
||||||
|
public fun test1a(/*0*/ x: kotlin.collections.List<Obsolete /* = Base */>): kotlin.collections.List<Obsolete /* = Base */>
|
||||||
|
|
||||||
|
public open class Base {
|
||||||
|
public constructor Base()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|
||||||
|
public companion object Companion {
|
||||||
|
private constructor Companion()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public open class CG</*0*/ T> {
|
||||||
|
public constructor CG</*0*/ T>()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IFoo {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface IG</*0*/ T> {
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test4 : Obsolete /* = Base */ {
|
||||||
|
public constructor Test4()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test4a : IObsolete /* = IFoo */ {
|
||||||
|
public constructor Test4a()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test4b : IG<Obsolete /* = Base */> {
|
||||||
|
public constructor Test4b()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
|
||||||
|
public final class Test4c : CG<Obsolete /* = Base */> {
|
||||||
|
public constructor Test4c()
|
||||||
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
}
|
||||||
|
@kotlin.Deprecated(message = "Obsolete") public typealias IObsolete = IFoo
|
||||||
|
@kotlin.Deprecated(message = "Obsolete") public typealias Obsolete = Base
|
||||||
+1
-1
@@ -19,7 +19,7 @@ val test3a = MyClass(1.0)
|
|||||||
class MyDerived : MyClass(1.0) {
|
class MyDerived : MyClass(1.0) {
|
||||||
val test4 = <!NONE_APPLICABLE!>MyAlias<!>(1)
|
val test4 = <!NONE_APPLICABLE!>MyAlias<!>(1)
|
||||||
val test4a = <!NONE_APPLICABLE!>MyClass<!>(1)
|
val test4a = <!NONE_APPLICABLE!>MyClass<!>(1)
|
||||||
val test5 = <!NONE_APPLICABLE!>MyAlias<!>("")
|
val test5 = <!PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL!>MyAlias<!>("")
|
||||||
val test5a = <!PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL!>MyClass<!>("")
|
val test5a = <!PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL!>MyClass<!>("")
|
||||||
val test6 = MyAlias(1.0)
|
val test6 = MyAlias(1.0)
|
||||||
val test6a = MyClass(1.0)
|
val test6a = MyClass(1.0)
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ public final class MyDerived : MyClass {
|
|||||||
public constructor MyDerived()
|
public constructor MyDerived()
|
||||||
public final val test4: [ERROR : Type for MyAlias(1)]
|
public final val test4: [ERROR : Type for MyAlias(1)]
|
||||||
public final val test4a: [ERROR : Type for MyClass(1)]
|
public final val test4a: [ERROR : Type for MyClass(1)]
|
||||||
public final val test5: [ERROR : Type for MyAlias("")]
|
public final val test5: MyClass
|
||||||
public final val test5a: MyClass
|
public final val test5a: MyClass
|
||||||
public final val test6: MyClass
|
public final val test6: MyClass
|
||||||
public final val test6a: MyClass
|
public final val test6a: MyClass
|
||||||
|
|||||||
@@ -6048,6 +6048,18 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typealiasConstructor.kt")
|
||||||
|
public void testTypealiasConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/deprecated/typealiasConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typealiasUsage.kt")
|
||||||
|
public void testTypealiasUsage() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/deprecated/typealiasUsage.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("unusedImport.kt")
|
@TestMetadata("unusedImport.kt")
|
||||||
public void testUnusedImport() throws Exception {
|
public void testUnusedImport() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/deprecated/unusedImport.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/deprecated/unusedImport.kt");
|
||||||
|
|||||||
@@ -15952,6 +15952,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typeAliasConstructorInSuperCall.kt")
|
||||||
|
public void testTypeAliasConstructorInSuperCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasConstructorInSuperCall.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typeAliasObject.kt")
|
@TestMetadata("typeAliasObject.kt")
|
||||||
public void testTypeAliasObject() throws Exception {
|
public void testTypeAliasObject() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
|
||||||
|
|||||||
+9
-6
@@ -111,17 +111,18 @@ class TypeAliasConstructorDescriptorImpl private constructor(
|
|||||||
fun create(
|
fun create(
|
||||||
typeAliasDescriptor: TypeAliasDescriptor,
|
typeAliasDescriptor: TypeAliasDescriptor,
|
||||||
constructor: ClassConstructorDescriptor,
|
constructor: ClassConstructorDescriptor,
|
||||||
substitutor: TypeSubstitutor
|
substitutor: TypeSubstitutor?
|
||||||
): TypeAliasConstructorDescriptor? {
|
): TypeAliasConstructorDescriptor? {
|
||||||
|
val actualSubstitutor = substitutor ?: TypeSubstitutor.EMPTY
|
||||||
|
|
||||||
val typeAliasConstructor =
|
val typeAliasConstructor =
|
||||||
TypeAliasConstructorDescriptorImpl(typeAliasDescriptor, constructor, null, constructor.annotations,
|
TypeAliasConstructorDescriptorImpl(typeAliasDescriptor, constructor, null, constructor.annotations,
|
||||||
constructor.kind, typeAliasDescriptor.source)
|
constructor.kind, typeAliasDescriptor.source)
|
||||||
|
|
||||||
val valueParameters =
|
val valueParameters = FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, constructor.valueParameters, actualSubstitutor, false)
|
||||||
FunctionDescriptorImpl.getSubstitutedValueParameters(typeAliasConstructor, constructor.valueParameters, substitutor, false)
|
?: return null
|
||||||
?: return null
|
|
||||||
|
|
||||||
val returnType = substitutor.substitute(constructor.returnType, Variance.INVARIANT)
|
val returnType = actualSubstitutor.substitute(constructor.returnType, Variance.INVARIANT)
|
||||||
?: return null
|
?: return null
|
||||||
|
|
||||||
val containingDeclaration = constructor.containingDeclaration
|
val containingDeclaration = constructor.containingDeclaration
|
||||||
@@ -137,10 +138,12 @@ class TypeAliasConstructorDescriptorImpl private constructor(
|
|||||||
valueParameters,
|
valueParameters,
|
||||||
returnType,
|
returnType,
|
||||||
Modality.FINAL,
|
Modality.FINAL,
|
||||||
constructor.visibility)
|
typeAliasDescriptor.visibility)
|
||||||
|
|
||||||
return typeAliasConstructor
|
return typeAliasConstructor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
open class C
|
||||||
|
|
||||||
|
typealias CA = C
|
||||||
|
|
||||||
|
class D : <caret>CA()
|
||||||
|
|
||||||
|
// REF: (test).CA
|
||||||
@@ -395,6 +395,12 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("TypeAliasAsSupertypeConstructor.kt")
|
||||||
|
public void testTypeAliasAsSupertypeConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeAliasAsSupertypeConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("TypeAliasRHS.kt")
|
@TestMetadata("TypeAliasRHS.kt")
|
||||||
public void testTypeAliasRHS() throws Exception {
|
public void testTypeAliasRHS() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeAliasRHS.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/resolve/references/TypeAliasRHS.kt");
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.js.naming
|
package org.jetbrains.kotlin.js.naming
|
||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||||
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.*
|
import org.jetbrains.kotlin.js.translate.utils.AnnotationsUtils.*
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
@@ -89,6 +90,9 @@ class NameSuggestion {
|
|||||||
// It's a special case when an object has `invoke` operator defined, in this case we simply generate object itself
|
// It's a special case when an object has `invoke` operator defined, in this case we simply generate object itself
|
||||||
is FakeCallableDescriptorForObject -> return suggest(descriptor.getReferencedObject())
|
is FakeCallableDescriptorForObject -> return suggest(descriptor.getReferencedObject())
|
||||||
|
|
||||||
|
// For type alias constructor descriptors we generate references to underlying constructors
|
||||||
|
is TypeAliasConstructorDescriptor -> return suggest(descriptor.underlyingConstructorDescriptor)
|
||||||
|
|
||||||
// For primary constructors and constructors of native classes we generate references to containing classes
|
// For primary constructors and constructors of native classes we generate references to containing classes
|
||||||
is ConstructorDescriptor -> {
|
is ConstructorDescriptor -> {
|
||||||
if (descriptor.isPrimary || isNativeObject(descriptor)) {
|
if (descriptor.isPrimary || isNativeObject(descriptor)) {
|
||||||
|
|||||||
@@ -71,6 +71,12 @@ public class TypeAliasesTestsGenerated extends AbstractTypeAliasesTests {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typeAliasConstructorInSuperCall.kt")
|
||||||
|
public void testTypeAliasConstructorInSuperCall() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasConstructorInSuperCall.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typeAliasObject.kt")
|
@TestMetadata("typeAliasObject.kt")
|
||||||
public void testTypeAliasObject() throws Exception {
|
public void testTypeAliasObject() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/typealias/typeAliasObject.kt");
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor;
|
||||||
import org.jetbrains.kotlin.js.config.JsConfig;
|
import org.jetbrains.kotlin.js.config.JsConfig;
|
||||||
import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
|
import org.jetbrains.kotlin.js.translate.intrinsic.Intrinsics;
|
||||||
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
|
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils;
|
||||||
@@ -463,6 +464,11 @@ public class TranslationContext {
|
|||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
public List<DeclarationDescriptor> getClassOrConstructorClosure(@NotNull MemberDescriptor classOrConstructor) {
|
public List<DeclarationDescriptor> getClassOrConstructorClosure(@NotNull MemberDescriptor classOrConstructor) {
|
||||||
|
if (classOrConstructor instanceof TypeAliasConstructorDescriptor) {
|
||||||
|
ClassConstructorDescriptor constructorDescriptor = ((TypeAliasConstructorDescriptor) classOrConstructor).getUnderlyingConstructorDescriptor();
|
||||||
|
return getClassOrConstructorClosure(constructorDescriptor);
|
||||||
|
}
|
||||||
|
|
||||||
List<DeclarationDescriptor> result = staticContext.getClassOrConstructorClosure(classOrConstructor);
|
List<DeclarationDescriptor> result = staticContext.getClassOrConstructorClosure(classOrConstructor);
|
||||||
if (result == null &&
|
if (result == null &&
|
||||||
classOrConstructor instanceof ConstructorDescriptor &&
|
classOrConstructor instanceof ConstructorDescriptor &&
|
||||||
|
|||||||
Reference in New Issue
Block a user