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 }