< Summary

Class:NanoCLang.Entities.WriteExpression
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\Expression\PointerWriteExpression.cs
Covered lines:3
Uncovered lines:0
Coverable lines:3
Total lines:93
Line coverage:100% (3 of 3)
Covered branches:1
Total branches:2
Branch coverage:50% (1 of 2)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
get_BaseWrite()100%1100%
Tokens(...)50%2100%

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>
 1813        public virtual PointerWriteExpression? BaseWrite { get; protected set; }
 14        /// <inheritdoc/>
 15        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args)
 816            => (BaseWrite ?? throw new InvalidOperationException("Write Expression must be fixed when translating!"))
 817            .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>
 28        public PointerWriteExpression(PureExpression pointer, PureExpression value) {
 29            Pointer = pointer;
 30            Value = value;
 31        }
 32        /// <summary>
 33        /// Pointer that is written to.
 34        /// </summary>
 35        public PureExpression Pointer { get; }
 36        /// <summary>
 37        /// Value that is written to the <see cref="Pointer"/>.
 38        /// </summary>
 39        public PureExpression Value { get; }
 40        /// <inheritdoc/>
 41        public override PointerWriteExpression? BaseWrite { get => this; protected set => throw new InvalidOperationExce
 42        /// <inheritdoc/>
 43        protected override World DoInferWorld(GlobalEnvironment phi, LocalEnvironment gamma, Heap heap) {
 44            var ptrType = Pointer.InferType(gamma);
 45            _ = PointerReadExpression.GetPointerValueType(ptrType, gamma, heap);
 46            if (!(ptrType.BaseType is ReferenceType ptrRef))
 47                throw new IllFormedException(Pointer, "Pointer is not a reference!");
 48            var newHeap = heap.StrongUpdate(ptrRef, Value, out var tau);
 49            Value.CheckType(gamma, tau);
 50            return new World(IntegerType.Void, newHeap);
 51        }
 52        /// <inheritdoc/>
 53        public override IEnumerable<StringFormatterToken> Tokens(NanoCSourceFormat args) {
 54            yield return "*";
 55            if (args.SpaceAfterDerefOperator) yield return " ";
 56            foreach (var tk in Pointer.Tokens(args)) yield return tk;
 57            if (args.SpaceBeforeBindingAssignment) yield return " ";
 58            yield return "=";
 59            if (args.SpaceAfterBindingAssignment) yield return " ";
 60            foreach (var tk in Value.Tokens(args)) yield return tk;
 61        }
 62        /// <inheritdoc/>
 63        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args) {
 64            var writtenType = Value.FixedType;
 65            if (writtenType is null) throw new InvalidOperationException("Expression must have fixed world when translat
 66            yield return "*";
 67            if (args.SpaceAfterDerefOperator) yield return " ";
 68            yield return "((";
 69            foreach (var tk in writtenType.Tokens(args)) yield return tk;
 70            yield return "*)";
 71            foreach (var tk in Pointer.Tokens(args)) yield return tk;
 72            yield return ")";
 73            if (args.SpaceBeforeBindingAssignment) yield return " ";
 74            yield return "=";
 75            if (args.SpaceAfterBindingAssignment) yield return " ";
 76            foreach (var tk in Value.Tokens(args)) yield return tk;
 77        }
 78        /// <inheritdoc/>
 79        public override IEnumerable<string> RequiredFunctions() { yield break; }
 80        #region Equality checks
 81        /// <inheritdoc/>
 82        public override bool Equals(object? obj) => Equals(obj as PointerWriteExpression);
 83        /// <inheritdoc/>
 84        public bool Equals(PointerWriteExpression? other) => !(other is null) && EqualityComparer<PureExpression>.Defaul
 85        /// <inheritdoc/>
 86        public override int GetHashCode() => HashCode.Combine(Pointer, Value);
 87        /// <inheritdoc/>
 88        public static bool operator ==(PointerWriteExpression? left, PointerWriteExpression? right) => EqualityComparer<
 89        /// <inheritdoc/>
 90        public static bool operator !=(PointerWriteExpression? left, PointerWriteExpression? right) => !(left == right);
 91        #endregion
 92    }
 93}

Methods/Properties

get_BaseWrite()
Tokens(...)