diff --git a/src/org/jetbrains/plugins/scala/lang/psi/api/toplevel/typedef/ScClass.scala b/src/org/jetbrains/plugins/scala/lang/psi/api/toplevel/typedef/ScClass.scala index 26cbbc2efb2..d1bb028f3e2 100644 --- a/src/org/jetbrains/plugins/scala/lang/psi/api/toplevel/typedef/ScClass.scala +++ b/src/org/jetbrains/plugins/scala/lang/psi/api/toplevel/typedef/ScClass.scala @@ -9,7 +9,7 @@ import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.{PsiElement, PsiMethod} import org.jetbrains.plugins.scala.lang.lexer.ScalaTokenTypes import org.jetbrains.plugins.scala.lang.psi.api.base.ScPrimaryConstructor -import org.jetbrains.plugins.scala.lang.psi.api.statements.params.ScParameters +import org.jetbrains.plugins.scala.lang.psi.api.statements.params.{ScTypeParam, ScParameters} import org.jetbrains.plugins.scala.lang.psi.api.statements.{ScFunction, ScFunctionDefinition, ScParameterOwner} import org.jetbrains.plugins.scala.lang.psi.impl.ScalaPsiElementFactory @@ -43,23 +43,30 @@ trait ScClass extends ScTypeDefinition with ScParameterOwner { } } - protected def typeParamString : String = if (typeParameters.nonEmpty) typeParameters.map(param => { - var paramText = param.name - param.lowerTypeElement foreach { - case tp => paramText = paramText + " >: " + tp.getText + protected def typeParamString : String = { + def typeParamString(param: ScTypeParam): String = { + var paramText = param.name + if (param.typeParameters.nonEmpty) { + paramText += param.typeParameters.map(typeParamString).mkString("[", ", ", "]") + } + param.lowerTypeElement foreach { + case tp => paramText = paramText + " >: " + tp.getText + } + param.upperTypeElement foreach { + case tp => paramText = paramText + " <: " + tp.getText + } + param.viewTypeElement foreach { + case tp => paramText = paramText + " <% " + tp.getText + } + param.contextBoundTypeElement foreach { + case tp => paramText = paramText + " : " + tp.getText + } + paramText } - param.upperTypeElement foreach { - case tp => paramText = paramText + " <: " + tp.getText - } - param.viewTypeElement foreach { - case tp => paramText = paramText + " <% " + tp.getText - } - param.contextBoundTypeElement foreach { - case tp => paramText = paramText + " : " + tp.getText - } - paramText - }).mkString("[", ", ", "]") - else "" + + if (typeParameters.nonEmpty) typeParameters.map(typeParamString).mkString("[", ", ", "]") + else "" + } def getSyntheticMethodsText: List[String] = { val paramString = constructor match { diff --git a/test/org/jetbrains/plugins/scala/lang/typeInference/generated/TypeInferenceBugs5Test.scala b/test/org/jetbrains/plugins/scala/lang/typeInference/generated/TypeInferenceBugs5Test.scala index 51c58a4ae12..e5f9f50636c 100644 --- a/test/org/jetbrains/plugins/scala/lang/typeInference/generated/TypeInferenceBugs5Test.scala +++ b/test/org/jetbrains/plugins/scala/lang/typeInference/generated/TypeInferenceBugs5Test.scala @@ -697,6 +697,8 @@ class TypeInferenceBugs5Test extends TypeInferenceTestBase { def testSCL8398(): Unit = doTest() + def testSCL8933(): Unit = doTest() + def testSCL8989(): Unit = doTest() def testSCL8995(): Unit = doTest() diff --git a/testdata/typeInference/bugs5/SCL8933.scala b/testdata/typeInference/bugs5/SCL8933.scala new file mode 100644 index 00000000000..b63ba9a048c --- /dev/null +++ b/testdata/typeInference/bugs5/SCL8933.scala @@ -0,0 +1,5 @@ +case class R[F[_], T](f: F[T]) +class B[T] +val r = R(new B[Int]) +/*start*/r/*end*/ +//R[B, Int] \ No newline at end of file