1 /** 2 * Copyright: Copyright (c) 2011 Jacob Carlborg. All rights reserved. 3 * Authors: Jacob Carlborg 4 * Version: Initial created: Oct 1, 2011 5 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost Software License 1.0) 6 */ 7 module clang.TranslationUnit; 8 9 import std..string; 10 11 import mambo.core.io; 12 13 import clang.c.index; 14 import clang.Cursor; 15 import clang.Diagnostic; 16 import clang.File; 17 import clang.Index; 18 import clang.UnsavedFile; 19 import clang.Util; 20 import clang.Visitor; 21 22 struct TranslationUnit 23 { 24 mixin CX; 25 26 static TranslationUnit parse (Index index, string sourceFilename, string[] commandLineArgs, 27 UnsavedFile[] unsavedFiles = null, 28 uint options = CXTranslationUnit_Flags.CXTranslationUnit_None) 29 { 30 return TranslationUnit( 31 clang_parseTranslationUnit( 32 index.cx, 33 sourceFilename.toStringz, 34 strToCArray(commandLineArgs), 35 cast(int) commandLineArgs.length, 36 toCArray!(CXUnsavedFile)(unsavedFiles), 37 cast(uint) unsavedFiles.length, 38 options)); 39 } 40 41 private this (CXTranslationUnit cx) 42 { 43 this.cx = cx; 44 } 45 46 @property DiagnosticVisitor diagnostics () 47 { 48 return DiagnosticVisitor(cx); 49 } 50 51 @property DeclarationVisitor declarations () 52 { 53 return DeclarationVisitor(clang_getTranslationUnitCursor(cx)); 54 } 55 56 File file (string filename) 57 { 58 return File(clang_getFile(cx, filename.toStringz)); 59 } 60 61 @property Cursor cursor () 62 { 63 auto r = clang_getTranslationUnitCursor(cx); 64 return Cursor(r); 65 } 66 } 67 68 struct DiagnosticVisitor 69 { 70 private CXTranslationUnit translatoinUnit; 71 72 this (CXTranslationUnit translatoinUnit) 73 { 74 this.translatoinUnit = translatoinUnit; 75 } 76 77 size_t length () 78 { 79 return clang_getNumDiagnostics(translatoinUnit); 80 } 81 82 int opApply (int delegate (ref Diagnostic) dg) 83 { 84 int result; 85 86 foreach (i ; 0 .. length) 87 { 88 auto diag = clang_getDiagnostic(translatoinUnit, cast(uint) i); 89 auto dDiag = Diagnostic(diag); 90 result = dg(dDiag); 91 92 if (result) 93 break; 94 } 95 96 return result; 97 } 98 }