netimen
netimen

Reputation: 4419

UninferredParameterTypeConstructor exception during build when generic parameters not specified explicitly

I have the following code (using RxKotlin 0.40.1):

class Result<T, E>(val data: T? = null, val error: E? = null)

fun <T, E> wrapResult(errorInfoFactory: (Throwable) -> E): (Observable<T>) -> Observable<Result<T, E>> = { it.map { Result<T, E>(it) }.onErrorReturn { Result<T, E>(error = errorInfoFactory(it)) } }

Just FYI this is needed to easily transform Observable which may throw errors to an Observable which always returns Result object, so onError is never triggered.

And I want to use it like this:

fun dangerousOperation() = 0

fun getErrorMessage(t: Throwable) = "error occurred"

fun test() {
    val resultObservable = Observable.fromCallable(::dangerousOperation).compose(wrapResult(::getErrorMessage))
}

And Android Studio 1.5.1 with Kotlin plugin 1.0.0-release-IJ141-56 doesn't highlight any errors in this code. But when I try to build it, I get the error:

//Error:(24, 9) org.jetbrains.kotlin.codegen.CompilationException: Back-end (JVM) Internal error: Error type encountered: org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@68754e6 (ErrorTypeImpl). //Cause: Error type encountered: org.jetbrains.kotlin.types.ErrorUtils$UninferredParameterTypeConstructor@68754e6 (ErrorTypeImpl). //File being compiled and position: (24,9) in /home/d/work/workspace/Hitch-hiking-Stats/app/src/main/java/ru/netimen/hitch_hikingstats/MemoryRepo.kt //PsiElement: val resultObservable = Observable.just(dangerousOperation()).compose(wrapResult(::getErrorMessage)) //The root cause was thrown at: JetTypeMapper.java:435 // at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:299) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:339) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1532) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.generateBlock(ExpressionCodegen.java:1485) // at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:56) // at org.jetbrains.kotlin.codegen.CodegenStatementVisitor.visitBlockExpression(CodegenStatementVisitor.java:22) // at org.jetbrains.kotlin.psi.KtBlockExpression.accept(KtBlockExpression.java:44) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.genQualified(ExpressionCodegen.java:280) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.genStatement(ExpressionCodegen.java:339) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.gen(ExpressionCodegen.java:309) // at org.jetbrains.kotlin.codegen.ExpressionCodegen.returnExpression(ExpressionCodegen.java:1873) // at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$FunctionDefault.doGenerateBody(FunctionGenerationStrategy.java:50) // at org.jetbrains.kotlin.codegen.FunctionGenerationStrategy$CodegenBased.generateBody(FunctionGenerationStrategy.java:72) // at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethodBody(FunctionCodegen.java:364) // at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:203) // at org.jetbrains.kotlin.codegen.FunctionCodegen.generateMethod(FunctionCodegen.java:138)

But when I change my test function to

fun test() {
    val resultObservable = Observable.fromCallable(::dangerousOperation).compose(wrapResult<Int, String>(::getErrorMessage))
}

everything compiles OK. But why I get that exception when I don't specify the generic parameters of wrapResult explicitly if the IDE doesn't highlight any errors?

Upvotes: 0

Views: 956

Answers (1)

erokhins
erokhins

Reputation: 629

It is compiler bug: https://youtrack.jetbrains.com/issue/KT-11144. Main reason why this bug is appear: function wrapResult uses generic parameter T only in own return type.

Upvotes: 2

Related Questions