using System;
using System.Collections.Generic;
using System.Linq;
using CppSharp.AST;
using CppSharp.Parser;
using ASTContext = CppSharp.Parser.AST.ASTContext;
using NativeLibrary = CppSharp.Parser.AST.NativeLibrary;
namespace CppSharp
{
public static class ClangParser
{
///
/// Fired when source files are parsed.
///
public static Action, ParserResult> SourcesParsed = delegate { };
///
/// Fired when library files are parsed.
///
public static Action LibraryParsed = delegate { };
///
/// Parses a C++ source file as a translation unit.
///
public static ParserResult ParseSourceFile(string file, ParserOptions options)
{
return ParseSourceFiles(new[] { file }, options);
}
///
/// Parses a set of C++ source files as a single translation unit.
///
public static ParserResult ParseSourceFiles(IEnumerable files, ParserOptions options)
{
options.ASTContext = new ASTContext();
foreach (var file in files)
options.AddSourceFiles(file);
var result = Parser.ClangParser.ParseHeader(options);
SourcesParsed(files, result);
return result;
}
///
/// Parses a library file with symbols.
///
public static ParserResult ParseLibrary(LinkerOptions options)
{
var result = Parser.ClangParser.ParseLibrary(options);
for (uint i = 0; i < options.LibrariesCount; i++)
LibraryParsed(options.GetLibraries(i), result);
return result;
}
///
/// Converts a native parser AST to a managed AST.
///
static public AST.ASTContext ConvertASTContext(ASTContext context)
{
var converter = new ASTConverter(context);
return converter.Convert();
}
public static AST.NativeLibrary ConvertLibrary(NativeLibrary library)
{
var newLibrary = new AST.NativeLibrary
{
FileName = library.FileName,
ArchType = (ArchType)library.ArchType
};
for (uint i = 0; i < library.SymbolsCount; ++i)
{
var symbol = library.GetSymbols(i);
newLibrary.Symbols.Add(symbol);
}
for (uint i = 0; i < library.DependenciesCount; i++)
{
newLibrary.Dependencies.Add(library.GetDependencies(i));
}
return newLibrary;
}
}
}