1 /**
2    Contract tests for libclang.
3    https://martinfowler.com/bliki/ContractTest.html
4  */
5 module contract;
6 
7 import dpp.from;
8 
9 public import unit_threaded;
10 public import clang: Cursor, Type;
11 
12 
13 struct C {
14     string value;
15 }
16 
17 struct Cpp {
18     string value;
19 }
20 
21 
22 auto parse(T)
23           (
24               in T code,
25               in from!"clang".TranslationUnitFlags tuFlags = from!"clang".TranslationUnitFlags.None,
26           )
27 {
28     import unit_threaded.integration: Sandbox;
29     import clang: parse_ = parse;
30 
31     enum isCpp = is(T == Cpp);
32 
33     with(immutable Sandbox()) {
34         const extension = isCpp ? "cpp" : "c";
35         const fileName = "code." ~ extension;
36         writeFile(fileName, code.value);
37 
38         auto tu = parse_(inSandboxPath(fileName),
39                          isCpp ? ["-std=c++14"] : [],
40                          tuFlags)
41             .cursor;
42         printChildren(tu);
43         return tu;
44     }
45 }
46 
47 
48 void printChildren(T)(auto ref T cursorOrTU) {
49     import unit_threaded.io: writelnUt;
50     import std.algorithm: map;
51     import std.array: join;
52     import std.conv: text;
53 
54     writelnUt("\n", cursorOrTU, " children:\n[\n", cursorOrTU.children.map!(a => text("    ", a)).join(",\n"));
55     writelnUt("]\n");
56 }