public override void EnterVariableSubStmt(VBAParser.VariableSubStmtContext context)
        {
            var parent        = (VBAParser.VariableStmtContext)context.Parent.Parent;
            var accessibility = GetMemberAccessibility(parent.visibility());
            var identifier    = context.identifier();

            if (identifier == null)
            {
                return;
            }
            var name         = Identifier.GetName(identifier);
            var typeHint     = Identifier.GetTypeHintValue(identifier);
            var asTypeClause = context.asTypeClause();
            var asTypeName   = asTypeClause == null
                ? Tokens.Variant
                : asTypeClause.type().GetText();
            var  withEvents   = parent.WITHEVENTS() != null;
            var  isAutoObject = asTypeClause != null && asTypeClause.NEW() != null;
            bool isArray      = context.LPAREN() != null;

            AddDeclaration(
                CreateDeclaration(
                    name,
                    asTypeName,
                    accessibility,
                    DeclarationType.Variable,
                    context,
                    context.identifier().GetSelection(),
                    isArray,
                    asTypeClause,
                    typeHint,
                    isAutoObject,
                    withEvents));
        }
 private static RewriterInfo GetModuleVariableRemovalInfo(VBAParser.VariableSubStmtContext target,
                                                          VBAParser.ModuleDeclarationsElementContext element,
                                                          int count, int itemIndex, IReadOnlyList <VBAParser.VariableSubStmtContext> items)
 {
     if (count == 1)
     {
         return(GetSeparateModuleVariableRemovalInfo(element));
     }
     return(GetRewriterInfoForTargetRemovedFromListStmt(target.Start, itemIndex, items));
 }
        private string DeclareExplicitVariant(VBAParser.VariableSubStmtContext context, out string instruction)
        {
            if (context == null)
            {
                instruction = null;
                return(null);
            }

            instruction = context.GetText();
            return(instruction + ' ' + Tokens.As + ' ' + Tokens.Variant);
        }
        private static RewriterInfo GetLocalVariableRemovalInfo(VBAParser.VariableSubStmtContext target,
                                                                VBAParser.VariableListStmtContext variables,
                                                                int count, int itemIndex, IReadOnlyList <VBAParser.VariableSubStmtContext> items)
        {
            if (count == 1)
            {
                return(GetSeparateLocalVariableRemovalInfo(variables));
            }

            return(GetRewriterInfoForTargetRemovedFromListStmt(target.Start, itemIndex, items));
        }
        private static RewriterInfo GetLocalVariableRemovalInfo(VBAParser.VariableSubStmtContext target,
                                                                VBAParser.VariableListStmtContext variables,
                                                                int count, int itemIndex, IReadOnlyList <VBAParser.VariableSubStmtContext> items)
        {
            var mainBlockStmt = (VBAParser.MainBlockStmtContext)variables.Parent.Parent;
            var startIndex    = mainBlockStmt.Start.TokenIndex;

            if (count == 1)
            {
                int stopIndex = variables.Stop.TokenIndex + 1; // also remove trailing newlines?

                var containingBlock = (VBAParser.BlockContext)mainBlockStmt.Parent.Parent;
                var blockStmtIndex  = containingBlock.children.IndexOf(mainBlockStmt.Parent);
                // a few things can happen here
                if (blockStmtIndex == containingBlock.ChildCount)
                {
                    // well we're lucky?
                    stopIndex = containingBlock.Stop.TokenIndex;
                }
                else if (containingBlock.GetChild(blockStmtIndex + 1) is VBAParser.EndOfStatementContext eos)
                {
                    // since EOS includes the following comment, we need to do weird shit
                    // eos cannot be EOF, since we're on a local var, but it can be a statment separator
                    var eol = eos.endOfLine(0);
                    if (eol?.commentOrAnnotation() != null)
                    {
                        stopIndex = eol.commentOrAnnotation().Start.TokenIndex - 1;
                    }
                    else
                    {
                        // remove until the end of the EOS or continue to the start of the following
                        if (blockStmtIndex + 2 >= containingBlock.ChildCount)
                        {
                            stopIndex = eol.Stop.TokenIndex;
                        }
                        else
                        {
                            stopIndex = containingBlock.GetChild <ParserRuleContext>(blockStmtIndex + 2).Start.TokenIndex - 1;
                        }
                    }
                }

                return(new RewriterInfo(startIndex, stopIndex));
            }

            var blockStmt  = (VBAParser.BlockStmtContext)mainBlockStmt.Parent;
            var block      = (VBAParser.BlockContext)blockStmt.Parent;
            var statements = block.blockStmt();

            return(GetRewriterInfoForTargetRemovedFromListStmt(target.Start, itemIndex, items));
        }
        private static RewriterInfo GetModuleVariableRemovalInfo(VBAParser.VariableSubStmtContext target,
                                                                 VBAParser.ModuleDeclarationsElementContext element,
                                                                 int count, int itemIndex, IReadOnlyList <VBAParser.VariableSubStmtContext> items)
        {
            var startIndex = element.Start.TokenIndex;
            var parent     = (VBAParser.ModuleDeclarationsContext)element.Parent;
            var elements   = parent.moduleDeclarationsElement();

            if (count == 1)
            {
                var stopIndex = FindStopTokenIndex(elements, element, parent);
                return(new RewriterInfo(startIndex, stopIndex));
            }
            return(GetRewriterInfoForTargetRemovedFromListStmt(target.Start, itemIndex, items));
        }
Example #7
0
        public override void EnterVariableSubStmt(VBAParser.VariableSubStmtContext context)
        {
            var parent        = (VBAParser.VariableStmtContext)context.Parent.Parent;
            var accessibility = GetMemberAccessibility(parent.visibility());

            var asTypeClause = context.asTypeClause();
            var asTypeName   = asTypeClause == null
                ? Tokens.Variant
                : asTypeClause.type().GetText();

            var withEvents   = parent.WITHEVENTS() != null;
            var selfAssigned = asTypeClause != null && asTypeClause.NEW() != null;

            _declarations.Add(CreateDeclaration(context.ambiguousIdentifier().GetText(), asTypeName, accessibility, DeclarationType.Variable, context, context.ambiguousIdentifier().GetSelection(), selfAssigned, withEvents));
        }
        private static Selection?SingleVariableDeclarationStatementSelection(VBAParser.VariableSubStmtContext context)
        {
            if (context is null)
            {
                return(null);
            }

            var declaredVariableList = (VBAParser.VariableListStmtContext)context.Parent;

            if (declaredVariableList.variableSubStmt().Length != 1)
            {
                return(null);
            }

            var declarationContext = (VBAParser.VariableStmtContext)declaredVariableList.Parent;

            return(declarationContext.GetSelection());
        }
        private static RewriterInfo GetRewriterInfo(VBAParser.VariableSubStmtContext variable, VBAParser.VariableListStmtContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException(nameof(context), @"Context is null. Expecting a VBAParser.VariableListStmtContext instance.");
            }

            var items     = context.variableSubStmt();
            var itemIndex = items.ToList().IndexOf(variable);
            var count     = items.Length;

            if (context.Parent.Parent is VBAParser.ModuleDeclarationsElementContext element)
            {
                return(GetModuleVariableRemovalInfo(variable, element, count, itemIndex, items));
            }

            if (context.Parent is VBAParser.VariableStmtContext)
            {
                return(GetLocalVariableRemovalInfo(variable, context, count, itemIndex, items));
            }

            return(RewriterInfo.None);
        }
        private string DeclareExplicitVariant(VBAParser.VariableSubStmtContext context, string contextLines, out string instruction, out Selection selection)
        {
            if (context == null)
            {
                instruction = null;
                selection   = VBEditor.Selection.Empty;
                return(null);
            }

            var parent = (ParserRuleContext)context.Parent.Parent;

            selection   = parent.GetSelection();
            instruction = contextLines.Substring(selection.StartColumn - 1);

            var variable    = context.GetText();
            var replacement = context.identifier().GetText() + ' ' + Tokens.As + ' ' + Tokens.Variant;

            var insertIndex = instruction.IndexOf(variable, StringComparison.Ordinal);
            var result      = instruction.Substring(0, insertIndex)
                              + replacement + instruction.Substring(insertIndex + variable.Length);

            return(result);
        }
Example #11
0
        public static string GetName(VBAParser.VariableSubStmtContext context)
        {
            var nameContext = context.identifier();

            return(GetName(nameContext));
        }
Example #12
0
        public static string GetName(VBAParser.VariableSubStmtContext context, out Interval tokenInterval)
        {
            var nameContext = context.identifier();

            return(GetName(nameContext, out tokenInterval));
        }