public MemberAccessExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     IBoundExpression lExpression)
     : base(referencedDeclaration, classification, context)
 {
     _lExpression = lExpression;
 }
 public MemberAccessExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     ParserRuleContext unrestrictedNameContext,
     IBoundExpression lExpression)
     : base(referencedDeclaration, classification, context)
 {
     LExpression             = lExpression;
     UnrestrictedNameContext = unrestrictedNameContext;
 }
Example #3
0
 public RecursiveDefaultMemberAccessExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     int defaultMemberRecursionDepth = 0,
     RecursiveDefaultMemberAccessExpression containedDefaultMemberRecursionExpression = null)
     : base(referencedDeclaration, classification, context)
 {
     DefaultMemberRecursionDepth = defaultMemberRecursionDepth;
     ContainedDefaultMemberRecursionExpression = containedDefaultMemberRecursionExpression;
 }
Example #4
0
 public IndexExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     IBoundExpression lExpression,
     ArgumentList argumentList)
     : base(referencedDeclaration, classification, context)
 {
     _lExpression  = lExpression;
     _argumentList = argumentList;
 }
Example #5
0
 public LetCoercionDefaultMemberAccessExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     IBoundExpression wrappedExpression,
     int defaultMemberRecursionDepth = 0,
     RecursiveDefaultMemberAccessExpression containedDefaultMemberRecursionExpression = null)
     : base(referencedDeclaration, classification, context)
 {
     WrappedExpression           = wrappedExpression;
     DefaultMemberRecursionDepth = defaultMemberRecursionDepth;
     ContainedDefaultMemberRecursionExpression = containedDefaultMemberRecursionExpression;
 }
        public ProcedureCoercionExpression(
            Declaration referencedDeclaration,
            ExpressionClassification classification,
            ParserRuleContext context,
            IBoundExpression wrappedExpression)
            : base(referencedDeclaration, classification, context)
        {
            WrappedExpression = wrappedExpression;

            //This works around a problem with the ordering of references between array accesses on (recursive) default member accesses
            //and from subsequent procedure coercion.
            DefaultMemberRecursionDepth = wrappedExpression is IndexExpression indexExpression
                ? indexExpression.DefaultMemberRecursionDepth + 1
                : 1;
        }
 public DictionaryAccessExpression(
     Declaration referencedDeclaration,
     ExpressionClassification classification,
     ParserRuleContext context,
     IBoundExpression lExpression,
     ArgumentList argumentList,
     ParserRuleContext defaultMemberContext,
     int defaultMemberRecursionDepth = 1,
     RecursiveDefaultMemberAccessExpression containedDefaultMemberRecursionExpression = null)
     : base(referencedDeclaration, classification, context)
 {
     LExpression  = lExpression;
     ArgumentList = argumentList;
     DefaultMemberRecursionDepth = defaultMemberRecursionDepth;
     ContainedDefaultMemberRecursionExpression = containedDefaultMemberRecursionExpression;
     DefaultMemberContext = defaultMemberContext;
 }
Example #8
0
 public IndexExpression(Declaration referencedDeclaration,
                        ExpressionClassification classification,
                        ParserRuleContext context,
                        IBoundExpression lExpression,
                        ArgumentList argumentList,
                        bool isArrayAccess              = false,
                        bool isDefaultMemberAccess      = false,
                        int defaultMemberRecursionDepth = 0,
                        RecursiveDefaultMemberAccessExpression containedDefaultMemberRecursionExpression = null)
     : base(referencedDeclaration, classification, context)
 {
     LExpression                 = lExpression;
     ArgumentList                = argumentList;
     IsArrayAccess               = isArrayAccess;
     IsDefaultMemberAccess       = isDefaultMemberAccess;
     DefaultMemberRecursionDepth = defaultMemberRecursionDepth;
     ContainedDefaultMemberRecursionExpression = containedDefaultMemberRecursionExpression;
 }
Example #9
0
 public BoundExpression(Declaration referencedDeclaration, ExpressionClassification classification, ParserRuleContext context)
 {
     _referencedDeclaration = referencedDeclaration;
     _classification        = classification;
     _context = context;
 }
Example #10
0
        private IBoundExpression ResolveMemberInModule(IBoundExpression lExpression, string name, Declaration module, DeclarationType memberType, ExpressionClassification classification)
        {
            /*
             *  A member access expression under the procedure pointer binding context is valid only if <l-
             *  expression> is classified as a procedural module, this procedural module has an accessible function
             *  or subroutine with the same name value as <unrestricted-name>, and <unrestricted-name> either
             *  does not specify a type character or specifies a type character whose associated type matches the
             *  declared type of the function or subroutine. In this case, the member access expression is classified
             *  as a function or subroutine, respectively.
             */
            // AddressOf is only allowed in the same project. See The "procedure pointer binding context" for "simple name expressions" section in the MS-VBAL document.
            var enclosingProjectType = _declarationFinder.FindMemberEnclosedProjectInModule(_project, _module, _parent, module, name, memberType);

            if (enclosingProjectType != null)
            {
                return(new MemberAccessExpression(enclosingProjectType, classification, _expression, _unrestrictedNameContext, lExpression));
            }
            return(null);
        }
Example #11
0
        private static IBoundExpression ResolveRecursiveDefaultMember(IBoundExpression wrappedExpression, Declaration defaultMember, ExpressionClassification defaultMemberClassification, ParserRuleContext expression, bool isAssignment, int recursionDepth, RecursiveDefaultMemberAccessExpression containedExpression)
        {
            var defaultMemberAsTypeName        = defaultMember.AsTypeName;
            var defaultMemberAsTypeDeclaration = defaultMember.AsTypeDeclaration;

            var defaultMemberExpression = new RecursiveDefaultMemberAccessExpression(defaultMember, defaultMemberClassification, expression, recursionDepth, containedExpression);

            return(ResolveViaDefaultMember(
                       wrappedExpression,
                       defaultMemberAsTypeName,
                       defaultMemberAsTypeDeclaration,
                       expression,
                       isAssignment,
                       recursionDepth + 1,
                       defaultMemberExpression));
        }
        private static IBoundExpression ResolveRecursiveDefaultMember(IBoundExpression lExpression, Declaration defaultMember, ExpressionClassification defaultMemberClassification, ArgumentList argumentList, ParserRuleContext expression, ParserRuleContext defaultMemberContext, int recursionDepth, RecursiveDefaultMemberAccessExpression containedExpression)
        {
            var defaultMemberAsTypeName        = defaultMember.AsTypeName;
            var defaultMemberAsTypeDeclaration = defaultMember.AsTypeDeclaration;

            var defaultMemberExpression = new RecursiveDefaultMemberAccessExpression(defaultMember, defaultMemberClassification, defaultMemberContext, recursionDepth, containedExpression);

            return(ResolveViaDefaultMember(
                       lExpression,
                       defaultMemberAsTypeName,
                       defaultMemberAsTypeDeclaration,
                       argumentList,
                       expression,
                       defaultMemberContext,
                       recursionDepth + 1,
                       defaultMemberExpression));
        }
 public SimpleNameExpression(Declaration referencedDeclaration, ExpressionClassification classification, ParserRuleContext context)
     : base(referencedDeclaration, classification, context)
 {
 }
 private void ClassifyCurrentExpression(ExpressionClassification classification)
 {
     _currentNodePath[0].Add(classification);
 }
Example #15
0
        private IBoundExpression ResolveLExpressionDeclaredTypeIsArray(Declaration indexedDeclaration, ExpressionClassification originalExpressionClassification, ArgumentList argumentList, ParserRuleContext expression, int defaultMemberRecursionDepth, RecursiveDefaultMemberAccessExpression containedExpression)
        {
            if (indexedDeclaration == null ||
                !indexedDeclaration.IsArray)
            {
                return(null);
            }

            /*
             *   The declared type of <l-expression> is an array type, an empty argument list has not already
             *   been specified for it, and one of the following is true:
             */

            if (!argumentList.HasArguments)
            {
                /*
                 *  <argument-list> represents an empty argument list. In this case, the index expression
                 *  takes on the classification and declared type of <l-expression> and references the same
                 *  array.
                 */
                ResolveArgumentList(indexedDeclaration, argumentList);
                return(new IndexExpression(indexedDeclaration, originalExpressionClassification, expression, _lExpression, argumentList, defaultMemberRecursionDepth: defaultMemberRecursionDepth, containedDefaultMemberRecursionExpression: containedExpression));
            }

            if (!argumentList.HasNamedArguments)
            {
                /*
                 *  <argument-list> represents an argument list with a number of positional arguments equal
                 *  to the rank of the array, and with no named arguments. In this case, the index expression
                 *  references an individual element of the array, is classified as a variable and has the
                 *  declared type of the array’s element type.
                 *
                 *  TODO: Implement compatibility checking
                 */

                ResolveArgumentList(indexedDeclaration, argumentList, true);
                return(new IndexExpression(indexedDeclaration, ExpressionClassification.Variable, expression, _lExpression, argumentList, isArrayAccess: true, defaultMemberRecursionDepth: defaultMemberRecursionDepth, containedDefaultMemberRecursionExpression: containedExpression));
            }

            return(null);
        }
Example #16
0
        private IBoundExpression ResolveRecursiveDefaultMember(Declaration defaultMember, ExpressionClassification defaultMemberClassification, ArgumentList argumentList, ParserRuleContext expression, Declaration parent, int defaultMemberResolutionRecursionDepth, RecursiveDefaultMemberAccessExpression containedExpression)
        {
            var defaultMemberRecursionExpression = new RecursiveDefaultMemberAccessExpression(defaultMember, defaultMemberClassification, _lExpression.Context, defaultMemberResolutionRecursionDepth, containedExpression);

            var defaultMemberAsLExpression = new SimpleNameExpression(defaultMember, defaultMemberClassification, expression);

            return(Resolve(defaultMemberAsLExpression, argumentList, expression, parent, defaultMemberResolutionRecursionDepth, defaultMemberRecursionExpression));
        }
 /// <summary>
 /// Tags the expression with a new classification
 /// </summary>
 /// <param name="classification">The expression decorator to tag with</param>
 public void Add(ExpressionClassification classification)
 {
     _classifications.Add(classification);
 }
Example #18
0
        private IBoundExpression ResolveMemberInModule(Declaration module, DeclarationType memberType, ExpressionClassification classification)
        {
            var enclosingProjectType = _declarationFinder.FindMemberEnclosedProjectInModule(_project, _module, _parent, module, _name, memberType);

            if (enclosingProjectType != null)
            {
                return(new MemberAccessExpression(enclosingProjectType, classification, _context, _unrestrictedNameContext, _lExpression));
            }
            var referencedProjectType = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, module, _name, memberType);

            if (referencedProjectType != null)
            {
                return(new MemberAccessExpression(referencedProjectType, classification, _context, _unrestrictedNameContext, _lExpression));
            }
            return(null);
        }
Example #19
0
 private IBoundExpression ResolveMemberInReferencedProject(bool lExpressionIsEnclosingProject, Declaration referencedProject, DeclarationType memberType, ExpressionClassification classification)
 {
     if (lExpressionIsEnclosingProject)
     {
         var foundType = _declarationFinder.FindMemberEnclosingModule(_module, _parent, _name, memberType);
         if (foundType != null)
         {
             return(new MemberAccessExpression(foundType, classification, _context, _unrestrictedNameContext, _lExpression));
         }
         var accessibleType = _declarationFinder.FindMemberEnclosedProjectWithoutEnclosingModule(_project, _module, _parent, _name, memberType);
         if (accessibleType != null)
         {
             return(new MemberAccessExpression(accessibleType, classification, _context, _unrestrictedNameContext, _lExpression));
         }
     }
     else
     {
         var referencedProjectType = _declarationFinder.FindMemberReferencedProject(_project, _module, _parent, referencedProject, _name, memberType);
         if (referencedProjectType != null)
         {
             return(new MemberAccessExpression(referencedProjectType, classification, _context, _unrestrictedNameContext, _lExpression));
         }
     }
     return(null);
 }
 public MissingArgumentExpression(
     ExpressionClassification classification,
     ParserRuleContext context)
     : base(null, classification, context)
 {
 }