This is a Scala/JNI implementation of the Babelfish client. It uses ScalaPB for Protobuf/gRPC code generation and libuast for XPath queries.
The latest scala-client
v2.x supports the UASTv2 protocol.
You need to install the Java SDK and its header files. The command for Debian and derived distributions would be:
sudo apt install openjdk-8 openjdk-8-jdk-headless
Currently we support Scala 2.11. We recommend using scalaVersion := "2.11.11"
or above in your build.sbt
file. This library is not compatible with Scala 2.12 or 2.13.
git clone https://github.com/bblfsh/scala-client.git
cd scala-client
./build.sh --clean --get-dependencies --all
This command would fetch dependencies for the package, compile native code (JNI) and the Scala code.
gRPC/protobuf files are re-generate from src/main/proto
on every ./sbt compile
and are stored under
./target/src_managed/
.
The jar file and the native module are generated in the build/
directory. If
you move the jar file to some other path, the native (.so
or .dylib
)
library must be in the same path.
If the build fails because it can't find the jni.h
header file, run it setting JAVA_HOME
(appropriately
setting it to the right location for your system):
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
./build.sh --clean --get-dependencies --all
If the build fails with: build.sh: Permission denied
, add execution permissions to the script:
chmod +x ./build.sh
build.sh
script has been tested in Unix (Linux and macOS) and with Git Bash in Windows.
For more developer documentation please check our CONTRIBUTING guideline.
The bblfsh-client
package is available thorugh Maven
central, so it can be easily
added as a dependency in various package management systems. Examples of how to
handle it for most common systems are included below; for other systems just look
at Maven central's dependency information.
<dependency>
<groupId>org.bblfsh</groupId>
<artifactId>bblfsh-client</artifactId>
<version>${version}</version>
</dependency>
libraryDependencies += "org.bblfsh" % "bblfsh-client" % version
If you don't have a bblfsh server running you can execute it using the following command:
docker run --privileged --rm -it -p 9432:9432 --name bblfsh bblfsh/bblfshd
Please, read the getting started guide to learn more about how to use and deploy a bblfsh server, install language drivers, etc.
API
import scala.io.Source
import org.bblfsh.client.v2.BblfshClient, BblfshClient._
import gopkg.in.bblfsh.sdk.v2.protocol.driver.Mode
val client = BblfshClient("localhost", 9432)
val filename = "/path/to/file.py" // client responsible for encoding it to utf-8
val fileContent = Source.fromFile(filename).getLines.mkString("\n")
val resp = client.parse(filename, fileContent, Mode.SEMANTIC)
// Full response
println(resp.get)
// Filtered response
val it = client.filter(resp.get, "//uast:Identifier")
it.foreach(println)
Please read the Babelfish clients guide section to learn more about babelfish clients and their query language.
Apache 2.0