- FAQ 319: What is eScript?
- FAQ 320: Language integration phase 1: How do I compile and build programs?
- FAQ 321: How do I load source files edited outside Eclipse?
- FAQ 322: How do I run an external builder on my source files?
- FAQ 323: How do I implement a compiler that runs inside Eclipse?
- FAQ 324: How do I react to changes in source files?
- FAQ 325: How do I implement an Eclipse builder?
- FAQ 326: Where are project build specifications stored?
- FAQ 327: How do I add a builder to a given project?
- FAQ 328: How do I implement an incremental project builder?
- FAQ 329: How do I handle setup problems for a given builder?
- FAQ 330: How do I make my compiler incremental?
- FAQ 331: Language integration phase 2: How do I implement a DOM?
- FAQ 332: How do I implement a DOM for my language?
- FAQ 333: How can I ensure that my model is scalable?
- FAQ 334: Language integration phase 3: How do I edit programs?
- FAQ 335: How do I write an editor for my own language?
- FAQ 336: How do I add Content Assist to my language editor?
- FAQ 337: How do I add hover support to my text editor?
- FAQ 338: How do I create problem markers for my compiler?
- FAQ 339: How do I implement Quick Fixes for my own language?
- FAQ 340: How do I support refactoring for my own language?
- FAQ 341: How do I create an Outline view for my own language editor?
- FAQ 342: Language integration phase 4: What are the finishing touches?
- FAQ 343: What wizards do I define for my own language?
- FAQ 344: When does my language need its own nature?
- FAQ 345: When does my language need its own perspective?
- FAQ 346: How do I add documentation and help for my own language?
- FAQ 347: How do I support source-level debugging for my own language?
FAQ 336: How do I add Content Assist to my language editor?
In FAQ 335 we describe how Content Assist is installed through our configuration class, as follows:
class Configuration extends SourceViewerConfiguration { ... public IContentAssistant getContentAssistant(ISourceViewer sourceViewer) { ContentAssistant ca = new ContentAssistant(); IContentAssistProcessor cap = new CompletionProcessor(); ca.setContentAssistProcessor(cap, IDocument.DEFAULT_CONTENT_TYPE); ca.setInformationControlCreator( getInformationControlCreator(sourceViewer)); return ca; } ... }
A completion processor takes the current insertion point in the editor and figures out a list of continuation proposals for the user to choose from. Our completion processor looks something like this:
class CompletionProcessor implements IContentAssistProcessor { private final IContextInformation[] NO_CONTEXTS = new IContextInformation[0]; private final char[] PROPOSAL_ACTIVATION_CHARS = new char[] { 's','f','p','n','m', }; private ICompletionProposal[] NO_COMPLETIONS = new ICompletionProposal[0]; public ICompletionProposal[] computeCompletionProposals( ITextViewer viewer, int offset) { try { IDocument document = viewer.getDocument(); ArrayList result = new ArrayList(); String prefix = lastWord(document, offset); String indent = lastIndent(document, offset); EscriptModel model = EscriptModel.getModel(document, null); model.getContentProposals(prefix, indent, offset, result); return (ICompletionProposal[]) result.toArray( new ICompletionProposal[result.size()]); } catch (Exception e) { // ... log the exception ... return NO_COMPLETIONS; } } private String lastWord(IDocument doc, int offset) { try { for (int n = offset-1; n >= 0; n--) { char c = doc.getChar(n); if (!Character.isJavaIdentifierPart(c)) return doc.get(n + 1, offset-n-1); } } catch (BadLocationException e) { // ... log the exception ... } return ""; } private String lastIndent(IDocument doc, int offset) { try { int start = offset-1; while (start >= 0 && doc.getChar(start)!= '\n') start--; int end = start; while (end < offset && Character.isSpaceChar(doc.getChar(end))) end++; return doc.get(start+1, end-start-1); } catch (BadLocationException e) { e.printStackTrace(); } return ""; } public IContextInformation[] computeContextInformation( ITextViewer viewer, int offset) { return NO_CONTEXTS; } char[] getCompletionProposalAutoActivationCharacters() { return PROPOSAL_ACTIVATION_CHARS; } // ... remaining methods are optional ... }
Basically, Content Assist completion has three steps. First, we have to figure out what string has already been started by the user (see lastWord). Second, we have to find appropriate completions. Third, we have to return strings so that when they are inserted, they lay out acceptably (see the use of lastIndent).
Note
FAQ 267 How do I add Content Assist to my editor?
FAQ 337 How do I add hover support to my text editor?