private ClrChangeSignatureParameter FindBestMatch(ParameterSignature requiredParameter, ClrChangeSignatureModel model, int i) { var parameters = model.ChangeSignatureParameters; // Look through all parameters for an exact match for (var j = i; j < parameters.Length; j++) { if (parameters[j].ParameterName == requiredParameter.Name && Equals(parameters[j].ParameterType, requiredParameter.Type)) { return(parameters[j]); } } // Now just match type - we'll update name after for (var j = i; j < parameters.Length; j++) { if (Equals(parameters[j].ParameterType, requiredParameter.Type)) { return(parameters[j]); } } return(null); }
private Action <ITextControl> ChangeParameters(ISolution solution) { var model = ClrChangeSignatureModel.CreateModel(myMethodDeclaration.DeclaredElement).NotNull(); for (var i = 0; i < myExpectedMethodSignature.Parameters.Length; i++) { var requiredParameter = myExpectedMethodSignature.Parameters[i]; var modelParameter = FindBestMatch(requiredParameter, model, i); if (modelParameter != null) { // If the current index is correct, do nothing. If not, use the original index to find the item to move if (modelParameter.ParameterIndex != i) { model.MoveTo(modelParameter.OriginalParameterIndex, i); } } else { model.Add(i); modelParameter = model.ChangeSignatureParameters[i]; } modelParameter.ParameterName = requiredParameter.Name; modelParameter.ParameterKind = ParameterKind.VALUE; modelParameter.ParameterType = requiredParameter.Type; // Reset everything else modelParameter.IsOptional = false; modelParameter.IsParams = false; modelParameter.IsThis = false; modelParameter.IsVarArg = false; } for (var i = model.ChangeSignatureParameters.Length - 1; i >= myExpectedMethodSignature.Parameters.Length; i--) { model.RemoveAt(i); } var refactoring = new ChangeSignatureRefactoring(model); refactoring.Execute(NullProgressIndicator.Create()); // Ideally, we would now call InplaceRefactoringsManager.Reset to make sure we didn't have // an inplace refactoring highlight. But InplaceRefactoringsManager is internal, so we can't. // We don't want a highlight telling us to "apply signature change refactoring" because we // just have. The only way to remove it is to fire the Escape action return(tc => { var highlightingManager = solution.GetComponent <InplaceRefactoringsHighlightingManager>(); if (highlightingManager.GetHighlightersForTests(tc).Any()) { var actionManager = solution.GetComponent <IActionManager>(); var escapeActionHandler = actionManager.Defs.GetActionDef <EscapeActionHandler>(); escapeActionHandler.EvaluateAndExecute(actionManager); } }); }
private ClrChangeSignatureParameter FindBestMatch(ParameterSignature requiredParameter, ClrChangeSignatureModel model, int i) { var parameters = model.ChangeSignatureParameters.Cast <ClrChangeSignatureParameter>().ToList(); // Try and match type and name first for (var j = i; j < parameters.Count; j++) { if (parameters[j].ParameterName == requiredParameter.Name && Equals(parameters[j].ParameterType, requiredParameter.Type)) { return(parameters[j]); } } // Now just match type - we'll update name after for (var j = i; j < parameters.Count; j++) { if (Equals(parameters[j].ParameterType, requiredParameter.Type)) { return(parameters[j]); } } return(null); }