diff options
author | Jason Zaugg <jzaugg@gmail.com> | 2013-09-26 23:16:25 -0700 |
---|---|---|
committer | Jason Zaugg <jzaugg@gmail.com> | 2013-09-26 23:16:25 -0700 |
commit | 738405a9aae7c117d3974c05269f6bbd2ac2ae3e (patch) | |
tree | 24744678d1772b3404aedc9e96b7f4ed326f47ac | |
parent | 052f1a7b1f7d6e63f5d83a89ffba9dbc56645112 (diff) | |
parent | c11d98822e86b23b7c31429433fbb15cf94792c8 (diff) | |
download | scala-738405a9aae7c117d3974c05269f6bbd2ac2ae3e.tar.gz scala-738405a9aae7c117d3974c05269f6bbd2ac2ae3e.tar.bz2 scala-738405a9aae7c117d3974c05269f6bbd2ac2ae3e.zip |
Merge pull request #2990 from retronym/ticket/7876
Scaladoc regression with Function / Tuple type constructors
-rw-r--r-- | src/reflect/scala/reflect/internal/Definitions.scala | 4 | ||||
-rw-r--r-- | src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala | 8 | ||||
-rw-r--r-- | test/files/run/t7876.scala | 26 | ||||
-rw-r--r-- | test/scaladoc/run/SI-4676.scala | 3 | ||||
-rw-r--r-- | test/scaladoc/run/t7876.check | 1 | ||||
-rw-r--r-- | test/scaladoc/run/t7876.scala | 19 | ||||
-rw-r--r-- | test/scaladoc/run/t7876b.check | 3 | ||||
-rw-r--r-- | test/scaladoc/run/t7876b.scala | 24 |
8 files changed, 81 insertions, 7 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/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala index d5048dcfa3..2b7e2506d4 100644 --- a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala +++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala @@ -41,8 +41,8 @@ trait ModelFactoryTypeSupport { private def appendType0(tpe: Type): Unit = tpe match { /* Type refs */ - case tp: TypeRef if definitions.isFunctionType(tp) => - val args = tp.normalize.typeArgs + case tp: TypeRef if definitions.isFunctionTypeDirect(tp) => + val args = tp.typeArgs nameBuffer append '(' appendTypes0(args.init, ", ") nameBuffer append ") ⇒ " @@ -53,8 +53,8 @@ trait ModelFactoryTypeSupport { case tp: TypeRef if definitions.isByNameParamType(tp) => nameBuffer append "⇒ " appendType0(tp.args.head) - case tp: TypeRef if definitions.isTupleType(tp) => - val args = tp.normalize.typeArgs + case tp: TypeRef if definitions.isTupleTypeDirect(tp) => + val args = tp.typeArgs nameBuffer append '(' appendTypes0(args, ", ") nameBuffer append ')' 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/SI-4676.scala b/test/scaladoc/run/SI-4676.scala index b83a59a472..99b3c5568a 100644 --- a/test/scaladoc/run/SI-4676.scala +++ b/test/scaladoc/run/SI-4676.scala @@ -21,6 +21,7 @@ object Test extends ScaladocModelTest { // check correct expansion of the use case signature val x = rootPackage._class("SI_4676")._method("x") - assert(x.valueParams(0)(0).resultType.name == "(String, String)", "parameter ss of method x has type (String, String") + val resultType = x.valueParams(0)(0).resultType.name + assert(resultType == "SS", s"parameter ss of method x has type $resultType, expected SS!") } }
\ No newline at end of file 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 + } +} diff --git a/test/scaladoc/run/t7876b.check b/test/scaladoc/run/t7876b.check new file mode 100644 index 0000000000..21aaf3b295 --- /dev/null +++ b/test/scaladoc/run/t7876b.check @@ -0,0 +1,3 @@ +foo: FInt +foo: TInt +Done. diff --git a/test/scaladoc/run/t7876b.scala b/test/scaladoc/run/t7876b.scala new file mode 100644 index 0000000000..4d5b8c22cf --- /dev/null +++ b/test/scaladoc/run/t7876b.scala @@ -0,0 +1,24 @@ +import scala.tools.nsc.doc.model._ +import scala.tools.partest.ScaladocModelTest + +// Don't dealias just to print a Function or Tuple type. +object Test extends ScaladocModelTest { + + override def code = """ + class Test { + type FInt = Function0[Int] + type TInt = Tuple1[Int] + def foo: FInt + def bar: TInt + } + """ + + def scaladocSettings = "" + + def testModel(rootPackage: Package) = { + import access._ + List("foo", "bar").foreach { name => + println("foo: " + rootPackage._class("Test")._method(name).resultType.name) + } + } +} |