Check for repeated annotations in type alias expansion.
This commit is contained in:
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiElement
|
|||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
@@ -32,6 +33,7 @@ import org.jetbrains.kotlin.psi.psiUtil.visibilityModifier
|
|||||||
import org.jetbrains.kotlin.resolve.BindingContext.*
|
import org.jetbrains.kotlin.resolve.BindingContext.*
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers
|
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveAbstractMembers
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveOpenMembers
|
import org.jetbrains.kotlin.resolve.DescriptorUtils.classCanHaveOpenMembers
|
||||||
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
||||||
import org.jetbrains.kotlin.types.typeUtil.*
|
import org.jetbrains.kotlin.types.typeUtil.*
|
||||||
@@ -214,6 +216,11 @@ class DeclarationsChecker(
|
|||||||
trace.report(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION.on(typeReference, bound, argument, typeParameter))
|
trace.report(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION.on(typeReference, bound, argument, typeParameter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun repeatedAnnotation(annotation: AnnotationDescriptor) {
|
||||||
|
val annotationEntry = (annotation.source as? KotlinSourceElement)?.psi as? KtAnnotationEntry ?: return
|
||||||
|
trace.report(REPEATED_ANNOTATION.on(annotationEntry))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun checkTypeAliasExpansion(declaration: KtTypeAlias, typeAliasDescriptor: TypeAliasDescriptor) {
|
private fun checkTypeAliasExpansion(declaration: KtTypeAlias, typeAliasDescriptor: TypeAliasDescriptor) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
|
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.annotations.AnnotationsImpl
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationsImpl
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations
|
import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations
|
||||||
@@ -51,8 +52,7 @@ class TypeAliasExpander(
|
|||||||
"Type alias expansion: result for ${typeAliasExpansion.descriptor} is ${expandedProjection.projectionKind}, should be invariant"
|
"Type alias expansion: result for ${typeAliasExpansion.descriptor} is ${expandedProjection.projectionKind}, should be invariant"
|
||||||
}
|
}
|
||||||
|
|
||||||
val expandedTypeWithExtraAnnotations = expandedType.replace(
|
val expandedTypeWithExtraAnnotations = combineAnnotations(expandedType, annotations)
|
||||||
newAnnotations = CompositeAnnotations(listOf(annotations, expandedType.annotations)))
|
|
||||||
|
|
||||||
return if (withAbbreviatedType)
|
return if (withAbbreviatedType)
|
||||||
expandedTypeWithExtraAnnotations.withAbbreviation(typeAliasExpansion.createAbbreviation(originalProjection, annotations))
|
expandedTypeWithExtraAnnotations.withAbbreviation(typeAliasExpansion.createAbbreviation(originalProjection, annotations))
|
||||||
@@ -60,6 +60,18 @@ class TypeAliasExpander(
|
|||||||
expandedTypeWithExtraAnnotations
|
expandedTypeWithExtraAnnotations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun combineAnnotations(type: SimpleType, annotations: Annotations): SimpleType {
|
||||||
|
val existingAnnotationTypes = type.annotations.getAllAnnotations().mapTo(hashSetOf<KotlinType>()) { it.annotation.type }
|
||||||
|
|
||||||
|
for (annotation in annotations) {
|
||||||
|
if (annotation.type in existingAnnotationTypes) {
|
||||||
|
reportStrategy.repeatedAnnotation(annotation)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return type.replace(newAnnotations = CompositeAnnotations(listOf(annotations, type.annotations)))
|
||||||
|
}
|
||||||
|
|
||||||
private fun TypeAliasExpansion.createAbbreviation(originalProjection: TypeProjection, annotations: Annotations) =
|
private fun TypeAliasExpansion.createAbbreviation(originalProjection: TypeProjection, annotations: Annotations) =
|
||||||
KotlinTypeFactory.simpleType(
|
KotlinTypeFactory.simpleType(
|
||||||
annotations,
|
annotations,
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeAliasDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
interface TypeAliasExpansionReportStrategy {
|
interface TypeAliasExpansionReportStrategy {
|
||||||
@@ -25,11 +26,13 @@ interface TypeAliasExpansionReportStrategy {
|
|||||||
fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType)
|
fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType)
|
||||||
fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor)
|
fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor)
|
||||||
fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor)
|
fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor)
|
||||||
|
fun repeatedAnnotation(annotation: AnnotationDescriptor)
|
||||||
|
|
||||||
object DO_NOTHING : TypeAliasExpansionReportStrategy {
|
object DO_NOTHING : TypeAliasExpansionReportStrategy {
|
||||||
override fun wrongNumberOfTypeArguments(typeAlias: TypeAliasDescriptor, numberOfParameters: Int) {}
|
override fun wrongNumberOfTypeArguments(typeAlias: TypeAliasDescriptor, numberOfParameters: Int) {}
|
||||||
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {}
|
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {}
|
||||||
override fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor) {}
|
override fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor) {}
|
||||||
override fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor) {}
|
override fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor) {}
|
||||||
|
override fun repeatedAnnotation(annotation: AnnotationDescriptor) {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.config.LanguageFeature
|
|||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.context.TypeLazinessToken
|
import org.jetbrains.kotlin.context.TypeLazinessToken
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.descriptors.impl.VariableDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.VariableDescriptorImpl
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
@@ -42,6 +43,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScope
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
|
import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.findFirstFromMeAndParent
|
import org.jetbrains.kotlin.resolve.scopes.utils.findFirstFromMeAndParent
|
||||||
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||||
import org.jetbrains.kotlin.resolve.source.toSourceElement
|
import org.jetbrains.kotlin.resolve.source.toSourceElement
|
||||||
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
import org.jetbrains.kotlin.storage.LockBasedStorageManager
|
||||||
import org.jetbrains.kotlin.storage.StorageManager
|
import org.jetbrains.kotlin.storage.StorageManager
|
||||||
@@ -519,7 +521,7 @@ class TypeResolver(
|
|||||||
|
|
||||||
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {
|
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {
|
||||||
val argumentElement = typeParameter?.let { mappedArguments[it] }
|
val argumentElement = typeParameter?.let { mappedArguments[it] }
|
||||||
if (argumentElement != null && typeParameter != null) {
|
if (argumentElement != null) {
|
||||||
trace.report(CONFLICTING_PROJECTION.on(argumentElement, typeParameter))
|
trace.report(CONFLICTING_PROJECTION.on(argumentElement, typeParameter))
|
||||||
}
|
}
|
||||||
else if (type != null) {
|
else if (type != null) {
|
||||||
@@ -544,10 +546,13 @@ class TypeResolver(
|
|||||||
trace.report(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION.on(type, bound, argument, typeParameter))
|
trace.report(UPPER_BOUND_VIOLATED_IN_TYPEALIAS_EXPANSION.on(type, bound, argument, typeParameter))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun repeatedAnnotation(annotation: AnnotationDescriptor) {
|
||||||
|
val annotationEntry = (annotation.source as? KotlinSourceElement)?.psi as? KtAnnotationEntry ?: return
|
||||||
|
trace.report(REPEATED_ANNOTATION.on(annotationEntry))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
private fun createErrorTypeForTypeConstructor(
|
private fun createErrorTypeForTypeConstructor(
|
||||||
c: TypeResolutionContext,
|
c: TypeResolutionContext,
|
||||||
arguments: List<KtTypeProjection>,
|
arguments: List<KtTypeProjection>,
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.google.common.collect.Lists
|
|||||||
import com.google.common.collect.Sets
|
import com.google.common.collect.Sets
|
||||||
import org.jetbrains.kotlin.builtins.ReflectionTypes
|
import org.jetbrains.kotlin.builtins.ReflectionTypes
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.*
|
import org.jetbrains.kotlin.diagnostics.Errors.*
|
||||||
@@ -597,15 +598,19 @@ class CandidateResolver(
|
|||||||
private val argumentsMapping = typeAlias.declaredTypeParameters.zip(ktTypeArguments).toMap()
|
private val argumentsMapping = typeAlias.declaredTypeParameters.zip(ktTypeArguments).toMap()
|
||||||
|
|
||||||
override fun wrongNumberOfTypeArguments(typeAlias: TypeAliasDescriptor, numberOfParameters: Int) {
|
override fun wrongNumberOfTypeArguments(typeAlias: TypeAliasDescriptor, numberOfParameters: Int) {
|
||||||
// TODO
|
// can't happen in single-step expansion
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {
|
override fun conflictingProjection(typeAlias: TypeAliasDescriptor, typeParameter: TypeParameterDescriptor?, substitutedArgument: KotlinType) {
|
||||||
// TODO
|
// can't happen in single-step expansion
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor) {
|
override fun recursiveTypeAlias(typeAlias: TypeAliasDescriptor) {
|
||||||
// can't happen in non-error type
|
// can't happen in single-step expansion
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun repeatedAnnotation(annotation: AnnotationDescriptor) {
|
||||||
|
// can't happen in single-step expansion
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor) {
|
override fun boundsViolationInSubstitution(bound: KotlinType, unsubstitutedArgument: KotlinType, argument: KotlinType, typeParameter: TypeParameterDescriptor) {
|
||||||
|
|||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
@Target(AnnotationTarget.TYPE)
|
||||||
|
annotation class A
|
||||||
|
|
||||||
|
typealias AInt = @A Int
|
||||||
|
typealias AI = AInt
|
||||||
|
|
||||||
|
typealias Test1 = <!REPEATED_ANNOTATION!>@A<!> AInt
|
||||||
|
typealias Test2 = <!REPEATED_ANNOTATION!>@A<!> AI
|
||||||
|
typealias Test3 = List<<!REPEATED_ANNOTATION!>@A<!> AInt>
|
||||||
|
typealias Test4 = List<<!REPEATED_ANNOTATION!>@A<!> AI>
|
||||||
|
|
||||||
|
val testProperty1: <!REPEATED_ANNOTATION!>@A<!> AInt = 0
|
||||||
|
val testProperty2: <!REPEATED_ANNOTATION!>@A<!> AI = 0
|
||||||
|
|
||||||
|
fun testFunction1(x: <!REPEATED_ANNOTATION!>@A<!> AInt): <!REPEATED_ANNOTATION!>@A<!> AInt = x
|
||||||
|
fun testFunction2(x: <!REPEATED_ANNOTATION!>@A<!> AI): <!REPEATED_ANNOTATION!>@A<!> AI = x
|
||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
package
|
||||||
|
|
||||||
|
public val testProperty1: @A AInt /* = @A @A kotlin.Int */ = 0
|
||||||
|
public val testProperty2: @A AI /* = @A @A kotlin.Int */ = 0
|
||||||
|
public fun testFunction1(/*0*/ x: @A AInt /* = @A @A kotlin.Int */): @A AInt /* = @A @A kotlin.Int */
|
||||||
|
public fun testFunction2(/*0*/ x: @A AI /* = @A @A kotlin.Int */): @A AI /* = @A @A kotlin.Int */
|
||||||
|
|
||||||
|
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class A : kotlin.Annotation {
|
||||||
|
public constructor A()
|
||||||
|
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 AI = AInt
|
||||||
|
public typealias AInt = @A kotlin.Int
|
||||||
|
public typealias Test1 = @A AInt
|
||||||
|
public typealias Test2 = @A AI
|
||||||
|
public typealias Test3 = kotlin.collections.List<@A AInt>
|
||||||
|
public typealias Test4 = kotlin.collections.List<@A AI>
|
||||||
@@ -14,8 +14,3 @@ fun test2(a: Alias3) = a
|
|||||||
|
|
||||||
typealias LA1 = List<@Ann2 Alias1>
|
typealias LA1 = List<@Ann2 Alias1>
|
||||||
fun test3(la1: LA1) = la1
|
fun test3(la1: LA1) = la1
|
||||||
|
|
||||||
// see KT-14318
|
|
||||||
typealias AliasRepeated = @Ann1 Alias1
|
|
||||||
fun test4(a: AliasRepeated) = a
|
|
||||||
fun test4a(a: @Ann1 Alias1) = a
|
|
||||||
@@ -3,8 +3,6 @@ package
|
|||||||
public fun test1(/*0*/ a: Alias2 /* = @Ann2 @Ann1 kotlin.String */): Alias2 /* = @Ann2 @Ann1 kotlin.String */
|
public fun test1(/*0*/ a: Alias2 /* = @Ann2 @Ann1 kotlin.String */): Alias2 /* = @Ann2 @Ann1 kotlin.String */
|
||||||
public fun test2(/*0*/ a: Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */): Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */
|
public fun test2(/*0*/ a: Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */): Alias3 /* = @kotlin.ExtensionFunctionType @Ann1 kotlin.String */
|
||||||
public fun test3(/*0*/ la1: LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */): LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */
|
public fun test3(/*0*/ la1: LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */): LA1 /* = kotlin.collections.List<@Ann2 Alias1 /* = @Ann2 @Ann1 kotlin.String */> */
|
||||||
public fun test4(/*0*/ a: AliasRepeated /* = @Ann1 @Ann1 kotlin.String */): AliasRepeated /* = @Ann1 @Ann1 kotlin.String */
|
|
||||||
public fun test4a(/*0*/ a: @Ann1 Alias1 /* = @Ann1 @Ann1 kotlin.String */): @Ann1 Alias1 /* = @Ann1 @Ann1 kotlin.String */
|
|
||||||
|
|
||||||
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class Ann1 : kotlin.Annotation {
|
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.TYPE}) public final annotation class Ann1 : kotlin.Annotation {
|
||||||
public constructor Ann1()
|
public constructor Ann1()
|
||||||
@@ -22,5 +20,4 @@ public fun test4a(/*0*/ a: @Ann1 Alias1 /* = @Ann1 @Ann1 kotlin.String */): @Ann
|
|||||||
public typealias Alias1 = @Ann1 kotlin.String
|
public typealias Alias1 = @Ann1 kotlin.String
|
||||||
public typealias Alias2 = @Ann2 Alias1
|
public typealias Alias2 = @Ann2 Alias1
|
||||||
public typealias Alias3 = @kotlin.ExtensionFunctionType Alias1
|
public typealias Alias3 = @kotlin.ExtensionFunctionType Alias1
|
||||||
public typealias AliasRepeated = @Ann1 Alias1
|
|
||||||
public typealias LA1 = kotlin.collections.List<@Ann2 Alias1>
|
public typealias LA1 = kotlin.collections.List<@Ann2 Alias1>
|
||||||
|
|||||||
@@ -20868,6 +20868,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("typeAliasExpansionRepeatedAnnotations.kt")
|
||||||
|
public void testTypeAliasExpansionRepeatedAnnotations() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasExpansionRepeatedAnnotations.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("typeAliasInAnonymousObjectType.kt")
|
@TestMetadata("typeAliasInAnonymousObjectType.kt")
|
||||||
public void testTypeAliasInAnonymousObjectType() throws Exception {
|
public void testTypeAliasInAnonymousObjectType() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/typealias/typeAliasInAnonymousObjectType.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user