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); } }