/*
* 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.project.build.fix;
import java.util.Optional;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.eclipse.jface.text.contentassist.CompletionProposal;
import org.eclipse.jface.text.contentassist.ICompletionProposal;
import org.rf.ide.core.testdata.text.read.recognizer.RobotToken;
import org.robotframework.ide.eclipse.main.plugin.RedImages;
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.RobotVariablesSection;
import org.robotframework.red.graphics.ImagesManager;
import com.google.common.collect.Range;
public class RemoveWhitespacesFromVariableNameFixer extends RedSuiteMarkerResolution {
private final String variableName;
public RemoveWhitespacesFromVariableNameFixer(final String variableName) {
this.variableName = variableName;
}
@Override
public String getLabel() {
return "Remove whitespaces after variable '" + variableName + "' type identificator";
}
@Override
public Optional<ICompletionProposal> asContentProposal(final IMarker marker, final IDocument document,
final RobotSuiteFile suiteModel) {
if (variableName == null) {
return Optional.empty();
}
final Optional<RobotVariablesSection> section = suiteModel.findSection(RobotVariablesSection.class);
if (!section.isPresent()) {
return Optional.empty();
}
for (final RobotVariable variable : section.get().getChildren()) {
final Range<Integer> defRange = getRange(marker);
if (defRange.contains(variable.getDefinitionPosition().getOffset())) {
try {
return createProposal(document, variable);
} catch (final BadLocationException e) {
return Optional.empty();
}
}
}
return Optional.empty();
}
private Optional<ICompletionProposal> createProposal(final IDocument document, final RobotVariable variable)
throws BadLocationException {
final RobotToken varDeclaration = variable.getLinkedElement().getDeclaration();
final int offset = varDeclaration.getStartOffset();
final String varText = varDeclaration.getRaw().toString();
final String correctedVariable = new StringBuilder().append(varText.charAt(0)).append(varText.substring(varText.indexOf('{'))).toString();
final ICompletionProposal proposal = new CompletionProposal(correctedVariable, offset, varText.length(), offset + correctedVariable.length(),
ImagesManager.getImage(RedImages.getUserKeywordImage()), getLabel(), null, null);
return Optional.of(proposal);
}
private Range<Integer> getRange(final IMarker marker) {
try {
return Range.closed((Integer) marker.getAttribute(IMarker.CHAR_START),
(Integer) marker.getAttribute(IMarker.CHAR_END));
} catch (final CoreException e) {
throw new IllegalStateException("Given marker should have offsets defined", e);
}
}
}