Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unresolved type symbol when pickling quotes #7008

Closed
anatoliykmetyuk opened this issue Aug 7, 2019 · 2 comments · Fixed by #7012
Closed

Unresolved type symbol when pickling quotes #7008

anatoliykmetyuk opened this issue Aug 7, 2019 · 2 comments · Fixed by #7012
Assignees

Comments

@anatoliykmetyuk
Copy link
Contributor

Macro:

package playground

import scala.quoted._, scala.quoted.matching._
import delegate scala.quoted._
import scala.tasty._

case class Box[T](v: T)

inline def mcr(expr: => Boolean): Unit = ${mcrProxy('expr)}

def mcrProxy(expr: Expr[Boolean]) given QuoteContext: Expr[Unit] = {
  val res = mcrImpl[Boolean]('{ (esx: Seq[Box[Boolean]]) => () }, expr)
  // println(s"Out: ${res.show}")
  res
}

def mcrImpl[T](func: Expr[Seq[Box[T]] => Unit], expr: Expr[T]) given (ctx: QuoteContext, tt: Type[T]): Expr[Unit] = {
  import ctx.tasty._
  val arg = Seq('{(Box($expr))}).toExprOfSeq
  func(arg)
}

Main:

package playground

@main def main = println(mcr(true))
Crash
[info] exception occurred while compiling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala
java.lang.AssertionError: assertion failed: unresolved symbols: type tt$_$2(line 18) when pickling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala while compiling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala
[error] ## Exception when compiling 1 sources to /Users/anatolii/Projects/dotty/playground/core/target/scala-0.18/classes
[error] assertion failed: unresolved symbols: type tt$_$2(line 18) when pickling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala
[error] dotty.DottyPredef$.assertFail(DottyPredef.scala:16)
[error] dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:695)
[error] dotty.tools.dotc.transform.Pickler.run$$anonfun$10$$anonfun$8(Pickler.scala:60)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.immutable.List.foreach(List.scala:392)
[error] dotty.tools.dotc.transform.Pickler.run$$anonfun$2(Pickler.scala:83)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.immutable.List.foreach(List.scala:392)
[error] dotty.tools.dotc.transform.Pickler.run(Pickler.scala:83)
[error] dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:316)
[error] scala.collection.immutable.List.map(List.scala:286)
[error] dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:318)
[error] dotty.tools.dotc.transform.Pickler.runOn(Pickler.scala:87)
[error] dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:158)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error] scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error] scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error] dotty.tools.dotc.Run.runPhases$5(Run.scala:170)
[error] dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:178)
[error] dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:65)
[error] dotty.tools.dotc.Run.compileUnits(Run.scala:185)
[error] dotty.tools.dotc.Run.compileSources(Run.scala:120)
[error] dotty.tools.dotc.Run.compile(Run.scala:104)
[error] dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
[error] dotty.tools.dotc.Driver.process(Driver.scala:180)
[error] dotty.tools.dotc.Main.process(Main.scala)
[error] xsbt.CachedCompilerImpl.run(CachedCompilerImpl.java:69)
[error] xsbt.CompilerInterface.run(CompilerInterface.java:41)
[error] sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
[error] sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] java.lang.reflect.Method.invoke(Method.java:498)
[error] sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:237)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:111)
[error] sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:90)
[error] sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
[error] scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:133)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:73)
[error] sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:116)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:307)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:307)
[error] sbt.internal.inc.Incremental$.doCompile(Incremental.scala:106)
[error] sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:87)
[error] sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:116)
[error] sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:63)
[error] sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:89)
[error] sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:134)
[error] sbt.internal.inc.Incremental$.compile(Incremental.scala:80)
[error] sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:67)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:311)
[error] sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:269)
[error] sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:159)
[error] sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:238)
[error] sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:69)
[error] sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1549)
[error] sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1523)
[error] scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error] sbt.std.Transform$$anon$4.work(System.scala:67)
[error] sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error] sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] sbt.Execute.work(Execute.scala:278)
[error] sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error] sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[error] java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[error] java.lang.Thread.run(Thread.java:745)
[error]
[error] java.lang.AssertionError: assertion failed: unresolved symbols: type tt$_$2(line 18) when pickling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala
[error] 	at dotty.DottyPredef$.assertFail(DottyPredef.scala:16)
[error] 	at dotty.tools.dotc.core.tasty.TreePickler.pickle(TreePickler.scala:695)
[error] 	at dotty.tools.dotc.transform.Pickler.run$$anonfun$10$$anonfun$8(Pickler.scala:60)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] 	at scala.collection.immutable.List.foreach(List.scala:392)
[error] 	at dotty.tools.dotc.transform.Pickler.run$$anonfun$2(Pickler.scala:83)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] 	at scala.collection.immutable.List.foreach(List.scala:392)
[error] 	at dotty.tools.dotc.transform.Pickler.run(Pickler.scala:83)
[error] 	at dotty.tools.dotc.core.Phases$Phase.runOn$$anonfun$1(Phases.scala:316)
[error] 	at scala.collection.immutable.List.map(List.scala:286)
[error] 	at dotty.tools.dotc.core.Phases$Phase.runOn(Phases.scala:318)
[error] 	at dotty.tools.dotc.transform.Pickler.runOn(Pickler.scala:87)
[error] 	at dotty.tools.dotc.Run.runPhases$4$$anonfun$4(Run.scala:158)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:15)
[error] 	at dotty.runtime.function.JProcedure1.apply(JProcedure1.java:10)
[error] 	at scala.collection.IndexedSeqOptimized.foreach(IndexedSeqOptimized.scala:36)
[error] 	at scala.collection.IndexedSeqOptimized.foreach$(IndexedSeqOptimized.scala:33)
[error] 	at scala.collection.mutable.ArrayOps$ofRef.foreach(ArrayOps.scala:198)
[error] 	at dotty.tools.dotc.Run.runPhases$5(Run.scala:170)
[error] 	at dotty.tools.dotc.Run.compileUnits$$anonfun$1(Run.scala:178)
[error] 	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] 	at dotty.tools.dotc.util.Stats$.maybeMonitored(Stats.scala:65)
[error] 	at dotty.tools.dotc.Run.compileUnits(Run.scala:185)
[error] 	at dotty.tools.dotc.Run.compileSources(Run.scala:120)
[error] 	at dotty.tools.dotc.Run.compile(Run.scala:104)
[error] 	at dotty.tools.dotc.Driver.doCompile(Driver.scala:35)
[error] 	at dotty.tools.dotc.Driver.process(Driver.scala:180)
[error] 	at dotty.tools.dotc.Main.process(Main.scala)
[error] 	at xsbt.CachedCompilerImpl.run(CachedCompilerImpl.java:69)
[error] 	at xsbt.CompilerInterface.run(CompilerInterface.java:41)
[error] 	at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
[error] 	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error] 	at java.lang.reflect.Method.invoke(Method.java:498)
[error] 	at sbt.internal.inc.AnalyzingCompiler.call(AnalyzingCompiler.scala:237)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:111)
[error] 	at sbt.internal.inc.AnalyzingCompiler.compile(AnalyzingCompiler.scala:90)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.$anonfun$compile$3(MixedAnalyzingCompiler.scala:82)
[error] 	at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.timed(MixedAnalyzingCompiler.scala:133)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compileScala$1(MixedAnalyzingCompiler.scala:73)
[error] 	at sbt.internal.inc.MixedAnalyzingCompiler.compile(MixedAnalyzingCompiler.scala:116)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1(IncrementalCompilerImpl.scala:307)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileInternal$1$adapted(IncrementalCompilerImpl.scala:307)
[error] 	at sbt.internal.inc.Incremental$.doCompile(Incremental.scala:106)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$4(Incremental.scala:87)
[error] 	at sbt.internal.inc.IncrementalCommon.recompileClasses(IncrementalCommon.scala:116)
[error] 	at sbt.internal.inc.IncrementalCommon.cycle(IncrementalCommon.scala:63)
[error] 	at sbt.internal.inc.Incremental$.$anonfun$compile$3(Incremental.scala:89)
[error] 	at sbt.internal.inc.Incremental$.manageClassfiles(Incremental.scala:134)
[error] 	at sbt.internal.inc.Incremental$.compile(Incremental.scala:80)
[error] 	at sbt.internal.inc.IncrementalCompile$.apply(Compile.scala:67)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileInternal(IncrementalCompilerImpl.scala:311)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.$anonfun$compileIncrementally$1(IncrementalCompilerImpl.scala:269)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.handleCompilationError(IncrementalCompilerImpl.scala:159)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compileIncrementally(IncrementalCompilerImpl.scala:238)
[error] 	at sbt.internal.inc.IncrementalCompilerImpl.compile(IncrementalCompilerImpl.scala:69)
[error] 	at sbt.Defaults$.compileIncrementalTaskImpl(Defaults.scala:1549)
[error] 	at sbt.Defaults$.$anonfun$compileIncrementalTask$1(Defaults.scala:1523)
[error] 	at scala.Function1.$anonfun$compose$1(Function1.scala:44)
[error] 	at sbt.internal.util.$tilde$greater.$anonfun$$u2219$1(TypeFunctions.scala:40)
[error] 	at sbt.std.Transform$$anon$4.work(System.scala:67)
[error] 	at sbt.Execute.$anonfun$submit$2(Execute.scala:269)
[error] 	at sbt.internal.util.ErrorHandling$.wideConvert(ErrorHandling.scala:16)
[error] 	at sbt.Execute.work(Execute.scala:278)
[error] 	at sbt.Execute.$anonfun$submit$1(Execute.scala:269)
[error] 	at sbt.ConcurrentRestrictions$$anon$4.$anonfun$submitValid$1(ConcurrentRestrictions.scala:178)
[error] 	at sbt.CompletionService$$anon$2.call(CompletionService.scala:37)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
[error] 	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
[error] 	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
[error] 	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
[error] 	at java.lang.Thread.run(Thread.java:745)
[error] (Compile / compileIncremental) java.lang.AssertionError: assertion failed: unresolved symbols: type tt$_$2(line 18) when pickling /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala
[error] Total time: 1 s, completed Aug 7, 2019 2:14:39 PM

If you uncomment the println statement:

println(s"Out: ${res.show}")

It will result in:

CyclicReference Exception
[error] -- Error: /Users/anatolii/Projects/dotty/playground/core/src/main/scala/playground/Main.scala:3:28
[error] 3 |@main def main = println(mcr(true))
[error]   |                         ^^^^^^^^^
[error]   |Exception occurred while executing macro expansion.
[error]   |dotty.tools.dotc.core.CyclicReference:
[error]   |	at dotty.tools.dotc.core.CyclicReference$.apply(TypeErrors.scala:157)
[error]   |	at dotty.tools.dotc.core.SymDenotations$SymDenotation.completeFrom(SymDenotations.scala:249)
[error]   |	at dotty.tools.dotc.core.Denotations$Denotation.completeInfo$1(Denotations.scala:180)
[error]   |	at dotty.tools.dotc.core.Denotations$Denotation.info(Denotations.scala:182)
[error]   |	at dotty.tools.dotc.core.SymDenotations$SymDenotation.ensureCompleted(SymDenotations.scala:391)
[error]   |	at dotty.tools.dotc.core.SymDenotations$SymDenotation.flags(SymDenotations.scala:150)
[error]   |	at dotty.tools.dotc.tastyreflect.ReflectionCompilerInterface.Symbol_flags(ReflectionInternal.scala:1492)
[error]   |	at dotty.tools.dotc.tastyreflect.ReflectionCompilerInterface.Symbol_flags(ReflectionInternal.scala:1492)
[error]   |	at scala.tasty.reflect.SymbolOps$SymbolAPI.flags(SymbolOps.scala:15)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printType(Printers.scala:1521)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypeOrBound(Printers.scala:1502)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printSeparated$9(Printers.scala:1162)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypesOrBounds(Printers.scala:1168)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printType$$anonfun$1(Printers.scala:1581)
[error]   |	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.inSquare(Printers.scala:534)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printType(Printers.scala:1581)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypeOrBound(Printers.scala:1502)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printSeparated$9(Printers.scala:1162)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypesOrBounds(Printers.scala:1168)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printType$$anonfun$1(Printers.scala:1581)
[error]   |	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.inSquare(Printers.scala:534)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printType(Printers.scala:1581)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypeAndAnnots$1(Printers.scala:1430)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTypeTree(Printers.scala:1432)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTree(Printers.scala:723)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printSeparated$2(Printers.scala:1065)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printStats(Printers.scala:1071)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printFlatBlock$$anonfun$1(Printers.scala:1033)
[error]   |	at dotty.runtime.function.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:12)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.indented(Printers.scala:522)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printFlatBlock(Printers.scala:1034)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter$Buffer.printTree(Printers.scala:913)
[error]   |	at scala.tasty.reflect.Printers$SourceCodePrinter.showTree(Printers.scala:463)
[error]   |	at scala.tasty.reflect.Printers$TreeShowDeco.show(Printers.scala:31)
[error]   |	at scala.quoted.QuoteContext.show(QuoteContext.scala:17)
[error]   |	at scala.quoted.Expr.show(Expr.scala:17)
[error]   |	at scala.internal.quoted.TastyTreeExpr.show(Expr.scala:91)
[error]   |	at playground.macros$package$.mcrProxy(macros.scala:13)
[error]   |
[error]   | This location is in code that was inlined at Main.scala:3
[error] one error found
@anatoliykmetyuk
Copy link
Contributor Author

More minimized version:

package playground

import scala.quoted._, scala.quoted.matching._
import delegate scala.quoted._
import scala.tasty._

case class Box[T](v: T)

inline def mcr(expr: => Boolean): Unit = ${mcrProxy('expr)}

def mcrProxy(expr: Expr[Boolean]) given QuoteContext: Expr[Unit] = {
  val res = mcrImpl[Boolean]('{ (esx: Box[Boolean]) => () }, expr)
  // println(s"Out: ${res.show}")
  res
}

def mcrImpl[T](func: Expr[Box[T] => Unit], expr: Expr[T]) given (ctx: QuoteContext, tt: Type[T]): Expr[Unit] = {
  import ctx.tasty._
  val x = Typed('{Box[T]($expr)}.unseal, the[quoted.Type[Box[T]]].unseal).seal.asInstanceOf[Expr[Box[T]]]
  func(x)
}

@anatoliykmetyuk
Copy link
Contributor Author

Workaround:

def mcrImpl[T](func: Expr[Box[T] => Unit], expr: Expr[T]) given (ctx: QuoteContext, tt: Type[T]): Expr[Unit] = {
  import ctx.tasty._
  val x = Typed('{Box[T]($expr)}.unseal, the[quoted.Type[Box[T]]].unseal).seal.asInstanceOf[Expr[Box[T]]]
  val res = func(x)
  '{$res: Unit}
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants