Frontend changes for reified type parameters

Allowing reified only for inline functions and Intrinsics
This commit is contained in:
Denis Zharkov
2014-10-20 14:19:42 +04:00
committed by Andrey Breslav
parent 79c6f2b91b
commit b3691b7358
28 changed files with 822 additions and 414 deletions
@@ -35,10 +35,21 @@ import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.lang.diagnostics.Errors
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.CallableDescriptor
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor
import org.jetbrains.jet.lang.resolve.DescriptorToSourceUtils
import org.jetbrains.jet.lang.psi.JetTypeParameter
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.lang.resolve.annotations.hasIntrinsicAnnotation
public object JavaDeclarationCheckerProvider : AdditionalCheckerProvider {
override val annotationCheckers: List<AnnotationChecker> = listOf(PlatformStaticAnnotationChecker(), LocalFunInlineChecker())
override val annotationCheckers: List<AnnotationChecker> = listOf(
PlatformStaticAnnotationChecker(), LocalFunInlineChecker(), ReifiedTypeParameterAnnotationChecker()
)
}
public class LocalFunInlineChecker : AnnotationChecker {
@@ -85,4 +96,35 @@ public class PlatformStaticAnnotationChecker : AnnotationChecker {
}
}
}
}
}
public class ReifiedTypeParameterAnnotationChecker : AnnotationChecker {
override fun check(declaration: JetDeclaration, descriptor: DeclarationDescriptor, diagnosticHolder: DiagnosticSink) {
if (descriptor.hasIntrinsicAnnotation()) return
if (descriptor is CallableDescriptor && !descriptor.hasInlineAnnotation()) {
checkTypeParameterDescriptorsAreNotReified(descriptor.getTypeParameters(), diagnosticHolder)
}
if (descriptor is ClassDescriptor) {
checkTypeParameterDescriptorsAreNotReified(descriptor.getTypeConstructor().getParameters(), diagnosticHolder)
}
}
}
private fun checkTypeParameterDescriptorsAreNotReified(
typeParameterDescriptors: List<TypeParameterDescriptor>,
diagnosticHolder: DiagnosticSink
) {
for (reifiedTypeParameterDescriptor in typeParameterDescriptors.filter { it.isReified() }) {
val typeParameterDeclaration = DescriptorToSourceUtils.descriptorToDeclaration(reifiedTypeParameterDescriptor)
if (typeParameterDeclaration !is JetTypeParameter) throw AssertionError("JetTypeParameter expected")
diagnosticHolder.report(
Errors.REIFIED_TYPE_PARAMETER_NO_INLINE.on(
typeParameterDeclaration.getModifierList().getModifier(JetTokens.REIFIED_KEYWORD)!!
)
)
}
}