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 }