< Summary

Class:NanoCLang.Entities.ArrayWriteExpression
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\Expression\ArrayWriteExpression.cs
Covered lines:32
Uncovered lines:3
Coverable lines:35
Total lines:78
Line coverage:91.4% (32 of 35)
Covered branches:13
Total branches:14
Branch coverage:92.8% (13 of 14)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
get_Array()100%1100%
get_Offset()100%1100%
get_Value()100%1100%
DoInferWorld(...)100%1100%
GetArrayPointer(...)100%2100%
Tokens()100%10100%
RequiredFunctions()100%1100%
Equals(...)100%1100%
Equals(...)50%2100%
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\ArrayWriteExpression.cs

#LineLine coverage
 1using NanoCLang.Environemnts;
 2using System;
 3using System.Collections.Generic;
 4
 5namespace NanoCLang.Entities {
 6    /// <summary>
 7    /// Provides a class for array write expressions.
 8    /// </summary>
 9    public class ArrayWriteExpression : WriteExpression, IEquatable<ArrayWriteExpression?> {
 10        /// <summary>
 11        /// Creates a new instance of a array write expression that reads the value of the <paramref name="array"/>.
 12        /// </summary>
 13        /// <param name="array">Array to write to.</param>
 14        /// <param name="offset">Offset in the array to access.</param>
 15        /// <param name="value">Value to write to the array.</param>
 2016        public ArrayWriteExpression(PureExpression array, PureExpression offset, PureExpression value) {
 1017            Array = array;
 1018            Offset = offset;
 1019            Value = value;
 1020        }
 21        /// <summary>
 22        /// Array that is written to.
 23        /// </summary>
 1824        public PureExpression Array { get; }
 25        /// <summary>
 26        /// Offset in the array to access.
 27        /// </summary>
 1028        public PureExpression Offset { get; }
 29        /// <summary>
 30        /// Value that is written to the array.
 31        /// </summary>
 932        public PureExpression Value { get; }
 33        /// <inheritdoc/>
 634        protected override World DoInferWorld(GlobalEnvironment phi, LocalEnvironment gamma, Heap heap) {
 635            VerbConsole.WriteLine(VerbosityLevel.Default, "T-ArrWrite");
 636            return (BaseWrite = new PointerWriteExpression(GetArrayPointer(gamma, Array, Offset), Value))
 637                .InferWorld(phi, gamma, heap);
 538        }
 39        /// <summary>
 40        /// Gets a properly offset pointer to the array, can also be used to offset structure pointers manually, so no c
 41        /// </summary>
 42        /// <param name="gamma">Local environment that contains type of the array value.</param>
 43        /// <param name="array">Pointer to the memory block.</param>
 44        /// <param name="offset">Offset from that <paramref name="array"/> pointer.</param>
 45        /// <returns>Offset Pointer</returns>
 1046        internal static PureExpression GetArrayPointer(LocalEnvironment gamma, PureExpression array, PureExpression offs
 1047            var type = array.InferType(gamma);
 1048            if (!(type.BaseType is ReferenceType))
 249                throw new IllFormedException(array, $"Cannot perform pointer access on non-reference expression!");
 850            return array + offset;
 851        }
 52        /// <inheritdoc/>
 453        public override IEnumerable<StringFormatterToken> Tokens(NanoCSourceFormat args) {
 2454            foreach (var tk in Array.Tokens(args)) yield return tk;
 455            yield return "[";
 3656            foreach (var tk in Offset.Tokens(args)) yield return tk;
 457            yield return "]";
 858            if (args.SpaceBeforeBindingAssignment) yield return " ";
 459            yield return "=";
 860            if (args.SpaceAfterBindingAssignment) yield return " ";
 3661            foreach (var tk in Value.Tokens(args)) yield return tk;
 462        }
 63        /// <inheritdoc/>
 464        public override IEnumerable<string> RequiredFunctions() { yield break; }
 65        #region Equality checks
 66        /// <inheritdoc/>
 467        public override bool Equals(object? obj) => Equals(obj as ArrayWriteExpression);
 68        /// <inheritdoc/>
 469        public bool Equals(ArrayWriteExpression? other) => !(other is null) && EqualityComparer<PureExpression>.Default.
 70        /// <inheritdoc/>
 071        public override int GetHashCode() => HashCode.Combine(Array);
 72        /// <inheritdoc/>
 073        public static bool operator ==(ArrayWriteExpression? left, ArrayWriteExpression? right) => EqualityComparer<Arra
 74        /// <inheritdoc/>
 075        public static bool operator !=(ArrayWriteExpression? left, ArrayWriteExpression? right) => !(left == right);
 76        #endregion
 77    }
 78}