Re[2]: R9 SDK question
От: ifle  
Дата: 16.04.15 16:05
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.