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);
        }
예제 #2
0
        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);
        }
예제 #3
0
            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);
        }
예제 #5
0
        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);
        }
예제 #10
0
        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}'.");
                }
            }
        }
예제 #11
0
        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}'.");
            }
        }
예제 #16
0
 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);
        }