private MutableProjectTree ReadNextProjectItem(MutableProjectTree current) { if (!TryReadNewLine()) { return(null); } MutableProjectTree parent = current; int previousIndentLevel; int indent = ReadIndentLevel(out previousIndentLevel); while (indent <= previousIndentLevel) { parent = parent.Parent; indent++; } if (parent == null) #pragma warning disable IDE0016 // Use 'throw' expression { throw _tokenizer.FormatException(ProjectTreeFormatError.MultipleRoots, "Encountered another project root, when tree can only have one."); } #pragma warning restore IDE0016 // Use 'throw' expression var tree = ReadProjectItem(); tree.Parent = parent; parent.Children.Add(tree); return(tree); }
private MutableProjectTree?ReadNextProjectItem(MutableProjectTree current) { if (!TryReadNewLine()) { return(null); } MutableProjectTree?parent = current; int indent = ReadIndentLevel(out int previousIndentLevel); while (indent <= previousIndentLevel) { parent = parent?.Parent; indent++; } if (parent == null) { throw FormatException(ProjectTreeFormatError.MultipleRoots, "Encountered another project root, when tree can only have one."); } MutableProjectTree tree = ReadProjectItem(); tree.Parent = parent; parent.Children.Add(tree); return(tree); }
public MutableProjectTree BuildProjectTree() { // MutableProjectItemTree acts as a builder for both MutableProjectItemTree and MutableProjectTree // // Once we've finished building, return either ourselves if we are already are a MutableProjectItemTree // otherwise, copy ourselves to a MutableProjectTree. if (!string.IsNullOrEmpty(Item.ItemName) || !string.IsNullOrEmpty(Item.ItemType)) { return(this); } var tree = new MutableProjectTree(); foreach (MutableProjectTree child in Children) { tree.Children.Add(child); } tree.Caption = Caption; tree.Flags = Flags; tree.FilePath = FilePath; tree.Visible = Visible; tree.Parent = Parent; tree.Icon = Icon; tree.SubType = SubType; tree.ExpandedIcon = ExpandedIcon; tree.DisplayOrder = DisplayOrder; return(tree); }
private void ReadIcon(MutableProjectTree tree, bool expandedIcon) { // Parses '{1B5CF1ED-9525-42B4-85F0-2CB50530ECA9 1}' Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValueBlock); tokenizer.Skip(TokenType.LeftBrace); // Empty icon if (tokenizer.SkipIf(TokenType.RightBrace)) { return; } var moniker = ReadProjectImageMoniker(); if (expandedIcon) { tree.ExpandedIcon = moniker; } else { tree.Icon = moniker; } tokenizer.Skip(TokenType.RightBrace); }
private void ReadDisplayOrder(MutableProjectTree tree) { // Parses ': 1` Tokenizer tokenizer = Tokenizer(Delimiters.PropertyValue); var identifier = tokenizer.ReadIdentifier(IdentifierParseOptions.None); tree.DisplayOrder = int.Parse(identifier); }
private void ReadFlag(MutableProjectTree tree) { // Parses 'AppDesigner' in '{AppDesigner Folder}' Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValue); string flag = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); tree.AddFlag(flag); }
private MutableProjectTree ReadProjectItem() { MutableProjectTree tree = new MutableProjectTree(); ReadProjectItemProperties(tree); return(tree); }
public IProjectTree Parse() { MutableProjectTree root = ReadProjectRoot(); _tokenizer.Close(); return(root); }
private MutableProjectTree ReadProjectRoot() { // We always start with the root, with zero indent MutableProjectTree root = ReadProjectItem(); MutableProjectTree current = root; do { current = ReadNextProjectItem(current); } while (current != null); return(root); }
private void ReadFields(MutableProjectTree tree) { // Parses ', FilePath: "C:\Temp\Foo"' // This section is optional while (_tokenizer.SkipIf(TokenType.Comma)) { _tokenizer.Skip(TokenType.WhiteSpace); Tokenizer tokenizer = Tokenizer(Delimiters.PropertyName); string fieldName = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); switch (fieldName) { case "FilePath": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadFilePath(tree); break; case "Icon": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadIcon(tree, expandedIcon: false); break; case "ExpandedIcon": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadIcon(tree, expandedIcon: true); break; case "DisplayOrder": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadDisplayOrder(tree); break; case "ItemName": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadItemName(tree); break; default: throw _tokenizer.FormatException(ProjectTreeFormatError.UnrecognizedPropertyName, $"Expected 'FilePath', 'Icon' or 'ExpandedIcon', but encountered '{fieldName}'."); } } }
private MutableProjectTree ReadProjectItem() { var tree = new MutableProjectTree(); ReadProjectItemProperties(tree); if (string.IsNullOrWhiteSpace(tree.ItemName)) { return(tree); } else { // Because we have an evaluated include value (ItemName), this means we have a project item tree. return(tree.ToMutableProjectItemTree()); } }
private void ReadCapabilities(MutableProjectTree tree) { // Parse '{ProjectRoot Folder}' Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValueBlock); tokenizer.Skip(TokenType.LeftBrace); // Empty flags if (tokenizer.SkipIf(TokenType.RightBrace)) { return; } do { ReadFlag(tree); }while (tokenizer.SkipIf(TokenType.WhiteSpace)); tokenizer.Skip(TokenType.RightBrace); }
private void ReadVisibility(MutableProjectTree tree) { // Parse 'visible' in 'visibility:visible' or 'invisible' in 'visibility:invisible" Tokenizer tokenizer = Tokenizer(Delimiters.PropertyValue); string visibility = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); switch (visibility) { case "visible": tree.Visible = true; break; case "invisible": tree.Visible = false; break; default: throw _tokenizer.FormatException(ProjectTreeFormatError.UnrecognizedPropertyValue, $"Expected 'visible' or 'invisible', but encountered '{visibility}'."); } }
private void ReadProperties(MutableProjectTree tree) { // Parses "(visibility: visible, flags: {ProjectRoot})" // Properties section is optional if (!_tokenizer.SkipIf(TokenType.LeftParenthesis)) { return; } // Empty properties if (_tokenizer.SkipIf(TokenType.RightParenthesis)) { return; } ReadProperty(tree); while (_tokenizer.SkipIf(TokenType.Comma)) { _tokenizer.Skip(TokenType.WhiteSpace); ReadProperty(tree); } _tokenizer.Skip(TokenType.RightParenthesis); }
private void ReadProperty(MutableProjectTree tree) { Tokenizer tokenizer = Tokenizer(Delimiters.PropertyName); string propertyName = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); switch (propertyName) { case "visibility": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadVisibility(tree); break; case "flags": tokenizer.Skip(TokenType.Colon); tokenizer.Skip(TokenType.WhiteSpace); ReadCapabilities(tree); break; default: throw _tokenizer.FormatException(ProjectTreeFormatError.UnrecognizedPropertyName, $"Expected 'visibility' or 'flags', but encountered '{propertyName}'."); } }
private void ReadItemName(MutableProjectTree tree) { // Parses ': "test.fs"' tree.ItemName = ReadQuotedPropertyValue(); }
public SubTypeRule(MutableProjectTree tree) { _tree = tree; }
private void ReadProjectItemProperties(MutableProjectTree tree) { // Parse "Root (visibility: visible, flags: {ProjectRoot}), FilePath: "C:\My Project\MyFile.txt", Icon: {1B5CF1ED-9525-42B4-85F0-2CB50530ECA9 1}, ExpandedIcon: {1B5CF1ED-9525-42B4-85F0-2CB50530ECA9 1} ReadCaption(tree); ReadProperties(tree); ReadFields(tree); }
private void ReadFilePath(MutableProjectTree tree) { // Parses ': "C:\Temp\Foo"' tree.FilePath = ReadQuotedPropertyValue(); }
private void ReadCaption(MutableProjectTree tree) { Tokenizer tokenizer = Tokenizer(Delimiters.Caption); tree.Caption = tokenizer.ReadIdentifier(IdentifierParseOptions.Required); }