public async Task <IAssembly> CompileAsync(IProject Project, CompilationParameters Parameters) { var binder = await Parameters.BinderTask; var asm = new SyntaxAssembly(Project.Name, new Version(), Parameters.Log, CBuildHelpers.Instance.CreatePrimitiveBinder32(binder), new TypeNamerBase()); await ParseCompilationUnitsAsync(Project.GetSourceItems(), asm, Parameters); return(asm); }
public static CompilationUnit ParseCompilationUnit(ITokenStream TokenParser, SyntaxAssembly Assembly) { var syntaxParser = new CSyntaxParser(Assembly.Log); var unit = Assembly.CreateCompilationUnit(); var state = unit.GetSyntaxState(); IDeclarationSyntax[] decls; try { decls = syntaxParser.ParseAllDeclarations(TokenParser).ToArray(); } catch (Exception ex) { Assembly.Log.LogError(new LogEntry( "error parsing source", "an error occurred while parsing source code.", TokenParser.PeekNoTrivia(TokenParser.CurrentPosition).TokenPeek.FullLocation)); Assembly.Log.LogException(ex); throw; } foreach (var item in decls) { try { item.Declare(state); } catch (Exception ex) { Assembly.Log.LogError(new LogEntry( "error applying declaration", "an error occurred while applying a declaration.", item.GetSourceLocation())); Assembly.Log.LogException(ex); throw; } } return(unit); }
public static Task ParseCompilationUnitsAsync(List <IProjectSourceItem> SourceItems, SyntaxAssembly Assembly, CompilationParameters Parameters) { Task[] units = new Task[SourceItems.Count]; for (int i = 0; i < units.Length; i++) { var item = SourceItems[i]; units[i] = ParseCompilationUnitAsync(item, Assembly, Parameters); } return(Task.WhenAll(units)); }
public static Task <CompilationUnit> ParseCompilationUnitAsync(IProjectSourceItem SourceItem, SyntaxAssembly Assembly, CompilationParameters Parameters) { Parameters.Log.LogEvent(new LogEntry("Status", "parsing " + SourceItem.SourceIdentifier)); return(Task.Run(() => { var code = GetSourceSafe(SourceItem, Parameters); if (code == null) { return null; } var parser = Preprocess(code, Parameters); var unit = ParseCompilationUnit(parser, Assembly); Parameters.Log.LogEvent(new LogEntry("Status", "parsed " + SourceItem.SourceIdentifier)); return unit; })); }