NTP Analyzer  0.8.2
Analyze the operation of time servers
SummariesSyntaxNode.cs
Go to the documentation of this file.
1 //
2 // Copyright (c) 2013-2017 Carsten Sonne Larsen <cs@innolan.net>
3 //
4 // Permission is hereby granted, free of charge, to any person obtaining a copy
5 // of this software and associated documentation files (the "Software"), to deal
6 // in the Software without restriction, including without limitation the rights
7 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 // copies of the Software, and to permit persons to whom the Software is
9 // furnished to do so, subject to the following conditions:
10 //
11 // The above copyright notice and this permission notice shall be included in
12 // all copies or substantial portions of the Software.
13 //
14 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20 // THE SOFTWARE.
21 
22 using System.Collections.Generic;
23 using System.Linq;
26 using Ntp.Analyzer.Config.Table;
27 
28 namespace Ntp.Analyzer.Config.Syntax
29 {
30  public sealed class SummariesSyntaxNode : SyntaxNode<SummaryCollection>
31  {
32  public SummariesSyntaxNode(string name, int line)
33  : base(Symbol.KeywordSummaries, name, line, true)
34  {
35  pages = new List<PeerSummaryPageSyntaxNode>();
36  }
37 
38  private readonly List<PeerSummaryPageSyntaxNode> pages;
39 
40  protected override SummaryCollection InternalCompile()
41  {
42  return new SummaryCollection(Name, pages.Select(p => p.Compile()));
43  }
44 
45  protected override void InternalResolve(SymbolTable table)
46  {
47  pages.AddRange(
48  Nodes.
49  Where(n => n.Symbol == Symbol.KeywordPeerSummaryPage).
50  Cast<StringSettingNode>().
51  Select(page => table.Lookup(page.Value)).
52  Cast<PeerSummaryPageSyntaxNode>()
53  );
54  }
55 
56  protected override void ValidateMandatories()
57  {
58  CheckAllIsPresent(new List<Symbol> {Symbol.KeywordPeerSummaryPage});
59  }
60 
61  protected override void ValidateReferences(SymbolTable table)
62  {
63  string keyword = Keyword.Find(Symbol.KeywordSummaries).Name;
64  string pageKeyword = Keyword.Find(Symbol.KeywordPeerSummaryPage).Name;
65  var pageNames = Nodes.Where(n => n.Symbol == Symbol.KeywordPeerSummaryPage).Cast<StringSettingNode>();
66 
67  foreach (var page in pageNames)
68  {
69  var reference = table.Lookup(page.Value);
70  if (reference == null)
71  {
72  AddReferenceNameError(page, keyword, page.Value);
73  }
74  else if (!(reference is PeerSummaryPageSyntaxNode))
75  {
76  AddReferenceTypeError(page, keyword, pageKeyword, page.Value);
77  }
78  }
79  }
80 
81  protected override void ValidateTypes()
82  {
83  CheckTypeIs<StringSettingNode>(Symbol.KeywordPeerSummaryPage);
84  }
85  }
86 }
readonly List< PeerSummaryPageSyntaxNode > pages
override void ValidateReferences(SymbolTable table)
static Keyword Find(Symbol symbol)
Definition: Keyword.cs:216
override void InternalResolve(SymbolTable table)
override void ValidateMandatories()
Override to validates the mandatory types in this syntax node.
ISyntaxNode Lookup(string name)
Definition: SymbolTable.cs:41
override void ValidateTypes()
Override to validates the types in this syntax node.