/* * Copyright 2016 Nokia Solutions and Networks * Licensed under the Apache License, Version 2.0, * see license.txt file for details. */ package org.robotframework.ide.eclipse.main.plugin.assist; import static com.google.common.collect.Lists.newArrayList; import static org.robotframework.ide.eclipse.main.plugin.assist.AssistProposals.sortedByLabels; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; public class RedCodeReservedWordProposals { static final String FOR_LOOP_1 = ":FOR"; static final String FOR_LOOP_2 = ": FOR"; public static final List<String> GHERKIN_ELEMENTS = newArrayList("Given", "When", "And", "But", "Then"); private static final List<String> LOOP_ELEMENTS = newArrayList("IN", "IN ENUMERATE", "IN RANGE", "IN ZIP"); private final ProposalMatcher matcher; private final AssistProposalPredicate<String> predicateWordHasToSatisfy; public RedCodeReservedWordProposals(final AssistProposalPredicate<String> predicateWordHasToSatisfy) { this(ProposalMatchers.prefixesMatcher(), predicateWordHasToSatisfy); } RedCodeReservedWordProposals(final ProposalMatcher matcher, final AssistProposalPredicate<String> predicateWordHasToSatisfy) { this.matcher = matcher; this.predicateWordHasToSatisfy = predicateWordHasToSatisfy; } public List<? extends AssistProposal> getReservedWordProposals(final String userContent) { return getReservedWordProposals(userContent, sortedByLabels()); } public List<? extends AssistProposal> getReservedWordProposals(final String userContent, final Comparator<AssistProposal> comparator) { final List<RedCodeReservedWordProposal> proposals = new ArrayList<>(); proposals.addAll(generateProposalsFrom(GHERKIN_ELEMENTS, userContent)); // match against both variants, but add only one proposal if (predicateWordHasToSatisfy.apply(FOR_LOOP_1)) { final Optional<ProposalMatch> forLoopMatch = newArrayList(FOR_LOOP_1, FOR_LOOP_2).stream() .map(variant -> matcher.matches(userContent, variant)) .filter(Optional::isPresent) .map(Optional::get) .findFirst(); if (forLoopMatch.isPresent()) { proposals.add(AssistProposals.createCodeReservedWordProposal(FOR_LOOP_1, forLoopMatch.get())); } } proposals.addAll(generateProposalsFrom(LOOP_ELEMENTS, userContent)); proposals.sort(comparator); return proposals; } private List<RedCodeReservedWordProposal> generateProposalsFrom(final Iterable<String> words, final String userContent) { final List<RedCodeReservedWordProposal> proposals = new ArrayList<>(); for (final String word : words) { if (predicateWordHasToSatisfy.apply(word)) { final Optional<ProposalMatch> match = matcher.matches(userContent, word); if (match.isPresent()) { proposals.add(AssistProposals.createCodeReservedWordProposal(word, match.get())); } } } return proposals; } }