com-lihaoyi / cask

Cask: a Scala HTTP micro-framework. Cask makes it easy to set up a website, backend server, or REST API using Scala
https://com-lihaoyi.github.io/cask/
Other
525 stars 55 forks source link

When compiling with Scala 3 and -Xcheck-macros I get exceptions from Cask #116

Open OndrejSpanel opened 7 months ago

OndrejSpanel commented 7 months ago

When I compile my project in Scala 3 with scalac option -Xcheck-macros, I get following exception:

Exception occurred while executing macro expansion.
scala.quoted.runtime.impl.ScopeException: Expression created in a splice was used outside of that splice.
Created in: cask\src-3\cask\router\Macros.scala:279 at column 28
Used in: cask\src-3\cask\router\Macros.scala:124 at column 28
Expr: validated

Creation stack:
    cask\src-3\cask\router\Macros.scala:279 at column 28
    cask\src-3\cask\router\RoutesEndpointMetadata.scala:13 at column 17
    cask\src-3\cask\main\Routes.scala:15 at column 51

Use stack:
    cask\src-3\cask\router\Macros.scala:124 at column 28
    cask\src-3\cask\router\RoutesEndpointMetadata.scala:13 at column 17
    cask\src-3\cask\main\Routes.scala:15 at column 51

Hint: A common reason for this to happen is when a `def` that creates a `'{...}`
      captures an outer instance of `Quotes`. If this `def` is called in a splice
      it will not track the `Quotes` provided by that particular splice.
      To fix it add a `given Quotes` to this `def`.
Details

at scala.quoted.runtime.impl.ScopeException$.checkInCorrectScope(ScopeException.scala:35) at dotty.tools.dotc.quoted.PickledQuotes$.quotedExprToTree(PickledQuotes.scala:40) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:112) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1538) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1498) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1504) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1498) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1504) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1498) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1506) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.quoted.PickledQuotes$.spliceTerms(PickledQuotes.scala:152) at dotty.tools.dotc.quoted.PickledQuotes$.unpickleTerm(PickledQuotes.scala:88) at scala.quoted.runtime.impl.QuotesImpl.unpickleExprV2(QuotesImpl.scala:3143) at cask.router.Macros$.$anonfun$1$$anonfun$1(Macros.scala:124) at cask.router.Macros$.$anonfun$1$$anonfun$adapted$1(Macros.scala:125) at scala.collection.immutable.List.map(List.scala:246) at cask.router.Macros$.$anonfun$1(Macros.scala:125) at cask.router.Macros$.$anonfun$adapted$1(Macros.scala:126) at scala.collection.immutable.List.map(List.scala:246) at cask.router.Macros$.call(Macros.scala:126) at cask.router.Macros$.extractMethod$$anonfun$1(Macros.scala:279) at cask.router.Macros$.extractMethod$$anonfun$adapted$1(Macros.scala:286) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:110) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1538) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1567) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1601) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1570) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1601) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1504) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1570) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1601) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1514) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1504) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.quoted.PickledQuotes$.spliceTerms(PickledQuotes.scala:152) at dotty.tools.dotc.quoted.PickledQuotes$.unpickleTerm(PickledQuotes.scala:88) at scala.quoted.runtime.impl.QuotesImpl.unpickleExprV2(QuotesImpl.scala:3143) at cask.router.Macros$.extractMethod(Macros.scala:286) at cask.router.RoutesEndpointsMetadata$.$anonfun$4(RoutesEndpointMetadata.scala:50) at scala.collection.Iterator$$anon$9.next(Iterator.scala:584) at scala.collection.immutable.List.prependedAll(List.scala:153) at scala.collection.immutable.List$.from(List.scala:684) at scala.collection.immutable.List$.from(List.scala:681) at scala.collection.IterableOps$WithFilter.map(Iterable.scala:898) at cask.router.RoutesEndpointsMetadata$.initializeImpl(RoutesEndpointMetadata.scala:63) at cask.router.RoutesEndpointsMetadata$.setRoutesImpl$$anonfun$1(RoutesEndpointMetadata.scala:13) at cask.router.RoutesEndpointsMetadata$.setRoutesImpl$$anonfun$adapted$1(RoutesEndpointMetadata.scala:13) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:110) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1538) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1504) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform$$anonfun$1(Trees.scala:1605) at scala.collection.immutable.List.mapConserve(List.scala:472) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1605) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformStats(Trees.scala:1601) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transformBlock(Trees.scala:1603) at dotty.tools.dotc.ast.Trees$Instance$TreeMap.transform(Trees.scala:1518) at dotty.tools.dotc.quoted.PickledQuotes$$anon$1.transform(PickledQuotes.scala:135) at dotty.tools.dotc.quoted.PickledQuotes$.spliceTerms(PickledQuotes.scala:152) at dotty.tools.dotc.quoted.PickledQuotes$.unpickleTerm(PickledQuotes.scala:88) at scala.quoted.runtime.impl.QuotesImpl.unpickleExprV2(QuotesImpl.scala:3143) at cask.router.RoutesEndpointsMetadata$.setRoutesImpl(RoutesEndpointMetadata.scala:13)

When not using the option, the server compiles and runs fine.