private static IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argumentList, ParserRuleContext expression)
        {
            if (lExpression.Classification == ExpressionClassification.ResolutionFailed)
            {
                ResolveArgumentList(null, argumentList);
                var argumentExpressions = argumentList.Arguments.Select(arg => arg.Expression);
                return(lExpression.JoinAsFailedResolution(expression, argumentExpressions));
            }

            if (!(expression is VBAParser.LExpressionContext lExpressionContext))
            {
                ResolveArgumentList(null, argumentList);
                return(CreateFailedExpression(lExpression, argumentList, expression));
            }

            var lDeclaration         = lExpression.ReferencedDeclaration;
            var defaultMemberContext = DefaultMemberReferenceContext(lExpressionContext);

            if (lExpression.Classification == ExpressionClassification.Unbound)
            {
                /*
                 *   <l-expression> is classified as an unbound member. In this case, the dictionary access expression
                 *  is classified as an unbound member with a declared type of Variant, referencing <l-expression> with no member name.
                 */
                ResolveArgumentList(lDeclaration, argumentList);
                return(new DictionaryAccessExpression(null, ExpressionClassification.Unbound, expression, lExpression, argumentList, defaultMemberContext, 1, null));
            }

            if (lDeclaration == null)
            {
                ResolveArgumentList(null, argumentList);
                return(CreateFailedExpression(lExpression, argumentList, expression));
            }

            var asTypeName        = lDeclaration.AsTypeName;
            var asTypeDeclaration = lDeclaration.AsTypeDeclaration;

            return(ResolveViaDefaultMember(lExpression, asTypeName, asTypeDeclaration, argumentList, lExpressionContext, defaultMemberContext));
        }
 public static ResolutionFailedExpression JoinAsFailedResolution(this IBoundExpression expression, ParserRuleContext context, params IBoundExpression[] otherExpressions)
 {
     return(expression.JoinAsFailedResolution(context, (IEnumerable <IBoundExpression>)otherExpressions));
 }
Exemple #3
0
        private IBoundExpression Resolve(IBoundExpression lExpression, ArgumentList argumentList, ParserRuleContext expression, Declaration parent, int defaultMemberResolutionRecursionDepth = 0, RecursiveDefaultMemberAccessExpression containedExpression = null)
        {
            if (lExpression.Classification == ExpressionClassification.ResolutionFailed)
            {
                ResolveArgumentList(null, argumentList);
                var argumentExpressions = argumentList.Arguments.Select(arg => arg.Expression);
                return(lExpression.JoinAsFailedResolution(expression, argumentExpressions));
            }

            if (lExpression.Classification == ExpressionClassification.Unbound)
            {
                return(ResolveLExpressionIsUnbound(lExpression, argumentList, expression, defaultMemberResolutionRecursionDepth, containedExpression));
            }

            if (lExpression.ReferencedDeclaration != null)
            {
                if (argumentList.HasArguments)
                {
                    switch (lExpression)
                    {
                    case IndexExpression indexExpression:
                        var doubleIndexExpression = ResolveLExpressionIsIndexExpression(indexExpression, argumentList, expression, parent, defaultMemberResolutionRecursionDepth, containedExpression);
                        if (doubleIndexExpression != null)
                        {
                            return(doubleIndexExpression);
                        }

                        break;

                    case DictionaryAccessExpression dictionaryAccessExpression:
                        var indexOnBangExpression = ResolveLExpressionIsDictionaryAccessExpression(dictionaryAccessExpression, argumentList, expression, parent, defaultMemberResolutionRecursionDepth, containedExpression);
                        if (indexOnBangExpression != null)
                        {
                            return(indexOnBangExpression);
                        }

                        break;
                    }

                    if (IsVariablePropertyFunctionWithoutParameters(lExpression) &&
                        !(lExpression.Classification == ExpressionClassification.Variable &&
                          parent.Equals(lExpression.ReferencedDeclaration)))
                    {
                        var parameterlessLExpressionAccess = ResolveLExpressionIsVariablePropertyFunctionNoParameters(lExpression, argumentList, expression, parent, defaultMemberResolutionRecursionDepth, containedExpression);
                        if (parameterlessLExpressionAccess != null)
                        {
                            return(parameterlessLExpressionAccess);
                        }
                    }
                }
            }

            if (lExpression.Classification == ExpressionClassification.Property ||
                lExpression.Classification == ExpressionClassification.Function ||
                lExpression.Classification == ExpressionClassification.Subroutine ||
                lExpression.Classification == ExpressionClassification.Variable &&
                parent.Equals(lExpression.ReferencedDeclaration))
            {
                var procedureDeclaration = lExpression.ReferencedDeclaration as IParameterizedDeclaration;
                var parameters           = procedureDeclaration?.Parameters?.ToList();
                if (parameters != null &&
                    ArgumentListIsCompatible(parameters, argumentList))
                {
                    return(ResolveLExpressionIsPropertyFunctionSubroutine(lExpression, argumentList, expression, defaultMemberResolutionRecursionDepth, containedExpression));
                }
            }

            ResolveArgumentList(null, argumentList);
            return(CreateFailedExpression(lExpression, argumentList, expression, parent, defaultMemberResolutionRecursionDepth > 0));
        }