< Summary

Class:NanoCLang.IndentChangeToken
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\StringFormatterToken.cs
Covered lines:4
Uncovered lines:0
Coverable lines:4
Total lines:103
Line coverage:100% (4 of 4)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
get_Amount()100%1100%

File(s)

C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\StringFormatterToken.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4
 5namespace NanoCLang {
 6    /// <summary>
 7    /// Provides a superclass for string formatter tokens.
 8    /// </summary>
 9    public abstract class StringFormatterToken {
 10        /// <summary>
 11        /// Implicitly converts a string value to a token with the same <paramref name="value"/>.
 12        /// </summary>
 13        /// <param name="value">Value of the token.</param>
 14        public static implicit operator StringFormatterToken(string value) => new StringToken(value);
 15        /// <summary>
 16        /// Create a new token list that concatenates the list of tokens with the separator inbetween every two tokens.
 17        /// </summary>
 18        /// <param name="tokens">Enumeration of tokens.</param>
 19        /// <param name="separator">Separator between the output tokens.</param>
 20        /// <returns>Enumeration of tokens with <paramref name="separator"/> inbetween the <paramref name="tokens"/>.</r
 21        public static IEnumerable<StringFormatterToken> Separated(IEnumerable<StringFormatterToken> tokens, StringFormat
 22            bool first = true;
 23            foreach (var token in tokens) {
 24                if (first) first = false;
 25                else yield return separator;
 26                yield return token;
 27            }
 28        }
 29        /// <inheritdoc cref="Separated(IEnumerable{StringFormatterToken}, StringFormatterToken)"/>
 30        public static IEnumerable<StringFormatterToken> Separated(IEnumerable<StringFormatterToken> tokens, string separ
 31            => Separated(tokens, (StringFormatterToken)separator);
 32        /// <inheritdoc cref="Separated(IEnumerable{StringFormatterToken}, StringFormatterToken)"/>
 33        public static IEnumerable<StringFormatterToken> Separated<T, A>(IEnumerable<T> objs, A args, StringFormatterToke
 34            bool first = true;
 35            foreach (var obj in objs) {
 36                if (first) first = false;
 37                else if (separator is StringToken s) foreach (var tk in s.ReplaceNewLines()) yield return tk;
 38                else yield return separator;
 39                foreach (var token in obj.Tokens(args)) yield return token;
 40            }
 41        }
 42        /// <summary>
 43        /// Prints the <paramref name="inner"/> tokens indented by the <paramref name="indent"/> amount.
 44        /// </summary>
 45        /// <param name="indent">Amount of indentation.</param>
 46        /// <param name="inner">Indented block</param>
 47        /// <returns>Token enumeration that represents the indented block.</returns>
 48        public static IEnumerable<StringFormatterToken> Indented(int indent, Func<IEnumerable<StringFormatterToken>> inn
 49            yield return new IndentChangeToken(indent);
 50            foreach (var tk in inner()) yield return tk;
 51            yield return new IndentChangeToken(-indent);
 52        }
 53        /// <inheritdoc cref="Separated(IEnumerable{StringFormatterToken}, StringFormatterToken)"/>
 54        public static IEnumerable<StringFormatterToken> Separated<T, A>(IEnumerable<T> blocks, A args, string separator)
 55            => Separated(blocks, args, (StringFormatterToken)separator);
 56        /// <inheritdoc cref="Separated(IEnumerable{StringFormatterToken}, StringFormatterToken)"/>
 57        public static IEnumerable<StringFormatterToken> Separated(IEnumerable<string> strings, StringFormatterToken sepa
 58        /// <inheritdoc cref="Separated(IEnumerable{StringFormatterToken}, StringFormatterToken)"/>
 59        public static IEnumerable<StringFormatterToken> Separated(IEnumerable<string> strings, string separator) => Sepa
 60    }
 61    /// <summary>
 62    /// Provides a class for token enumerations for the string formatter <see cref="StringFormatter"/>.
 63    /// </summary>
 64    public class StringToken : StringFormatterToken {
 65        /// <summary>
 66        /// Constructs a new string token with a given <paramref name="value"/>.
 67        /// </summary>
 68        /// <param name="value">Value of the token.</param>
 69        public StringToken(string value) {
 70            Value = value;
 71        }
 72        /// <summary>
 73        /// Gets the value of the token.
 74        /// </summary>
 75        public string Value { get; }
 76        /// <summary>
 77        /// Replace newlines in the value with newline tokens.
 78        /// </summary>
 79        /// <returns>Enumeration of tokens with newlines as tokens.</returns>
 80        internal IEnumerable<StringFormatterToken> ReplaceNewLines()
 81            => Separated(Value.Split('\n', StringSplitOptions.None), new NewLineToken());
 82    }
 83    /// <summary>
 84    /// Tokens used to push the current indentation of the formatter.
 85    /// </summary>
 86    public class IndentChangeToken : StringFormatterToken {
 87        /// <summary>
 88        /// Constructs a new indent change token that increases/decreases the current indent by <paramref name="amount"/
 89        /// </summary>
 90        /// <param name="amount">Indent change amount.</param>
 35691        public IndentChangeToken(int amount) {
 17892            Amount = amount;
 17893        }
 94        /// <summary>
 95        /// The amount of indent to insert/remove.
 96        /// </summary>
 30097        public int Amount { get; }
 98    }
 99    /// <summary>
 100    /// Token used to print a new line in the formatter (recognizes formatters indent)
 101    /// </summary>
 102    public class NewLineToken : StringFormatterToken { }
 103}

Methods/Properties

.ctor(...)
get_Amount()