< Summary

Class:NanoCLang.Entities.PointerWriteExpression
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\Expression\PointerWriteExpression.cs
Covered lines:41
Uncovered lines:5
Coverable lines:46
Total lines:93
Line coverage:89.1% (41 of 46)
Covered branches:24
Total branches:30
Branch coverage:80% (24 of 30)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
get_Pointer()100%1100%
get_Value()100%1100%
get_BaseWrite()100%10%
DoInferWorld(...)50%288.88%
Tokens()90%10100%
Tokens()85.71%14100%
RequiredFunctions()100%1100%
Equals(...)100%1100%
Equals(...)50%4100%
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\PointerWriteExpression.cs

#LineLine coverage
 1using NanoCLang.Environemnts;
 2using System;
 3using System.Collections.Generic;
 4
 5namespace NanoCLang.Entities {
 6    /// <summary>
 7    /// Provide an abstract base class for all writing expressions.
 8    /// </summary>
 9    public abstract class WriteExpression : Expression {
 10        /// <summary>
 11        /// Equivalent read expression that is fixed during type inference.
 12        /// </summary>
 13        public virtual PointerWriteExpression? BaseWrite { get; protected set; }
 14        /// <inheritdoc/>
 15        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args)
 16            => (BaseWrite ?? throw new InvalidOperationException("Write Expression must be fixed when translating!"))
 17            .Tokens(args);
 18    }
 19    /// <summary>
 20    /// Provides a class for pointer write expressions.
 21    /// </summary>
 22    public class PointerWriteExpression : WriteExpression, IEquatable<PointerWriteExpression?> {
 23        /// <summary>
 24        /// Creates a new instance of a pointer write expression that writes the <paramref name="value"/> to the <paramr
 25        /// </summary>
 26        /// <param name="pointer">Pointer to write to.</param>
 27        /// <param name="value">Value that shall be written.</param>
 5428        public PointerWriteExpression(PureExpression pointer, PureExpression value) {
 2729            Pointer = pointer;
 2730            Value = value;
 2731        }
 32        /// <summary>
 33        /// Pointer that is written to.
 34        /// </summary>
 5535        public PureExpression Pointer { get; }
 36        /// <summary>
 37        /// Value that is written to the <see cref="Pointer"/>.
 38        /// </summary>
 8539        public PureExpression Value { get; }
 40        /// <inheritdoc/>
 041        public override PointerWriteExpression? BaseWrite { get => this; protected set => throw new InvalidOperationExce
 42        /// <inheritdoc/>
 1843        protected override World DoInferWorld(GlobalEnvironment phi, LocalEnvironment gamma, Heap heap) {
 1844            var ptrType = Pointer.InferType(gamma);
 1845            _ = PointerReadExpression.GetPointerValueType(ptrType, gamma, heap);
 1746            if (!(ptrType.BaseType is ReferenceType ptrRef))
 047                throw new IllFormedException(Pointer, "Pointer is not a reference!");
 1748            var newHeap = heap.StrongUpdate(ptrRef, Value, out var tau);
 1749            Value.CheckType(gamma, tau);
 1750            return new World(IntegerType.Void, newHeap);
 1751        }
 52        /// <inheritdoc/>
 753        public override IEnumerable<StringFormatterToken> Tokens(NanoCSourceFormat args) {
 754            yield return "*";
 755            if (args.SpaceAfterDerefOperator) yield return " ";
 12656            foreach (var tk in Pointer.Tokens(args)) yield return tk;
 1457            if (args.SpaceBeforeBindingAssignment) yield return " ";
 758            yield return "=";
 1459            if (args.SpaceAfterBindingAssignment) yield return " ";
 5460            foreach (var tk in Value.Tokens(args)) yield return tk;
 761        }
 62        /// <inheritdoc/>
 1463        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args) {
 1464            var writtenType = Value.FixedType;
 1465            if (writtenType is null) throw new InvalidOperationException("Expression must have fixed world when translat
 1466            yield return "*";
 1467            if (args.SpaceAfterDerefOperator) yield return " ";
 1468            yield return "((";
 9369            foreach (var tk in writtenType.Tokens(args)) yield return tk;
 1470            yield return "*)";
 40271            foreach (var tk in Pointer.Tokens(args)) yield return tk;
 1472            yield return ")";
 2873            if (args.SpaceBeforeBindingAssignment) yield return " ";
 1474            yield return "=";
 2875            if (args.SpaceAfterBindingAssignment) yield return " ";
 12676            foreach (var tk in Value.Tokens(args)) yield return tk;
 1477        }
 78        /// <inheritdoc/>
 279        public override IEnumerable<string> RequiredFunctions() { yield break; }
 80        #region Equality checks
 81        /// <inheritdoc/>
 882        public override bool Equals(object? obj) => Equals(obj as PointerWriteExpression);
 83        /// <inheritdoc/>
 884        public bool Equals(PointerWriteExpression? other) => !(other is null) && EqualityComparer<PureExpression>.Defaul
 85        /// <inheritdoc/>
 086        public override int GetHashCode() => HashCode.Combine(Pointer, Value);
 87        /// <inheritdoc/>
 088        public static bool operator ==(PointerWriteExpression? left, PointerWriteExpression? right) => EqualityComparer<
 89        /// <inheritdoc/>
 090        public static bool operator !=(PointerWriteExpression? left, PointerWriteExpression? right) => !(left == right);
 91        #endregion
 92    }
 93}