예제 #1
0
            /// <summary>
            /// Removes the given item from the collection
            /// </summary>
            /// <returns>True, if the item was removed, otherwise False</returns>
            /// <param name="item">The item that should be removed</param>
            public override bool Remove(IModelElement item)
            {
                IValueToAlias valueToAliasItem = item.As <IValueToAlias>();

                if (((valueToAliasItem != null) &&
                     this._parent.Values.Remove(valueToAliasItem)))
                {
                    return(true);
                }
                ICommand commandItem = item.As <ICommand>();

                if (((commandItem != null) &&
                     this._parent.Commands.Remove(commandItem)))
                {
                    return(true);
                }
                IDiscrete discreteItem = item.As <IDiscrete>();

                if (((discreteItem != null) &&
                     this._parent.Discretes.Remove(discreteItem)))
                {
                    return(true);
                }
                return(false);
            }
        private bool CheckNoCycle(IClass node, out IDictionary <Number, IDiscrete> combinedDiscreteNumericValueList)
        {
            bool Success = true;

            combinedDiscreteNumericValueList = new Dictionary <Number, IDiscrete>();

            foreach (KeyValuePair <IFeatureName, IExpression> Entry in node.DiscreteWithValueTable)
            {
                Debug.Assert(node.DiscreteTable.ContainsKey(Entry.Key));
                IDiscrete DiscreteItem = node.DiscreteTable[Entry.Key];

                IExpression       NumericValue       = (IExpression)DiscreteItem.NumericValue.Item;
                ILanguageConstant ExpressionConstant = Expression.FinalConstant(NumericValue);

                if (ExpressionConstant is INumberLanguageConstant AsNumberLanguageConstant && AsNumberLanguageConstant.IsValueKnown)
                {
                    Number NumberConstant = AsNumberLanguageConstant.Value;

                    if (combinedDiscreteNumericValueList.ContainsKey(NumberConstant))
                    {
                        AddSourceError(new ErrorMultipleIdenticalDiscrete(DiscreteItem, NumberConstant));
                        Success = false;
                    }
                    else
                    {
                        combinedDiscreteNumericValueList.Add(AsNumberLanguageConstant.Value, DiscreteItem);
                    }
                }
        /// <summary>
        /// Checks for errors before applying a rule.
        /// </summary>
        /// <param name="node">The node instance to check.</param>
        /// <param name="dataList">Optional data collected during inspection of sources.</param>
        /// <param name="data">Private data to give to Apply() upon return.</param>
        /// <returns>True if an error occured.</returns>
        public override bool CheckConsistency(IClass node, IDictionary <ISourceTemplate, object> dataList, out object data)
        {
            bool Success = true;

            data = null;

            Debug.Assert(node.LocalDiscreteTable.IsSealed);
            ISealableDictionary <IFeatureName, IDiscrete> MergedDiscreteTable = node.LocalDiscreteTable.CloneUnsealed();

            foreach (IInheritance Inheritance in node.InheritanceList)
            {
                Debug.Assert(Inheritance.ResolvedType.IsAssigned);
                Debug.Assert(Inheritance.DiscreteTable.IsAssigned);

                ISealableDictionary <IFeatureName, IDiscrete> InheritedDiscreteTable = Inheritance.DiscreteTable.Item;

                foreach (KeyValuePair <IFeatureName, IDiscrete> InstanceEntry in InheritedDiscreteTable)
                {
                    IFeatureName InstanceName     = InstanceEntry.Key;
                    IDiscrete    InstanceItem     = InstanceEntry.Value;
                    bool         ConflictingEntry = false;

                    foreach (KeyValuePair <IFeatureName, IDiscrete> Entry in MergedDiscreteTable)
                    {
                        IFeatureName LocalName = Entry.Key;
                        IDiscrete    LocalItem = Entry.Value;

                        if (InstanceName.Name == LocalName.Name)
                        {
                            if (InstanceItem != LocalItem)
                            {
                                AddSourceError(new ErrorDuplicateName(Inheritance, LocalName.Name));
                                ConflictingEntry = true;
                                Success          = false;
                            }
                        }
                        else if (InstanceItem == LocalItem)
                        {
                            AddSourceError(new ErrorDiscreteNameConflict(Inheritance, LocalName.Name, InstanceName.Name));
                            ConflictingEntry = true;
                            Success          = false;
                        }
                    }

                    if (!ConflictingEntry && !MergedDiscreteTable.ContainsKey(InstanceName))
                    {
                        MergedDiscreteTable.Add(InstanceName, InstanceItem);
                    }
                }
            }

            if (Success)
            {
                data = MergedDiscreteTable;
            }

            return(Success);
        }
        /// <summary>
        /// Checks if another constant can be compared with this instance.
        /// </summary>
        /// <param name="other">The other instance.</param>
        public override bool IsCompatibleWith(ILanguageConstant other)
        {
            bool Result = false;

            if (other is IDiscreteLanguageConstant AsDiscreteLanguageConstant && IsValueKnown && AsDiscreteLanguageConstant.IsValueKnown)
            {
                IDiscrete OtherDiscrete = AsDiscreteLanguageConstant.Discrete;
                Result = Discrete.EmbeddingClass == OtherDiscrete.EmbeddingClass;
            }

            return(Result);
        }
예제 #5
0
 /// <summary>
 /// Adds the given element to the collection
 /// </summary>
 /// <param name="item">The item to add</param>
 public override void Add(IModelElement item)
 {
     if ((this._parent.Discrete == null))
     {
         IDiscrete discreteCasted = item.As <IDiscrete>();
         if ((discreteCasted != null))
         {
             this._parent.Discrete = discreteCasted;
             return;
         }
     }
 }
예제 #6
0
        /// <summary>
        /// Applies the rule.
        /// </summary>
        /// <param name="node">The node instance to modify.</param>
        /// <param name="data">Private data from CheckConsistency().</param>
        public override void Apply(IEntityExpression node, object data)
        {
            IResultType                 ResolvedResult       = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item1;
            IResultException            ResolvedException    = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item2;
            ISealableList <IExpression> ConstantSourceList   = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item3;
            ILanguageConstant           ExpressionConstant   = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item4;
            ICompiledFeature            ResolvedFinalFeature = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item5;
            IDiscrete ResolvedFinalDiscrete = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item6;

            node.ResolvedResult.Item = ResolvedResult;
            node.ConstantSourceList.AddRange(ConstantSourceList);
            node.ConstantSourceList.Seal();
            node.ExpressionConstant.Item = ExpressionConstant;
        }
        /// <summary>
        /// Applies the rule.
        /// </summary>
        /// <param name="node">The node instance to modify.</param>
        /// <param name="data">Private data from CheckConsistency().</param>
        public override void Apply(IClassConstantExpression node, object data)
        {
            IResultType                 ResolvedResult     = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item1;
            IResultException            ResolvedException  = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item2;
            ISealableList <IExpression> ConstantSourceList = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item3;
            ILanguageConstant           ExpressionConstant = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item4;
            Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> AdditionalData = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item5;
            IConstantFeature ResolvedFinalFeature  = AdditionalData.Item1;
            IDiscrete        ResolvedFinalDiscrete = AdditionalData.Item2;
            ITypeName        ResolvedClassTypeName = AdditionalData.Item3;
            IClassType       ResolvedClassType     = AdditionalData.Item4;

            node.ResolvedException.Item = ResolvedException;
        }
        /// <summary>
        /// Checks if another constant is equal to this instance.
        /// </summary>
        /// <param name="other">The other instance.</param>
        protected virtual bool IsConstantEqual(IDiscreteLanguageConstant other)
        {
            Debug.Assert(other != null && Discrete != null && other.Discrete != null);

            IDiscrete OtherDiscrete  = other.Discrete;
            IClass    EmbeddingClass = Discrete.EmbeddingClass;

            Debug.Assert(EmbeddingClass != null);
            Debug.Assert(EmbeddingClass == OtherDiscrete.EmbeddingClass);

            int ThisDiscreteIndex  = EmbeddingClass.DiscreteList.IndexOf(Discrete);
            int OtherDiscreteIndex = EmbeddingClass.DiscreteList.IndexOf(OtherDiscrete);

            Debug.Assert(ThisDiscreteIndex != -1 && OtherDiscreteIndex != -1);

            return(ThisDiscreteIndex == OtherDiscreteIndex);
        }
        /// <summary>
        /// Applies the rule.
        /// </summary>
        /// <param name="node">The node instance to modify.</param>
        /// <param name="data">Private data from CheckConsistency().</param>
        public override void Apply(IClassConstantExpression node, object data)
        {
            IResultType                 ResolvedResult     = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item1;
            IResultException            ResolvedException  = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item2;
            ISealableList <IExpression> ConstantSourceList = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item3;
            ILanguageConstant           ExpressionConstant = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item4;
            Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> AdditionalData = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, Tuple <IConstantFeature, IDiscrete, ITypeName, IClassType> >)data).Item5;
            IConstantFeature ResolvedFinalFeature  = AdditionalData.Item1;
            IDiscrete        ResolvedFinalDiscrete = AdditionalData.Item2;
            ITypeName        ResolvedClassTypeName = AdditionalData.Item3;
            IClassType       ResolvedClassType     = AdditionalData.Item4;

            node.ResolvedResult.Item = ResolvedResult;
            node.ConstantSourceList.AddRange(ConstantSourceList);
            node.ConstantSourceList.Seal();

            if (ConstantSourceList.Count == 0)
            {
                IDiscreteLanguageConstant DiscreteLanguageConstant = ExpressionConstant as IDiscreteLanguageConstant;
                Debug.Assert(DiscreteLanguageConstant != null);
                Debug.Assert(DiscreteLanguageConstant.IsValueKnown);
                node.ExpressionConstant.Item = ExpressionConstant;
            }
            else
            {
                Debug.Assert(ConstantSourceList.Count == 1);
            }

            node.ResolvedClassTypeName.Item = ResolvedClassTypeName;
            node.ResolvedClassType.Item     = ResolvedClassType;

            Debug.Assert(ResolvedFinalFeature != null || ResolvedFinalDiscrete != null);

            if (ResolvedFinalFeature != null)
            {
                node.ResolvedFinalFeature.Item = ResolvedFinalFeature;
            }

            if (ResolvedFinalDiscrete != null)
            {
                node.ResolvedFinalDiscrete.Item = ResolvedFinalDiscrete;
            }
        }
예제 #10
0
            /// <summary>
            /// Adds the given element to the collection
            /// </summary>
            /// <param name="item">The item to add</param>
            public override void Add(IModelElement item)
            {
                IValueToAlias valuesCasted = item.As <IValueToAlias>();

                if ((valuesCasted != null))
                {
                    this._parent.Values.Add(valuesCasted);
                }
                ICommand commandsCasted = item.As <ICommand>();

                if ((commandsCasted != null))
                {
                    this._parent.Commands.Add(commandsCasted);
                }
                IDiscrete discretesCasted = item.As <IDiscrete>();

                if ((discretesCasted != null))
                {
                    this._parent.Discretes.Add(discretesCasted);
                }
            }
예제 #11
0
 /// <summary>
 /// Adds the given element to the collection
 /// </summary>
 /// <param name="item">The item to add</param>
 public override void Add(IModelElement item)
 {
     if ((this._parent.ValueAliasSet == null))
     {
         IValueAliasSet valueAliasSetCasted = item.As <IValueAliasSet>();
         if ((valueAliasSetCasted != null))
         {
             this._parent.ValueAliasSet = valueAliasSetCasted;
             return;
         }
     }
     if ((this._parent.Discrete == null))
     {
         IDiscrete discreteCasted = item.As <IDiscrete>();
         if ((discreteCasted != null))
         {
             this._parent.Discrete = discreteCasted;
             return;
         }
     }
 }
예제 #12
0
        /// <summary>
        /// Applies the rule.
        /// </summary>
        /// <param name="node">The node instance to modify.</param>
        /// <param name="data">Private data from CheckConsistency().</param>
        public override void Apply(IEntityExpression node, object data)
        {
            IResultType                 ResolvedResult       = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item1;
            IResultException            ResolvedException    = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item2;
            ISealableList <IExpression> ConstantSourceList   = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item3;
            ILanguageConstant           ExpressionConstant   = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item4;
            ICompiledFeature            ResolvedFinalFeature = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item5;
            IDiscrete ResolvedFinalDiscrete = ((Tuple <IResultType, IResultException, ISealableList <IExpression>, ILanguageConstant, ICompiledFeature, IDiscrete>)data).Item6;

            node.ResolvedException.Item = ResolvedException;

            if (ResolvedFinalFeature != null)
            {
                node.ResolvedFinalFeature.Item = ResolvedFinalFeature;
            }

            if (ResolvedFinalDiscrete != null)
            {
                node.ResolvedFinalDiscrete.Item = ResolvedFinalDiscrete;
            }
        }
예제 #13
0
        private void AddValueToList(IConstantRange range)
        {
            if (LanguageConstant.TryParseInt(range.Minimum, out int IntMinimum) && LanguageConstant.TryParseInt(range.Maximum, out int IntMaximum))
            {
                ConstantList.Add(range.Minimum);

                if (IntMinimum < IntMaximum)
                {
                    for (int i = IntMinimum + 1; i < IntMaximum; i++)
                    {
                        ConstantList.Add(new NumberLanguageConstant(new Number(i)));
                    }

                    ConstantList.Add(range.Maximum);
                }
            }

            else if (range.Minimum is DiscreteLanguageConstant AsDiscreteMinimum && AsDiscreteMinimum.IsValueKnown && range.Maximum is DiscreteLanguageConstant AsDiscreteMaximum && AsDiscreteMaximum.IsValueKnown)
            {
                ConstantList.Add(AsDiscreteMinimum);

                if (AsDiscreteMaximum.IsConstantGreater(AsDiscreteMinimum))
                {
                    IClass EmbeddingClass = AsDiscreteMinimum.Discrete.EmbeddingClass;

                    int DiscreteMinimumIndex = EmbeddingClass.DiscreteList.IndexOf(AsDiscreteMinimum.Discrete);
                    int DiscreteMaximumIndex = EmbeddingClass.DiscreteList.IndexOf(AsDiscreteMaximum.Discrete);

                    if (DiscreteMinimumIndex >= 0 && DiscreteMaximumIndex >= 0)
                    {
                        for (int Index = DiscreteMinimumIndex + 1; Index < DiscreteMaximumIndex; Index++)
                        {
                            IDiscrete MiddleDiscrete = EmbeddingClass.DiscreteList[Index];
                            DiscreteLanguageConstant MiddleConstant = new DiscreteLanguageConstant(MiddleDiscrete);
                            ConstantList.Add(MiddleConstant);
                        }
                    }
                }
            }
        }
예제 #14
0
        /// <summary>
        /// Writes down the C# conditional instructions.
        /// </summary>
        /// <param name="writer">The stream on which to write.</param>
        public virtual void WriteCSharp(ICSharpWriter writer)
        {
            Debug.Assert(WriteDown);

            foreach (ILanguageConstant Constant in ConstantList)
            {
                bool IsHandled = false;

                switch (Constant)
                {
                case INumberLanguageConstant AsManifestConstant:
                    Number AsNumber = AsManifestConstant.Value;
                    if (AsNumber.TryParseInt(out int IntValue))
                    {
                        writer.WriteIndentedLine($"case {IntValue}:");
                        IsHandled = true;
                    }
                    break;

                case IDiscreteLanguageConstant AsDiscreteConstant:
                    IDiscrete    DiscreteItem        = AsDiscreteConstant.Discrete;
                    IName        ClassEntityName     = (IName)DiscreteItem.EmbeddingClass.EntityName;
                    string       ClassName           = CSharpNames.ToCSharpIdentifier(ClassEntityName.ValidText.Item);
                    IFeatureName DiscreteFeatureName = DiscreteItem.ValidDiscreteName.Item;
                    string       DiscreteName        = CSharpNames.ToCSharpIdentifier(DiscreteFeatureName.Name);

                    writer.WriteIndentedLine($"case {ClassName}.{DiscreteName}:");
                    IsHandled = true;
                    break;
                }

                Debug.Assert(IsHandled);
            }

            Instructions.WriteCSharp(writer, CSharpCurlyBracketsInsertions.Indifferent, true);
        }
예제 #15
0
        /// <summary>
        /// Gets the object a path is refering to.
        /// </summary>
        /// <param name="baseClass">The class where the path is used.</param>
        /// <param name="baseType">The type at the start of the path.</param>
        /// <param name="localScope">The local scope.</param>
        /// <param name="validPath">The path.</param>
        /// <param name="index">Index of the current identifier in the path.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="finalFeature">The feature at the end of the path, if any, upon return.</param>
        /// <param name="finalDiscrete">The discrete at the end of the path, if any, upon return.</param>
        /// <param name="finalTypeName">The type name of the result.</param>
        /// <param name="finalType">The type of the result.</param>
        /// <param name="inheritBySideAttribute">Inherited from an effective body.</param>
        public static bool GetQualifiedPathFinalType(IClass baseClass, ICompiledType baseType, ISealableDictionary <string, IScopeAttributeFeature> localScope, IList <IIdentifier> validPath, int index, IErrorList errorList, out ICompiledFeature finalFeature, out IDiscrete finalDiscrete, out ITypeName finalTypeName, out ICompiledType finalType, out bool inheritBySideAttribute)
        {
            finalFeature           = null;
            finalDiscrete          = null;
            finalTypeName          = null;
            finalType              = null;
            inheritBySideAttribute = false;

            ISealableDictionary <IFeatureName, IFeatureInstance> FeatureTable = baseType.FeatureTable;

            IIdentifier ValidIdentifier = validPath[index];
            string      ValidText       = ValidIdentifier.ValidText.Item;

            if (index == 0 && localScope.ContainsKey(ValidText))
            {
                return(GetQualifiedPathFinalTypeFromLocal(baseClass, baseType, localScope, validPath, index, errorList, out finalFeature, out finalDiscrete, out finalTypeName, out finalType, out inheritBySideAttribute));
            }
            else if (FeatureName.TableContain(FeatureTable, ValidText, out IFeatureName Key, out IFeatureInstance Instance))
            {
                return(GetQualifiedPathFinalTypeAsFeature(baseClass, baseType, localScope, validPath, index, errorList, Instance, out finalFeature, out finalDiscrete, out finalTypeName, out finalType, out inheritBySideAttribute));
            }
예제 #16
0
 /// <summary>
 /// Initializes a new instance of the <see cref="EntityLanguageConstant"/> class.
 /// </summary>
 /// <param name="value">The constant value.</param>
 public EntityLanguageConstant(IDiscrete value)
 {
     Value = value;
 }
예제 #17
0
        private static bool ResolveDiscrete(IQueryExpression node, IErrorList errorList, IDiscrete resolvedFinalDiscrete, ref ResolvedExpression resolvedExpression)
        {
            // This is enforced by the caller.
            bool IsNumberTypeAvailable = Expression.IsLanguageTypeAvailable(LanguageClasses.Number.Guid, node, out ITypeName NumberTypeName, out ICompiledType NumberType);

            Debug.Assert(IsNumberTypeAvailable);

            resolvedExpression.ResolvedResult    = new ResultType(NumberTypeName, NumberType, resolvedFinalDiscrete.ValidDiscreteName.Item.Name);
            resolvedExpression.ResolvedException = new ResultException();

            if (resolvedFinalDiscrete.NumericValue.IsAssigned)
            {
                IExpression NumericValue = (IExpression)resolvedFinalDiscrete.NumericValue.Item;
                resolvedExpression.ConstantSourceList.Add(NumericValue);
            }
            else
            {
                resolvedExpression.ExpressionConstant = new DiscreteLanguageConstant(resolvedFinalDiscrete);
            }

            resolvedExpression.SelectedResultList = new SealableList <IParameter>();
            resolvedExpression.FeatureCall        = new FeatureCall();

            return(true);
        }
        /// <summary>
        /// Finds the matching nodes of a <see cref="IClassConstantExpression"/>.
        /// </summary>
        /// <param name="node">The agent expression to check.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="resolvedResult">The expression result types upon return.</param>
        /// <param name="resolvedException">Exceptions the expression can throw upon return.</param>
        /// <param name="constantSourceList">Sources of the constant expression upon return, if any.</param>
        /// <param name="expressionConstant">The expression constant upon return.</param>
        /// <param name="resolvedFinalFeature">The feature if the end of the path is a feature.</param>
        /// <param name="resolvedFinalDiscrete">The discrete if the end of the path is a discrete.</param>
        /// <param name="resolvedClassTypeName">The class type name upon return.</param>
        /// <param name="resolvedClassType">The class name upon return.</param>
        public static bool ResolveCompilerReferences(IClassConstantExpression node, IErrorList errorList, out IResultType resolvedResult, out IResultException resolvedException, out ISealableList <IExpression> constantSourceList, out ILanguageConstant expressionConstant, out IConstantFeature resolvedFinalFeature, out IDiscrete resolvedFinalDiscrete, out ITypeName resolvedClassTypeName, out IClassType resolvedClassType)
        {
            resolvedResult        = null;
            resolvedException     = null;
            constantSourceList    = new SealableList <IExpression>();
            expressionConstant    = NeutralLanguageConstant.NotConstant;
            resolvedFinalFeature  = null;
            resolvedFinalDiscrete = null;
            resolvedClassTypeName = null;
            resolvedClassType     = null;

            IIdentifier ClassIdentifier    = (IIdentifier)node.ClassIdentifier;
            IIdentifier ConstantIdentifier = (IIdentifier)node.ConstantIdentifier;
            IClass      EmbeddingClass     = node.EmbeddingClass;
            string      ValidClassText     = ClassIdentifier.ValidText.Item;
            string      ValidConstantText  = ConstantIdentifier.ValidText.Item;
            ISealableDictionary <string, IImportedClass> ClassTable = EmbeddingClass.ImportedClassTable;

            if (!ClassTable.ContainsKey(ValidClassText))
            {
                errorList.AddError(new ErrorUnknownIdentifier(ClassIdentifier, ValidClassText));
                return(false);
            }

            IClass BaseClass = ClassTable[ValidClassText].Item;

            resolvedClassTypeName = BaseClass.ResolvedClassTypeName.Item;
            resolvedClassType     = BaseClass.ResolvedClassType.Item;

            ITypeName     ConstantTypeName;
            ICompiledType ConstantType;

            ISealableDictionary <IFeatureName, IDiscrete>        DiscreteTable = BaseClass.DiscreteTable;
            ISealableDictionary <IFeatureName, IFeatureInstance> FeatureTable  = BaseClass.FeatureTable;

            if (FeatureName.TableContain(DiscreteTable, ValidConstantText, out IFeatureName Key, out IDiscrete Discrete))
            {
                if (!Expression.IsLanguageTypeAvailable(LanguageClasses.Number.Guid, node, out ITypeName NumberTypeName, out ICompiledType NumberType))
                {
                    errorList.AddError(new ErrorNumberTypeMissing(node));
                    return(false);
                }

                if (Discrete.NumericValue.IsAssigned)
                {
                    constantSourceList.Add((IExpression)Discrete.NumericValue.Item);
                }
                else
                {
                    expressionConstant = new DiscreteLanguageConstant(Discrete);
                }

                resolvedFinalDiscrete = Discrete;
                ConstantTypeName      = NumberTypeName;
                ConstantType          = NumberType;
            }
예제 #19
0
        /// <summary>
        /// Finds the matching nodes of a <see cref="IEntityExpression"/>.
        /// </summary>
        /// <param name="node">The agent expression to check.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="resolvedResult">The expression result types upon return.</param>
        /// <param name="resolvedException">Exceptions the expression can throw upon return.</param>
        /// <param name="constantSourceList">Sources of the constant expression upon return, if any.</param>
        /// <param name="expressionConstant">The expression constant upon return.</param>
        /// <param name="resolvedFinalFeature">The feature if the end of the path is a feature.</param>
        /// <param name="resolvedFinalDiscrete">The discrete if the end of the path is a discrete.</param>
        public static bool ResolveCompilerReferences(IEntityExpression node, IErrorList errorList, out IResultType resolvedResult, out IResultException resolvedException, out ISealableList <IExpression> constantSourceList, out ILanguageConstant expressionConstant, out ICompiledFeature resolvedFinalFeature, out IDiscrete resolvedFinalDiscrete)
        {
            resolvedResult        = null;
            resolvedException     = null;
            constantSourceList    = new SealableList <IExpression>();
            expressionConstant    = NeutralLanguageConstant.NotConstant;
            resolvedFinalFeature  = null;
            resolvedFinalDiscrete = null;

            IQualifiedName Query = (IQualifiedName)node.Query;

            IClass     EmbeddingClass = (Class)node.EmbeddingClass;
            IClassType BaseType       = EmbeddingClass.ResolvedClassType.Item;

            if (!Expression.IsLanguageTypeAvailable(LanguageClasses.Entity.Guid, node, out ITypeName ResultTypeName, out ICompiledType ResultType))
            {
                errorList.AddError(new ErrorEntityTypeMissing(node));
                return(false);
            }

            IList <IIdentifier> ValidPath      = Query.ValidPath.Item;
            IIdentifier         LastIdentifier = ValidPath[ValidPath.Count - 1];
            string ValidText = LastIdentifier.ValidText.Item;

            ISealableDictionary <string, IScopeAttributeFeature> LocalScope = Scope.CurrentScope(node);

            if (!ObjectType.GetQualifiedPathFinalType(EmbeddingClass, BaseType, LocalScope, ValidPath, 0, errorList, out ICompiledFeature FinalFeature, out IDiscrete FinalDiscrete, out ITypeName FinalTypeName, out ICompiledType FinalType, out bool InheritBySideAttribute))
            {
                return(false);
            }

            Guid EntityGuid;

            if (FinalFeature is IFeatureWithEntity AsFeatureWithEntity)
            {
                ObjectType.FillResultPath(EmbeddingClass, BaseType, LocalScope, ValidPath, 0, Query.ValidResultTypePath.Item);
                resolvedFinalFeature = FinalFeature;
                EntityGuid           = AsFeatureWithEntity.EntityGuid;

                expressionConstant = new EntityLanguageConstant(AsFeatureWithEntity);
            }
            else
            {
                Debug.Assert(FinalDiscrete != null);

                resolvedFinalDiscrete = FinalDiscrete;
                EntityGuid            = LanguageClasses.NamedFeatureEntity.Guid;

                expressionConstant = new EntityLanguageConstant(resolvedFinalDiscrete);
            }

            ITypeName     EntityTypeName = EmbeddingClass.ImportedLanguageTypeTable[EntityGuid].Item1;
            ICompiledType EntityType     = EmbeddingClass.ImportedLanguageTypeTable[EntityGuid].Item2;

            resolvedResult    = new ResultType(EntityTypeName, EntityType, ValidText);
            resolvedException = new ResultException();

#if COVERAGE
            Debug.Assert(!node.IsComplex);
#endif

            return(true);
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="DiscreteLanguageConstant"/> class.
 /// </summary>
 /// <param name="discrete">The discrete constant.</param>
 public DiscreteLanguageConstant(IDiscrete discrete)
 {
     Discrete = discrete;
 }