Отключение «Перейти к определению», «Перейти к объявлению» и «Перейти к ссылке» в реализации LanguageService - PullRequest
0 голосов
/ 14 января 2019

Я работаю над созданием расширения базового языкового сервиса

Ниже приведен код языковой службы

[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
}

В контекстном меню редактора отображаются меню «Перейти к определению», «Перейти к объявлению» и «Перейти к справке».

Editor Right Click Menu Options

Поскольку я не реализую их сейчас, мне не нужны эти опции.

Я попытался отключить меню с помощью функций 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);
}

Есть ли лучший способ через сам языковой сервис, который помогает мне отключить это?

...