Здравствуйте, zhuravlik26, Вы писали:
Z>1) Лучше всего использовать типизированные ноды, а не ходить по соседям. Иначе любые локальные изменения дерева могут разломать ваш плагин.
Z>Z>var windowOnloadStatement = (IFunctionStatement)_highlighting.Element;
Z>var block = windowOnloadStatement.Expression.Block;
Z>
Z>А для поиска ноды по одному из ее child'ов, если вдруг вам понадобится потом, можно использовать навигаторы. Если у вас нода имеет интерфейс IMyNode, то для нее почти всегда есть навигатор MyNodeNavigator, который позволяет найти ноду этого типа по одной из child-нод. Это использовать надежнее, чем хождение по соседним нодам, потому что не убъется, если структура дерева в каком-то месте изменится (навигаторы автогенеренные и обновляются вместе с деревом, а их интерфейс остается в большинстве случаев тем же).
Спасибо за подробный ответ.
Дело в том, что подобная конструкция
function window.onload()
{
var xml = getXml();
}
имя функции с точкой, не валидная с точки зрения всех современных браузеров, кроме старого IE и решарпер парсит это выражение с ошибками, поэтому приходится ходить по нодам, поскольку блок находится отдельно от IFunctionStatement и между ними есть IExpressionStatement и ErrorElement, может есть более кашерный способ, не знаю. Буду признателен если подскажете как сделать по другому.
Переписал свой фикс на такой
protected override Action<ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
{
// "function window" statement
var windowOnloadStatement = Highlighting.Element;
var errorElement = windowOnloadStatement.NextSibling;
// onload() expression
var onloadExpression = (IExpressionStatement)errorElement.GetMeaningfulRightSib();
// function block
var block = (IBlock)onloadExpression.GetMeaningfulRightSib();
var factory = JavaScriptElementFactory.GetInstance(windowOnloadStatement);
var jqueryWinLoad = factory.CreateStatement(@"$(window).load(function(o_event) {{ }});");
var funcExpression = jqueryWinLoad.Descendants<IFunctionExpression>().First();
funcExpression.SetBlock(block);
var statement = windowOnloadStatement.ReplaceBy(jqueryWinLoad);
using (WriteLockCookie.Create())
{
ModificationUtil.DeleteChildRange(statement.NextSibling, statement.GetMeaningfulRightSib().GetMeaningfulRightSib());
}
return null;
}
Работает, как задумано, только после блока затирается newline character
Т.е если до фикса было так
function window.onload()
{
}
// number
var num1 = 5;
После фикса комментарий поднимается на одну строчку
$(window).load(function()
{
});// number
var num1 = 5;
А как реализовать Bulk Action для этого фикса? R9.1