/// <summary>
 /// Try produce indented string for command line.
 /// </summary>
 /// <param name="text">command line</param>
 /// <param name="itw">indenting text writer</param>
 /// <returns>true if we was able to produce indented string without any problem</returns>
 private static bool TryProduceIndentString(string text, IndentedTextWriter itw)
 {
     string[] tokens;
     if (!CmdParser.LexString(text, out tokens))
     {
         return(false);
     }
     for (var i = 0; i < tokens.Length;)
     {
         //We in last token, or next token don't equal to '='.
         if (i + 1 == tokens.Length || tokens[i + 1] != "=")
         {
             itw.WriteLine(tokens[i++]);
         }
         else
         {
             itw.Write(tokens[i++]);
             itw.Write(tokens[i++]);
             // We have something like "name =" which is invalid.
             if (i >= tokens.Length)
             {
                 return(false);
             }
             //We have something like "name = value {options}".
             if (i + 1 < tokens.Length && tokens[i + 1].StartsWith("{") && tokens[i + 1].EndsWith("}"))
             {
                 itw.Write(tokens[i++]);
                 itw.WriteLine("{");
                 using (itw.Nest())
                 {
                     var str = CmdLexer.UnquoteValue(tokens[i++]);
                     // REVIEW: Probably we shouldn't give up if we have problem within one of the token
                     //and we need return partially indented string.
                     bool success = TryProduceIndentString(str, itw);
                     if (!success)
                     {
                         return(false);
                     }
                 }
                 itw.WriteLine("}");
             }
             //We have something like "name = value".
             else
             {
                 itw.WriteLine(tokens[i++]);
             }
         }
     }
     return(true);
 }
示例#2
0
        private static void ParseCore(string str, out string kind, out string args)
        {
            kind = args = null;
            if (string.IsNullOrWhiteSpace(str))
            {
                return;
            }
            str = str.Trim();
            int ich = str.IndexOf('{');

            if (ich < 0)
            {
                kind = str;
                return;
            }
            if (ich == 0 || str[str.Length - 1] != '}')
            {
                throw Contracts.Except("Invalid SubComponent string: mismatched braces, or empty component name.");
            }

            kind = str.Substring(0, ich);
            args = CmdLexer.UnquoteValue(str.Substring(ich));
        }