private static bool ResolveCallFunction(IPrecursorExpression node, IFeatureInstance selectedPrecursor, IFunctionType callType, List <IExpressionType> mergedArgumentList, TypeArgumentStyles argumentStyle, IErrorList errorList, ref ResolvedExpression resolvedExpression, out ISealableList <IParameter> selectedParameterList, out ISealableList <IParameter> selectedResultList, out List <IExpressionType> resolvedArgumentList)
        {
            selectedParameterList = null;
            selectedResultList    = null;
            resolvedArgumentList  = null;

            IList <IArgument> ArgumentList    = node.ArgumentList;
            ICompiledFeature  OperatorFeature = selectedPrecursor.Feature;
            IList <ISealableList <IParameter> > ParameterTableList = new List <ISealableList <IParameter> >();

            foreach (IQueryOverloadType Overload in callType.OverloadList)
            {
                ParameterTableList.Add(Overload.ParameterTable);
            }

            if (!Argument.ArgumentsConformToParameters(ParameterTableList, mergedArgumentList, argumentStyle, errorList, node, out int SelectedIndex))
            {
                return(false);
            }

            IFunctionFeature AsFunctionFeature = OperatorFeature as IFunctionFeature;

            Debug.Assert(AsFunctionFeature != null);
            Debug.Assert(AsFunctionFeature.OverloadList.Count == callType.OverloadList.Count);

            resolvedExpression.SelectedOverload     = AsFunctionFeature.OverloadList[SelectedIndex];
            resolvedExpression.SelectedOverloadType = callType.OverloadList[SelectedIndex];
            resolvedExpression.ResolvedResult       = new ResultType(resolvedExpression.SelectedOverloadType.ResultTypeList);
            resolvedExpression.ResolvedException    = new ResultException(resolvedExpression.SelectedOverloadType.ExceptionIdentifierList);
            selectedParameterList = resolvedExpression.SelectedOverloadType.ParameterTable;
            selectedResultList    = resolvedExpression.SelectedOverloadType.ResultTable;
            resolvedArgumentList  = mergedArgumentList;

            return(true);
        }
        private static bool ResolveCallClass(IPrecursorExpression node, IFeatureInstance selectedPrecursor, List <IExpressionType> mergedArgumentList, TypeArgumentStyles argumentStyle, IErrorList errorList, ref ResolvedExpression resolvedExpression, out ISealableList <IParameter> selectedParameterList, out ISealableList <IParameter> selectedResultList, out List <IExpressionType> resolvedArgumentList)
        {
            selectedParameterList = null;
            selectedResultList    = null;
            resolvedArgumentList  = null;

            IList <IArgument> ArgumentList = node.ArgumentList;

            if (ArgumentList.Count > 0)
            {
                errorList.AddError(new ErrorInvalidExpression(node));
                return(false);
            }
            else
            {
                ICompiledFeature OperatorFeature  = selectedPrecursor.Feature;
                ITypeName        OperatorTypeName = OperatorFeature.ResolvedEffectiveTypeName.Item;
                ICompiledType    OperatorType     = OperatorFeature.ResolvedEffectiveType.Item;
                IList <ISealableList <IParameter> > ParameterTableList = new List <ISealableList <IParameter> >();

                resolvedExpression.ResolvedResult    = new ResultType(OperatorTypeName, OperatorType, string.Empty);
                resolvedExpression.ResolvedException = new ResultException();
                selectedParameterList = new SealableList <IParameter>();
                selectedResultList    = new SealableList <IParameter>();
                resolvedArgumentList  = new List <IExpressionType>();
            }

            return(true);
        }
        private static bool ResolveCall(IPrecursorExpression node, IFeatureInstance selectedPrecursor, List <IExpressionType> mergedArgumentList, TypeArgumentStyles argumentStyle, IErrorList errorList, ref ResolvedExpression resolvedExpression, out ISealableList <IParameter> selectedParameterList, out ISealableList <IParameter> selectedResultList, out List <IExpressionType> resolvedArgumentList)
        {
            selectedParameterList = null;
            selectedResultList    = null;
            resolvedArgumentList  = null;

            IList <IArgument> ArgumentList    = node.ArgumentList;
            ICompiledFeature  OperatorFeature = selectedPrecursor.Feature;
            IList <ISealableList <IParameter> > ParameterTableList = new List <ISealableList <IParameter> >();
            bool IsHandled = false;
            bool Success   = false;

            switch (OperatorFeature)
            {
            case IAttributeFeature AsAttributeFeature:
            case ICreationFeature AsCreationFeature:
            case IProcedureFeature AsProcedureFeature:
            case IIndexerFeature AsIndexerFeature:
                errorList.AddError(new ErrorInvalidExpression(node));
                IsHandled = true;
                break;

            case IConstantFeature AsConstantFeature:
                Success   = ResolveCallClass(node, selectedPrecursor, mergedArgumentList, argumentStyle, errorList, ref resolvedExpression, out selectedParameterList, out selectedResultList, out resolvedArgumentList);
                IsHandled = true;
                break;

            case IFunctionFeature AsFunctionFeature:
                IFunctionType FunctionType = AsFunctionFeature.ResolvedAgentType.Item as IFunctionType;
                Debug.Assert(FunctionType != null);

                Success   = ResolveCallFunction(node, selectedPrecursor, FunctionType, mergedArgumentList, argumentStyle, errorList, ref resolvedExpression, out selectedParameterList, out selectedResultList, out resolvedArgumentList);
                IsHandled = true;
                break;

            case IPropertyFeature AsPropertyFeature:
                IPropertyType PropertyType = AsPropertyFeature.ResolvedAgentType.Item as IPropertyType;
                Debug.Assert(PropertyType != null);

                Success   = ResolveCallProperty(node, selectedPrecursor, PropertyType, mergedArgumentList, argumentStyle, errorList, ref resolvedExpression, out selectedParameterList, out selectedResultList, out resolvedArgumentList);
                IsHandled = true;
                break;
            }

            Debug.Assert(IsHandled);

            return(Success);
        }
Example #4
0
        /// <summary>
        /// Initializes a new instance of the <see cref="CSharpPrecursorExpression"/> class.
        /// </summary>
        /// <param name="context">The creation context.</param>
        /// <param name="source">The Easly expression from which the C# expression is created.</param>
        protected CSharpPrecursorExpression(ICSharpContext context, IPrecursorExpression source)
            : base(context, source)
        {
            PrecursorFeature = context.GetFeature(source.ResolvedPrecursor.Item.Feature) as ICSharpFeatureWithName;
            Debug.Assert(PrecursorFeature != null);

            ParentFeature = context.GetFeature((ICompiledFeature)source.EmbeddingFeature) as ICSharpFeatureWithName;
            Debug.Assert(ParentFeature != null);

            FeatureCall = new CSharpFeatureCall(context, source.FeatureCall.Item);

            if (Source.SelectedOverloadType.IsAssigned)
            {
                SelectedOverloadType = CSharpQueryOverloadType.Create(context, Source.SelectedOverloadType.Item, PrecursorFeature.Owner);
            }
            else
            {
                SelectedOverloadType = null;
            }
        }
        /// <summary>
        /// Compares two expressions.
        /// </summary>
        /// <param name="other">The other expression.</param>
        protected bool IsExpressionEqual(IPrecursorExpression other)
        {
            Debug.Assert(other != null);

            bool Result = true;

            if (AncestorType.IsAssigned && other.AncestorType.IsAssigned)
            {
                IObjectType AncestorType1 = (IObjectType)AncestorType.Item;
                IObjectType AncestorType2 = (IObjectType)other.AncestorType.Item;

                Debug.Assert(AncestorType1.ResolvedType.IsAssigned);
                Debug.Assert(AncestorType2.ResolvedType.IsAssigned);

                Result &= AncestorType1.ResolvedType.Item == AncestorType2.ResolvedType.Item;
            }

            Result &= AncestorType.IsAssigned == other.AncestorType.IsAssigned;
            Result &= Argument.IsArgumentListEqual(ArgumentList, other.ArgumentList);

            return(Result);
        }
        private static bool ResolveCallProperty(IPrecursorExpression node, IFeatureInstance selectedPrecursor, IPropertyType callType, List <IExpressionType> mergedArgumentList, TypeArgumentStyles argumentStyle, IErrorList errorList, ref ResolvedExpression resolvedExpression, out ISealableList <IParameter> selectedParameterList, out ISealableList <IParameter> selectedResultList, out List <IExpressionType> resolvedArgumentList)
        {
            selectedParameterList = null;
            selectedResultList    = null;
            resolvedArgumentList  = null;

            IList <IArgument> ArgumentList = node.ArgumentList;

            if (ArgumentList.Count > 0)
            {
                errorList.AddError(new ErrorInvalidExpression(node));
                return(false);
            }
            else
            {
                ICompiledFeature OperatorFeature = selectedPrecursor.Feature;
                IList <ISealableList <IParameter> > ParameterTableList = new List <ISealableList <IParameter> >();
                IPropertyFeature Property     = (IPropertyFeature)OperatorFeature;
                string           PropertyName = ((IFeatureWithName)Property).EntityName.Text;

                resolvedExpression.ResolvedResult = new ResultType(callType.ResolvedEntityTypeName.Item, callType.ResolvedEntityType.Item, PropertyName);

                resolvedExpression.ResolvedException = new ResultException();

                if (Property.GetterBody.IsAssigned)
                {
                    IBody GetterBody = (IBody)Property.GetterBody.Item;
                    resolvedExpression.ResolvedException = new ResultException(GetterBody.ExceptionIdentifierList);
                }

                selectedParameterList = new SealableList <IParameter>();
                selectedResultList    = new SealableList <IParameter>();
                resolvedArgumentList  = new List <IExpressionType>();

                return(true);
            }
        }
Example #7
0
 /// <summary>
 /// Creates a new C# expression.
 /// </summary>
 /// <param name="context">The creation context.</param>
 /// <param name="source">The Easly expression from which the C# expression is created.</param>
 public static ICSharpPrecursorExpression Create(ICSharpContext context, IPrecursorExpression source)
 {
     return(new CSharpPrecursorExpression(context, source));
 }
        /// <summary>
        /// Finds the matching nodes of a <see cref="IPrecursorExpression"/>.
        /// </summary>
        /// <param name="node">The agent expression to check.</param>
        /// <param name="errorList">The list of errors found.</param>
        /// <param name="resolvedExpression">The result of the search.</param>
        public static bool ResolveCompilerReferences(IPrecursorExpression node, IErrorList errorList, out ResolvedExpression resolvedExpression)
        {
            resolvedExpression = new ResolvedExpression();

            IOptionalReference <BaseNode.IObjectType> AncestorType = node.AncestorType;
            IList <IArgument> ArgumentList   = node.ArgumentList;
            IClass            EmbeddingClass = node.EmbeddingClass;
            ISealableDictionary <string, IImportedClass>         ClassTable   = EmbeddingClass.ImportedClassTable;
            ISealableDictionary <IFeatureName, IFeatureInstance> FeatureTable = EmbeddingClass.FeatureTable;
            IFeature InnerFeature = node.EmbeddingFeature;

            if (InnerFeature is IndexerFeature)
            {
                errorList.AddError(new ErrorPrecursorNotAllowedInIndexer(node));
                return(false);
            }

            IFeature         AsNamedFeature = InnerFeature;
            IFeatureInstance Instance       = FeatureTable[AsNamedFeature.ValidFeatureName.Item];

            if (!Instance.FindPrecursor(node.AncestorType, errorList, node, out IFeatureInstance SelectedPrecursor))
            {
                return(false);
            }

            resolvedExpression.SelectedPrecursor = SelectedPrecursor;

            List <IExpressionType> MergedArgumentList = new List <IExpressionType>();

            if (!Argument.Validate(ArgumentList, MergedArgumentList, out TypeArgumentStyles TypeArgumentStyle, errorList))
            {
                return(false);
            }

            if (!ResolveCall(node, SelectedPrecursor, MergedArgumentList, TypeArgumentStyle, errorList, ref resolvedExpression, out ISealableList <IParameter> SelectedParameterList, out ISealableList <IParameter> SelectedResultList, out List <IExpressionType> ResolvedArgumentList))
            {
                return(false);
            }

            resolvedExpression.FeatureCall = new FeatureCall(SelectedParameterList, SelectedResultList, ArgumentList, ResolvedArgumentList, TypeArgumentStyle);

            bool IsHandled = false;

            switch (SelectedPrecursor.Feature)
            {
            case IConstantFeature AsConstantFeature:
                IExpression ConstantValue = (IExpression)AsConstantFeature.ConstantValue;
                resolvedExpression.ConstantSourceList.Add(ConstantValue);
                IsHandled = true;
                break;

            case IFunctionFeature AsFunctionFeature:
                Argument.AddConstantArguments(node, resolvedExpression.ResolvedResult, ArgumentList, resolvedExpression.ConstantSourceList, out ILanguageConstant ExpressionConstant);
                resolvedExpression.ExpressionConstant = ExpressionConstant;
                IsHandled = true;
                break;

            case IPropertyFeature AsPropertyFeature:
                resolvedExpression.ExpressionConstant = Expression.GetDefaultConstant(node, resolvedExpression.ResolvedResult);
                IsHandled = true;
                break;
            }

            Debug.Assert(IsHandled);

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

            return(true);
        }