void AnalyzeBinding(Module module, Parse.Syntax.Binding bindingNode, Binding binding, CancellationToken cancel) { if (bindingNode.Body == null || !bindingNode.Body.Any()) { Unit.AddError(new AnalyzerError { ErrorNode = bindingNode, Message = string.Format(ErrorMessages.E_0014_Analyzer_EmptyBinding, bindingNode.Name.Text), }); return; } var triviaNodes = new List <Parse.Syntax.Node>(); Expression expression = null; Parse.Syntax.Literal literalNode; Parse.Syntax.Literal <BigInteger> bigIntLiteral; foreach (var node in bindingNode.Body) { if (cancel.IsCancellationRequested) { throw new OperationCanceledException(cancel); } if ((literalNode = node as Parse.Syntax.Literal) != null) { if ((bigIntLiteral = literalNode as Parse.Syntax.Literal <BigInteger>) != null) { expression = new Expressions.IntegerLiteral(bigIntLiteral.Value) { SyntaxNode = bigIntLiteral }; } else { throw new NotImplementedException(string.Format("Literals of type {0} not implemented yet.", literalNode.ValueType.Name)); } } else if (node is Parse.Syntax.Space) { triviaNodes.Add(node); } } if (expression == null) { Unit.AddError(new AnalyzerError { ErrorNode = bindingNode, Message = string.Format(ErrorMessages.E_0014_Analyzer_EmptyBinding, bindingNode.Name.Text), }); return; } foreach (var tn in triviaNodes) { expression.PostTrivia.Add(tn); } binding.Expression = expression; }
Task <Module> AnalyzeModule(Parse.Syntax.Module moduleNode, Module module, CancellationToken cancel) { var bindings = new List <Tuple <Parse.Syntax.Binding, Binding> >(); // collect module bindings var triviaNodes = new List <Parse.Syntax.Node>(); Binding curBinding = null; Parse.Syntax.Binding bindingNode = null; foreach (var node in moduleNode.Body) { if (cancel.IsCancellationRequested) { throw new OperationCanceledException(cancel); } if ((bindingNode = node as Parse.Syntax.Binding) != null) { var bindingName = new QualifiedName(module, bindingNode.Name.Text); lock (module.Bindings) { if (module.Bindings.TryGetValue(bindingName, out curBinding)) { Unit.AddError(new AnalyzerError { ErrorNode = node, Message = string.Format(ErrorMessages.E_0012_Analyzer_DuplicateBinding, bindingName.Name), }); } else { curBinding = new Binding { Parent = module, Name = bindingName, SyntaxNode = bindingNode }; bindings.Add(Tuple.Create(bindingNode, curBinding)); module.Bindings.Add(curBinding.Name, curBinding); } foreach (var tn in triviaNodes) { curBinding.PreTrivia.Add(tn); } triviaNodes.Clear(); } } else if (node is Parse.Syntax.Space) { triviaNodes.Add(node); } else { Unit.AddError(new AnalyzerError { ErrorNode = node, Message = string.Format(ErrorMessages.E_0013_Analyzer_InvalidScopeItem, ApteridError.Truncate(node.Text)), }); } } if (curBinding != null) { foreach (var tn in triviaNodes) { curBinding.PostTrivia.Add(tn); } } // analyze var tasks = bindings.Select(bb => Task.Factory.StartNew(() => AnalyzeBinding(module, bb.Item1, bb.Item2, cancel), TaskCreationOptions.AttachedToParent)); return(Task.WhenAll(tasks).ContinueWith(t => module)); }