Skip to content

Commit 6a9e067

Browse files
committed
Address review comments
1 parent df5b967 commit 6a9e067

File tree

2 files changed

+104
-158
lines changed

2 files changed

+104
-158
lines changed

compiler/src/dotty/tools/repl/ReplCompiler.scala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -194,20 +194,17 @@ class ReplCompiler(val directory: AbstractFile) extends Compiler {
194194
}
195195

196196
typeCheck(expr).map {
197-
case v @ ValDef(_, _, Block(stats, _)) if stats.nonEmpty =>
197+
case ValDef(_, _, Block(stats, _)) if stats.nonEmpty =>
198198
val stat = stats.last.asInstanceOf[tpd.Tree]
199199
if (stat.tpe.isError) stat.tpe.show
200200
else {
201-
val doc =
202-
ctx.docCtx.flatMap { docCtx =>
203-
val symbols = extractSymbols(stat)
204-
symbols.collectFirst {
205-
case sym if docCtx.docstrings.contains(sym) =>
206-
docCtx.docstrings(sym).raw
207-
}
208-
}
209-
210-
doc.getOrElse(s"// No doc for `${expr}`")
201+
val docCtx = ctx.docCtx.get
202+
val symbols = extractSymbols(stat)
203+
val doc = symbols.collectFirst {
204+
case sym if docCtx.docstrings.contains(sym) =>
205+
docCtx.docstrings(sym).raw
206+
}
207+
doc.getOrElse(s"// No doc for `${expr}`")
211208
}
212209

213210
case _ =>

compiler/test/dotty/tools/repl/DocTests.scala

Lines changed: 96 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -5,205 +5,154 @@ import org.junit.Test
55
import org.junit.Assert.assertEquals
66

77
class DocTests extends ReplTest {
8+
89
@Test def docOfDef =
9-
fromInitialState { implicit s => run("/** doc */ def foo = 0") }
10-
.andThen { implicit s =>
11-
storedOutput()
12-
run(":doc foo")
13-
assertEquals("/** doc */", storedOutput().trim)
10+
eval("/** doc */ def foo = 0").andThen { implicit s =>
11+
assertEquals("/** doc */", doc("foo"))
1412
}
1513

1614
@Test def docOfVal =
17-
fromInitialState { implicit s => run("/** doc */ val foo = 0") }
18-
.andThen { implicit s =>
19-
storedOutput()
20-
run(":doc foo")
21-
assertEquals("/** doc */", storedOutput().trim)
15+
eval("/** doc */ val foo = 0").andThen { implicit s =>
16+
assertEquals("/** doc */", doc("foo"))
2217
}
2318

2419
@Test def docOfObject =
25-
fromInitialState { implicit s => run("/** doc */ object Foo") }
26-
.andThen { implicit s =>
27-
storedOutput()
28-
run(":doc Foo")
29-
assertEquals("/** doc */", storedOutput().trim)
20+
eval("/** doc */ object Foo").andThen { implicit s =>
21+
assertEquals("/** doc */", doc("Foo"))
3022
}
3123

3224
@Test def docOfClass =
33-
fromInitialState { implicit s => run("/** doc */ class Foo") }
34-
.andThen { implicit s =>
35-
storedOutput()
36-
run(":doc new Foo")
37-
assertEquals("/** doc */", storedOutput().trim)
25+
eval("/** doc */ class Foo").andThen { implicit s =>
26+
assertEquals("/** doc */", doc("new Foo"))
3827
}
3928

4029
@Test def docOfTrait =
41-
fromInitialState { implicit s => run("/** doc */ trait Foo") }
42-
.andThen { implicit s =>
43-
storedOutput()
44-
run(":doc new Foo")
45-
assertEquals("/** doc */", storedOutput().trim)
30+
eval("/** doc */ trait Foo").andThen { implicit s =>
31+
assertEquals("/** doc */", doc("new Foo"))
4632
}
4733

4834
@Test def docOfDefInObject =
49-
fromInitialState { implicit s => run("object O { /** doc */ def foo = 0 }") }
50-
.andThen { implicit s =>
51-
storedOutput()
52-
run(":doc O.foo")
53-
assertEquals("/** doc */", storedOutput().trim)
35+
eval("object O { /** doc */ def foo = 0 }").andThen { implicit s =>
36+
assertEquals("/** doc */", doc("O.foo"))
5437
}
5538

5639
@Test def docOfValInObject =
57-
fromInitialState { implicit s => run("object O { /** doc */ val foo = 0 }") }
58-
.andThen { implicit s =>
59-
storedOutput()
60-
run(":doc O.foo")
61-
assertEquals("/** doc */", storedOutput().trim)
40+
eval("object O { /** doc */ val foo = 0 }").andThen { implicit s =>
41+
assertEquals("/** doc */", doc("O.foo"))
6242
}
6343

6444
@Test def docOfObjectInObject =
65-
fromInitialState { implicit s => run("object O { /** doc */ object Foo }") }
66-
.andThen { implicit s =>
67-
storedOutput()
68-
run(":doc O.Foo")
69-
assertEquals("/** doc */", storedOutput().trim)
45+
eval("object O { /** doc */ object Foo }").andThen { implicit s =>
46+
assertEquals("/** doc */", doc("O.Foo"))
7047
}
7148

7249
@Test def docOfClassInObject =
73-
fromInitialState { implicit s => run("object O { /** doc */ class Foo }") }
74-
.andThen { implicit s =>
75-
storedOutput()
76-
run(":doc new O.Foo")
77-
assertEquals("/** doc */", storedOutput().trim)
50+
eval("object O { /** doc */ class Foo }").andThen { implicit s =>
51+
assertEquals("/** doc */", doc("new O.Foo"))
7852
}
7953

8054
@Test def docOfTraitInObject =
81-
fromInitialState { implicit s => run("object O { /** doc */ trait Foo }") }
82-
.andThen { implicit s =>
83-
storedOutput()
84-
run(":doc new O.Foo")
85-
assertEquals("/** doc */", storedOutput().trim)
55+
eval("object O { /** doc */ trait Foo }").andThen { implicit s =>
56+
assertEquals("/** doc */", doc("new O.Foo"))
8657
}
8758

88-
@Test def docOfDetInClass =
89-
fromInitialState { implicit s => run("class C { /** doc */ def foo = 0 }") }
90-
.andThen { implicit s => run("val c = new C") }
91-
.andThen { implicit s =>
92-
storedOutput()
93-
run(":doc c.foo")
94-
assertEquals("/** doc */", storedOutput().trim)
59+
@Test def docOfDefInClass =
60+
eval(
61+
"""class C { /** doc */ def foo = 0 }
62+
|val c = new C
63+
""".stripMargin).andThen { implicit s =>
64+
assertEquals("/** doc */", doc("c.foo"))
9565
}
9666

97-
@Test def docOfVatInClass =
98-
fromInitialState { implicit s => run("class C { /** doc */ val foo = 0 }") }
99-
.andThen { implicit s => run("val c = new C") }
100-
.andThen { implicit s =>
101-
storedOutput()
102-
run(":doc c.foo")
103-
assertEquals("/** doc */", storedOutput().trim)
67+
@Test def docOfValInClass =
68+
eval(
69+
"""class C { /** doc */ val foo = 0 }
70+
|val c = new C
71+
""".stripMargin).andThen { implicit s =>
72+
assertEquals("/** doc */", doc("c.foo"))
10473
}
10574

10675
@Test def docOfObjectInClass =
107-
fromInitialState { implicit s => run("class C { /** doc */ object Foo }") }
108-
.andThen { implicit s => run("val c = new C") }
109-
.andThen { implicit s =>
110-
storedOutput()
111-
run(":doc c.Foo")
112-
assertEquals("/** doc */", storedOutput().trim)
76+
eval(
77+
"""class C { /** doc */ object Foo }
78+
|val c = new C
79+
""".stripMargin).andThen { implicit s =>
80+
assertEquals("/** doc */", doc("c.Foo"))
11381
}
11482

11583
@Test def docOfClassInClass =
116-
fromInitialState { implicit s => run("class C { /** doc */ class Foo }") }
117-
.andThen { implicit s => run("val c = new C") }
118-
.andThen { implicit s =>
119-
storedOutput()
120-
run(":doc new c.Foo")
121-
assertEquals("/** doc */", storedOutput().trim)
84+
eval(
85+
"""class C { /** doc */ class Foo }
86+
|val c = new C
87+
""".stripMargin).andThen { implicit s =>
88+
assertEquals("/** doc */", doc("new c.Foo"))
12289
}
12390

12491
@Test def docOfTraitInClass =
125-
fromInitialState { implicit s => run("class C { /** doc */ trait Foo }") }
126-
.andThen { implicit s => run("val c = new C") }
127-
.andThen { implicit s =>
128-
storedOutput()
129-
run(":doc new c.Foo")
130-
assertEquals("/** doc */", storedOutput().trim)
92+
eval(
93+
"""class C { /** doc */ trait Foo }
94+
|val c = new C
95+
""".stripMargin).andThen { implicit s =>
96+
assertEquals("/** doc */", doc("new c.Foo"))
13197
}
13298

13399
@Test def docOfOverloadedDef =
134-
fromInitialState { implicit s =>
135-
run("""object O {
136-
|/** doc0 */ def foo(x: Int) = x
137-
|/** doc1 */ def foo(x: String) = x
138-
|}""".stripMargin)
139-
}
140-
.andThen { implicit s =>
141-
storedOutput()
142-
run(":doc O.foo(_: Int)")
143-
assertEquals("/** doc0 */", storedOutput().trim)
144-
s
145-
}
146-
.andThen { implicit s =>
147-
run(":doc O.foo(_: String)")
148-
assertEquals("/** doc1 */", storedOutput().trim)
100+
eval(
101+
"""object O {
102+
| /** doc0 */ def foo(x: Int) = x
103+
| /** doc1 */ def foo(x: String) = x
104+
|}
105+
""".stripMargin).andThen { implicit s =>
106+
assertEquals("/** doc0 */", doc("O.foo(_: Int)"))
107+
assertEquals("/** doc1 */", doc("O.foo(_: String)"))
149108
}
150109

151110
@Test def docOfInherited =
152-
fromInitialState { implicit s => run("class C { /** doc */ def foo = 0 }") }
153-
.andThen { implicit s => run("object O extends C") }
154-
.andThen { implicit s =>
155-
storedOutput()
156-
run(":doc O.foo")
157-
assertEquals("/** doc */", storedOutput().trim)
111+
eval(
112+
"""class C { /** doc */ def foo = 0 }
113+
|object O extends C
114+
""".stripMargin).andThen { implicit s =>
115+
assertEquals("/** doc */", doc("O.foo"))
158116
}
159117

160118
@Test def docOfOverride =
161-
fromInitialState { implicit s =>
162-
run("""abstract class A {
163-
|/** doc0 */ def foo(x: Int): Int = x + 1
164-
|/** doc1 */ def foo(x: String): String = x + "foo"
165-
|}""".stripMargin)
166-
}
167-
.andThen { implicit s =>
168-
run("""object O extends A {
169-
| override def foo(x: Int): Int = x
170-
| /** overridden doc */ override def foo(x: String): String = x
171-
|}""".stripMargin)
172-
}
173-
.andThen { implicit s =>
174-
storedOutput()
175-
run(":doc O.foo(_: Int)")
176-
assertEquals("/** doc0 */", storedOutput().trim)
177-
s
178-
}
179-
.andThen { implicit s =>
180-
run(":doc O.foo(_: String)")
181-
assertEquals("/** overridden doc */", storedOutput().trim)
119+
eval(
120+
"""abstract class A {
121+
| /** doc0 */ def foo(x: Int): Int = x + 1
122+
| /** doc1 */ def foo(x: String): String = x + "foo"
123+
|}
124+
|object O extends A {
125+
| override def foo(x: Int): Int = x
126+
| /** overridden doc */ override def foo(x: String): String = x
127+
|}
128+
""".stripMargin).andThen { implicit s =>
129+
assertEquals("/** doc0 */", doc("O.foo(_: Int)"))
130+
assertEquals("/** overridden doc */", doc("O.foo(_: String)"))
182131
}
183132

184133
@Test def docOfOverrideObject =
185-
fromInitialState { implicit s =>
186-
run("""abstract class A {
187-
| abstract class Companion { /** doc0 */ def bar: Int }
188-
| /** companion */ def foo: Companion
189-
|}""".stripMargin)
190-
.andThen { implicit s =>
191-
run("""object O extends A {
192-
| override object foo extends Companion {
193-
| override def bar: Int = 0
194-
| }
195-
|}""".stripMargin)
196-
}
197-
.andThen { implicit s =>
198-
storedOutput()
199-
run(":doc O.foo")
200-
assertEquals("/** companion */", storedOutput().trim)
201-
s
202-
}
203-
.andThen { implicit s =>
204-
run(":doc O.foo.bar")
205-
assertEquals("/** doc0 */", storedOutput().trim)
206-
}
207-
}
134+
eval(
135+
"""abstract class A {
136+
| abstract class Companion { /** doc0 */ def bar: Int }
137+
| /** companion */ def foo: Companion
138+
|}
139+
|object O extends A {
140+
| override object foo extends Companion {
141+
| override def bar: Int = 0
142+
| }
143+
|}
144+
""".stripMargin).andThen { implicit s =>
145+
assertEquals("/** companion */", doc("O.foo"))
146+
assertEquals("/** doc0 */", doc("O.foo.bar"))
147+
}
148+
149+
private def eval(code: String): State =
150+
fromInitialState { implicit s => run(code) }
151+
152+
private def doc(expr: String)(implicit s: State): String = {
153+
storedOutput()
154+
run(s":doc $expr")
155+
storedOutput().trim
156+
}
208157

209158
}

0 commit comments

Comments
 (0)