protected override Action <JetBrains.TextControl.ITextControl> ExecutePsiTransaction(JetBrains.ProjectModel.ISolution solution, JetBrains.Application.Progress.IProgressIndicator progress)
        {
            if (!Highlighting.IsValid())
            {
                return(null);
            }

            var node             = Highlighting.Node;
            var badWordTextRange = Highlighting.Range.TextRange;

            var newText = StringUtil.ReplaceSection(
                node.GetText(),
                Suggestion,
                badWordTextRange.StartOffset - node.GetDocumentRange().TextRange.StartOffset,
                badWordTextRange.Length
                );

            if (node is TreeElement)
            {
                var elementFactory = HtmlElementFactory.GetInstance(node.Language);
                var newElements    = elementFactory.CompileText(newText, node).ToList();
                if (newElements.Count > 0)
                {
                    var recentNode = ModificationUtil.ReplaceChild(node, newElements[0]);
                    for (int i = 1; i < newElements.Count; i++)
                    {
                        recentNode = ModificationUtil.AddChildAfter(recentNode.Parent, recentNode, newElements[i]);
                    }
                }
                return(null);
            }
            return(null);
        }
        public override void Accept(JetBrains.TextControl.ITextControl textControl, JetBrains.Util.TextRange nameRange, LookupItemInsertType lookupItemInsertType, Suffix suffix, JetBrains.ProjectModel.ISolution solution, bool keepCaretStill)
        {
            Solution.GetPsiServices().Files.CommitAllDocuments();

            IDisposable changeUnit = Shell.Instance.GetComponent <TextControlChangeUnitFactory>().CreateChangeUnit(textControl, "Expand live template");

            try
            {
                var method = (IMethod)_instance.Element;
                var invocationExpression = ((IInvocationExpression)Context.NodeInFile.Parent); //target.GetMethod()


                string target = ((IReferenceExpression)invocationExpression.InvokedExpression).QualifierExpression.GetText();
                if (!method.IsStatic)
                {
                    target = string.Format("Expression.Default({0})", target);
                }


                textControl.Document.DeleteText(invocationExpression.GetDocumentRange().TextRange);

                string[] parameters;
                string[] arguments;
                BuildArguments(method, out parameters, out arguments);

                var template = new Template("GetMethodTemplate", string.Empty,
                                            string.Format("Expression.Call({0}, \"{1}\", new Type[] {{ {2} }}, {3}).Method", target, method.ShortName,
                                                          string.Join(", ", parameters.Select(p => string.Format("typeof({0})", p))),
                                                          string.Join(", ", arguments)),
                                            false, true, false, TemplateApplicability.Live);

                for (int i = 0; i < parameters.Length; i++)
                {
                    template.Fields.Add(new TemplateField(parameters[i].Replace("$", string.Empty), parameters[i], 0));
                }

                HotspotSession sessionFromTemplate = LiveTemplatesManager.Instance.CreateHotspotSessionFromTemplate(
                    template,
                    solution,
                    textControl, (Action <IHotspotSession>)null);
                if (sessionFromTemplate == null)
                {
                    return;
                }
                sessionFromTemplate.Execute(changeUnit);
            }
            catch
            {
                changeUnit.Dispose();
                throw;
            }
        }