예제 #1
0
        private bool CheckIndexerKind(IIndexerFeature node, out BaseNode.UtilityType indexerKind)
        {
            bool Success = true;

            indexerKind = (BaseNode.UtilityType)(-1);

            if (node.GetterBody.IsAssigned && node.SetterBody.IsAssigned)
            {
                indexerKind = BaseNode.UtilityType.ReadWrite;

                ICompiledBody AsCompiledGetter = (ICompiledBody)node.GetterBody.Item;
                ICompiledBody AsCompiledSetter = (ICompiledBody)node.SetterBody.Item;

                if (AsCompiledGetter.IsDeferredBody != AsCompiledSetter.IsDeferredBody)
                {
                    AddSourceError(new ErrorIndexerBodyTypeMismatch(node));
                    Success = false;
                }
            }
            else if (node.GetterBody.IsAssigned)
            {
                indexerKind = BaseNode.UtilityType.ReadOnly;
            }
            else if (node.SetterBody.IsAssigned)
            {
                indexerKind = BaseNode.UtilityType.WriteOnly;
            }
            else
            {
                AddSourceError(new ErrorIndexerMissingBody(node));
                Success = false;
            }

            return(Success);
        }
예제 #2
0
        /// <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(IFunctionFeature node, IDictionary <ISourceTemplate, object> dataList, out object data)
        {
            data = null;
            bool Success = true;

            IName EntityName = (IName)((IFeatureWithName)node).EntityName;

            // This is ensured because the root node is valid.
            Debug.Assert(node.OverloadList.Count > 0);

            IQueryOverload FirstOverload     = node.OverloadList[0];
            ICompiledBody  FirstOverloadBody = (ICompiledBody)FirstOverload.QueryBody;

            for (int i = 1; i < node.OverloadList.Count; i++)
            {
                IQueryOverload ThisOverload     = node.OverloadList[i];
                ICompiledBody  ThisOverloadBody = (ICompiledBody)ThisOverload.QueryBody;

                if (ThisOverloadBody.IsDeferredBody != FirstOverloadBody.IsDeferredBody)
                {
                    ErrorList.AddError(new ErrorBodyTypeMismatch(ThisOverload, EntityName.ValidText.Item));
                    Success = false;
                    break;
                }
            }

            IErrorList CheckErrorList = new ErrorList();
            IList <IQueryOverloadType> OverloadTypeList = new List <IQueryOverloadType>();

            foreach (IQueryOverload Overload in node.OverloadList)
            {
                Debug.Assert(Overload.ResolvedAssociatedType.IsAssigned);
                OverloadTypeList.Add(Overload.ResolvedAssociatedType.Item);
            }

            if (!Feature.DisjoinedParameterCheck(OverloadTypeList, CheckErrorList))
            {
                Debug.Assert(!CheckErrorList.IsEmpty);
                AddSourceErrorList(CheckErrorList);
                Success = false;
            }

            return(Success);
        }
예제 #3
0
        /// <summary>
        /// Creates a new C# body.
        /// </summary>
        /// <param name="context">The creation context.</param>
        /// <param name="parentFeature">The parent feature.</param>
        /// <param name="source">The Easly body from which the C# body is created.</param>
        public static ICSharpBody Create(ICSharpContext context, ICSharpFeature parentFeature, ICompiledBody source)
        {
            ICSharpBody Result = null;

            switch (source)
            {
            case IDeferredBody AsDeferredBody:
                Result = CSharpDeferredBody.Create(context, parentFeature, AsDeferredBody);
                break;

            case IEffectiveBody AsEffectiveBody:
                Result = CSharpEffectiveBody.Create(context, parentFeature, AsEffectiveBody);
                break;

            case IExternBody AsExternBody:
                Result = CSharpExternBody.Create(context, parentFeature, AsExternBody);
                break;

            case IPrecursorBody AsPrecursorBody:
                Result = CSharpPrecursorBody.Create(context, parentFeature, AsPrecursorBody);
                break;
            }

            Debug.Assert(Result != null);

            return(Result);
        }
예제 #4
0
        /// <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(IPropertyFeature node, IDictionary <ISourceTemplate, object> dataList, out object data)
        {
            data = null;
            bool Success = true;

            IClass      EmbeddingClass = node.EmbeddingClass;
            IObjectType TypeToResolve  = (IObjectType)node.EntityType;

            IScopeAttributeFeature Result = ScopeAttributeFeature.CreateResultFeature(TypeToResolve, EmbeddingClass, node);
            IScopeAttributeFeature Value  = ScopeAttributeFeature.CreateValueFeature(TypeToResolve, EmbeddingClass, node);

            string NameResult = Result.ValidFeatureName.Item.Name;
            string NameValue  = Value.ValidFeatureName.Item.Name;

            ISealableDictionary <string, IScopeAttributeFeature> CheckedGetScope = new SealableDictionary <string, IScopeAttributeFeature>();

            CheckedGetScope.Add(NameResult, Result);
            ISealableDictionary <string, IScopeAttributeFeature> CheckedSetScope = new SealableDictionary <string, IScopeAttributeFeature>();

            CheckedSetScope.Add(NameValue, Value);

            IList <string> ConflictList = new List <string>();

            ScopeHolder.RecursiveCheck(CheckedGetScope, node.InnerScopes, ConflictList);
            ScopeHolder.RecursiveCheck(CheckedSetScope, node.InnerScopes, ConflictList);

            // This has been checked in another rule.
            Debug.Assert(!ConflictList.Contains(NameResult));
            Debug.Assert(!ConflictList.Contains(NameValue));

            IName PropertyName = (IName)((IFeatureWithName)node).EntityName;

            if (node.GetterBody.IsAssigned && node.SetterBody.IsAssigned)
            {
                ICompiledBody AsCompiledGetter = (ICompiledBody)node.GetterBody.Item;
                ICompiledBody AsCompiledSetter = (ICompiledBody)node.SetterBody.Item;

                if (AsCompiledGetter.IsDeferredBody != AsCompiledSetter.IsDeferredBody)
                {
                    AddSourceError(new ErrorBodyTypeMismatch(node, PropertyName.ValidText.Item));
                    Success = false;
                }

                if (node.PropertyKind != BaseNode.UtilityType.ReadWrite)
                {
                    AddSourceError(new ErrorBodyTypeMismatch(node, PropertyName.ValidText.Item));
                    Success = false;
                }
            }
            else if (node.GetterBody.IsAssigned)
            {
                if (node.PropertyKind == BaseNode.UtilityType.WriteOnly)
                {
                    AddSourceError(new ErrorBodyTypeMismatch(node, PropertyName.ValidText.Item));
                    Success = false;
                }
            }
            else if (node.SetterBody.IsAssigned)
            {
                if (node.PropertyKind == BaseNode.UtilityType.ReadOnly)
                {
                    AddSourceError(new ErrorBodyTypeMismatch(node, PropertyName.ValidText.Item));
                    Success = false;
                }
            }

            if (Success)
            {
                data = new Tuple <IScopeAttributeFeature, IScopeAttributeFeature>(Result, Value);
            }

            return(Success);
        }