From 309ae32c6fa55d13c78adfd46fab09f9ebe11516 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Thu, 6 Jun 2019 19:18:59 +0200 Subject: [PATCH 1/5] v2: add load() stub Signed-off-by: Alexander Bezzubov --- src/main/native/org_bblfsh_client_v2_Node.h | 2 +- .../org_bblfsh_client_v2_libuast_Libuast.cc | 22 ++++++++++++------- .../scala/org/bblfsh/client/v2/JNode.scala | 11 ++++++++++ .../scala/org/bblfsh/client/v2/Node.scala | 3 +-- .../scala/org/bblfsh/client/v2/package.scala | 5 +++++ 5 files changed, 32 insertions(+), 11 deletions(-) create mode 100644 src/main/scala/org/bblfsh/client/v2/JNode.scala create mode 100644 src/main/scala/org/bblfsh/client/v2/package.scala diff --git a/src/main/native/org_bblfsh_client_v2_Node.h b/src/main/native/org_bblfsh_client_v2_Node.h index 56fea6f..03e01f1 100644 --- a/src/main/native/org_bblfsh_client_v2_Node.h +++ b/src/main/native/org_bblfsh_client_v2_Node.h @@ -10,7 +10,7 @@ extern "C" { /* * Class: org_bblfsh_client_v2_Node * Method: load - * Signature: ()Lscala/collection/immutable/Map; + * Signature: ()Lorg/bblfsh/client/v2/JNode; */ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Node_load (JNIEnv *, jobject); diff --git a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc index 3784dfb..609dcea 100644 --- a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc +++ b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc @@ -137,16 +137,9 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_libuast_Libuast_decode( return jCtxExt; } -JNIEXPORT void JNICALL Java_org_bblfsh_client_v2_Context_dispose(JNIEnv *env, - jobject self) { - ContextExt *p = getHandle(env, self, "nativeContext"); - setHandle(env, self, 0, "nativeContext"); - delete p; -} - JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_libuast_Libuast_filter( JNIEnv *, jobject, jobject, jstring) { - return NULL; // TODO(bzz): implement + return nullptr; // TODO(bzz): implement } // v2.Context() @@ -156,6 +149,19 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_root(JNIEnv *env, return p->RootNode(); } +JNIEXPORT void JNICALL Java_org_bblfsh_client_v2_Context_dispose(JNIEnv *env, + jobject self) { + ContextExt *p = getHandle(env, self, "nativeContext"); + setHandle(env, self, 0, "nativeContext"); + delete p; +} + +// v2.Node() +JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Node_load(JNIEnv *, + jobject) { + return nullptr; // TODO(bzz): implement +} + JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { JNIEnv *env; if (vm->GetEnv(reinterpret_cast(&env), JNI_VERSION_1_8) != JNI_OK) { diff --git a/src/main/scala/org/bblfsh/client/v2/JNode.scala b/src/main/scala/org/bblfsh/client/v2/JNode.scala new file mode 100644 index 0000000..76a7e75 --- /dev/null +++ b/src/main/scala/org/bblfsh/client/v2/JNode.scala @@ -0,0 +1,11 @@ +package org.bblfsh.client.v2 + +sealed abstract class JNode +case class JString(s: String) extends JNode +case class JDouble(num: Double) extends JNode +case class JLong(num: Long) extends JNode +case class JInt(num: BigInt) extends JNode +case class JBool(value: Boolean) extends JNode +case class JObject(obj: List[JField]) extends JNode +case class JArray(arr: List[JNode]) extends JNode + diff --git a/src/main/scala/org/bblfsh/client/v2/Node.scala b/src/main/scala/org/bblfsh/client/v2/Node.scala index df9d135..aa158c7 100644 --- a/src/main/scala/org/bblfsh/client/v2/Node.scala +++ b/src/main/scala/org/bblfsh/client/v2/Node.scala @@ -1,6 +1,5 @@ package org.bblfsh.client.v2 case class Node(ctx: Long, handle: Long) { - // TODO(bzz) make sure single string value or an array can also be loaded - @native def load(): Map[String, _] + @native def load(): JNode } diff --git a/src/main/scala/org/bblfsh/client/v2/package.scala b/src/main/scala/org/bblfsh/client/v2/package.scala new file mode 100644 index 0000000..89de59c --- /dev/null +++ b/src/main/scala/org/bblfsh/client/v2/package.scala @@ -0,0 +1,5 @@ +package org.bblfsh.client + +package object v2 { + type JField = (String, JNode) +} From 413c430069f5d522acc09055be4ab235a5d4d0cf Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Thu, 6 Jun 2019 19:19:57 +0200 Subject: [PATCH 2/5] v2: tests - add missing to CI and small import cleanup Signed-off-by: Alexander Bezzubov --- .travis.yml | 2 ++ src/test/scala/org/bblfsh/client/v2/BblfshClientCloseTest.scala | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 02e1ebd..91bbe86 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,8 +40,10 @@ jobs: - sudo apt-get install -y binutils - ./sbt assembly - ./sbt "testOnly *Close* *ClientVersion* *SupportedLanguages*" + - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Parsed UAST for .java file\"" - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Decoded UAST after parsing\"" - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Decoded UAST RootNode\"" + after_failure: *failure_logs_anchor - name: 'Cross-compile, release & publish to Sonatype' diff --git a/src/test/scala/org/bblfsh/client/v2/BblfshClientCloseTest.scala b/src/test/scala/org/bblfsh/client/v2/BblfshClientCloseTest.scala index 5f80d83..a8a4d8d 100644 --- a/src/test/scala/org/bblfsh/client/v2/BblfshClientCloseTest.scala +++ b/src/test/scala/org/bblfsh/client/v2/BblfshClientCloseTest.scala @@ -1,9 +1,7 @@ package org.bblfsh.client.v2 -import gopkg.in.bblfsh.sdk.v2.protocol.driver.VersionResponse import org.scalatest.{BeforeAndAfter, FunSuite} -import scala.io.Source class BblfshClientClose extends FunSuite with BeforeAndAfter { val client = BblfshClient("0.0.0.0", 9432) From 918b9b9469de58b2af91c6b1dab438b3884e2150 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Thu, 6 Jun 2019 20:01:04 +0200 Subject: [PATCH 3/5] v2: add .encode() Signed-off-by: Alexander Bezzubov --- .travis.yml | 5 +---- src/main/native/org_bblfsh_client_v2_Context.h | 4 ++-- .../native/org_bblfsh_client_v2_libuast_Libuast.cc | 11 ++++++++++- src/main/scala/org/bblfsh/client/v2/Context.scala | 2 +- .../org/bblfsh/client/v2/BblfshClientParseTest.scala | 6 +++--- 5 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.travis.yml b/.travis.yml index 91bbe86..ab7eb09 100644 --- a/.travis.yml +++ b/.travis.yml @@ -39,10 +39,7 @@ jobs: script: - sudo apt-get install -y binutils - ./sbt assembly - - ./sbt "testOnly *Close* *ClientVersion* *SupportedLanguages*" - - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Parsed UAST for .java file\"" - - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Decoded UAST after parsing\"" - - ./sbt "testOnly org.bblfsh.client.v2.BblfshClientParseTest -- -z \"Decoded UAST RootNode\"" + - ./sbt "testOnly *Close* *ClientVersion* *SupportedLanguages* *BblfshClientParseTest" after_failure: *failure_logs_anchor diff --git a/src/main/native/org_bblfsh_client_v2_Context.h b/src/main/native/org_bblfsh_client_v2_Context.h index 4309742..4deed86 100644 --- a/src/main/native/org_bblfsh_client_v2_Context.h +++ b/src/main/native/org_bblfsh_client_v2_Context.h @@ -18,10 +18,10 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_root /* * Class: org_bblfsh_client_v2_Context * Method: encode - * Signature: (Lorg/bblfsh/client/v2/Node;I)Ljava/nio/ByteBuffer; + * Signature: (Lorg/bblfsh/client/v2/Node;)Ljava/nio/ByteBuffer; */ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_encode - (JNIEnv *, jobject, jobject, jint); + (JNIEnv *, jobject, jobject); /* * Class: org_bblfsh_client_v2_Context diff --git a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc index 609dcea..d9b9f3c 100644 --- a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc +++ b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc @@ -93,7 +93,7 @@ class ContextExt { return toJ(root); } - // Encode serializes existing-on-guest-side UAST. + // Encode serializes external UAST. // Borrows the reference. jobject Encode(jobject node, UastFormat format) { NodeHandle h = toHandle(node); @@ -149,6 +149,15 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_root(JNIEnv *env, return p->RootNode(); } +JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_encode( + JNIEnv *env, jobject self, jobject node) { + UastFormat fmt = UAST_BINARY; // TODO(bzz): make it argument & enum + + ContextExt *p = getHandle(env, self, "nativeContext"); + return p->Encode(node, fmt); + return nullptr; +} + JNIEXPORT void JNICALL Java_org_bblfsh_client_v2_Context_dispose(JNIEnv *env, jobject self) { ContextExt *p = getHandle(env, self, "nativeContext"); diff --git a/src/main/scala/org/bblfsh/client/v2/Context.scala b/src/main/scala/org/bblfsh/client/v2/Context.scala index cbc3a1e..9d8cb82 100644 --- a/src/main/scala/org/bblfsh/client/v2/Context.scala +++ b/src/main/scala/org/bblfsh/client/v2/Context.scala @@ -4,7 +4,7 @@ import java.nio.ByteBuffer case class Context(nativeContext: Long) { @native def root(): Node - @native def encode(n: Node, format: Int): ByteBuffer + @native def encode(n: Node): ByteBuffer @native def dispose() @native def filter() diff --git a/src/test/scala/org/bblfsh/client/v2/BblfshClientParseTest.scala b/src/test/scala/org/bblfsh/client/v2/BblfshClientParseTest.scala index 63231c5..ba8ceba 100644 --- a/src/test/scala/org/bblfsh/client/v2/BblfshClientParseTest.scala +++ b/src/test/scala/org/bblfsh/client/v2/BblfshClientParseTest.scala @@ -55,11 +55,11 @@ class BblfshClientParseTest extends FlatSpec } "Encoding back the RootNode of decoded UAST" should "produce same bytes" in { - val uast = resp.uast.decode() - val rootNode: Node = uast.root() + val uastCtx: Context = resp.uast.decode() + val rootNode: Node = uastCtx.root() println(s"Root node: $rootNode") - val encodedBytes: ByteBuffer = uast.encode(rootNode, 0) + val encodedBytes: ByteBuffer = uastCtx.encode(rootNode) encodedBytes.capacity should be (resp.uast.asReadOnlyByteBuffer.capacity) encodedBytes shouldEqual resp.uast.asReadOnlyByteBuffer From 8162713fa88a425510391838a9f51c9bb83c5466 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Tue, 11 Jun 2019 11:50:53 +0200 Subject: [PATCH 4/5] v2: ScalaDoc for new types, review feedback Signed-off-by: Alexander Bezzubov --- src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc | 1 - src/main/scala/org/bblfsh/client/v2/JNode.scala | 4 ++++ src/main/scala/org/bblfsh/client/v2/package.scala | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc index d9b9f3c..2e03aad 100644 --- a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc +++ b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc @@ -155,7 +155,6 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_encode( ContextExt *p = getHandle(env, self, "nativeContext"); return p->Encode(node, fmt); - return nullptr; } JNIEXPORT void JNICALL Java_org_bblfsh_client_v2_Context_dispose(JNIEnv *env, diff --git a/src/main/scala/org/bblfsh/client/v2/JNode.scala b/src/main/scala/org/bblfsh/client/v2/JNode.scala index 76a7e75..b3c3f01 100644 --- a/src/main/scala/org/bblfsh/client/v2/JNode.scala +++ b/src/main/scala/org/bblfsh/client/v2/JNode.scala @@ -1,5 +1,9 @@ package org.bblfsh.client.v2 +/** UAST nodes representation on the JVM side. + * + * Mirrors https://godoc.org/github.com/bblfsh/sdk/uast/nodes + */ sealed abstract class JNode case class JString(s: String) extends JNode case class JDouble(num: Double) extends JNode diff --git a/src/main/scala/org/bblfsh/client/v2/package.scala b/src/main/scala/org/bblfsh/client/v2/package.scala index 89de59c..327b7d2 100644 --- a/src/main/scala/org/bblfsh/client/v2/package.scala +++ b/src/main/scala/org/bblfsh/client/v2/package.scala @@ -1,5 +1,11 @@ package org.bblfsh.client +/** Bblfsh client for protocol v2. + * See https://github.com/bblfsh/sdk/blob/v3.1.0/protocol/driver.proto + * + * The main class to use is [[org.bblfsh.client.v2.BblfshClient]] + */ package object v2 { + /** Key, Value representation of [[org.bblfsh.client.v2.JObject]] */ type JField = (String, JNode) } From 0d76c98dbdf5ec8db5dedb43dda35a26d5f59c13 Mon Sep 17 00:00:00 2001 From: Alexander Bezzubov Date: Tue, 11 Jun 2019 12:03:53 +0200 Subject: [PATCH 5/5] v2 jni: refactoring, extract a constant Signed-off-by: Alexander Bezzubov --- .../native/org_bblfsh_client_v2_libuast_Libuast.cc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc index 2e03aad..f0d4b1a 100644 --- a/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc +++ b/src/main/native/org_bblfsh_client_v2_libuast_Libuast.cc @@ -15,6 +15,8 @@ jobject asJvmBuffer(uast::Buffer buf) { return env->NewDirectByteBuffer(buf.ptr, buf.size); } +const char *nativeContext = "nativeContext"; + jfieldID getHandleField(JNIEnv *env, jobject obj, const char *name) { jclass cls = env->GetObjectClass(obj); if (env->ExceptionOccurred() || !cls) { @@ -145,7 +147,7 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_libuast_Libuast_filter( // v2.Context() JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_root(JNIEnv *env, jobject self) { - ContextExt *p = getHandle(env, self, "nativeContext"); + ContextExt *p = getHandle(env, self, nativeContext); return p->RootNode(); } @@ -153,14 +155,14 @@ JNIEXPORT jobject JNICALL Java_org_bblfsh_client_v2_Context_encode( JNIEnv *env, jobject self, jobject node) { UastFormat fmt = UAST_BINARY; // TODO(bzz): make it argument & enum - ContextExt *p = getHandle(env, self, "nativeContext"); + ContextExt *p = getHandle(env, self, nativeContext); return p->Encode(node, fmt); } JNIEXPORT void JNICALL Java_org_bblfsh_client_v2_Context_dispose(JNIEnv *env, jobject self) { - ContextExt *p = getHandle(env, self, "nativeContext"); - setHandle(env, self, 0, "nativeContext"); + ContextExt *p = getHandle(env, self, nativeContext); + setHandle(env, self, 0, nativeContext); delete p; }