tpolecat / tut

doc/tutorial generator for scala
MIT License
581 stars 63 forks source link

0.4.1 breaks sbt's tab completion #87

Closed fthomas closed 8 years ago

fthomas commented 8 years ago

It seems that tut 0.4.1 breaks tab completion in sbt in multi-project builds. This project is a minimal example for reproducing the problem: https://github.com/fthomas/sbt-test

Pressing tab after sbt loads, yields this exception:

$ sbt
Loading /usr/share/sbt/bin/sbt-launch-lib.bash
[info] Loading global plugins from /home/frank/.sbt/0.13/plugins
[info] Loading project definition from /home/frank/data/code/sbt-test/project
[info] Set current project to sbt-test (in build file:/home/frank/data/code/sbt-test/)
> java.lang.RuntimeException: sbt-test/.:.::tutSourceDirectory is undefined.
        at scala.sys.package$.error(package.scala:27)                                                                                                                                                
        at sbt.Extracted$$anonfun$getOrError$2.apply(Extracted.scala:96)                                                                                                                             
        at sbt.Extracted$$anonfun$getOrError$2.apply(Extracted.scala:96)                                                                                                                             
        at scala.Option.getOrElse(Option.scala:120)                                                                                                                                                  
        at sbt.Extracted.getOrError(Extracted.scala:96)                                                                                                                                              
        at sbt.Extracted.get(Extracted.scala:21)                                                                                                                                                     
        at tut.Plugin$$anonfun$tutSettings$10$$anonfun$apply$11.apply(Plugin.scala:70)                                                                                                               
        at tut.Plugin$$anonfun$tutSettings$10$$anonfun$apply$11.apply(Plugin.scala:68)                                                                                                               
        at sbt.InputTask$$anonfun$free$1.apply(InputTask.scala:58)                                                                                                                                   
        at sbt.InputTask$$anonfun$free$1.apply(InputTask.scala:58)                                                                                                                                   
        at sbt.InputTask$$anonfun$mapTask$1.apply(InputTask.scala:12)                                                                                                                                
        at sbt.InputTask$$anonfun$mapTask$1.apply(InputTask.scala:12)                                                                                                                                
        at sbt.Aggregation$$anonfun$6.apply(Aggregation.scala:109)                                                                                                                                   
        at sbt.Aggregation$$anonfun$6.apply(Aggregation.scala:109)                                                                                                                                   
        at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:722)                                                                                               
        at scala.collection.immutable.List.foreach(List.scala:318)                                                                                                                                   
        at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:721)                                                                                                                
        at sbt.Aggregation$.applyDynamicTasks(Aggregation.scala:109)                                                                                                                                 
        at sbt.Aggregation$.evaluatingParser(Aggregation.scala:147)                                                                                                                                  
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1.sbt$Act$$anonfun$$evaluate$1(Act.scala:240)                                                                                                        
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$apply$12.apply(Act.scala:249)                                                                                                             
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$apply$12.apply(Act.scala:249)                                                                                                             
        at sbt.complete.BindParser$$anonfun$completions$3.apply(Parser.scala:661)                                                                                                                    
        at sbt.complete.BindParser$$anonfun$completions$3.apply(Parser.scala:658)                                                                                                                    
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)                                                                                                  
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)                                                                                                  
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)                                                                                                      
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)                                                                                                      
        at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:153)                                                                                                                    
        at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306)
        at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306)
        at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
        at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$map$1.apply(Completions.scala:20)
        at sbt.complete.Completions$$anonfun$map$1.apply(Completions.scala:20)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.immutable.Set$Set3.foreach(Set.scala:115)
        at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
        at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.JLineCompletion$.convertCompletions(JLineCompletion.scala:56)
        at sbt.complete.JLineCompletion$$anonfun$parserAsCompletor$1.apply(JLineCompletion.scala:52)
        at sbt.complete.JLineCompletion$$anonfun$parserAsCompletor$1.apply(JLineCompletion.scala:52)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1$$anonfun$2.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1$$anonfun$2.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$.complete(JLineCompletion.scala:94)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1.apply(JLineCompletion.scala:74)
        at sbt.complete.JLineCompletion$CustomHandler.complete(JLineCompletion.scala:30)
        at jline.console.ConsoleReader.complete(ConsoleReader.java:3082)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2501)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2162)
        at sbt.JLine.sbt$JLine$$readLineDirectRaw(LineReader.scala:42)
        at sbt.JLine$$anonfun$readLineDirect$2.apply(LineReader.scala:34)
        at sbt.JLine$$anonfun$readLineDirect$2.apply(LineReader.scala:34)
        at sbt.Signals0.withHandler(Signal.scala:81)
        at sbt.Signals$.withHandler(Signal.scala:11)
        at sbt.JLine.readLineDirect(LineReader.scala:34)
        at sbt.JLine.readLineWithHistory(LineReader.scala:27)
        at sbt.JLine.sbt$JLine$$unsynchronizedReadLine(LineReader.scala:19)
        at sbt.JLine$$anonfun$readLine$1.apply(LineReader.scala:16)
        at sbt.JLine$$anonfun$readLine$1.apply(LineReader.scala:16)
        at sbt.JLine$$anonfun$withJLine$1.apply(LineReader.scala:114)
        at sbt.JLine$$anonfun$withJLine$1.apply(LineReader.scala:112)
        at sbt.JLine$.withTerminal(LineReader.scala:86)
        at sbt.JLine$.withJLine(LineReader.scala:112)
        at sbt.JLine.readLine(LineReader.scala:16)
        at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:174)
        at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:170)
        at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30)
        at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30)
        at sbt.Command$.process(Command.scala:93)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.State$$anon$1.process(State.scala:184)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.MainLoop$.next(MainLoop.scala:98)
        at sbt.MainLoop$.run(MainLoop.scala:91)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:70)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:65)
        at sbt.Using.apply(Using.scala:24)
        at sbt.MainLoop$.runWithNewLog(MainLoop.scala:65)
        at sbt.MainLoop$.runAndClearLast(MainLoop.scala:48)
        at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:32)
        at sbt.MainLoop$.runLogged(MainLoop.scala:24)
        at sbt.StandardMain$.runManaged(Main.scala:53)
        at sbt.xMain.run(Main.scala:28)
        at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:57)
        at xsbt.boot.Launch$.withContextLoader(Launch.scala:77)
        at xsbt.boot.Launch$.run(Launch.scala:57)
        at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
        at xsbt.boot.Launch$.launch(Launch.scala:65)
        at xsbt.boot.Launch$.apply(Launch.scala:16)
        at xsbt.boot.Boot$.runImpl(Boot.scala:32)
        at xsbt.boot.Boot$.main(Boot.scala:21)
        at xsbt.boot.Boot.main(Boot.scala)

Exception occurred while determining completions.java.lang.RuntimeException: sbt-test/.:.::tutSourceDirectory is undefined.
        at scala.sys.package$.error(package.scala:27)
        at sbt.Extracted$$anonfun$getOrError$2.apply(Extracted.scala:96)
        at sbt.Extracted$$anonfun$getOrError$2.apply(Extracted.scala:96)
        at scala.Option.getOrElse(Option.scala:120)
        at sbt.Extracted.getOrError(Extracted.scala:96)
        at sbt.Extracted.get(Extracted.scala:21)
        at tut.Plugin$$anonfun$tutSettings$10$$anonfun$apply$11.apply(Plugin.scala:70)
        at tut.Plugin$$anonfun$tutSettings$10$$anonfun$apply$11.apply(Plugin.scala:68)
        at sbt.InputTask$$anonfun$free$1.apply(InputTask.scala:58)
        at sbt.InputTask$$anonfun$free$1.apply(InputTask.scala:58)
        at sbt.InputTask$$anonfun$mapTask$1.apply(InputTask.scala:12)
        at sbt.InputTask$$anonfun$mapTask$1.apply(InputTask.scala:12)
        at sbt.Aggregation$$anonfun$6.apply(Aggregation.scala:109)
        at sbt.Aggregation$$anonfun$6.apply(Aggregation.scala:109)
        at scala.collection.TraversableLike$WithFilter$$anonfun$map$2.apply(TraversableLike.scala:722)
        at scala.collection.immutable.List.foreach(List.scala:318)
        at scala.collection.TraversableLike$WithFilter.map(TraversableLike.scala:721)
        at sbt.Aggregation$.applyDynamicTasks(Aggregation.scala:109)
        at sbt.Aggregation$.evaluatingParser(Aggregation.scala:147)
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1.sbt$Act$$anonfun$$evaluate$1(Act.scala:240)
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$apply$12.apply(Act.scala:249)
        at sbt.Act$$anonfun$sbt$Act$$actParser0$1$$anonfun$apply$12.apply(Act.scala:249)
        at sbt.complete.BindParser$$anonfun$completions$3.apply(Parser.scala:661)
        at sbt.complete.BindParser$$anonfun$completions$3.apply(Parser.scala:658)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.immutable.HashSet$HashSet1.foreach(HashSet.scala:153)
        at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306)
        at scala.collection.immutable.HashSet$HashTrieSet.foreach(HashSet.scala:306)
        at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
        at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$map$1.apply(Completions.scala:20)
        at sbt.complete.Completions$$anonfun$map$1.apply(Completions.scala:20)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1$$anonfun$apply$1.apply(Completions.scala:19)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.TraversableLike$$anonfun$flatMap$1.apply(TraversableLike.scala:251)
        at scala.collection.immutable.Set$Set3.foreach(Set.scala:115)
        at scala.collection.TraversableLike$class.flatMap(TraversableLike.scala:251)
        at scala.collection.AbstractTraversable.flatMap(Traversable.scala:105)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anonfun$$plus$plus$1.apply(Completions.scala:14)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anonfun$flatMap$1.apply(Completions.scala:19)
        at sbt.complete.Completions$$anon$1.get$lzycompute(Completions.scala:27)
        at sbt.complete.Completions$$anon$1.get(Completions.scala:27)
        at sbt.complete.JLineCompletion$.convertCompletions(JLineCompletion.scala:56)
        at sbt.complete.JLineCompletion$$anonfun$parserAsCompletor$1.apply(JLineCompletion.scala:52)
        at sbt.complete.JLineCompletion$$anonfun$parserAsCompletor$1.apply(JLineCompletion.scala:52)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1$$anonfun$2.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1$$anonfun$2.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$.complete(JLineCompletion.scala:94)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1.apply(JLineCompletion.scala:75)
        at sbt.complete.JLineCompletion$$anonfun$customCompletor$1.apply(JLineCompletion.scala:74)
        at sbt.complete.JLineCompletion$CustomHandler.complete(JLineCompletion.scala:30)
        at jline.console.ConsoleReader.complete(ConsoleReader.java:3082)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2501)
        at jline.console.ConsoleReader.readLine(ConsoleReader.java:2162)
        at sbt.JLine.sbt$JLine$$readLineDirectRaw(LineReader.scala:42)
        at sbt.JLine$$anonfun$readLineDirect$2.apply(LineReader.scala:34)
        at sbt.JLine$$anonfun$readLineDirect$2.apply(LineReader.scala:34)
        at sbt.Signals0.withHandler(Signal.scala:81)
        at sbt.Signals$.withHandler(Signal.scala:11)
        at sbt.JLine.readLineDirect(LineReader.scala:34)
        at sbt.JLine.readLineWithHistory(LineReader.scala:27)
        at sbt.JLine.sbt$JLine$$unsynchronizedReadLine(LineReader.scala:19)
        at sbt.JLine$$anonfun$readLine$1.apply(LineReader.scala:16)
        at sbt.JLine$$anonfun$readLine$1.apply(LineReader.scala:16)
        at sbt.JLine$$anonfun$withJLine$1.apply(LineReader.scala:114)
        at sbt.JLine$$anonfun$withJLine$1.apply(LineReader.scala:112)
        at sbt.JLine$.withTerminal(LineReader.scala:86)
        at sbt.JLine$.withJLine(LineReader.scala:112)
        at sbt.JLine.readLine(LineReader.scala:16)
        at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:174)
        at sbt.BasicCommands$$anonfun$shell$1.apply(BasicCommands.scala:170)
        at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30)
        at sbt.Command$$anonfun$command$1$$anonfun$apply$1.apply(Command.scala:30)
        at sbt.Command$.process(Command.scala:93)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1$$anonfun$apply$1.apply(MainLoop.scala:98)
        at sbt.State$$anon$1.process(State.scala:184)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.MainLoop$$anonfun$1.apply(MainLoop.scala:98)
        at sbt.ErrorHandling$.wideConvert(ErrorHandling.scala:17)
        at sbt.MainLoop$.next(MainLoop.scala:98)
        at sbt.MainLoop$.run(MainLoop.scala:91)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:70)
        at sbt.MainLoop$$anonfun$runWithNewLog$1.apply(MainLoop.scala:65)
        at sbt.Using.apply(Using.scala:24)
        at sbt.MainLoop$.runWithNewLog(MainLoop.scala:65)
        at sbt.MainLoop$.runAndClearLast(MainLoop.scala:48)
        at sbt.MainLoop$.runLoggedLoop(MainLoop.scala:32)
        at sbt.MainLoop$.runLogged(MainLoop.scala:24)
        at sbt.StandardMain$.runManaged(Main.scala:53)
        at sbt.xMain.run(Main.scala:28)
        at xsbt.boot.Launch$$anonfun$run$1.apply(Launch.scala:57)
        at xsbt.boot.Launch$.withContextLoader(Launch.scala:77)
        at xsbt.boot.Launch$.run(Launch.scala:57)
        at xsbt.boot.Launch$$anonfun$explicit$1.apply(Launch.scala:45)
        at xsbt.boot.Launch$.launch(Launch.scala:65)
        at xsbt.boot.Launch$.apply(Launch.scala:16)
        at xsbt.boot.Boot$.runImpl(Boot.scala:32)
        at xsbt.boot.Boot$.main(Boot.scala:21)
        at xsbt.boot.Boot.main(Boot.scala)

Exception occurred while determining completions.

Downgrading to 0.4.0 fixes the problem.

tpolecat commented 8 years ago
tpolecat 09:35
@fthomas does it work if you scope it to the project that has the documentation; i.e., docs/tut<tab>? or project docs first?

fthomas 09:38
docs/<tab>also throws. everything seems to be fine if I do project docs first