/*
* Copyright 2015 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 com.google.common.collect.Sets.newLinkedHashSet;
import static org.robotframework.ide.eclipse.main.plugin.assist.AssistProposals.sortedByTypesAndOrigin;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import org.rf.ide.core.project.RobotProjectConfig.ReferencedVariableFile;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.robotframework.ide.eclipse.main.plugin.RedPlugin;
import org.robotframework.ide.eclipse.main.plugin.model.RobotFileInternalElement;
import org.robotframework.ide.eclipse.main.plugin.model.RobotModel;
import org.robotframework.ide.eclipse.main.plugin.model.RobotSuiteFile;
import org.robotframework.ide.eclipse.main.plugin.model.RobotVariable;
import org.robotframework.ide.eclipse.main.plugin.model.locators.ContinueDecision;
import org.robotframework.ide.eclipse.main.plugin.model.locators.VariableDefinitionLocator;
import org.robotframework.ide.eclipse.main.plugin.model.locators.VariableDefinitionLocator.VariableDetector;
import com.google.common.annotations.VisibleForTesting;
public class RedVariableProposals {
private final RobotModel model;
private final RobotSuiteFile suiteFile;
private final ProposalMatcher matcher;
private final AssistProposalPredicate<String> globalVarPredicate;
public RedVariableProposals(final RobotSuiteFile suiteFile,
final AssistProposalPredicate<String> globalVarPredicate) {
this(RedPlugin.getModelManager().getModel(), suiteFile, globalVarPredicate);
}
@VisibleForTesting
RedVariableProposals(final RobotModel model, final RobotSuiteFile suiteFile,
final AssistProposalPredicate<String> globalVarPredicate) {
this(model, suiteFile, ProposalMatchers.prefixesMatcher(), globalVarPredicate);
}
@VisibleForTesting
RedVariableProposals(final RobotModel model, final RobotSuiteFile suiteFile, final ProposalMatcher matcher,
final AssistProposalPredicate<String> globalVarPredicate) {
this.model = model;
this.suiteFile = suiteFile;
this.matcher = matcher;
this.globalVarPredicate = globalVarPredicate;
}
public List<? extends AssistProposal> getVariableProposals(final String userContent,
final RobotFileInternalElement element) {
return getVariableProposals(userContent, sortedByTypesAndOrigin(), element);
}
public List<? extends AssistProposal> getVariableProposals(final String userContent,
final Comparator<? super RedVariableProposal> comparator, final RobotFileInternalElement element) {
final Set<RedVariableProposal> proposals = newLinkedHashSet();
final VariableDefinitionLocator locator = new VariableDefinitionLocator(suiteFile.getFile(), model);
locator.locateVariableDefinitionWithLocalScope(createDetector(userContent, proposals), element);
final List<RedVariableProposal> resultProposals = newArrayList(proposals);
Collections.sort(resultProposals, comparator);
return resultProposals;
}
public List<? extends AssistProposal> getVariableProposals(final String userContent, final int offset) {
return getVariableProposals(userContent, sortedByTypesAndOrigin(), offset);
}
public List<? extends AssistProposal> getVariableProposals(final String userContent,
final Comparator<? super RedVariableProposal> comparator, final int offset) {
final Set<RedVariableProposal> proposals = newLinkedHashSet();
final VariableDefinitionLocator locator = new VariableDefinitionLocator(suiteFile.getFile(), model);
locator.locateVariableDefinitionWithLocalScope(createDetector(userContent, proposals), offset);
final List<RedVariableProposal> resultProposals = newArrayList(proposals);
Collections.sort(resultProposals, comparator);
return resultProposals;
}
private VariableDetector createDetector(final String userContent, final Set<RedVariableProposal> proposals) {
return new VariableDetector() {
@Override
public ContinueDecision variableDetected(final RobotVariable variable) {
final Optional<ProposalMatch> match = matcher.matches(userContent,
variable.getPrefix() + variable.getName() + variable.getSuffix());
if (match.isPresent()) {
proposals.add(AssistProposals.createUserVariableProposal(variable, match.get()));
}
return ContinueDecision.CONTINUE;
}
@Override
public ContinueDecision localVariableDetected(final RobotFileInternalElement element,
final RobotToken variable) {
final String varName = variable.getText().trim();
final Optional<ProposalMatch> match = matcher.matches(userContent, varName);
if (match.isPresent()) {
proposals.add(AssistProposals.createLocalVariableProposal(varName, element.getSuiteFile().getName(),
match.get()));
}
return ContinueDecision.CONTINUE;
}
@Override
public ContinueDecision varFileVariableDetected(final ReferencedVariableFile file,
final String variableName, final Object value) {
final Optional<ProposalMatch> match = matcher.matches(userContent, variableName);
if (match.isPresent()) {
proposals.add(AssistProposals.createVarFileVariableProposal(variableName, value.toString(),
file.getPath(), match.get()));
}
return ContinueDecision.CONTINUE;
}
@Override
public ContinueDecision globalVariableDetected(final String variableName, final Object value) {
if (globalVarPredicate.apply(variableName)) {
final Optional<ProposalMatch> match = matcher.matches(userContent, variableName);
if (match.isPresent()) {
proposals.add(AssistProposals.createBuiltInVariableProposal(variableName, value.toString(),
match.get()));
}
}
return ContinueDecision.CONTINUE;
}
};
}
}