private IBoundExpression ResolveModuleInReferencedProject(string name)
        {
            /*  Namespace tier 5:
             *  Module in Referenced Project namespace: An accessible UDT or Enum type defined in a
             *  procedural module or class module within a referenced project.
             */
            var referencedProjectUdt = _declarationFinder.FindMemberReferencedProject(_project, _module, _parent, name, DeclarationType.UserDefinedType);

            if (referencedProjectUdt != null)
            {
                return(new SimpleNameExpression(referencedProjectUdt, ExpressionClassification.Type, _expression));
            }
            var referencedProjectEnumType = _declarationFinder.FindMemberReferencedProject(_project, _module, _parent, name, DeclarationType.Enumeration);

            if (referencedProjectEnumType != null)
            {
                return(new SimpleNameExpression(referencedProjectEnumType, ExpressionClassification.Type, _expression));
            }
            var referencedProjectAliasType = _declarationFinder.FindMemberReferencedProject(_project, _module, _parent, name, DeclarationType.ComAlias);

            if (referencedProjectAliasType != null)
            {
                return(new SimpleNameExpression(referencedProjectAliasType, ExpressionClassification.Type, _expression));
            }
            return(null);
        }
 private IBoundExpression ResolveMemberInReferencedProject(bool lExpressionIsEnclosingProject, IBoundExpression lExpression, string name, Declaration referencedProject, DeclarationType memberType)
 {
     /*
      *  The project does not have an accessible module named <unrestricted-name> and exactly one of
      *  the procedural modules within the project contains a 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.
      */
     if (lExpressionIsEnclosingProject)
     {
         var foundType = _declarationFinder.FindMemberEnclosingModule(_module, _parent, name, memberType);
         if (foundType != null)
         {
             return(new MemberAccessExpression(foundType, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression));
         }
         var accessibleType = _declarationFinder.FindMemberEnclosedProjectWithoutEnclosingModule(_project, _module, _parent, name, memberType);
         if (accessibleType != null)
         {
             return(new MemberAccessExpression(accessibleType, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression));
         }
     }
     else
     {
         var referencedProjectType = _declarationFinder.FindMemberReferencedProject(_project, _module, _parent, referencedProject, name, memberType);
         if (referencedProjectType != null)
         {
             return(new MemberAccessExpression(referencedProjectType, ExpressionClassification.Type, _expression, _unrestrictedNameContext, lExpression));
         }
     }
     return(null);
 }
Exemple #3
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);
 }