ReSharper 8 - 实时模板宏 - HotspotItems

时间:2013-11-11 12:59:21

标签: macros resharper

我目前正在使用ReSharper V8.1。我最近才开始使用ReSharper并且对他们的LiveTemplate宏感兴趣。我想出了一个解决方案,用于从常量中返回HotspotItem列表,类似于ReSharper的预定义宏"逗号分隔的值列表"。在方法中,我获取模板参数的常量变量并对它们执行拆分字符串以提供HotSpotItems的集合。不幸的是,如果我在模板中多次使用宏,它就无法工作。下面是一个极端的黑客工作,显示了我对IMacroImplementation的HotspotItems方法的实现。

我希望那里的某个人可能已经在这方面做了一些工作,并且可能提供一个例子,说明他们如何实现IMacroImplementation,它提供了一个来自常量的项目列表,并允许在一个内部进行多次使用。单个模板。 谢谢。

    public override HotspotItems GetLookupItems(IHotspotContext context)
    {



        HotspotItems hotSpotItems = null;
        foreach (var hotspot in context.HotspotSession.Hotspots)
        {
            if (hotspot.Expression != null && ((MacroCallExpressionNew)hotspot.Expression).Definition is Macros.DisplayMultipleItems)
            {
                //hotspot.CurrentValue
                var multiItems = ((MacroCallExpressionNew) hotspot.Expression).Definition as DisplayMultipleItems;
                if (!multiItems.ItemSet)
                {

                    var expression = hotspot.Expression as MacroCallExpressionNew;
                    IMacroParameterValueNew baseValue = expression.Parameters[0].GetValue(context.SessionContext.Solution.GetLifetime(), context.HotspotSession);
                    string templateValue = baseValue.GetValue();
                    multiItems.ItemSet = true;
                    if (!string.IsNullOrEmpty(templateValue) && templateValue.Split(',').Any())
                    {
                        var lookupItems = templateValue.Split(',').Select(param => new TextLookupItem(param)).Cast<ILookupItem>().ToList();
                        if (hotSpotItems == null)
                            hotSpotItems = new HotspotItems(lookupItems);
                        else
                        {
                            foreach (var item in lookupItems)
                            {
                              hotSpotItems.Items.Add(item);        
                            }

                        }

                    }
                }
            }

        }
        return hotSpotItems;
    }

1 个答案:

答案 0 :(得分:1)

你应该启动dotPeek并将其指向ReSharper bin目录并查看ListMacroDefListMacroImpl,这是逗号分隔列表宏的实现。

该定义来自SimpleMacroDefinition。它将在GetPlaceholder的调用中获得参数,查看第一个参数并用逗号分隔,将第一个项目作为占位符返回。

ListMacroImpl同样简单。其构造函数的[Optional]参数类型为MacroParameterValueCollection。这是热点编辑器中指定的参数值列表。您需要检查null并获取第一个参数,该参数将是您的分隔列表。然后,如果参数值为null,则覆盖GetLookupItems并返回HotspotItems.Empty,或者解析该值并返回TextLookupItem的列表。

您不需要查看会话和热点列表 - 当您只对当前热点感兴趣时,它将为您提供会话中的所有热点,并且ReSharper将创建新的IMacroImplementation对于每个热点,并在构造函数中为您提供这些值。