Пример #1
0
            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);
            }
Пример #2
0
            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);
        }