diff --git a/scaladoc/src/dotty/tools/scaladoc/renderers/DocRenderer.scala b/scaladoc/src/dotty/tools/scaladoc/renderers/DocRenderer.scala index 803ad863c9b7..03daa7acfe62 100644 --- a/scaladoc/src/dotty/tools/scaladoc/renderers/DocRenderer.scala +++ b/scaladoc/src/dotty/tools/scaladoc/renderers/DocRenderer.scala @@ -66,7 +66,7 @@ class DocRender(signatureRenderer: SignatureRenderer)(using DocContext): case Superscript(text) => span(cls:="superscript")(renderElement(text)) // TODO implement style case Subscript(text) => span(cls:="subscript")(renderElement(text)) // TODO implement style case Link(target, body) => - renderLink(target, default => body.fold[TagArg](text(default))(renderElement)) + renderLink(target, default => body.fold[TagArg](default)(renderElement)) case Text(text) => raw(text) case Summary(text) => renderElement(text) case HtmlTag(content) => raw(content) diff --git a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/MemberLookup.scala b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/MemberLookup.scala index ee5ae7f1bd71..b2c4e1bdcac4 100644 --- a/scaladoc/src/dotty/tools/scaladoc/tasty/comments/MemberLookup.scala +++ b/scaladoc/src/dotty/tools/scaladoc/tasty/comments/MemberLookup.scala @@ -193,7 +193,7 @@ trait MemberLookup { case Some(sym) => val externalOwner: Option[reflect.Symbol] = if owner eq sym.owner then None - else if owner.flags.is(Flags.Module) then Some(owner.moduleClass) + else if owner.flags.is(Flags.Module) && !owner.flags.is(Flags.Package) then Some(owner.moduleClass) else if owner.isClassDef then Some(owner) else None Some(sym -> externalOwner) diff --git a/scaladoc/test/dotty/tools/scaladoc/tasty/comments/MemberLookupTests.scala b/scaladoc/test/dotty/tools/scaladoc/tasty/comments/MemberLookupTests.scala index c4102d913e96..0b9b88fa5bb8 100644 --- a/scaladoc/test/dotty/tools/scaladoc/tasty/comments/MemberLookupTests.scala +++ b/scaladoc/test/dotty/tools/scaladoc/tasty/comments/MemberLookupTests.scala @@ -13,6 +13,8 @@ class LookupTestCases[Q <: Quotes](val q: Quotes) { def testAll(): Unit = { testOwnerlessLookup() + testOwnerlessLookupOfInherited() + testOwnerlessLookupOfClassWithinPackageWithPackageObject() testOwnedLookup() testStrictMemberLookup() } @@ -46,7 +48,7 @@ class LookupTestCases[Q <: Quotes](val q: Quotes) { cls("tests.lookupInheritedMembers.pack1.A").fun("x"), "tests.lookupInheritedMembers.pack2.B.x" -> - cls("tests.lookupInheritedMembers.pack1.A").fun("x"), + cls("tests.lookupInheritedMembers.pack2.B").fun("x"), ) cases.foreach { case (query, sym) => @@ -62,6 +64,49 @@ class LookupTestCases[Q <: Quotes](val q: Quotes) { assertSame(query, target, lookedUp) } + /** + * We cannot test for cls().fun() beucase it returns parent fun symbol from tasty. Hence we will look for member (val, def, type) but compare its owner to just cls() + */ + def testOwnerlessLookupOfInherited(): Unit = { + val cases = List[(String, Sym)]( + "tests.lookupInheritedMembers.pack2.B.x" -> + cls("tests.lookupInheritedMembers.pack2.B"), + + "tests.lookupInheritedMembers.pack2.B.y" -> + cls("tests.lookupInheritedMembers.pack2.B"), + + "tests.lookupInheritedMembers.pack2.B.MyType" -> + cls("tests.lookupInheritedMembers.pack2.B"), + ) + + cases.foreach { case (query, sym) => + val target = sym.symbol + val lookupRes = MemberLookup.lookupOpt(parseQuery(query), None) + assertTrue(s"Couldn't look up: $query", lookupRes.nonEmpty) + val Some((_ , _, Some(owner))) = lookupRes + assertSame(query, target, owner) + } + } + + /** + * Classes should not have owner of package object + */ + def testOwnerlessLookupOfClassWithinPackageWithPackageObject(): Unit = { + val cases = List[(String, Sym)]( + "<:<" -> + cls("scala.<:<"), + ) + + cases.foreach { case (query, sym) => + val target = sym.symbol + val lookupRes = MemberLookup.lookupOpt(parseQuery(query), Some(cls("scala.=:=").symbol)) + assertTrue(s"Couldn't look up: $query", lookupRes.nonEmpty) + println(lookupRes) + val Some((_ , _, owner)) = lookupRes + assertSame(query, None, owner) + } + } + def testOwnedLookup(): Unit = { val cases = List[((Sym, String), Sym)]( cls("tests.A") -> "tests.Methods.simple" -> cls("tests.Methods").fun("simple"),