private IBoundExpression ResolveMemberInModule(IBoundExpression lExpression, string name, Declaration module, DeclarationType memberType)
        {
            /*
             *  <l-expression> is classified as a procedural module or a type referencing a class defined in a
             *  class module, and one of the following is true:
             *
             *  This module has an accessible UDT or Enum definition named <unrestricted-name>. In this
             *  case, the member access expression is classified as a type and refers to the specified UDT or
             *  Enum type.
             */
            var enclosingProjectType = _declarationFinder.FindMemberEnclosedProjectInModule(_project, _module, _parent, module, name, memberType);

            if (enclosingProjectType != null)
            {
                return(new MemberAccessExpression(enclosingProjectType, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression));
            }

            var referencedProjectType = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, module, name, memberType);

            if (referencedProjectType != null)
            {
                return(new MemberAccessExpression(referencedProjectType, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression));
            }
            return(null);
        }
Exemple #2
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);
        }
Exemple #3
0
        private IBoundExpression ResolveModuleReferencedProjectNamespace()
        {
            /*  Namespace tier 6:
             *  Module in Referenced Project namespace: An accessible variable, constant, Enum type,
             *  Enum member, property, function or subroutine defined in a procedural module or as a member
             *  of the default instance of a global class module within a referenced project.
             */

            // Part 1: Procedural module as parent
            var accessibleVariable = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.Variable);

            if (IsValidMatch(accessibleVariable, _name))
            {
                return(new SimpleNameExpression(accessibleVariable, ExpressionClassification.Variable, _context));
            }
            var accessibleConstant = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.Constant);

            if (IsValidMatch(accessibleConstant, _name))
            {
                return(new SimpleNameExpression(accessibleConstant, ExpressionClassification.Variable, _context));
            }
            var accessibleType = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.Enumeration);

            if (IsValidMatch(accessibleType, _name))
            {
                return(new SimpleNameExpression(accessibleType, ExpressionClassification.Type, _context));
            }
            var accessibleMember = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.EnumerationMember);

            if (IsValidMatch(accessibleMember, _name))
            {
                return(new SimpleNameExpression(accessibleMember, ExpressionClassification.Value, _context));
            }
            var accessibleProperty = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, _propertySearchType);

            if (IsValidMatch(accessibleProperty, _name))
            {
                return(new SimpleNameExpression(accessibleProperty, ExpressionClassification.Property, _context));
            }
            var accessibleFunction = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.Function);

            if (IsValidMatch(accessibleFunction, _name))
            {
                return(new SimpleNameExpression(accessibleFunction, ExpressionClassification.Function, _context));
            }
            var accessibleSubroutine = _declarationFinder.FindMemberReferencedProjectInModule(_project, _module, _parent, DeclarationType.ProceduralModule, _name, DeclarationType.Procedure);

            if (IsValidMatch(accessibleSubroutine, _name))
            {
                return(new SimpleNameExpression(accessibleSubroutine, ExpressionClassification.Subroutine, _context));
            }

            // Part 2: Global class module as parent
            var globalClassModuleVariable = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.Variable);

            if (IsValidMatch(globalClassModuleVariable, _name))
            {
                return(new SimpleNameExpression(globalClassModuleVariable, ExpressionClassification.Variable, _context));
            }
            var globalClassModuleConstant = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.Constant);

            if (IsValidMatch(globalClassModuleConstant, _name))
            {
                return(new SimpleNameExpression(globalClassModuleConstant, ExpressionClassification.Variable, _context));
            }
            var globalClassModuleType = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.Enumeration);

            if (IsValidMatch(globalClassModuleType, _name))
            {
                return(new SimpleNameExpression(globalClassModuleType, ExpressionClassification.Type, _context));
            }
            var globalClassModuleMember = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.EnumerationMember);

            if (IsValidMatch(globalClassModuleMember, _name))
            {
                return(new SimpleNameExpression(globalClassModuleMember, ExpressionClassification.Value, _context));
            }
            var globalClassModuleProperty = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, _propertySearchType);

            if (IsValidMatch(globalClassModuleProperty, _name))
            {
                return(new SimpleNameExpression(globalClassModuleProperty, ExpressionClassification.Property, _context));
            }
            var globalClassModuleFunction = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.Function);

            if (IsValidMatch(globalClassModuleFunction, _name))
            {
                return(new SimpleNameExpression(globalClassModuleFunction, ExpressionClassification.Function, _context));
            }
            var globalClassModuleSubroutine = _declarationFinder.FindMemberReferencedProjectInGlobalClassModule(_project, _module, _parent, _name, DeclarationType.Procedure);

            if (IsValidMatch(globalClassModuleSubroutine, _name))
            {
                return(new SimpleNameExpression(globalClassModuleSubroutine, ExpressionClassification.Subroutine, _context));
            }

            return(null);
        }