greenoldman
greenoldman

Reputation: 21082

Does Scala have "macro" definitions ready to use -- like LINE, FILE?

When you get a stack trace from exception you get files and line numbers. I need something like this for my reporting, so I could get to the cause very fast.

I am looking in particular for LINE and FILE macro. Is there anything like this in Scala?

Upvotes: 5

Views: 346

Answers (3)

Jens Hoffmann
Jens Hoffmann

Reputation: 6801

The sourcecode library is based on macros and provides metadata at compile-time.

Example (taken from their page):

object Main extends App {
  def log(message: String)(implicit line: sourcecode.Line, file: sourcecode.File) = 
    println(s"${file.value}:${line.value} $message")

  log("foo")
}

This will print:

/Users/jhoffmann/Development/sourcecode/src/main/scala/Main.scala:5 foo

You can use the implicits anywhere in your code.

Upvotes: 2

Don Mackenzie
Don Mackenzie

Reputation: 7963

The is a project to provide a macro capability in Scala.

Perhaps you could approach the project team to discuss what you need

Upvotes: 1

Tomasz Nurkiewicz
Tomasz Nurkiewicz

Reputation: 340963

There is no such macro neither in Scala nor in Java. Of course the line number information is stored in the bytecode (also for debugging purposes) but there is no API to obtain it.

Stack traces with class names and line numbers are generated via native Throwable.fillInStackTrace(). Logging libraries might also use Thread.getStackTrace().

In both cases it boils down to parse stack trace and find our current location. Note that generating stack trace is time-consuming and should be avoided.

Upvotes: 6

Related Questions