diff --git a/docs/docs/usage/worksheet-mode-implementation-details.md b/docs/docs/usage/worksheet-mode-implementation-details.md index 38664292c4fe..d06939d810ae 100644 --- a/docs/docs/usage/worksheet-mode-implementation-details.md +++ b/docs/docs/usage/worksheet-mode-implementation-details.md @@ -65,12 +65,12 @@ indicate that worksheet execution has produced some output. * The worksheet that produced this output. */ textDocument: VersionedTextDocumentIdentifier; - + /** - * The line number of the expression that produced this output. + * The range of the expression that produced this output. */ - line: int; - + range: Range; + /** * The output that has been produced. */ diff --git a/language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala b/language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala index 76ae83ffc374..34b84aa8df65 100644 --- a/language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala +++ b/language-server/src/dotty/tools/languageserver/DottyLanguageServer.scala @@ -240,17 +240,20 @@ class DottyLanguageServer extends LanguageServer val document = params.getTextDocument val uri = new URI(document.getUri) val driver = driverFor(uri) + implicit def ctx: Context = driver.currentCtx val worksheetMode = isWorksheet(uri) - val (text, positionMapper) = - if (worksheetMode) (wrapWorksheet(document.getText), Some(toUnwrappedPosition _)) - else (document.getText, None) + val text = + if (worksheetMode) + wrapWorksheet(document.getText) + else + document.getText val diags = driver.run(uri, text) client.publishDiagnostics(new PublishDiagnosticsParams( document.getUri, - diags.flatMap(diagnostic(_, positionMapper)(driver.currentCtx)).asJava)) + diags.flatMap(diagnostic).asJava)) } override def didChange(params: DidChangeTextDocumentParams): Unit = { @@ -262,19 +265,22 @@ class DottyLanguageServer extends LanguageServer checkMemory() val driver = driverFor(uri) + implicit def ctx: Context = driver.currentCtx val change = params.getContentChanges.get(0) assert(change.getRange == null, "TextDocumentSyncKind.Incremental support is not implemented") - val (text, positionMapper) = - if (worksheetMode) (wrapWorksheet(change.getText), Some(toUnwrappedPosition _)) - else (change.getText, None) + val text = + if (worksheetMode) + wrapWorksheet(change.getText) + else + change.getText val diags = driver.run(uri, text) client.publishDiagnostics(new PublishDiagnosticsParams( document.getUri, - diags.flatMap(diagnostic(_, positionMapper)(driver.currentCtx)).asJava)) + diags.flatMap(diagnostic).asJava)) } } @@ -299,7 +305,7 @@ class DottyLanguageServer extends LanguageServer override def completion(params: CompletionParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val pos = sourcePosition(driver, uri, params.getPosition) val items = driver.compilationUnits.get(uri) match { @@ -318,13 +324,13 @@ class DottyLanguageServer extends LanguageServer override def definition(params: TextDocumentPositionParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val pos = sourcePosition(driver, uri, params.getPosition) val path = Interactive.pathTo(driver.openedTrees(uri), pos) val definitions = Interactive.findDefinitions(path, pos, driver).toList - definitions.flatMap(d => location(d.namePos, positionMapperFor(d.source))).asJava + definitions.flatMap(d => location(d.namePos)).asJava } override def references(params: ReferenceParams) = computeAsync { cancelToken => @@ -341,7 +347,7 @@ class DottyLanguageServer extends LanguageServer val pos = sourcePosition(driver, uri, params.getPosition) val (definitions, originalSymbols) = { - implicit val ctx: Context = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val path = Interactive.pathTo(driver.openedTrees(uri), pos) val definitions = Interactive.findDefinitions(path, pos, driver) val originalSymbols = Interactive.enclosingSourceSymbols(path, pos) @@ -359,7 +365,7 @@ class DottyLanguageServer extends LanguageServer val name = definition.name(ctx).sourceModuleName.toString val trees = remoteDriver.sourceTreesContaining(name)(ctx) val matches = Interactive.findTreesMatching(trees, includes, definition)(ctx) - matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source))) + matches.map(tree => location(tree.namePos(ctx))) } } }.toList @@ -370,7 +376,7 @@ class DottyLanguageServer extends LanguageServer override def rename(params: RenameParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val uriTrees = driver.openedTrees(uri) val pos = sourcePosition(driver, uri, params.getPosition) @@ -429,7 +435,7 @@ class DottyLanguageServer extends LanguageServer .flatMap((uriOpt, ref) => uriOpt.map(uri => (uri.toString, ref))) .mapValues(refs => refs.flatMap(ref => - range(ref.namePos, positionMapperFor(ref.source)).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava) + range(ref.namePos).map(nameRange => new TextEdit(nameRange, newName))).distinct.asJava) new WorkspaceEdit(changes.asJava) } @@ -437,7 +443,7 @@ class DottyLanguageServer extends LanguageServer override def documentHighlight(params: TextDocumentPositionParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val pos = sourcePosition(driver, uri, params.getPosition) val uriTrees = driver.openedTrees(uri) @@ -449,7 +455,7 @@ class DottyLanguageServer extends LanguageServer val refs = Interactive.findTreesMatching(uriTrees, includes, sym) (for { ref <- refs - nameRange <- range(ref.namePos, positionMapperFor(ref.source)) + nameRange <- range(ref.namePos) } yield new DocumentHighlight(nameRange, DocumentHighlightKind.Read)) }.distinct.asJava } @@ -457,7 +463,7 @@ class DottyLanguageServer extends LanguageServer override def hover(params: TextDocumentPositionParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val pos = sourcePosition(driver, uri, params.getPosition) val trees = driver.openedTrees(uri) @@ -481,14 +487,14 @@ class DottyLanguageServer extends LanguageServer override def documentSymbol(params: DocumentSymbolParams) = computeAsync { cancelToken => val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val uriTrees = driver.openedTrees(uri) val defs = Interactive.namedTrees(uriTrees, Include.empty) (for { d <- defs if !isWorksheetWrapper(d) - info <- symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source)) + info <- symbolInfo(d.tree.symbol, d.namePos) } yield JEither.forLeft(info)).asJava } @@ -496,11 +502,11 @@ class DottyLanguageServer extends LanguageServer val query = params.getQuery drivers.values.toList.flatMap { driver => - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val trees = driver.sourceTreesContaining(query) val defs = Interactive.namedTrees(trees, Include.empty, _.name.toString.contains(query)) - defs.flatMap(d => symbolInfo(d.tree.symbol, d.namePos, positionMapperFor(d.source))) + defs.flatMap(d => symbolInfo(d.tree.symbol, d.namePos)) }.asJava } @@ -511,7 +517,7 @@ class DottyLanguageServer extends LanguageServer val pos = sourcePosition(driver, uri, params.getPosition) val (definitions, originalSymbols) = { - implicit val ctx: Context = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val path = Interactive.pathTo(driver.openedTrees(uri), pos) val originalSymbols = Interactive.enclosingSourceSymbols(path, pos) val definitions = Interactive.findDefinitions(path, pos, driver) @@ -528,7 +534,7 @@ class DottyLanguageServer extends LanguageServer tree => predicates.exists(_(tree)) } val matches = Interactive.namedTrees(trees, Include.local, predicate)(ctx) - matches.map(tree => location(tree.namePos(ctx), positionMapperFor(tree.source))) + matches.map(tree => location(tree.namePos(ctx))) } }.toList @@ -539,7 +545,7 @@ class DottyLanguageServer extends LanguageServer val uri = new URI(params.getTextDocument.getUri) val driver = driverFor(uri) - implicit val ctx = driver.currentCtx + implicit def ctx: Context = driver.currentCtx val pos = sourcePosition(driver, uri, params.getPosition) val trees = driver.openedTrees(uri) @@ -653,9 +659,9 @@ object DottyLanguageServer { } /** Convert a SourcePosition to an lsp4j.Range */ - def range(p: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition] = None): Option[lsp4j.Range] = + def range(p: SourcePosition): Option[lsp4j.Range] = if (p.exists) { - val mappedPosition = positionMapper.map(_(p)).getOrElse(p) + val mappedPosition = positionMapperFor(p.source).map(_(p)).getOrElse(p) Some(new lsp4j.Range( new lsp4j.Position(mappedPosition.startLine, mappedPosition.startColumn), new lsp4j.Position(mappedPosition.endLine, mappedPosition.endColumn) @@ -664,19 +670,16 @@ object DottyLanguageServer { None /** Convert a SourcePosition to an lsp4.Location */ - def location(p: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition] = None): Option[lsp4j.Location] = + def location(p: SourcePosition): Option[lsp4j.Location] = for { uri <- toUriOption(p.source) - r <- range(p, positionMapper) + r <- range(p) } yield new lsp4j.Location(uri.toString, r) /** - * Convert a MessageContainer to an lsp4j.Diagnostic. The positions are transformed vy - * `positionMapper`. + * Convert a MessageContainer to an lsp4j.Diagnostic. */ - def diagnostic(mc: MessageContainer, - positionMapper: Option[SourcePosition => SourcePosition] = None - )(implicit ctx: Context): Option[lsp4j.Diagnostic] = + def diagnostic(mc: MessageContainer)(implicit ctx: Context): Option[lsp4j.Diagnostic] = if (!mc.pos.exists) None // diagnostics without positions are not supported: https://github.com/Microsoft/language-server-protocol/issues/249 else { @@ -697,7 +700,7 @@ object DottyLanguageServer { val message = mc.contained() if (displayMessage(message, mc.pos.source)) { val code = message.errorId.errorNumber.toString - range(mc.pos, positionMapper).map(r => + range(mc.pos).map(r => new lsp4j.Diagnostic( r, mc.message, severity(mc.level), /*source =*/ "", code)) } else { @@ -866,7 +869,7 @@ object DottyLanguageServer { } /** Create an lsp4j.SymbolInfo from a Symbol and a SourcePosition */ - def symbolInfo(sym: Symbol, pos: SourcePosition, positionMapper: Option[SourcePosition => SourcePosition])(implicit ctx: Context): Option[lsp4j.SymbolInformation] = { + def symbolInfo(sym: Symbol, pos: SourcePosition)(implicit ctx: Context): Option[lsp4j.SymbolInformation] = { def symbolKind(sym: Symbol)(implicit ctx: Context): lsp4j.SymbolKind = { import lsp4j.{SymbolKind => SK} @@ -893,7 +896,7 @@ object DottyLanguageServer { else null - location(pos, positionMapper).map(l => new lsp4j.SymbolInformation(name, symbolKind(sym), l, containerName)) + location(pos).map(l => new lsp4j.SymbolInformation(name, symbolKind(sym), l, containerName)) } /** Convert `signature` to a `SignatureInformation` */ diff --git a/language-server/src/dotty/tools/languageserver/worksheet/Worksheet.scala b/language-server/src/dotty/tools/languageserver/worksheet/Worksheet.scala index f51149ae0dea..28eaf61f02c7 100644 --- a/language-server/src/dotty/tools/languageserver/worksheet/Worksheet.scala +++ b/language-server/src/dotty/tools/languageserver/worksheet/Worksheet.scala @@ -4,7 +4,7 @@ import dotty.tools.dotc.ast.tpd.{DefTree, Template, Tree, TypeDef} import dotty.tools.dotc.core.Contexts.Context import dotty.tools.dotc.interactive.SourceTree import dotty.tools.dotc.util.Spans.Span -import dotty.tools.dotc.util.SourceFile +import dotty.tools.dotc.util.{ SourceFile, SourcePosition, NoSourcePosition } import dotty.tools.dotc.core.Flags.Synthetic @@ -22,7 +22,7 @@ object Worksheet { */ def run(tree: SourceTree, treeLock: Object, - sendMessage: (Int, String) => Unit, + sendMessage: (SourcePosition, String) => Unit, cancelChecker: CancelChecker)( implicit ctx: Context): Unit = { // For now, don't try to run multiple evaluators in parallel, this would require @@ -30,7 +30,7 @@ object Worksheet { Evaluator.synchronized { Evaluator.get(cancelChecker) match { case None => - sendMessage(1, "Couldn't start the JVM.") + sendMessage(NoSourcePosition, "Couldn't start the JVM.") case Some(evaluator) => val queries = treeLock.synchronized { tree.tree match { @@ -59,16 +59,15 @@ object Worksheet { } /** - * Extract the line number and source code corresponding to this tree + * Extract the position and source code corresponding to this tree * * @param evaluator The JVM that runs the REPL. * @param tree The compiled tree to evaluate. * @param sourcefile The sourcefile of the worksheet. */ - private def query(tree: Tree, sourcefile: SourceFile): (Int, String) = { - val line = sourcefile.offsetToLine(tree.span.end) + private def query(tree: Tree, sourcefile: SourceFile)(implicit ctx: Context): (SourcePosition, String) = { val source = sourcefile.content.slice(tree.span.start, tree.span.end).mkString - (line, source) + (tree.sourcePos, source) } private def bounds(span: Span): (Int, Int) = (span.start, span.end) diff --git a/language-server/src/dotty/tools/languageserver/worksheet/WorksheetMessages.scala b/language-server/src/dotty/tools/languageserver/worksheet/WorksheetMessages.scala index a67b1add38a7..42870cf0971e 100644 --- a/language-server/src/dotty/tools/languageserver/worksheet/WorksheetMessages.scala +++ b/language-server/src/dotty/tools/languageserver/worksheet/WorksheetMessages.scala @@ -1,6 +1,6 @@ package dotty.tools.languageserver.worksheet -import org.eclipse.lsp4j.VersionedTextDocumentIdentifier +import org.eclipse.lsp4j.{ Range, VersionedTextDocumentIdentifier } // All case classes in this file should have zero-parameters secondary // constructors to allow Gson to reflectively create instances on @@ -17,6 +17,6 @@ case class WorksheetRunResult(success: Boolean) { } /** The parameters to the `worksheet/publishOutput` notification. */ -case class WorksheetRunOutput(textDocument: VersionedTextDocumentIdentifier, line: Int, content: String) { - def this() = this(null, 0, null) +case class WorksheetRunOutput(textDocument: VersionedTextDocumentIdentifier, range: Range, content: String) { + def this() = this(null, null, null) } diff --git a/language-server/src/dotty/tools/languageserver/worksheet/WorksheetService.scala b/language-server/src/dotty/tools/languageserver/worksheet/WorksheetService.scala index a5a273003e7f..601bf7e71557 100644 --- a/language-server/src/dotty/tools/languageserver/worksheet/WorksheetService.scala +++ b/language-server/src/dotty/tools/languageserver/worksheet/WorksheetService.scala @@ -1,8 +1,10 @@ package dotty.tools.languageserver.worksheet import dotty.tools.dotc.core.Contexts.Context +import dotty.tools.dotc.util.SourcePosition import dotty.tools.dotc.interactive.InteractiveDriver import dotty.tools.languageserver.DottyLanguageServer +import dotty.tools.languageserver.DottyLanguageServer.range import org.eclipse.lsp4j.jsonrpc._//{CancelChecker, CompletableFutures} import org.eclipse.lsp4j.jsonrpc.services._//{JsonSegment, JsonRequest} @@ -19,8 +21,8 @@ trait WorksheetService { thisServer: DottyLanguageServer => val uri = new URI(params.textDocument.getUri) try { val driver = driverFor(uri) - val sendMessage = - (line: Int, msg: String) => client.publishOutput(WorksheetRunOutput(params.textDocument, line, msg)) + val sendMessage = (pos: SourcePosition, msg: String) => + client.publishOutput(WorksheetRunOutput(params.textDocument, range(pos).get, msg)) runWorksheet(driver, uri, sendMessage, cancelChecker)(driver.currentCtx) cancelChecker.checkCanceled() @@ -41,7 +43,7 @@ trait WorksheetService { thisServer: DottyLanguageServer => */ private def runWorksheet(driver: InteractiveDriver, uri: URI, - sendMessage: (Int, String) => Unit, + sendMessage: (SourcePosition, String) => Unit, cancelChecker: CancelChecker)( implicit ctx: Context): Unit = { val treeOpt = thisServer.synchronized { diff --git a/language-server/test/dotty/tools/languageserver/WorksheetTest.scala b/language-server/test/dotty/tools/languageserver/WorksheetTest.scala index 7b5f89651a8f..ac9438238e55 100644 --- a/language-server/test/dotty/tools/languageserver/WorksheetTest.scala +++ b/language-server/test/dotty/tools/languageserver/WorksheetTest.scala @@ -13,86 +13,98 @@ import java.lang.System.{lineSeparator => nl} class WorksheetTest { @Test def runExpression: Unit = { - ws"${m1}2 + 2".withSource - .run(m1, "1:val res0: Int = 4") + ws"${m1}2 + 2${m2}".withSource + .run(m1, + ((m1 to m2), "val res0: Int = 4")) } @Test def runSimpleVal: Unit = { - ws"${m1}val foo = 123".withSource - .run(m1, "1:val foo: Int = 123") + ws"${m1}val foo = 123${m2}".withSource + .run(m1, + ((m1 to m2), "val foo: Int = 123")) } @Test def usePreviousDefinition: Unit = { - ws"""${m1}val foo = 123 - val bar = foo + 1""".withSource - .run(m1, "1:val foo: Int = 123", - "2:val bar: Int = 124") + ws"""${m1}val foo = 123${m2} + ${m3}val bar = foo + 1${m4}""".withSource + .run(m1, + ((m1 to m2), "val foo: Int = 123"), + ((m3 to m4), "val bar: Int = 124")) } @Test def defineObject: Unit = { - ws"""${m1}def foo(x: Int) = x + 1 - foo(1)""".withSource - .run(m1, "1:def foo(x: Int): Int", - "2:val res0: Int = 2") + ws"""${m1}def foo(x: Int) = x + 1${m2} + ${m3}foo(1)${m4}""".withSource + .run(m1, + ((m1 to m2), "def foo(x: Int): Int"), + ((m3 to m4), "val res0: Int = 2")) } @Test def defineCaseClass: Unit = { - ws"""${m1} case class Foo(x: Int) - Foo(1)""".withSource - .run(m1, "1:// defined case class Foo", - "2:val res0: Foo = Foo(1)") + ws"""${m1}case class Foo(x: Int)${m2} + ${m3}Foo(1)${m4}""".withSource + .run(m1, + ((m1 to m2), "// defined case class Foo"), + ((m3 to m4), "val res0: Foo = Foo(1)")) } @Test def defineClass: Unit = { ws"""${m1}class Foo(x: Int) { override def toString: String = "Foo" - } - new Foo(1)""".withSource - .run(m1, "3:// defined class Foo", - "4:val res0: Foo = Foo") + }${m2} + ${m3}new Foo(1)${m4}""".withSource + .run(m1, + ((m1 to m2), "// defined class Foo"), + ((m3 to m4), "val res0: Foo = Foo")) } @Test def defineAnonymousClass0: Unit = { ws"""${m1}new { override def toString: String = "Foo" - }""".withSource - .run(m1, "3:val res0: Object = Foo") + }${m2}""".withSource + .run(m1, + ((m1 to m2), "val res0: Object = Foo")) } @Test def defineAnonymousClass1: Unit = { - ws"""${m1}class Foo - trait Bar - new Foo with Bar { + ws"""${m1}class Foo${m2} + ${m3}trait Bar${m4} + ${m5}new Foo with Bar { override def toString: String = "Foo" - }""".withSource - .run(m1, "1:// defined class Foo", - "2:// defined trait Bar", - "5:val res0: Foo & Bar = Foo") + }${m6}""".withSource + .run(m1, + ((m1 to m2), "// defined class Foo"), + ((m3 to m4), "// defined trait Bar"), + ((m5 to m6), "val res0: Foo & Bar = Foo")) } @Test def produceMultilineOutput: Unit = { - ws"""${m1}1 to 3 foreach println""".withSource - .run(m1, s"1:1${nl}2${nl}3") + ws"""${m1}1 to 3 foreach println${m2}""".withSource + .run(m1, + ((m1 to m2), s"1${nl}2${nl}3")) } @Test def patternMatching0: Unit = { ws"""${m1}1 + 2 match { case x if x % 2 == 0 => "even" case _ => "odd" - }""".withSource - .run(m1, "4:val res0: String = odd") + }${m2}""".withSource + .run(m1, + ((m1 to m2), "val res0: String = odd")) } @Test def patternMatching1: Unit = { - ws"""${m1}val (foo, bar) = (1, 2)""".withSource - .run(m1, s"1:val bar: Int = 2${nl}val foo: Int = 1") + ws"""${m1}val (foo, bar) = (1, 2)${m2}""".withSource + .run(m1, + ((m1 to m2), s"val bar: Int = 2${nl}val foo: Int = 1")) } @Test def evaluationException: Unit = { - ws"""${m1}val foo = 1 / 0 - val bar = 2""".withSource - .runNonStrict(m1, "1:java.lang.ArithmeticException: / by zero", - "2:val bar: Int = 2") + ws"""${m1}val foo = 1 / 0${m2} + ${m3}val bar = 2${m4}""".withSource + .runNonStrict(m1, + ((m1 to m2), "java.lang.ArithmeticException: / by zero"), + ((m3 to m4), "val bar: Int = 2")) } @Test def worksheetCompletion(): Unit = { @@ -204,15 +216,17 @@ class WorksheetTest { } @Test def systemExit(): Unit = { - ws"""${m1}println("Hello, world!") + ws"""${m1}println("Hello, world!")${m2} System.exit(0) println("Goodbye!")""".withSource - .run(m1, "1:Hello, world!") + .run(m1, + ((m1 to m2), "Hello, world!")) } @Test def outputOnStdErr(): Unit = { - ws"""${m1}System.err.println("Oh no")""".withSource - .run(m1, "1:Oh no") + ws"""${m1}System.err.println("Oh no")${m2}""".withSource + .run(m1, + ((m1 to m2), "Oh no")) } } diff --git a/language-server/test/dotty/tools/languageserver/util/CodeTester.scala b/language-server/test/dotty/tools/languageserver/util/CodeTester.scala index 44f553832e89..d20e39a4ff49 100644 --- a/language-server/test/dotty/tools/languageserver/util/CodeTester.scala +++ b/language-server/test/dotty/tools/languageserver/util/CodeTester.scala @@ -182,7 +182,7 @@ class CodeTester(projects: List[Project]) { * * @see dotty.tools.languageserver.util.actions.WorksheetRun */ - def run(marker: CodeMarker, expected: String*): this.type = + def run(marker: CodeMarker, expected: (CodeRange, String)*): this.type = doAction(new WorksheetRun(marker, expected, strict = true)) /** @@ -194,7 +194,7 @@ class CodeTester(projects: List[Project]) { * * @see dotty.tools.languageserver.util.actions.WorksheetRun */ - def runNonStrict(marker: CodeMarker, expected: String*): this.type = + def runNonStrict(marker: CodeMarker, expected: (CodeRange, String)*): this.type = doAction(new WorksheetRun(marker, expected, strict = false)) /** diff --git a/language-server/test/dotty/tools/languageserver/util/actions/WorksheetRun.scala b/language-server/test/dotty/tools/languageserver/util/actions/WorksheetRun.scala index 036e184618dc..a227da435ca9 100644 --- a/language-server/test/dotty/tools/languageserver/util/actions/WorksheetRun.scala +++ b/language-server/test/dotty/tools/languageserver/util/actions/WorksheetRun.scala @@ -1,26 +1,27 @@ package dotty.tools.languageserver.util.actions -import dotty.tools.languageserver.util.PositionContext +import dotty.tools.languageserver.util.{ CodeRange, PositionContext } import dotty.tools.languageserver.util.embedded.CodeMarker import java.util.concurrent.TimeUnit import org.junit.Assert.{assertEquals, assertTrue, fail} -class WorksheetRun(marker: CodeMarker, expected: Seq[String], strict: Boolean) extends WorksheetAction { +class WorksheetRun(marker: CodeMarker, expected: Seq[(CodeRange, String)], strict: Boolean) extends WorksheetAction { override def execute(): Exec[Unit] = { val result = triggerRun(marker).get(30, TimeUnit.SECONDS) assertTrue(result.success) - val logs = worksheetOutput(marker).map(out => s"${out.line}:${out.content}") + val logs = worksheetOutput(marker).map(out => (out.range, out.content)) - if (strict) { - assertEquals(expected, logs) - } else { - expected.zip(logs).foreach { - case (expected, message) => assertTrue(s"'$message' didn't start with '$expected'", message.startsWith(expected)) - } + expected.zip(logs).foreach { + case ((expectedCodeRange, expectedOutput), (actualRange, actualOutput)) => + assertEquals(expectedCodeRange.toRange, actualRange) + if (strict) + assertEquals(expectedOutput, actualOutput) + else + assertTrue(s"'$actualOutput' didn't start with '$expectedOutput'", actualOutput.startsWith(expectedOutput)) } client.worksheetOutput.clear() } diff --git a/project/Build.scala b/project/Build.scala index 64cd553b7eac..768c0f4a5af0 100644 --- a/project/Build.scala +++ b/project/Build.scala @@ -752,9 +752,11 @@ object Build { fork in run := true, fork in Test := true, libraryDependencies ++= Seq( - "org.eclipse.lsp4j" % "org.eclipse.lsp4j" % "0.5.0", + "org.eclipse.lsp4j" % "org.eclipse.lsp4j" % "0.6.0", Dependencies.`jackson-databind` ), + // Work around https://github.com/eclipse/lsp4j/issues/295 + dependencyOverrides += "org.eclipse.xtend" % "org.eclipse.xtend.lib" % "2.16.0", javaOptions := (javaOptions in `dotty-compiler-bootstrapped`).value, run := Def.inputTaskDyn { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index e9cd6bc31f6e..de8ab2f96e32 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -4,7 +4,7 @@ import sbt._ * to ensure the same version of the dependency is used in all projects */ object Dependencies { - private val jacksonVersion = "2.9.0" + private val jacksonVersion = "2.9.8" val `jackson-databind` = "com.fasterxml.jackson.core" % "jackson-databind" % jacksonVersion val `jackson-dataformat-yaml` = diff --git a/vscode-dotty/package-lock.json b/vscode-dotty/package-lock.json index 65f388b9ef52..e776f7924533 100644 --- a/vscode-dotty/package-lock.json +++ b/vscode-dotty/package-lock.json @@ -27,7 +27,7 @@ }, "@types/events": { "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "resolved": "http://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, @@ -64,9 +64,9 @@ "dev": true }, "@types/node": { - "version": "8.10.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.38.tgz", - "integrity": "sha512-EibsnbJerd0hBFaDjJStFrVbVBAtOy4dgL8zZFw0uOvPqzBAX59Ci8cgjg3+RgJIWhsB5A4c+pi+D4P9tQQh/A==", + "version": "10.12.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.24.tgz", + "integrity": "sha512-GWWbvt+z9G5otRBW8rssOFgRY87J9N/qbhqfjMZ+gUuL6zoL+Hm6gP/8qQBG4jjimqdaNLCehcVapZ/Fs2WjCQ==", "dev": true }, "@types/request": { @@ -223,12 +223,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -296,7 +290,7 @@ }, "bl": { "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", + "resolved": "http://registry.npmjs.org/bl/-/bl-1.2.2.tgz", "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", "requires": { "readable-stream": "^2.3.5", @@ -321,17 +315,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", @@ -551,9 +534,9 @@ "dev": true }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -600,24 +583,6 @@ "through": "~2.3.1" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -632,23 +597,6 @@ "kind-of": "^1.1.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -673,54 +621,14 @@ "pend": "~1.2.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "for-in": "^1.0.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "forever-agent": { @@ -803,42 +711,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -850,68 +722,21 @@ } }, "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", "dev": true, "requires": { "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } } }, "graceful-fs": { @@ -1034,56 +859,6 @@ } } }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.1.tgz", - "integrity": "sha512-UHd3MokfIN7SrFdsbV5uZTwzBpL0ZSTu7iq98fuDqBGZ0dlHxgbQBJwfd6qjCW83snkQ3Hz9IY4sMRMz2iTq7w==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, "gulp-untar": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", @@ -1149,58 +924,6 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "queue": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.0.tgz", - "integrity": "sha512-DwxpAnqJuoQa+wyDgQuwkSshkhlqIlWEvwvdAY27fDPunZ2cVJzXU4JyjY+5l7zs7oGLaYAQm4MbLOVFAHFBzA==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -1214,31 +937,6 @@ "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } } } }, @@ -1313,9 +1011,9 @@ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, "is-absolute": { @@ -1334,27 +1032,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -1376,44 +1053,12 @@ "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", "dev": true }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, "is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -1423,12 +1068,6 @@ "is-unc-path": "^1.0.0" } }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -1450,9 +1089,9 @@ "dev": true }, "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", "dev": true }, "is-windows": { @@ -1466,15 +1105,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1495,26 +1125,17 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1574,12 +1195,6 @@ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, "lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", @@ -1601,86 +1216,6 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } - } - }, "mime-db": { "version": "1.37.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", @@ -1798,12 +1333,6 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, "object-keys": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", @@ -1822,16 +1351,6 @@ "object-keys": "^1.0.11" } }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1841,44 +1360,14 @@ } }, "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "is-stream": "^1.0.1", "readable-stream": "^2.0.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -1923,12 +1412,6 @@ "extend-shallow": "^1.1.2" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -1992,39 +1475,14 @@ "dev": true }, "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", "dev": true, "requires": { "inherits": "~2.0.0" } }, - "randomatic": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.1.tgz", - "integrity": "sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -2039,15 +1497,6 @@ "util-deprecate": "~1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "^0.1.3" - } - }, "remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", @@ -2074,18 +1523,6 @@ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -2135,12 +1572,12 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { @@ -2165,9 +1602,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -2243,25 +1680,6 @@ "safe-buffer": "~5.1.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -2313,9 +1731,9 @@ } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", @@ -2323,23 +1741,13 @@ } }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", "dev": true, "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, "to-buffer": { @@ -2379,9 +1787,9 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", + "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", "dev": true }, "unc-path-regex": { @@ -2391,13 +1799,13 @@ "dev": true }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" } }, "url-parse": { @@ -2420,12 +1828,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", - "dev": true - }, "value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", @@ -2453,51 +1855,54 @@ } }, "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", + "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, "dependencies": { "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -2565,9 +1970,9 @@ } }, "vscode": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.22.tgz", - "integrity": "sha512-G/zu7PRAN1yF80wg+l6ebIexDflU3uXXeabacJuLearTIfObKw4JaI8aeHwDEmpnCkc3MkIr3Bclkju2gtEz6A==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", + "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", "dev": true, "requires": { "glob": "^7.1.2", @@ -2575,14 +1980,14 @@ "gulp-filter": "^5.0.1", "gulp-gunzip": "1.0.0", "gulp-remote-src-vscode": "^0.5.1", - "gulp-symdest": "^1.1.1", "gulp-untar": "^0.0.7", "gulp-vinyl-zip": "^2.1.2", "mocha": "^4.0.1", - "request": "^2.83.0", + "request": "^2.88.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", "url-parse": "^1.4.3", + "vinyl-fs": "^3.0.3", "vinyl-source-stream": "^1.1.0" } }, @@ -2592,36 +1997,36 @@ "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageclient": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.1.1.tgz", - "integrity": "sha512-jMxshi+BPRQFNG8GB00dJv7ldqMda0be26laYYll/udtJuHbog6RqK10GSxHWDN0PgY0b0m5fePyTk3bq8a0TA==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz", + "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==", "requires": { "semver": "^5.5.0", - "vscode-languageserver-protocol": "3.13.0" + "vscode-languageserver-protocol": "3.14.1" } }, "vscode-languageserver": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.1.0.tgz", - "integrity": "sha512-CIsrgx2Y5VHS317g/HwkSTWYBIQmy0DwEyZPmB2pEpVOhYFwVsYpbiJwHIIyLQsQtmRaO4eA2xM8KPjNSdXpBw==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", + "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", "requires": { - "vscode-languageserver-protocol": "3.13.0", + "vscode-languageserver-protocol": "3.14.1", "vscode-uri": "^1.0.6" } }, "vscode-languageserver-protocol": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.13.0.tgz", - "integrity": "sha512-2ZGKwI+P2ovQll2PGAp+2UfJH+FK9eait86VBUdkPd9HRlm8e58aYT9pV/NYanHOcp3pL6x2yTLVCFMcTer0mg==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", + "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", "requires": { "vscode-jsonrpc": "^4.0.0", - "vscode-languageserver-types": "3.13.0" + "vscode-languageserver-types": "3.14.0" } }, "vscode-languageserver-types": { - "version": "3.13.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", - "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", + "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" }, "vscode-uri": { "version": "1.0.6", @@ -2634,9 +2039,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.2.tgz", - "integrity": "sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", "requires": { "async-limiter": "~1.0.0" } @@ -2657,9 +2062,9 @@ } }, "yazl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.0.tgz", - "integrity": "sha512-rgptqKwX/f1/7bIRF1FHb4HGsP5k11QyxBpDl1etUDfNpTa7CNjDOYNPFnIaEzZ9dRq0c47IEJS+sy+T39JCLw==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, "requires": { "buffer-crc32": "~0.2.3" diff --git a/vscode-dotty/package.json b/vscode-dotty/package.json index d1d864cb5fb4..42e60c2a11d6 100644 --- a/vscode-dotty/package.json +++ b/vscode-dotty/package.json @@ -11,7 +11,7 @@ }, "icon": "images/dotty-logo.png", "engines": { - "vscode": "^1.27.1" + "vscode": "^1.30.0" }, "categories": [ "Programming Languages" @@ -121,18 +121,18 @@ "promisify-child-process": "^2.1.2", "request": "^2.88.0", "vscode-jsonrpc": "4.0.0", - "vscode-languageclient": "^5.1.0", - "vscode-languageserver": "^5.1.0", - "ws": "^6.1.2" + "vscode-languageclient": "^5.2.1", + "vscode-languageserver": "^5.2.1", + "ws": "^6.1.3" }, "devDependencies": { "@types/archiver": "^2.1.2", "@types/compare-versions": "^3.0.0", "@types/mocha": "^5.2.5", - "@types/node": "^8.10.38", + "@types/node": "^10.12.24", "@types/request": "^2.48.1", - "@types/ws": "^6.0.0", - "typescript": "^2.9.2", - "vscode": "^1.1.22" + "@types/ws": "^6.0.1", + "typescript": "^3.2.4", + "vscode": "^1.1.29" } } diff --git a/vscode-dotty/src/protocol.ts b/vscode-dotty/src/protocol.ts index 976849203ff5..b8c77e6f13cb 100644 --- a/vscode-dotty/src/protocol.ts +++ b/vscode-dotty/src/protocol.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode' import { RequestType, NotificationType } from 'vscode-jsonrpc' -import { VersionedTextDocumentIdentifier, TextDocumentIdentifier } from 'vscode-languageserver-protocol' +import { Range, VersionedTextDocumentIdentifier, TextDocumentIdentifier } from 'vscode-languageserver-protocol' import { client } from './extension' @@ -17,7 +17,13 @@ export interface WorksheetRunResult { /** The parameters for the `worksheet/publishOutput` notification. */ export interface WorksheetPublishOutputParams { textDocument: VersionedTextDocumentIdentifier - line: number + // TODO: remove this property and make `range` non-optional once we + // stop supporting Dotty < 0.13.0-RC1 + /** + * @deprecated Use range instead. + */ + line?: number + range?: Range content: string } @@ -33,18 +39,9 @@ export interface TastyDecompileResult { error: number } -// TODO: Can be removed once https://github.com/Microsoft/vscode-languageserver-node/pull/421 -// is merged. -export function asVersionedTextDocumentIdentifier(textDocument: vscode.TextDocument): VersionedTextDocumentIdentifier { - return { - uri: client.code2ProtocolConverter.asUri(textDocument.uri), - version: textDocument.version - } -} - export function asWorksheetRunParams(textDocument: vscode.TextDocument): WorksheetRunParams { return { - textDocument: asVersionedTextDocumentIdentifier(textDocument) + textDocument: client.code2ProtocolConverter.asVersionedTextDocumentIdentifier(textDocument) } } diff --git a/vscode-dotty/src/worksheet.ts b/vscode-dotty/src/worksheet.ts index b63a5f04f951..51815ea46839 100644 --- a/vscode-dotty/src/worksheet.ts +++ b/vscode-dotty/src/worksheet.ts @@ -99,7 +99,12 @@ class Worksheet implements Disposable { /** Display the output in the worksheet's editor. */ handleMessage(output: WorksheetPublishOutputParams, editor: vscode.TextEditor) { - this.displayAndSaveResult(output.line - 1, output.content, editor) + let range = output.range ? + this.client.protocol2CodeConverter.asRange(output.range) : + (output.line ? + new Range(output.line - 1, 0, output.line - 1, 0) : + new Range(0, 0, 0, 0)) + this.displayAndSaveResult(range, output.content, editor) } /** @@ -140,22 +145,22 @@ class Worksheet implements Disposable { * Parse and display the result of running part of this worksheet. The result is saved so that it * can be restored if this buffer is closed. * - * @param lineNumber The number of the line in the source that produced the result. + * @param range The range in the source that produced the result. * @param runResult The result itself. * @param editor The editor where to display the result. */ - private displayAndSaveResult(lineNumber: number, runResult: string, editor: vscode.TextEditor): void { + private displayAndSaveResult(range: Range, runResult: string, editor: vscode.TextEditor): void { const resultLines = runResult.split(/\r\n|\r|\n/g) if (resultLines.length == 0) return - const line = editor.document.lineAt(lineNumber) + const lastLine = editor.document.lineAt(range.end.line) const decorationOptions = { - range: line.range, + range: range, hoverMessage: new vscode.MarkdownString().appendCodeblock(runResult) } - const decorationMargin = this.margin - line.text.length + const decorationMargin = this.margin - lastLine.text.length const decorationText = resultLines[0] + (resultLines.length > 1 ? `<${resultLines.length - 1} lines hidden, hover to see full output>` : "") const decorationType = this.createDecoration(decorationMargin, decorationText) const decoration = new Decoration(decorationType, decorationOptions)