private IBoundExpression ResolveProceduralModule(bool lExpressionIsEnclosingProject, IBoundExpression lExpression, string name, Declaration referencedProject)
 {
     /*
      *  The project has an accessible procedural module named <unrestricted-name>. In this case, the
      *  member access expression is classified as a procedural module and refers to the specified
      *  procedural module.
      */
     if (lExpressionIsEnclosingProject)
     {
         if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
         {
             return(new MemberAccessExpression(_module, ExpressionClassification.ProceduralModule, _expression, _unrestrictedNameContext, lExpression));
         }
         var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ProceduralModule);
         if (proceduralModuleEnclosingProject != null)
         {
             return(new MemberAccessExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _expression, _unrestrictedNameContext, lExpression));
         }
     }
     else
     {
         var proceduralModuleInReferencedProject = _declarationFinder.FindModuleReferencedProject(_project, _module, referencedProject, name, DeclarationType.ProceduralModule);
         if (proceduralModuleInReferencedProject != null)
         {
             return(new MemberAccessExpression(proceduralModuleInReferencedProject, ExpressionClassification.ProceduralModule, _expression, _unrestrictedNameContext, lExpression));
         }
     }
     return(null);
 }
        private IBoundExpression ResolveEnclosingProject(string name)
        {
            /*  Namespace tier 2:
             *  Enclosing Project namespace: The enclosing project itself, a referenced project, or a
             *  procedural module or class module contained in the enclosing project.
             */
            if (_declarationFinder.IsMatch(_project.ProjectName, name))
            {
                // Ensure there is no ambiguous matches
                var ambiguousClassModule = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ClassModule);
                if (ambiguousClassModule != null)
                {
                    // We have an indeterminate result; let's check if this is a part of member access first...
                    if (_expression.Parent.GetType().Name != nameof(VBAParser.MemberAccessExprContext))
                    {
                        // There is no qualifier -- this is normally a VBA compile error
                        throw new InvalidOperationException($"There cannot be a unqualified reference where the name '{name}' is ambiguous.");
                    }
                }

                return(new SimpleNameExpression(_project, ExpressionClassification.Project, _expression));
            }
            var referencedProject = _declarationFinder.FindReferencedProject(_project, name);

            if (referencedProject != null)
            {
                return(new SimpleNameExpression(referencedProject, ExpressionClassification.Project, _expression));
            }
            if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.ProceduralModule, _expression));
            }
            var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ProceduralModule);

            if (proceduralModuleEnclosingProject != null)
            {
                return(new SimpleNameExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _expression));
            }
            if (_module.DeclarationType == DeclarationType.ClassModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.Type, _expression));
            }
            var classEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ClassModule);

            if (classEnclosingProject != null)
            {
                return(new SimpleNameExpression(classEnclosingProject, ExpressionClassification.Type, _expression));
            }
            return(null);
        }
Exemple #3
0
        private IBoundExpression ResolveEnclosingProjectNamespace()
        {
            /*  Namespace tier 3:
             *  Enclosing Project namespace: The enclosing project itself, a referenced project, or a
             *  procedural module contained in the enclosing project.
             */
            if (_declarationFinder.IsMatch(_project.ProjectName, _name))
            {
                return(new SimpleNameExpression(_project, ExpressionClassification.Project, _context));
            }
            var referencedProject = _declarationFinder.FindReferencedProject(_project, _name);

            if (referencedProject != null)
            {
                return(new SimpleNameExpression(referencedProject, ExpressionClassification.Project, _context));
            }
            if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, _name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.ProceduralModule, _context));
            }
            var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, _name, DeclarationType.ProceduralModule);

            if (proceduralModuleEnclosingProject != null)
            {
                return(new SimpleNameExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _context));
            }
            var defaultInstanceVariableClass = _declarationFinder.FindDefaultInstanceVariableClassEnclosingProject(_project, _module, _name);

            if (defaultInstanceVariableClass != null)
            {
                return(new SimpleNameExpression(defaultInstanceVariableClass, ExpressionClassification.Type, _context));
            }
            return(null);
        }
        private IBoundExpression ResolveEnclosingProject(string name)
        {
            /*  Namespace tier 2:
             *  Enclosing Project namespace: The enclosing project itself, a referenced project, or a
             *  procedural module or class module contained in the enclosing project.
             */
            if (_declarationFinder.IsMatch(_project.ProjectName, name))
            {
                return(new SimpleNameExpression(_project, ExpressionClassification.Project, _expression));
            }
            var referencedProject = _declarationFinder.FindReferencedProject(_project, name);

            if (referencedProject != null)
            {
                return(new SimpleNameExpression(referencedProject, ExpressionClassification.Project, _expression));
            }
            if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.ProceduralModule, _expression));
            }
            var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ProceduralModule);

            if (proceduralModuleEnclosingProject != null)
            {
                return(new SimpleNameExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _expression));
            }
            if (_module.DeclarationType == DeclarationType.ClassModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.Type, _expression));
            }
            var classEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ClassModule);

            if (classEnclosingProject != null)
            {
                return(new SimpleNameExpression(classEnclosingProject, ExpressionClassification.Type, _expression));
            }
            return(null);
        }
        private IBoundExpression ResolveEnclosingProject(string name)
        {
            /*
             *  Enclosing Project namespace: The enclosing project itself or a procedural module contained in
             *  the enclosing project.
             */
            if (_declarationFinder.IsMatch(_project.Project.Name, name))
            {
                return(new SimpleNameExpression(_project, ExpressionClassification.Project, _expression));
            }
            if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, name))
            {
                return(new SimpleNameExpression(_module, ExpressionClassification.ProceduralModule, _expression));
            }
            var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, name, DeclarationType.ProceduralModule);

            if (proceduralModuleEnclosingProject != null)
            {
                return(new SimpleNameExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _expression));
            }
            return(null);
        }
Exemple #6
0
 private IBoundExpression ResolveProceduralModule(bool lExpressionIsEnclosingProject, Declaration referencedProject)
 {
     if (lExpressionIsEnclosingProject)
     {
         if (_module.DeclarationType == DeclarationType.ProceduralModule && _declarationFinder.IsMatch(_module.IdentifierName, _name))
         {
             return(new MemberAccessExpression(_module, ExpressionClassification.ProceduralModule, _context, _unrestrictedNameContext, _lExpression));
         }
         var proceduralModuleEnclosingProject = _declarationFinder.FindModuleEnclosingProjectWithoutEnclosingModule(_project, _module, _name, DeclarationType.ProceduralModule);
         if (proceduralModuleEnclosingProject != null)
         {
             return(new MemberAccessExpression(proceduralModuleEnclosingProject, ExpressionClassification.ProceduralModule, _context, _unrestrictedNameContext, _lExpression));
         }
     }
     else
     {
         var proceduralModuleInReferencedProject = _declarationFinder.FindModuleReferencedProject(_project, _module, referencedProject, _name, DeclarationType.ProceduralModule);
         if (proceduralModuleInReferencedProject != null)
         {
             return(new MemberAccessExpression(proceduralModuleInReferencedProject, ExpressionClassification.ProceduralModule, _context, _unrestrictedNameContext, _lExpression));
         }
     }
     return(null);
 }