package com.redhat.ceylon.eclipse.code.complete; import static com.redhat.ceylon.eclipse.code.complete.CompletionUtil.isModuleDescriptor; import static com.redhat.ceylon.eclipse.code.outline.CeylonLabelProvider.getDecoratedImage; import static com.redhat.ceylon.eclipse.ui.CeylonResources.CEYLON_LITERAL; import static com.redhat.ceylon.ide.common.util.OccurrenceLocation.CASE; import static com.redhat.ceylon.ide.common.util.OccurrenceLocation.CATCH; import static com.redhat.ceylon.ide.common.util.OccurrenceLocation.EXPRESSION; import static com.redhat.ceylon.ide.common.util.OccurrenceLocation.EXTENDS; import static com.redhat.ceylon.ide.common.util.OccurrenceLocation.META; import java.util.Arrays; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.contentassist.ICompletionProposal; import org.eclipse.jface.viewers.StyledString; import org.eclipse.swt.graphics.Image; import org.eclipse.swt.graphics.Point; import com.redhat.ceylon.compiler.typechecker.parser.CeylonLexer; import com.redhat.ceylon.compiler.typechecker.tree.Node; import com.redhat.ceylon.compiler.typechecker.tree.Tree; import com.redhat.ceylon.eclipse.code.parse.CeylonParseController; import com.redhat.ceylon.eclipse.ui.CeylonPlugin; import com.redhat.ceylon.eclipse.util.Highlights; import com.redhat.ceylon.eclipse.util.Highlights.FontStyler; import com.redhat.ceylon.ide.common.util.OccurrenceLocation; public class KeywordCompletionProposal extends CompletionProposal { public static final Set<String> expressionKeywords = new LinkedHashSet<String>(Arrays.asList( "object", "value", "void", "function", "this", "outer", "super", "of", "in", "else", "for", "if", "is", "exists", "nonempty", "then", "let")); public static final Set<String> postfixKeywords = new LinkedHashSet<String>(Arrays.asList( "of", "in", "else", "exists", "nonempty", "then")); public static final Set<String> conditionKeywords = new LinkedHashSet<String>(Arrays.asList("assert", "let", "while", "for", "if", "switch", "case", "catch")); @Deprecated static void addKeywordProposals(CeylonParseController cpc, int offset, String prefix, List<ICompletionProposal> result, Node node, OccurrenceLocation ol, boolean postfix, int previousTokenType) { if (isModuleDescriptor(cpc) && ol!=META && (ol==null||!ol.reference)) { //outside of backtick quotes, the only keyword allowed //in a module descriptor is "import" if ("import".startsWith(prefix)) { addKeywordProposal(offset, prefix, result, "import"); } } else if (!prefix.isEmpty() && ol!=CATCH && ol!=CASE) { //TODO: this filters out satisfies/extends in an object named arg Set<String> keywords; if (ol==EXPRESSION) { keywords = postfix ? postfixKeywords : expressionKeywords; } else { keywords = null; // Escaping.KEYWORDS; } for (String keyword: keywords) { if (keyword.startsWith(prefix)) { addKeywordProposal(offset, prefix, result, keyword); } } } else if (ol==CASE && previousTokenType==CeylonLexer.LPAREN) { addKeywordProposal(offset, prefix, result, "is"); } else if (!prefix.isEmpty() && ol==CASE) { if ("case".startsWith(prefix)) { addKeywordProposal(offset, prefix, result, "case"); } } else if (ol==null && node instanceof Tree.ConditionList && previousTokenType==CeylonLexer.LPAREN) { addKeywordProposal(offset, prefix, result, "exists"); addKeywordProposal(offset, prefix, result, "nonempty"); } else if (ol==EXTENDS) { addKeywordProposal(offset, prefix, result, "package"); addKeywordProposal(offset, prefix, result, "super"); } } public KeywordCompletionProposal(int offset, String prefix, String keyword, String text) { super(offset, prefix, null, keyword, text); } @Deprecated KeywordCompletionProposal(int offset, String prefix, String keyword) { super(offset, prefix, null, keyword, conditionKeywords.contains(keyword) ? keyword+" ()" : keyword); } @Override public Point getSelection(IDocument document) { int close = text.indexOf(')'); if (close>0) { return new Point(offset + close - prefix.length(), 0); } else { return super.getSelection(document); } } @Override public int length(IDocument document) { return prefix.length(); } @Override public Image getImage() { return getDecoratedImage(CEYLON_LITERAL, 0, false); } @Override public StyledString getStyledDisplayString() { return new StyledString(getDisplayString(), new FontStyler(CeylonPlugin.getCompletionFont(), Highlights.KW_STYLER)); } @Deprecated static void addKeywordProposal(int offset, String prefix, List<ICompletionProposal> result, String keyword) { result.add(new KeywordCompletionProposal(offset, prefix, keyword)); } }