【问题标题】:How can I add language setting entries to existing CDT eclipse projects?如何将语言设置条目添加到现有的 CDT eclipse 项目?
【发布时间】:2020-05-20 12:31:55
【问题描述】:

我正在按照找到的步骤here 尝试使用 LanguageSettingsProvider 扩展点将构建设置添加到现有 Eclipse CDT 项目中的文件,但我的设置提供程序似乎没有显示在 UI 中,并且它的方法不是t 查询设置。

我之前使用an external settings provider 成功将设置添加到项目,但我couldn't find a way to add file-specific settings

我已经实现了 LanguageSettingsSerializableProvider 的子类(我们称之为 MyProvider),并将其添加到我的 plugin.xml 中:

    <extension
         point="org.eclipse.cdt.core.LanguageSettingsProvider">
      <provider
            class="com.example.MyProvider"
            id="MyProvider_id"
            name="I would like to see this in the UI">
         <language-scope id="org.eclipse.cdt.core.gcc"/>
         <language-scope id="org.eclipse.cdt.core.g++"/>
      </provider>
    </extension>

该类的实现大致如下:

    public class MyProvider
                       extends LanguageSettingsSerializableProvider
                       implements ILanguageSettingsProvider,
                                  IResourceChangeListener,
                                  ILanguageSettingsEditableProvider,
                                  ILanguageSettingsBroadcastingProvider {
        /** The ID of this settings provider */
        public static final String MY_PROVIDER_ID = "MyProvider_id"; //$NON-NLS-

        /**
         * Constructor. Initialises super class with appropriate values.
         */
        public MyProvider() {
            super( MY_PROVIDER_ID , Messages.UiLabel );
        }

        @Override
        public String getId() {
            return MY_PROVIDER_ID ;
        }

        @Override
        public String getName() {
            return Messages.UiLabel;
        }

        @Override
        public List<ICLanguageSettingEntry> getSettingEntries(ICConfigurationDescription cfgDescription, IResource resource, String languageId) {
            //breakpoint on this line that never gets hit...
            return super.getSettingEntries( cfgDescription, resource, languageId );
        }

        ...

    }

真正的实现包含一些其他逻辑来实际创建设置条目,包括将自己注册为资源更改侦听器。 resourceChanged 代码工作正常,调用setSettingsEntries,然后调用serializeSettings。但是,永远不会调用 getSettingEntries 来获取这些设置。

我有什么遗漏吗?

我的猜测是 plugin.xml 缺少一些东西,但我不确定是什么。该类实现的各种接口中都有指导段落,但一个简单的工作示例价值超过一千字。我已经尝试查看内置设置提供程序的 xml(例如 GCCBuiltinCompilerSettingsMinGW),但它们是与 CDT 的许多其他部分一起定义的,很难判断哪些位与我的用例相关。

【问题讨论】:

    标签: eclipse eclipse-plugin eclipse-cdt


    【解决方案1】:

    我最终做的是:

    
        someMethod {
            final IProject myProject = getProjectFromSomewhere();
            final ICProjectDescription projDesc = CoreModel.getDefault().getProjectDescription( myProject );
            for (ICConfigurationDescription config : projDesc.getConfigurations()) {
                try {
                    ensureMySettingsProvidedFor( (ILanguageSettingsProvidersKeeper) config );
                } catch (ClassCastException e) {
                    logger.log( Level.WARNING, "Unexpected class was not a keeper of language settings:" + config.getClass().getName(), e );
                }
            }
        }
    
        /**
         * Will ensure my settings provider is registered as a settings provider for...
         * @param settingsKeeper ...the given configuration.
         */
        public static void ensureMySettingsProvidedFor(final ILanguageSettingsProvidersKeeper settingsKeeper) {
            if (settingsKeeper instanceof CConfigurationDescriptionCache) {
                logger.log(Level.SEVERE, "Got non-writable cached settings. We can't update this!! "
                        + "How do we get a writeable version?");
                return;
            }
            for ( ILanguageSettingsProvider provider : settingsKeeper.getLanguageSettingProviders() ) {
                if (MyProvider.MY_PROVIDER_ID.equals( provider.getId() )) {
                    return;
                }
            }
            addMyProvider( settingsKeeper );
        }
    
        /**
         * Adds my language settings provider to the given configuration by means of its ID.
         * @param settingsKeeper The existing configuration.
         */
        private static void addMyProvider( final ILanguageSettingsProvidersKeeper settingsKeeper ) {
            List<String> ids = new ArrayList<String>();
            for ( ILanguageSettingsProvider provider : settingsKeeper.getLanguageSettingProviders() ) {
                ids.add( provider.getId() );
            }
            ids.add(MyProvider.MY_PROVIDER_ID);
            List<ILanguageSettingsProvider> newProviders = LanguageSettingsManager.createLanguageSettingsProviders( ids.toArray( new String[ids.size()] ) );
            settingsKeeper.setLanguageSettingProviders(newProviders);
        }
    

    感觉不是最好的答案,但它似乎大部分时间都有效。
    一个问题是知道何时执行此操作,以便所有还没有提供程序但不会被重复或过于频繁地调用的项目都会发生这种情况。
    另一个问题是我们有时会得到一个CConfigurationDescriptionCache,然后代码什么也做不了。

    我愿意接受更好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 1970-01-01
      • 2012-08-22
      • 2014-04-30
      • 2014-10-20
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多