首页 > 解决方案 > Eclipse 插件:在默认代码完成弹出窗口中添加自定义建议

问题描述

我正在制作一个需要在默认 Eclipse 弹出窗口中添加一些自定义建议的 Eclipse 插件。为此,我从eclipse 文档中了解到,我必须实施IJavaCompletionProposalComputer才能参与内容辅助过程。因此,我尝试了在github中找到的以下实现。我知道它会覆盖computeCompletionProposals()计算建议并作为ICompletionProposal列表返回的方法。但是我找不到在默认弹出窗口中添加自定义建议的方法。

知道我该怎么做吗?

package zzz.handlers;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.eclipse.jface.text.contentassist.IContextInformation;
import org.eclipse.ui.texteditor.HippieProposalProcessor;
import org.eclipse.jdt.ui.text.java.ContentAssistInvocationContext;
import org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer;
import java.util.*;

/**
 * Our sample handler extends AbstractHandler, an IHandler base class.
 * @see org.eclipse.core.commands.IHandler
 * @see org.eclipse.core.commands.AbstractHandler
 */
/**
 * A computer wrapper for the hippie processor.
 *
 * @since 3.2
 */
public final class HippieProposalComputer implements IJavaCompletionProposalComputer {
    /** The wrapped processor. */
    private final HippieProposalProcessor fProcessor= new HippieProposalProcessor();

    /**
     * Default ctor to make it instantiatable via the extension mechanism.
     */
    public HippieProposalComputer() {
    }

    /*
     * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#computeCompletionProposals(org.eclipse.jface.text.contentassist.TextContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
     */
    @Override
    public List<ICompletionProposal> computeCompletionProposals(ContentAssistInvocationContext context, IProgressMonitor monitor) {
        return Arrays.asList(fProcessor.computeCompletionProposals(context.getViewer(), context.getInvocationOffset()));
    }

    /*
     * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#computeContextInformation(org.eclipse.jface.text.contentassist.TextContentAssistInvocationContext, org.eclipse.core.runtime.IProgressMonitor)
     */
    @Override
    public List<IContextInformation> computeContextInformation(ContentAssistInvocationContext context, IProgressMonitor monitor) {
        return Arrays.asList(fProcessor.computeContextInformation(context.getViewer(), context.getInvocationOffset()));
    }

    /*
     * @see org.eclipse.jface.text.contentassist.ICompletionProposalComputer#getErrorMessage()
     */
    @Override
    public String getErrorMessage() {
        return fProcessor.getErrorMessage();
    }

    /*
     * @see org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer#sessionStarted()
     */
    @Override
    public void sessionStarted() {
    }

    /*
     * @see org.eclipse.jdt.ui.text.java.IJavaCompletionProposalComputer#sessionEnded()
     */
    @Override
    public void sessionEnded() {
    }
}

plugin.xml的如下...

<?xml version="1.0" encoding="UTF-8"?>
<?eclipse version="3.4"?>
<plugin>

 <extension point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
       id="WordCompletionProposalComputer"
       name="Word Completion Proposal Computer">
       <javaCompletionProposalComputer
          class="org.eclipse.jdt.internal.ui.text.java.HippieProposalComputer"
          categoryId="org.eclipse.ui.texteditor.textual_proposals">
          <partition type="__java_javadoc"/>
       </javaCompletionProposalComputer>
     </extension>

   <extension
         point="org.eclipse.ui.commands">
      <category
            name="Sample Category"
            id="zadawdaw.commands.category">
      </category>
      <command
            name="Sample Command"
            categoryId="zadawdaw.commands.category"
            id="zadawdaw.commands.sampleCommand">
      </command>
   </extension>
   <extension
         point="org.eclipse.ui.handlers">
      <handler
            commandId="zadawdaw.commands.sampleCommand"
            class="zadawdaw.handlers.SampleHandler">
      </handler>
   </extension>

   <extension point="org.eclipse.jdt.ui.javaCompletionProposalComputer"
   id="textual_proposals"
   name="Text Proposals">
   <proposalCategory icon="icons/wordcompletions.png"/>
 </extension>

   <extension
         point="org.eclipse.ui.menus">
      <menuContribution
            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
         <menu
               label="Sample Menu"
               mnemonic="M"
               id="zadawdaw.menus.sampleMenu">
            <command
                  commandId="zadawdaw.commands.sampleCommand"
                  mnemonic="S"
                  id="zadawdaw.menus.sampleCommand">
            </command>
         </menu>
      </menuContribution>
      <menuContribution
            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
         <toolbar
               id="zadawdaw.toolbars.sampleToolbar">
            <command
                  commandId="zadawdaw.commands.sampleCommand"
                  icon="icons/sample.png"
                  tooltip="Say hello world"
                  id="zadawdaw.toolbars.sampleCommand">
            </command>
         </toolbar>
      </menuContribution>
   </extension>

</plugin>

标签: javaeclipse-plugineclipse-jdtcode-completioncontent-assist

解决方案


到目前为止,似乎主要的错误是将提案提供者限制为分区类型__java_javadoc

您已经(几乎?)在正确的地方寻找 - 寻找type. 请注意,此定义也指IJavaPartitions。简而言之,分区是指编辑器中的文本段。链接接口列出了可能的常量以及简短描述。

如果您希望在编辑 Java 代码时提出补全,请尝试IJavaPartitions.JAVA_PARTITIONING.


推荐阅读