首页 > 解决方案 > 在 LanguageService 实现中禁用 Go To Definition、Go To Declaration 和 Go To Reference

问题描述

我正在创建一个基本的语言服务扩展

以下是语言服务的代码

[ComVisible(true)]
[Guid("5CE7002C-0B61-47AB-9B99-EA0F62E0CE42")]
class CustomLanguageService : LanguageService
{
    public const string LanguageName = "Custom Language";
    public const string LanguageExtension = ".kav";
    private LanguagePreferences _preferences;

    public override string Name
    {
        get
        {
            return LanguageName;
        }
    }

    public override LanguagePreferences GetLanguagePreferences()
    {
        if (this._preferences == null)
        {
            this._preferences = new LanguagePreferences(this.Site, typeof(CustomLanguageService).GUID, this.Name);
            this._preferences.Init();

            this._preferences.EnableCommenting = true;
        }

        return this._preferences;
    }

    public override IScanner GetScanner(IVsTextLines buffer)
    {
        return null;
    }

    public override AuthoringScope ParseSource(ParseRequest req)
    {
        return null;
    }

    public override string GetFormatFilterList()
    {
        return "Custom Language (*.kav)\n*.kav";
    }

    public override Source CreateSource(IVsTextLines buffer)
    {
        return new CustomLanguageSource(this, buffer, this.GetColorizer(buffer));
    }
}

这是我的包裹代码

[PackageRegistration(UseManagedResourcesOnly = true)]
[DefaultRegistryRoot("Software\\Microsoft\\VisualStudio\\10.0")]
[ProvideObject(typeof(GeneralPropertyPage))]
[ProvideProjectFactory(typeof(MyCustomProjectFactory), "My Custom Project", "My Custom Project Files (*.myproj);*.myproj", "myproj", "myproj", @"..\..\Templates\Projects\MyCustomProject", LanguageVsTemplate = "MyCustomProject", NewProjectRequireNewFolderVsTemplate = false)]
[ProvideProjectItem(typeof(MyCustomProjectFactory), "My Items", @"..\..\Templates\ProjectItems\MyCustomProject", 500)]
[Guid(GuidStrings.guidCustomProjectPkgString)]
[ProvideService(typeof(CustomLanguageService))]
[ProvideLanguageExtension(typeof(CustomLanguageService), CustomLanguageService.LanguageExtension)]
[ProvideLanguageService(typeof(CustomLanguageService), CustomLanguageService.LanguageName, 0, EnableCommenting = true)]
public sealed class CustomProjectPackage : ProjectPackage
{
    private CustomLanguageService _customLanguageService;

    #region Overridden Implementation

    protected override void Initialize()
    {
        base.Initialize();
        this.RegisterProjectFactory(new MyCustomProjectFactory(this));

        _customLanguageService = new CustomLanguageService();

        _customLanguageService.SetSite(this);

        IServiceContainer serviceContainer = (IServiceContainer)this;
        serviceContainer.AddService(typeof(CustomLanguageService), _customLanguageService, true);

    }

    public override string ProductUserContext
    {
        get { return "CustomProj"; }
    }

    #endregion
}

在编辑器的右键菜单下,可以看到“Go To Definition”、“Go To Declaration”和“Go To Reference”菜单。

编辑器右键菜单选项

由于我现在没有实施这些,我不想要这些选项。

我尝试使用 IOleCommandTarget.QueryStatus 和 IOleCommandTarget.Exec 函数禁用菜单。但是,这样做只会隐藏“转到定义”和“转到声明”菜单,“转到参考”保持可见。我正在使用以下代码来隐藏它们:

int IOleCommandTarget.QueryStatus(ref Guid pguidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
{
    if (Microsoft.VisualStudio.Project.VsMenus.guidStandardCommandSet97 == pguidCmdGroup)
    {
        switch ((uint)prgCmds[0].cmdID)
        {
            case (uint)VsCommands.GotoDecl:
            case (uint)VsCommands.GotoDefn:
            case (uint)VsCommands.GotoRef:            
                prgCmds[0].cmdID |= (uint)QueryStatusResult.NOTSUPPORTED | (uint)QueryStatusResult.INVISIBLE;
                return VSConstants.S_OK;
        }
    }

    return _commandTarget.QueryStatus(ref pguidCmdGroup, cCmds, prgCmds, pCmdText);
}

有没有更好的方法通过语言服务本身来帮助我禁用它?

标签: c#visual-studiovisual-studio-extensionsvsx

解决方案


推荐阅读