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.Util; 19 import clang.Visitor; 20 21 struct TranslationUnit 22 { 23 mixin CX; 24 25 static TranslationUnit parse (Index index, string sourceFilename, string[] commandLineArgs, 26 CXUnsavedFile[] unsavedFiles = null, 27 uint options = CXTranslationUnit_Flags.CXTranslationUnit_None) 28 { 29 return TranslationUnit( 30 clang_parseTranslationUnit( 31 index.cx, 32 sourceFilename.toStringz, 33 strToCArray(commandLineArgs), 34 cast(int) commandLineArgs.length, 35 toCArray!(CXUnsavedFile)(unsavedFiles), 36 cast(uint) unsavedFiles.length, 37 options)); 38 } 39 40 private this (CXTranslationUnit cx) 41 { 42 this.cx = cx; 43 } 44 45 @property DiagnosticVisitor diagnostics () 46 { 47 return DiagnosticVisitor(cx); 48 } 49 50 @property DeclarationVisitor declarations () 51 { 52 return DeclarationVisitor(clang_getTranslationUnitCursor(cx)); 53 } 54 55 File file (string filename) 56 { 57 return File(clang_getFile(cx, filename.toStringz)); 58 } 59 60 @property Cursor cursor () 61 { 62 auto r = clang_getTranslationUnitCursor(cx); 63 return Cursor(r); 64 } 65 } 66 67 struct DiagnosticVisitor 68 { 69 private CXTranslationUnit translatoinUnit; 70 71 this (CXTranslationUnit translatoinUnit) 72 { 73 this.translatoinUnit = translatoinUnit; 74 } 75 76 size_t length () 77 { 78 return clang_getNumDiagnostics(translatoinUnit); 79 } 80 81 int opApply (int delegate (ref Diagnostic) dg) 82 { 83 int result; 84 85 foreach (i ; 0 .. length) 86 { 87 auto diag = clang_getDiagnostic(translatoinUnit, cast(uint) i); 88 auto dDiag = Diagnostic(diag); 89 result = dg(dDiag); 90 91 if (result) 92 break; 93 } 94 95 return result; 96 } 97 }