< Summary

Class:NanoCLang.Entities.FunctionDefinition
Assembly:NanoCLang
File(s):C:\GitLab-Runner\builds\JxAESPd8\0\chenmichael\nanoc\src\NanoCLang\Entities\FunctionDefinition.cs
Covered lines:56
Uncovered lines:12
Coverable lines:68
Total lines:114
Line coverage:82.3% (56 of 68)
Covered branches:25
Total branches:44
Branch coverage:56.8% (25 of 44)

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
.ctor(...)100%1100%
get_Body()100%1100%
get_Schema()100%1100%
WellFormed(...)66.66%687.5%
Tokens()64.28%4277.77%
Tokens()100%6100%
Equals(...)100%10%
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\FunctionDefinition.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 function definitions.
 9    /// </summary>
 10    public class FunctionDefinition : Base, IEquatable<FunctionDefinition?> {
 11        /// <summary>
 12        /// Creates a new instance of a function definition with a specific <paramref name="schema"/> and a <paramref na
 13        /// </summary>
 14        /// <param name="body">Expression body of the function.</param>
 15        /// <param name="schema">Schema of the function.</param>
 10016        public FunctionDefinition(Expression body, RawFunctionSchema schema) {
 5017            Body = body;
 5018            Schema = schema;
 5019        }
 20        /// <summary>
 21        /// Expression that the function evaluates to.
 22        /// </summary>
 11123        public Expression Body { get; }
 24        /// <summary>
 25        /// Schema of the function.
 26        /// </summary>
 21727        public RawFunctionSchema Schema { get; }
 28        /// <summary>
 29        /// Checks if the function definition is well-formed and raises an exception if it is ill-formed.
 30        /// </summary>
 31        /// <param name="phi">Environemt to check the function definition with.</param>
 32        /// <param name="name">Name of the function to be defined.</param>
 33        /// <exception cref="IllFormedException">Function definition is ill-formed.</exception>
 2134        public void WellFormed(GlobalEnvironment phi, string name) {
 2135            if (!Schema.HasWorld && Body.RequiredFunctions().Contains(name))
 036                throw new IllFormedException(this, $"Cannot infer worlds of recursive function {name}. Please specify th
 2137            var schema = Schema.Build(phi, out var links);
 38
 2139            schema.WellFormed();
 2140            var gamma = schema.GetEnvironment();
 2141            gamma.AddStructLocs(links);
 42            World inferredWorld;
 43            //try {
 2144            inferredWorld = Body.InferWorld(phi, gamma, schema.Heap);
 45            //} catch (IllFormedException e) {
 46            //    throw new IllFormedException(this, $"In function {name}: body is ill-formed!", e);
 47            //}
 2148            var world = Schema.FixWorld(inferredWorld).Build(phi);
 49
 2150            var domain = inferredWorld.Heap.Domain().Concat(schema.Heap.Domain()).Concat(world.Heap.Domain()).ToHashSet(
 4851            var h = inferredWorld.Heap.Filter(l => domain.Contains(l));
 2152            if (h != world.Heap)
 053                throw new IllFormedException(world, "Expression heap does not match schema!");
 4854            var h0 = inferredWorld.Heap.Filter(l => !domain.Contains(l));
 55            //world.WellFormed(gamma);
 2156            h0.WellFormed(gamma);
 2157        }
 58        /// <inheritdoc/>
 2059        public override IEnumerable<StringFormatterToken> Tokens(NanoCSourceFormat args) {
 2060            yield return "fun";
 2061            if (args.SpaceAfterFunKeyword) yield return " ";
 2062            yield return "(";
 2063            if (args.FunctionParamNamesInDefinition)
 20364                foreach (var tk in StringFormatterToken.Separated(Schema.Parameters.Select(i => i.Name), args.ParameterL
 2065            if (args.SpaceInEmptyArgList && Schema.Parameters.Length == 0) yield return " ";
 2066            yield return ")";
 2067            if (args.NewlineBeforeFunctionBody) {
 068                yield return new NewLineToken();
 069                if (args.IndentFunctionBodyOpenBrace) yield return new string(' ', args.FunctionBodyIndent);
 4070            } else if (args.SpaceBeforeFunctionBody) yield return " ";
 2071            yield return "{";
 365672            foreach (var tk in StringFormatterToken.Indented(args.FunctionBodyIndent, () => Body.Tokens(args).Prepend(ne
 4073            if (args.NewlineBeforeFunctionBodyCloseBrace) {
 2074                yield return new NewLineToken();
 2075                if (args.IndentFunctionBodyCloseBrace) yield return new string(' ', args.FunctionBodyIndent);
 2076            } else if (args.SpaceBeforeFunctionBodyCloseBrace) yield return " ";
 2077            yield return "}";
 2078            if (args.NewlineBeforeFunctionSchemaColon) {
 079                yield return new NewLineToken();
 080                if (args.IndentFunctionSchemaColon) yield return new string(' ', args.FunctionSchemaIndent);
 4081            } else if (args.SpaceBeforeFunctionSchemaColon) yield return " ";
 2082            yield return ":";
 2083            if (args.NewlineAfterFunctionSchemaColon) {
 084                yield return new NewLineToken();
 085                if (args.IndentFunctionSchema) yield return new string(' ', args.FunctionSchemaIndent);
 4086            } else if (args.SpaceAfterFunctionSchemaColon) yield return " ";
 669587            foreach (var tk in StringFormatterToken.Indented(args.FunctionSchemaIndent, () => Schema.Tokens(args))) yiel
 2088        }
 89        /// <inheritdoc/>
 2590        public override IEnumerable<StringFormatterToken> Tokens(CSourceFormat args) {
 2591            yield return "(";
 36392            foreach (var tk in StringFormatterToken.Separated(Schema.Parameters, args, ", ")) yield return tk;
 2593            yield return ")";
 2594            yield return " ";
 2595            yield return "{";
 2596            args.PureRequiresReturn = true;
 474197            foreach (var tk in StringFormatterToken.Indented(4, () => Body.Tokens(args).Prepend(new NewLineToken()))) yi
 2598            yield return new NewLineToken();
 2599            yield return "}";
 25100        }
 101        #region Equality checks
 102        /// <inheritdoc/>
 0103        public override bool Equals(object? obj) => Equals(obj as FunctionDefinition);
 104        /// <inheritdoc/>
 21105        public bool Equals(FunctionDefinition? other) => !(other is null) && EqualityComparer<Expression>.Default.Equals
 106        /// <inheritdoc/>
 0107        public override int GetHashCode() => HashCode.Combine(Body, Schema);
 108        /// <inheritdoc/>
 0109        public static bool operator ==(FunctionDefinition? left, FunctionDefinition? right) => EqualityComparer<Function
 110        /// <inheritdoc/>
 0111        public static bool operator !=(FunctionDefinition? left, FunctionDefinition? right) => !(left == right);
 112        #endregion
 113    }
 114}