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; }
public RecursiveDefaultMemberAccessExpression( Declaration referencedDeclaration, ExpressionClassification classification, ParserRuleContext context, int defaultMemberRecursionDepth = 0, RecursiveDefaultMemberAccessExpression containedDefaultMemberRecursionExpression = null) : base(referencedDeclaration, classification, context) { DefaultMemberRecursionDepth = defaultMemberRecursionDepth; ContainedDefaultMemberRecursionExpression = containedDefaultMemberRecursionExpression; }
public IndexExpression( Declaration referencedDeclaration, ExpressionClassification classification, ParserRuleContext context, IBoundExpression lExpression, ArgumentList argumentList) : base(referencedDeclaration, classification, context) { _lExpression = lExpression; _argumentList = argumentList; }
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; }
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; }
public BoundExpression(Declaration referencedDeclaration, ExpressionClassification classification, ParserRuleContext context) { _referencedDeclaration = referencedDeclaration; _classification = classification; _context = context; }
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); }
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); }
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); }
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); }
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); }
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) { }