コード例 #1
0
 internal ArgumentReference(
     QualifiedModuleName qualifiedName,
     Declaration parentScopingDeclaration,
     Declaration parentNonScopingDeclaration,
     string identifierName,
     Selection argumentSelection,
     ParserRuleContext context,
     VBAParser.ArgumentListContext argumentListContext,
     ArgumentListArgumentType argumentType,
     int argumentPosition,
     ParameterDeclaration referencedParameter,
     IEnumerable <IParseTreeAnnotation> annotations = null)
     : base(
         qualifiedName,
         parentScopingDeclaration,
         parentNonScopingDeclaration,
         identifierName,
         argumentSelection,
         context,
         referencedParameter,
         false,
         false,
         annotations)
 {
     ArgumentType          = argumentType;
     ArgumentPosition      = argumentPosition;
     ArgumentListContext   = argumentListContext;
     NumberOfArguments     = ArgumentListContext?.argument()?.Length ?? 0;
     ArgumentListSelection = argumentListContext?.GetSelection() ?? Selection.Empty;
 }
        private void UpdateCalls()
        {
            var procedureName = Identifier.GetName(_subStmtQualifiedContext.Context.subroutineName().identifier());

            var procedure =
                _state.AllDeclarations.SingleOrDefault(d =>
                                                       !d.IsBuiltIn &&
                                                       d.IdentifierName == procedureName &&
                                                       d.Context is VBAParser.SubStmtContext &&
                                                       d.QualifiedName.QualifiedModuleName.Equals(_subStmtQualifiedContext.ModuleName));

            if (procedure == null)
            {
                return;
            }

            foreach (var reference in procedure.References.OrderByDescending(o => o.Selection.StartLine).ThenByDescending(d => d.Selection.StartColumn))
            {
                var startLine = reference.Selection.StartLine;

                if (procedure.ComponentName == reference.QualifiedModuleName.ComponentName && procedure.Selection.EndLine < reference.Selection.StartLine)
                {
                    startLine += _lineOffset;
                }

                var module = reference.QualifiedModuleName.Component.CodeModule;

                var referenceParent = ParserRuleContextHelper.GetParent <VBAParser.CallStmtContext>(reference.Context);
                if (referenceParent == null)
                {
                    continue;
                }
                VBAParser.ArgumentListContext argList = CallStatement.GetArgumentList(referenceParent);
                List <string> paramNames     = new List <string>();
                string        argsCall       = string.Empty;
                int           argsCallOffset = 0;
                if (argList != null)
                {
                    argsCallOffset = argList.GetSelection().EndColumn - reference.Context.GetSelection().EndColumn;
                    argsCall       = argList.GetText();
                    if (argList.positionalOrNamedArgumentList().positionalArgumentOrMissing() != null)
                    {
                        paramNames.AddRange(argList.positionalOrNamedArgumentList().positionalArgumentOrMissing().Select(p =>
                        {
                            if (p is VBAParser.SpecifiedPositionalArgumentContext)
                            {
                                return(((VBAParser.SpecifiedPositionalArgumentContext)p).positionalArgument().GetText());
                            }
                            else
                            {
                                return(string.Empty);
                            }
                        }).ToList());
                    }
                    if (argList.positionalOrNamedArgumentList().namedArgumentList() != null)
                    {
                        paramNames.AddRange(argList.positionalOrNamedArgumentList().namedArgumentList().namedArgument().Select(p => p.GetText()).ToList());
                    }
                    if (argList.positionalOrNamedArgumentList().requiredPositionalArgument() != null)
                    {
                        paramNames.Add(argList.positionalOrNamedArgumentList().requiredPositionalArgument().GetText());
                    }
                }
                var referenceText = reference.Context.GetText();
                var newCall       = paramNames.ToList().ElementAt(_argListQualifiedContext.Context.arg().ToList().IndexOf(_argQualifiedContext.Context)) +
                                    " = " + _subStmtQualifiedContext.Context.subroutineName().GetText() +
                                    "(" + argsCall + ")";

                var oldLines = module.Lines[startLine, reference.Selection.LineCount];

                var newText = oldLines.Remove(reference.Selection.StartColumn - 1, referenceText.Length + argsCallOffset)
                              .Insert(reference.Selection.StartColumn - 1, newCall);

                module.DeleteLines(startLine, reference.Selection.LineCount);
                module.InsertLines(startLine, newText);
            }
        }