< Summary

Class:NanoCLang.Entities.BindingExpression
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\Expression\BindingExpression.cs
Covered lines:48
Uncovered lines:3
Coverable lines:51
Total lines:89
Line coverage:94.1% (48 of 51)
Covered branches:26
Total branches:32
Branch coverage:81.2% (26 of 32)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
get_Name()100%1100%
get_Expression()100%1100%
get_Next()100%1100%
DoInferWorld(...)100%1100%
Tokens()91.66%12100%
Tokens()85.71%14100%
RequiredFunctions()100%1100%
Equals(...)100%1100%
Equals(...)50%6100%
GetHashCode()100%10%
op_Equality(...)100%10%
op_Inequality(...)100%10%

File(s)

C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\Expression\BindingExpression.cs

#LineLine coverage
 1using NanoCLang.Environemnts;
 2using System;
 3using System.Collections.Generic;
 4using System.Linq;
 5
 6namespace NanoCLang.Entities {
 7    /// <summary>
 8    /// Provides a class for binding expressions.
 9    /// </summary>
 10    public class BindingExpression : Expression, IEquatable<BindingExpression?> {
 11        /// <summary>
 12        /// Creates a new instance of a binding expression that binds the <paramref name="expression"/> to the <paramref
 13        /// </summary>
 14        /// <param name="name">Name of the binding.</param>
 15        /// <param name="expression">Expression that is bound to the <paramref name="name"/>.</param>
 16        /// <param name="next">Expression that is evaluated with the binding.</param>
 10617        public BindingExpression(string name, Expression expression, Expression next) {
 5318            Name = name;
 5319            Expression = expression;
 5320            Next = next;
 5321        }
 22        /// <summary>
 23        /// Name that the <see cref="Expression"/> is bound to.
 24        /// </summary>
 12725        public string Name { get; }
 26        /// <summary>
 27        /// Expression that is bound to the <see cref="Name"/>.
 28        /// </summary>
 16129        public Expression Expression { get; }
 30        /// <summary>
 31        /// Expression that is evaluated with the binding.
 32        /// </summary>
 13733        public Expression Next { get; }
 34        /// <inheritdoc/>
 2635        protected override World DoInferWorld(GlobalEnvironment phi, LocalEnvironment gamma, Heap heap) {
 2636            VerbConsole.WriteLine(VerbosityLevel.Default, "T-Let");
 2637            var expressionWorld = Expression.InferWorld(phi, gamma, heap);
 2638            return gamma.With(Name, expressionWorld.Type,
 5239                gamma => Next.InferWorld(phi, gamma, expressionWorld.Heap));
 2440        }
 41        /// <inheritdoc/>
 2542        public override IEnumerable<StringFormatterToken> Tokens(NanoCSourceFormat args) {
 2543            yield return "let";
 2544            yield return " ";
 2545            yield return Name;
 5046            if (args.SpaceBeforeBindingAssignment) yield return " ";
 2547            yield return "=";
 5048            if (args.SpaceAfterBindingAssignment) yield return " ";
 60049            foreach (var tk in Expression.Tokens(args)) yield return tk;
 2550            yield return " ";
 2551            yield return "in";
 2552            if (args.NewlinesAfterBindingExpression <= 0) yield return " ";
 12553            else for (int i = 0; i < args.NewlinesAfterBindingExpression; i++) yield return new NewLineToken();
 401754            foreach (var tk in Next.Tokens(args)) yield return tk;
 2555        }
 56        /// <inheritdoc/>
 2457        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args) {
 2458            var boundType = Expression.FixedWorld?.Type;
 2459            if (boundType is null) throw new InvalidOperationException("Expression must have fixed world when translatin
 19260            foreach (var tk in boundType.Tokens(args)) yield return tk;
 2461            yield return " ";
 2462            yield return Name;
 4863            if (args.SpaceBeforeBindingAssignment) yield return " ";
 2464            yield return "=";
 4865            if (args.SpaceAfterBindingAssignment) yield return " ";
 2466            args.PureRequiresReturn = false;
 86167            foreach (var tk in Expression.Tokens(args)) yield return tk;
 2468            yield return ";";
 2469            yield return new NewLineToken();
 2470            args.PureRequiresReturn = true;
 503171            foreach (var tk in Next.Tokens(args)) yield return tk;
 2472            yield return ";";
 2473        }
 74        /// <inheritdoc/>
 1075        public override IEnumerable<string> RequiredFunctions() => Expression.RequiredFunctions().Concat(Next.RequiredFu
 76        #region Equality checks
 77        /// <inheritdoc/>
 2678        public override bool Equals(object? obj) => Equals(obj as BindingExpression);
 79        /// <inheritdoc/>
 2680        public bool Equals(BindingExpression? other) => !(other is null) && Name == other.Name && EqualityComparer<Expre
 81        /// <inheritdoc/>
 082        public override int GetHashCode() => HashCode.Combine(Name, Expression, Next);
 83        /// <inheritdoc/>
 084        public static bool operator ==(BindingExpression? left, BindingExpression? right) => EqualityComparer<BindingExp
 85        /// <inheritdoc/>
 086        public static bool operator !=(BindingExpression? left, BindingExpression? right) => !(left == right);
 87        #endregion
 88    }
 89}