【问题标题】:How to create a ReSharper 8.X Custom Macro that can fetch and process the containing type name如何创建可以获取和处理包含类型名称的 ReSharper 8.X 自定义宏
【发布时间】:2014-07-30 11:32:06
【问题描述】:

ReSharper 8.X 附带了一个获取“包含类型名称”的宏,但我想做的是操纵该名称。我在 Visual Studio 2013 Web API 项目中使用它,我想要一个模板,它采用类名并构建必须调用的 URL。因此,例如,假设我有这个:

public class AnnouncementController : ApiController
{
    //Want to put a template here!
    [HttpGet]
    public HttpResponseMessage GetActiveAnnouncements()
    {
        /// ...
    }
 }

现在我的 ReSharper 模板将如下所示:

    /// This sample shows how to call the <see cref="$METHOD$"/> method of controller $CLASS$ using the Web API.
    ///      https://myurl.mydomain.com/api/$CONTROLLER$/$METHOD$

$Controller$,按照惯例,是类名减去字母“Controller”。这是因为 ASP.NET MVC Web API 项目期望从 ApiController 派生的类以字符串 'Controller' 结尾,

由于这个类是 AnnouncementController,模板应该输出

https://myurl.mydomain.com/api/Announcement/GetActiveAnnouncements

Resharper 的内置宏可以给我一些我需要的东西,但我想编写一个自定义宏来获取包含的类型名称并从中删除“控制器”。我想直接这样做,而不是将包含的类型名称存储在另一个参数中。

另外,如何安装此自定义宏?我在 Google 上四处搜索,发现很多死链接和为 ReSharper 版本 7 及更低版本编写的旧演练不适用于 ReSharper 8.x

【问题讨论】:

    标签: resharper-8.0


    【解决方案1】:

    经过大量的战斗,这是我的解决方案。

    [MacroImplementation(Definition = typeof (ControllerNameMacroDefinition))]
    public class ControllerNameMacroImplementation : SimpleMacroImplementation
    {
    
        public ControllerNameMacroImplementation([Optional] IReadOnlyCollection<IMacroParameterValueNew> arguments)
        {
    
        }
    
        public override HotspotItems GetLookupItems(IHotspotContext context)
        {
            var ret = "CONTROLLER";
            var fileName = GetFileName(context);
            if (!fileName.IsNullOrEmpty())
            {
                //Replace "Controller.cs" in two separate steps in case the extension is absent
                ret = fileName.Replace("Controller", "").Replace(".cs", "");
            }
            return MacroUtil.SimpleEvaluateResult(ret);
        }
    
        /// <summary>
        /// Returns the filename of the current hotspot context
        /// </summary>
        private string GetFileName(IHotspotContext context)
        {
            var psiSourceFile = context.ExpressionRange.Document.GetPsiSourceFile(context.SessionContext.Solution);
            return psiSourceFile == null ? string.Empty : psiSourceFile.Name;
        }
    }
    

    【讨论】:

      【解决方案2】:

      我确实想这样做,但对于 JavaScript Jasmine 测试 -- SomethingViewModel.js,固定装置为 SomethingViewModelFixture.js,但希望能够在文件中引用 SomethingViewModel。对上述内容稍作修改即可。

      不幸的是,您需要做很多事情才能让您的插件真正安装。这是一个清单。我希望它是全面的。

      • NuGet 包安装JetBrains.ReSharper.SDK,请确保您安装了正确的版本!
      • 将您的类库 DLL 复制到 C:\Users\&lt;you&gt;\AppData\Local\JetBrains\ReSharper\&lt;version&gt;\plugins\&lt;your plugin name&gt;,如果需要,创建插件目录。
      • 您需要AssemblyInfo.cs 文件中的插件注释:
        • [assembly: PluginTitle("Your extensions for ReSharper")]
        • [assembly: PluginDescription("Some description")] -- 这显示在 ReSharper->Options->Plugins 中
        • [assembly: PluginVendor("You")]
      • 您的项目中需要一个定义MacroDefinition的类,以及上面的MacroImplementation
        • [MacroDefinition("MyNamespace.MyClassName", ShortDescription = "A short description of what it does.", LongDescription = "A long description of what it does.")]
        • “ShortDescription” - 显示在“选择宏”对话框列表中。
        • “LongDescription”,您可能认为这会出现在“选择宏”描述中,但事实并非如此。
        • 我刚刚在上面的文件中添加了这个注解。
      • 你添加MacroDefinition的文件需要实现IMacroDefinition,它有一个方法(GetPlaceholder)和一个属性(Parameters)。前者可以返回任何字符串(“a”),后者可以返回一个空数组。
      • 如果你愿意,你可以忽略 WiX/NuGet 的东西。仅用于本地安装。
      • 在 VS 中,ReSharper->Options->Plugins 部分包含一些关于您的插件可能无法加载的故障排除详细信息。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-07-15
        • 2021-10-27
        • 1970-01-01
        • 2013-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多