/// <remarks>
        /// Interface implementation members are private, they're not called from an object
        /// variable reference of the type of the procedure's class, and whether they're called or not,
        /// they have to be implemented anyway, so removing them would break the code.
        /// Best just ignore them.
        /// </remarks>
        private bool IsInterfaceMember(IEnumerable <Declaration> declarations, IEnumerable <Declaration> classes, Declaration procedure)
        {
            // get the procedure's parent module
            var enumerable = classes as IList <Declaration> ?? classes.ToList();
            var parent     = enumerable.Where(item => item.ProjectId == procedure.ProjectId)
                             .SingleOrDefault(item => item.IdentifierName == procedure.ComponentName);

            if (parent == null)
            {
                return(false);
            }

            var interfaces = enumerable.Where(item => item.References.Any(reference =>
                                                                          ParserRuleContextHelper.HasParent <VBAParser.ImplementsStmtContext>(reference.Context.Parent)));

            if (interfaces.Select(i => i.ComponentName).Contains(procedure.ComponentName))
            {
                return(true);
            }

            var result = GetImplementedInterfaceMembers(declarations, enumerable, procedure.ComponentName)
                         .Contains(procedure.IdentifierName);

            return(result);
        }
        private IEnumerable <string> GetImplementedInterfaceMembers(IEnumerable <Declaration> declarations, IEnumerable <Declaration> classes, string componentName)
        {
            var interfaces = classes.Where(item => item.References.Any(reference =>
                                                                       ParserRuleContextHelper.HasParent <VBAParser.ImplementsStmtContext>(reference.Context.Parent) &&
                                                                       reference.QualifiedModuleName.Component.Name == componentName));

            var members = interfaces.SelectMany(declarations.InScope)
                          .Select(member => member.ComponentName + "_" + member.IdentifierName);

            return(members);
        }
예제 #3
0
        private bool IsIndexExprContext(IdentifierReference usage)
        {
            var indexExpr = ParserRuleContextHelper.GetParent <VBAParser.IndexExprContext>(usage.Context);

            if (indexExpr == null)
            {
                return(false);
            }
            var argumentList = indexExpr.argumentList();

            if (argumentList == null)
            {
                return(true);
            }
            return(!ParserRuleContextHelper.HasParent(usage.Context, argumentList));
        }
예제 #4
0
        private bool IsCallStmt(IdentifierReference usage)
        {
            var callStmt = ParserRuleContextHelper.GetParent <VBAParser.CallStmtContext>(usage.Context);

            if (callStmt == null)
            {
                return(false);
            }
            var argumentList = CallStatement.GetArgumentList(callStmt);

            if (argumentList == null)
            {
                return(true);
            }
            return(!ParserRuleContextHelper.HasParent(usage.Context, argumentList));
        }
예제 #5
0
 private bool IsTypeOfExpression(IdentifierReference usage)
 {
     return(ParserRuleContextHelper.HasParent <VBAParser.TypeofexprContext>(usage.Context));
 }
예제 #6
0
 private bool IsAddressOfCall(IdentifierReference usage)
 {
     return(ParserRuleContextHelper.HasParent <VBAParser.AddressOfExpressionContext>(usage.Context));
 }