We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
1 parent 6086f5a commit 6de313fCopy full SHA for 6de313f
4 files changed
src/libuast.hpp
@@ -58,6 +58,11 @@ namespace uast {
58
virtual T node() = 0;
59
};
60
61
+ // NodeHash is a hash of a node subtree.
62
+ struct NodeHash {
63
+ uint8_t data[UAST_HASH_SIZE];
64
+ };
65
+
66
// Context is a common interface implemented by all UAST contexts.
67
template<class T> class Context {
68
public:
@@ -75,6 +80,7 @@ namespace uast {
75
80
76
81
virtual Iterator<T>* Filter(T root, std::string query) = 0;
77
82
virtual Iterator<T>* Iterate(T root, TreeOrder order) = 0;
83
+ virtual NodeHash Hash(T root, HashFlags flags) = 0;
78
84
79
85
86
// NodeCreator is an interface that creates new UAST nodes.
@@ -351,6 +357,11 @@ namespace uast {
351
357
CheckError();
352
358
return new RawIterator(it);
353
359
}
360
+ NodeHash Hash(NodeHandle root, HashFlags flags) {
361
+ NodeHash h;
362
+ UastHash(ctx, root, (void*)&h, flags);
363
+ return h;
364
+ }
354
365
355
366
356
367
// PtrIterator is an iterator that casts NodeHandle directly to pointer type T.
@@ -414,6 +425,9 @@ namespace uast {
414
425
auto it = new PtrIterator<T>(raw, true);
415
426
return it;
416
427
428
+ NodeHash Hash(T root, HashFlags flags) {
429
+ return ctx->Hash(ToHandle(root), flags);
430
417
431
void CheckError(){
418
432
ctx->CheckError();
419
433
src/uast.h
@@ -91,6 +91,7 @@ typedef struct UastIterator {
91
typedef enum { UAST_BINARY = 0, UAST_YAML = 1 } UastFormat;
92
93
typedef enum {
94
+ HASH_ALL = 0x0,
95
HASH_NO_POS = 0x1,
96
} HashFlags;
97
tests/main.cc
@@ -28,6 +28,7 @@ int main() {
28
29
// add the tests to the suite
30
ADD_TEST(suite, "test of RoleNameForId()", TestRoleNameForId);
31
+ ADD_TEST(suite, "test node hash", TestNodeHash);
32
ADD_TEST(suite, "test of UastFilter() pointers", TestUastFilterPointers);
33
ADD_TEST(suite, "test iteration (preorder)", TestUastIteratorPreOrder);
34
ADD_TEST(suite, "test of UastFilter() counting", TestUastFilterCount);
tests/nodes_test.h
@@ -642,6 +642,24 @@ void TestNodeFindError() {
642
UastFree(ctx);
643
644
645
+void TestNodeHash() {
646
+ Uast *ctx = NewUastMock();
647
+ Node* module = newObject("Module");
648
+ Node* child = newObject("Child");
649
+ module->SetChild("field", child);
650
651
+ unsigned char hash[UAST_HASH_SIZE];
652
+ unsigned char exp[UAST_HASH_SIZE] = {
653
+ 0xe6, 0xd2, 0x53, 0xe1, 0x26, 0xa, 0xaa, 0xa9,
654
+ 0x37, 0xcc, 0xfc, 0x42, 0xf, 0x52, 0x65, 0x48,
655
+ 0x1d, 0x59, 0x18, 0xce, 0x1, 0xad, 0xda, 0xa2,
656
+ 0x82, 0x4c, 0x74, 0x77, 0xae, 0xa1, 0x26, 0xb5};
657
+ UastHash(ctx, NodeHandle(module), (void*)hash, HASH_ALL);
658
+ CU_ASSERT_FATAL(memcmp(hash, exp, UAST_HASH_SIZE) == 0);
659
660
+ UastFree(ctx);
661
+}
662
663
void TestEmptyResult() {
664
Uast *ctx = NewUastMock();
665
Node* module = newObject("Module");
0 commit comments