Как запустить официальный пример отражения - PullRequest
3 голосов
/ 18 июня 2019

У меня проблема с использованием официального кода, чтобы попробовать какое-либо отражение [https://docs.scala -lang.org / Overviews / отражение / environment-universes-mirrors.html]

Я использовал sbt для создания 2 пакетов, пакет приложения зависит от макропакета, я поместил код макроса в пакет макроса и импортировал код в пакет приложения, чтобы вызвать его, но он не работал должным образом.

import scala.reflect.macros.Context

case class Location(filename: String, line: Int, column: Int)

object Macros {
  def currentLocation: Location = macro impl

  def impl(c: Context): c.Expr[Location] = {
    import c.universe._
    val pos = c.macroApplication.pos
    val clsLocation = c.mirror.staticModule("Location") // get symbol of "Location" object
    c.Expr(Apply(Ident(clsLocation), List(Literal(Constant(pos.source.path)), Literal(Constant(pos.line)), Literal(Constant(pos.column)))))
  }
}

[ошибка] scala.ScalaReflectionException: местоположение объекта не найдено. [ошибка] в scala.reflect.internal.Mirrors $ RootsBase.staticModule (Mirrors.scala: 168) [ошибка] в scala.reflect.internal.Mirrors $ RootsBase.staticModule (Mirrors.scala: 29) [ошибка] в sg.bigo.Macros $ .impl (Macros.scala: 61) [ошибка] currentLocation.column

1 Ответ

1 голос
/ 08 июля 2019

Следующий проект компилируется

App.scala

import Macros.currentLocation

object App {
  def main(args: Array[String]): Unit = {
    println(
      currentLocation //Location(/media/data/Projects/macrosdemo213/core/src/main/scala/App.scala,6,7)
    )
  }
}

Macros.scala

import scala.language.experimental.macros
import scala.reflect.macros.blackbox

case class Location(filename: String, line: Int, column: Int)

object Macros {
  def currentLocation: Location = macro impl

  def impl(c: blackbox.Context): c.Tree = {
    import c.universe._
    val pos = c.macroApplication.pos
    val clsLocation = c.mirror.staticModule("Location")
    q"$clsLocation(${pos.source.path}, ${pos.line}, ${pos.column})"
  }
}

build.sbt

name := "macrosdemo213"

lazy val commonSettings = Seq(
  scalaVersion := "2.13.0",
  organization := "com.example",
  version := "1.0.0",
)


lazy val macros: Project = (project in file("macros")).settings(
  commonSettings,
  libraryDependencies ++= Seq(
    scalaOrganization.value % "scala-reflect" % scalaVersion.value,
  )
)

lazy val core: Project = (project in file("core")).aggregate(macros).dependsOn(macros).settings(
  commonSettings
)

build.properties

sbt.version = 1.2.8

Структура проекта

enter image description here

...