コード例 #1
0
 private void UpdateCondition(ParserRuleContext condition, IModuleRewriter rewriter)
 {
     if (condition.GetText().Contains(' '))
     {
         rewriter.InsertBefore(condition.Start.TokenIndex, "Not (");
         rewriter.InsertAfter(condition.Stop.TokenIndex, ")");
     }
     else
     {
         rewriter.InsertBefore(condition.Start.TokenIndex, "Not ");
     }
 }
コード例 #2
0
        private void UpdateContext(VBAParser.IfStmtContext context, IModuleRewriter rewriter)
        {
            var elseBlock   = context.elseBlock();
            var elseIfBlock = context.elseIfBlock().FirstOrDefault();

            if (BlockHasDeclaration(context.block()))
            {
                rewriter.InsertBefore(context.Start.TokenIndex, AdjustedBlockText(context.block()));
            }

            if (elseIfBlock != null)
            {
                rewriter.RemoveRange(context.IF().Symbol.TokenIndex, context.block()?.Stop.TokenIndex ?? context.endOfStatement().Stop.TokenIndex);
                rewriter.Replace(elseIfBlock.ELSEIF(), "If");
            }
            else if (elseBlock != null)
            {
                if (!string.IsNullOrEmpty(context.block()?.GetText()))
                {
                    rewriter.RemoveRange(context.block().Start.TokenIndex, elseBlock.ELSE().Symbol.TokenIndex);
                }
                else
                {
                    rewriter.Remove(elseBlock.ELSE());
                }

                Debug.Assert(context.booleanExpression().children.Count == 1);
                UpdateCondition((dynamic)context.booleanExpression().children[0], rewriter);
            }
            else
            {
                rewriter.Remove(context);
            }
        }
コード例 #3
0
 private static void AddByRefIdentifier(IModuleRewriter rewriter, VBAParser.ArgContext context)
 {
     if (context.BYREF() == null)
     {
         rewriter.InsertBefore(context.unrestrictedIdentifier().Start.TokenIndex, "ByRef ");
     }
 }
コード例 #4
0
        private void AdjustArgument(VBAParser.DictionaryAccessContext dictionaryAccessContext, IModuleRewriter rewriter)
        {
            var argumentContext = ArgumentContext(dictionaryAccessContext);

            rewriter.InsertBefore(argumentContext.Start.TokenIndex, "(\"");
            rewriter.InsertAfter(argumentContext.Stop.TokenIndex, "\")");
        }
コード例 #5
0
        private void UpdateContext(VBAParser.ElseIfBlockContext context, IModuleRewriter rewriter)
        {
            if (BlockHasDeclaration(context.block()))
            {
                rewriter.InsertBefore(((VBAParser.IfStmtContext)context.Parent).Start.TokenIndex, AdjustedBlockText(context.block()));
            }

            rewriter.Remove(context);
        }
コード例 #6
0
        private static void MakePositionalArgumentNamed(ArgumentReference argumentReference, IModuleRewriter rewriter)
        {
            var parameterName   = argumentReference.Declaration.IdentifierName;
            var insertionCode   = $"{parameterName}:=";
            var argumentContext = argumentReference.Context;
            var insertionIndex  = argumentContext.Start.TokenIndex;

            rewriter.InsertBefore(insertionIndex, insertionCode);
        }
コード例 #7
0
        public static void InsertAtEndOfFile(this IModuleRewriter rewriter, string content)
        {
            if (content == string.Empty)
            {
                return;
            }

            rewriter.InsertBefore(rewriter.TokenStream.Size - 1, content);
        }
コード例 #8
0
        private void AddField(IModuleRewriter rewriter, Declaration target)
        {
            var content = $"{Tokens.Private} {target.IdentifierName} {Tokens.As} {target.AsTypeName}\r\n";
            var members = _state.DeclarationFinder.Members(target.QualifiedName.QualifiedModuleName)
                          .Where(item => item.DeclarationType.HasFlag(DeclarationType.Member))
                          .OrderByDescending(item => item.Selection);

            var firstMember = members.FirstOrDefault();

            rewriter.InsertBefore(firstMember?.Context.Start.TokenIndex ?? 0, content);
        }
コード例 #9
0
        private void AddField(IModuleRewriter rewriter, Declaration target)
        {
            var content = $"{Tokens.Private} {target.IdentifierName} {Tokens.As} {target.AsTypeName}{Environment.NewLine}";
            var members = _declarationFinderProvider.DeclarationFinder
                          .Members(target.QualifiedName.QualifiedModuleName, DeclarationType.Member)
                          .OrderBy(item => item.Selection);

            var firstMember = members.FirstOrDefault();

            rewriter.InsertBefore(firstMember?.Context.Start.TokenIndex ?? 0, content);
        }
コード例 #10
0
        private void InsertLocalVariableDeclarationAndAssignment(IModuleRewriter rewriter, Declaration target, string localIdentifier)
        {
            var localVariableDeclaration = $"{Environment.NewLine}{Tokens.Dim} {localIdentifier} {Tokens.As} {target.AsTypeName}{Environment.NewLine}";

            var requiresAssignmentUsingSet =
                target.References.Any(refItem => VariableRequiresSetAssignmentEvaluator.RequiresSetAssignment(refItem, _parserState));

            var localVariableAssignment = requiresAssignmentUsingSet ? $"Set {localIdentifier} = {target.IdentifierName}" : $"{localIdentifier} = {target.IdentifierName}";

            rewriter.InsertBefore(((ParserRuleContext)target.Context.Parent).Stop.TokenIndex + 1, localVariableDeclaration + localVariableAssignment);
        }
コード例 #11
0
        public static void SetVariableVisiblity(this IModuleRewriter rewriter, Declaration element, string visibility)
        {
            if (!element.IsVariable())
            {
                throw new ArgumentException();
            }

            var variableStmtContext = element.Context.GetAncestor <VBAParser.VariableStmtContext>();
            var visibilityContext   = variableStmtContext.GetChild <VBAParser.VisibilityContext>();

            if (visibilityContext != null)
            {
                rewriter.Replace(visibilityContext, visibility);
                return;
            }
            rewriter.InsertBefore(element.Context.Start.TokenIndex, $"{visibility} ");
        }
コード例 #12
0
        private void InsertAfterLastModuleAttribute(IModuleRewriter rewriter, QualifiedModuleName module, string codeToAdd)
        {
            var moduleParseTree     = (ParserRuleContext)_parseTreeProvider.GetParseTree(module, CodeKind.AttributesCode);
            var lastModuleAttribute = moduleParseTree.GetDescendents <VBAParser.ModuleAttributesContext>()
                                      .Where(moduleAttributes => moduleAttributes.attributeStmt() != null)
                                      .SelectMany(moduleAttributes => moduleAttributes.attributeStmt())
                                      .OrderBy(moduleAttribute => moduleAttribute.stop.TokenIndex)
                                      .LastOrDefault();

            if (lastModuleAttribute == null)
            {
                //This should never happen for a real module.
                var codeToInsert = codeToAdd + Environment.NewLine;
                rewriter.InsertBefore(0, codeToInsert);
            }
            else
            {
                var codeToInsert = Environment.NewLine + codeToAdd;
                rewriter.InsertAfter(lastModuleAttribute.stop.TokenIndex, codeToInsert);
            }
        }
コード例 #13
0
        private static void SetPrivateVariableVisiblity(IReadOnlyCollection <IEncapsulateFieldCandidate> fields, IModuleRewriter rewriter)
        {
            var visibility = Accessibility.Private.TokenString();

            foreach (var element in fields.Where(f => !f.Declaration.HasPrivateAccessibility()).Select(f => f.Declaration))
            {
                if (!element.IsVariable())
                {
                    throw new ArgumentException();
                }

                var variableStmtContext = element.Context.GetAncestor <VBAParser.VariableStmtContext>();
                var visibilityContext   = variableStmtContext.GetChild <VBAParser.VisibilityContext>();

                if (visibilityContext != null)
                {
                    rewriter.Replace(visibilityContext, visibility);
                    continue;
                }
                rewriter.InsertBefore(element.Context.Start.TokenIndex, $"{visibility} ");
            }
        }
コード例 #14
0
        private void AddProperty(IModuleRewriter rewriter)
        {
            UpdateReferences();
            SetFieldToPrivate(rewriter);

            var members = _model.State.DeclarationFinder
                          .Members(_model.TargetDeclaration.QualifiedName.QualifiedModuleName)
                          .OrderBy(declaration => declaration.QualifiedSelection);

            var fields = members.Where(d => d.DeclarationType == DeclarationType.Variable && !d.ParentScopeDeclaration.DeclarationType.HasFlag(DeclarationType.Member)).ToList();

            var property = Environment.NewLine + Environment.NewLine + GetPropertyText();

            if (members.Any(m => m.DeclarationType.HasFlag(DeclarationType.Member)))
            {
                property += Environment.NewLine;
            }

            if (_model.TargetDeclaration.Accessibility != Accessibility.Private)
            {
                var newField = $"Private {_model.TargetDeclaration.IdentifierName} As {_model.TargetDeclaration.AsTypeName}";
                if (fields.Count > 1)
                {
                    newField = Environment.NewLine + newField;
                }

                property = newField + property;
            }

            if (_model.TargetDeclaration.Accessibility == Accessibility.Private || fields.Count > 1)
            {
                rewriter.InsertAfter(fields.Last().Context.Stop.TokenIndex, property);
            }
            else
            {
                rewriter.InsertBefore(0, property);
            }
        }