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 }