protected Collection<ICompletionProposal> getFuzzyCompletions( final IDocument doc, final int offset) { final String prefix = fuzzySearchPrefix.getPrefix(doc, offset); if (prefix != null) { Collection<Match<PropertyInfo>> matches = findMatches(prefix); if (matches != null && !matches.isEmpty()) { ArrayList<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(matches.size()); for (final Match<PropertyInfo> match : matches) { ProposalApplier edits = new LazyProposalApplier() { @Override protected ProposalApplier create() throws Exception { Type type = TypeParser.parse(match.data.getType()); DocumentEdits edits = new DocumentEdits(doc); edits.delete(offset - prefix.length(), offset); edits.insert(offset, match.data.getId() + propertyCompletionPostfix(type)); return edits; } }; proposals.add(completionFactory.property(doc, edits, match, typeUtil)); } return proposals; } } return Collections.emptyList(); }
/** * @param type Type of the expression leading upto the 'nav' operator * @param navOffset Offset of the nav operator (either ']' or '.' * @param offset Offset of the cursor where CA was requested. * @return */ private Collection<ICompletionProposal> getNavigationProposals( IDocument doc, Type type, int navOffset, int offset) { try { char navOp = doc.getChar(navOffset); if (navOp == '.') { String prefix = doc.get(navOffset + 1, offset - (navOffset + 1)); EnumCaseMode caseMode = caseMode(prefix); List<TypedProperty> objectProperties = typeUtil.getProperties(type, caseMode, BeanPropertyNameMode.HYPHENATED); // Note: properties editor itself deals with relaxed names. So it expects the properties // here to be returned in hyphenated form only. if (objectProperties != null && !objectProperties.isEmpty()) { ArrayList<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); for (TypedProperty prop : objectProperties) { double score = FuzzyMatcher.matchScore(prefix, prop.getName()); if (score != 0) { Type valueType = prop.getType(); String postFix = propertyCompletionPostfix(valueType); DocumentEdits edits = new DocumentEdits(doc); edits.delete(navOffset + 1, offset); edits.insert(offset, prop.getName() + postFix); proposals.add(completionFactory.simpleProposal(prop.getName(), score, edits)); } } return proposals; } } else { // TODO: other cases ']' or '[' ? } } catch (Exception e) { BootActivator.log(e); } return Collections.emptyList(); }
private Collection<ICompletionProposal> getValueCompletions( IDocument doc, int offset, ITypedRegion valuePartition) { int regionStart = valuePartition.getOffset(); int startOfValue = findValueStart(doc, regionStart); try { String valuePrefix; if (startOfValue >= 0 && startOfValue < offset) { valuePrefix = doc.get(startOfValue, offset - startOfValue); } else { startOfValue = offset; valuePrefix = ""; } EnumCaseMode caseMode = caseMode(valuePrefix); String propertyName = fuzzySearchPrefix.getPrefix( doc, regionStart); // note: no need to skip whitespace backwards. // because value partition includes whitespace around the assignment if (propertyName != null) { Type type = getValueType(propertyName); String[] valueCompletions = typeUtil.getAllowedValues(type, caseMode); if (valueCompletions != null && valueCompletions.length > 0) { ArrayList<ICompletionProposal> proposals = new ArrayList<ICompletionProposal>(); for (int i = 0; i < valueCompletions.length; i++) { String valueCandidate = valueCompletions[i]; double score = FuzzyMatcher.matchScore(valuePrefix, valueCandidate); if (score != 0) { DocumentEdits edits = new DocumentEdits(doc); edits.delete(startOfValue, offset); edits.insert(offset, valueCandidate); proposals.add( completionFactory.valueProposal(valueCandidate, type, score, edits) // new ValueProposal(startOfValue, valuePrefix, valueCandidate, i) ); } } return proposals; } } } catch (Exception e) { SpringPropertiesEditorPlugin.log(e); } return Collections.emptyList(); }