summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-09-26 11:51:42 +0200
committerJason Zaugg <jzaugg@gmail.com>2013-09-26 11:51:42 +0200
commit001132d842f0d1962a0264307610aa805de4d338 (patch)
tree7ad908d0bb756c1861153fa999a74015d29f6e5f
parentbda48577d022811be58ce2b7f9e46890543ad45b (diff)
downloadscala-001132d842f0d1962a0264307610aa805de4d338.tar.gz
scala-001132d842f0d1962a0264307610aa805de4d338.tar.bz2
scala-001132d842f0d1962a0264307610aa805de4d338.zip
SI-7876 Scaladoc crasher due to regression in isFunctionType.
`isFunctionType` and `isTupleType` started returing true for type constructors as of aeb73314. This led to a crash in type printing in ScalaDoc (specfically, in ModelFactoryTypeSupport.scala) This commit: - fixes those methods by guarding with !isHigherKinded - unit tests said methods - tests the reported crasher with a ScalaDoc test.
-rw-r--r--src/reflect/scala/reflect/internal/Definitions.scala4
-rw-r--r--test/files/run/t7876.scala26
-rw-r--r--test/scaladoc/run/t7876.check1
-rw-r--r--test/scaladoc/run/t7876.scala19
4 files changed, 48 insertions, 2 deletions
diff --git a/src/reflect/scala/reflect/internal/Definitions.scala b/src/reflect/scala/reflect/internal/Definitions.scala
index f8af4f155d..961e8e7264 100644
--- a/src/reflect/scala/reflect/internal/Definitions.scala
+++ b/src/reflect/scala/reflect/internal/Definitions.scala
@@ -658,8 +658,8 @@ trait Definitions extends api.StandardDefinitions {
// These "direct" calls perform no dealiasing. They are most needed when
// printing types when one wants to preserve the true nature of the type.
- def isFunctionTypeDirect(tp: Type) = isFunctionSymbol(tp.typeSymbolDirect)
- def isTupleTypeDirect(tp: Type) = isTupleSymbol(tp.typeSymbolDirect)
+ def isFunctionTypeDirect(tp: Type) = !tp.isHigherKinded && isFunctionSymbol(tp.typeSymbolDirect)
+ def isTupleTypeDirect(tp: Type) = !tp.isHigherKinded && isTupleSymbol(tp.typeSymbolDirect)
// Note that these call .dealiasWiden and not .normalize, the latter of which
// tends to change the course of events by forcing types.
diff --git a/test/files/run/t7876.scala b/test/files/run/t7876.scala
new file mode 100644
index 0000000000..aeec8c8cce
--- /dev/null
+++ b/test/files/run/t7876.scala
@@ -0,0 +1,26 @@
+import scala.tools.partest._
+
+// Type constructors for FunctionN and TupleN should not be considered as function type / tuple types.
+object Test extends DirectTest {
+ override def extraSettings: String = "-usejavacp"
+
+ def code = ""
+
+ def show() {
+ val global = newCompiler()
+ new global.Run()
+ import global._, definitions._
+ val function0TC = FunctionClass(0).typeConstructor
+ val tuple1TC = TupleClass(1).typeConstructor
+ FunctionClass.seq.foreach { sym =>
+ val tc = sym.typeConstructor
+ assert(!isFunctionType(tc), s"$tc")
+ assert(!isFunctionTypeDirect(tc), s"$tc (direct)")
+ }
+ TupleClass.seq.foreach { sym =>
+ val tc = sym.typeConstructor
+ assert(!isTupleType(tc), s"$sym")
+ assert(!isTupleTypeDirect(tc), s"$tc (direct)")
+ }
+ }
+}
diff --git a/test/scaladoc/run/t7876.check b/test/scaladoc/run/t7876.check
new file mode 100644
index 0000000000..619c56180b
--- /dev/null
+++ b/test/scaladoc/run/t7876.check
@@ -0,0 +1 @@
+Done.
diff --git a/test/scaladoc/run/t7876.scala b/test/scaladoc/run/t7876.scala
new file mode 100644
index 0000000000..63c63f8a0c
--- /dev/null
+++ b/test/scaladoc/run/t7876.scala
@@ -0,0 +1,19 @@
+import scala.tools.nsc.doc.model._
+import scala.tools.partest.ScaladocModelTest
+
+object Test extends ScaladocModelTest {
+
+ override def code = """
+ import language.higherKinds
+ trait T[M[_]]
+ class C extends T[Function0]
+ class D extends T[Tuple1]
+ """
+
+ def scaladocSettings = ""
+
+ def testModel(rootPackage: Package) = {
+ import access._
+ // did not crash
+ }
+}