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 string ReadQuotedPropertyValue()
        {   // Parses '"C:\Temp"'
            Tokenizer tokenizer = Tokenizer(Delimiters.QuotedPropertyValue);

            tokenizer.Skip(TokenType.Quote);

            string value = tokenizer.ReadIdentifier(IdentifierParseOptions.None);

            tokenizer.Skip(TokenType.Quote);

            return(value);
        }
        private int ReadIndentLevel(out int previousIndentLevel)
        {
            // Attempts to read the indent level of the current project item
            //
            // Root              <--- IndentLevel: 0
            //     Parent        <--- IndentLevel: 1
            //         Child     <--- IndentLevel: 2

            previousIndentLevel = _indentLevel;
            int indentLevel = 0;

            while (_tokenizer.Peek() == TokenType.WhiteSpace)
            {
                _tokenizer.Skip(TokenType.WhiteSpace);
                _tokenizer.Skip(TokenType.WhiteSpace);
                _tokenizer.Skip(TokenType.WhiteSpace);
                _tokenizer.Skip(TokenType.WhiteSpace);

                indentLevel++;
            }

            if (indentLevel > previousIndentLevel + 1)
            {
                throw _tokenizer.FormatException(ProjectTreeFormatError.IndentTooManyLevels, "Project item has been indented too many levels");
            }

            return(_indentLevel = indentLevel);
        }
Пример #4
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}'.");
                }
            }
        }
        private ProjectImageMoniker ReadProjectImageMoniker()
        {
            Tokenizer tokenizer = Tokenizer(Delimiters.BracedPropertyValue);

            string guidAsString = tokenizer.ReadIdentifier(IdentifierParseOptions.Required);

            Guid guid;

            if (!Guid.TryParseExact(guidAsString, "D", out guid))
            {
                throw _tokenizer.FormatException(ProjectTreeFormatError.GuidExpected, $"Expected GUID, but encountered '{guidAsString}'");
            }

            tokenizer.Skip(TokenType.WhiteSpace);

            string idAsString = tokenizer.ReadIdentifier(IdentifierParseOptions.Required);

            int id;

            if (!int.TryParse(idAsString, out id))
            {
                throw _tokenizer.FormatException(ProjectTreeFormatError.IntegerExpected, $"Expected integer, but encountered '{idAsString}'");
            }

            return(new ProjectImageMoniker(guid, id));
        }
        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 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}'.");
            }
        }