/**
* generated by Xtext
*/
package de.unidue.ecg.characterScript.ui.quickfix;
import com.google.common.base.Objects;
import com.google.common.collect.Iterables;
import com.google.inject.Inject;
import de.unidue.ecg.characterScript.characterScript.Age;
import de.unidue.ecg.characterScript.characterScript.AttributeType;
import de.unidue.ecg.characterScript.characterScript.CharaSex;
import de.unidue.ecg.characterScript.characterScript.CharaType;
import de.unidue.ecg.characterScript.characterScript.CharacterScriptFactory;
import de.unidue.ecg.characterScript.characterScript.CharacterScriptPackage;
import de.unidue.ecg.characterScript.characterScript.Characters;
import de.unidue.ecg.characterScript.characterScript.CustomAttribute;
import de.unidue.ecg.characterScript.characterScript.CustomAttributeName;
import de.unidue.ecg.characterScript.characterScript.CustomProperty;
import de.unidue.ecg.characterScript.characterScript.Description;
import de.unidue.ecg.characterScript.characterScript.EnumValue;
import de.unidue.ecg.characterScript.characterScript.FullName;
import de.unidue.ecg.characterScript.characterScript.Import;
import de.unidue.ecg.characterScript.characterScript.Property;
import de.unidue.ecg.characterScript.characterScript.Sex;
import de.unidue.ecg.characterScript.characterScript.Template;
import de.unidue.ecg.characterScript.characterScript.Type;
import de.unidue.ecg.characterScript.validation.CharacterScriptValidator;
import de.unidue.ecg.common.linking.CustomLinkingDiagnosticMessageProvider;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.Keyword;
import org.eclipse.xtext.diagnostics.Diagnostic;
import org.eclipse.xtext.nodemodel.BidiTreeIterable;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.INode;
import org.eclipse.xtext.nodemodel.impl.HiddenLeafNode;
import org.eclipse.xtext.nodemodel.impl.LeafNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
import org.eclipse.xtext.ui.editor.model.edit.IModificationContext;
import org.eclipse.xtext.ui.editor.model.edit.ISemanticModification;
import org.eclipse.xtext.ui.editor.quickfix.DefaultQuickfixProvider;
import org.eclipse.xtext.ui.editor.quickfix.Fix;
import org.eclipse.xtext.ui.editor.quickfix.IssueResolutionAcceptor;
import org.eclipse.xtext.validation.Issue;
import org.eclipse.xtext.xbase.lib.Conversions;
import org.eclipse.xtext.xbase.lib.Functions.Function1;
import org.eclipse.xtext.xbase.lib.IterableExtensions;
import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
/**
* Custom quickfixes.
*
* see http://www.eclipse.org/Xtext/documentation.html#quickfixes
*/
@SuppressWarnings("all")
public class CharacterScriptQuickfixProvider extends DefaultQuickfixProvider {
@Inject
private CustomLinkingDiagnosticMessageProvider customLinkingDiagnosticMessageProvider;
@Fix(CharacterScriptValidator.UNRESOLVED_TEMPLATE)
public void createImport(final Issue issue, final IssueResolutionAcceptor acceptor) {
String[] _data = issue.getData();
final String linkText = _data[0];
this.addImportTemplateFix(issue, acceptor, linkText);
this.addLocalTemplateFix(issue, acceptor, linkText);
}
@Fix(CharacterScriptValidator.MISSING_REQUIRED_DEFAULT)
public void addRequiredDefault(final Issue issue, final IssueResolutionAcceptor acceptor) {
String[] _data = issue.getData();
final String propName = _data[0];
final ISemanticModification _function = new ISemanticModification() {
public void apply(final EObject element, final IModificationContext context) throws Exception {
if ((element instanceof de.unidue.ecg.characterScript.characterScript.Character)) {
final de.unidue.ecg.characterScript.characterScript.Character character = ((de.unidue.ecg.characterScript.characterScript.Character) element);
final Template template = character.getTemplate();
boolean _notEquals = (!Objects.equal(template, null));
if (_notEquals) {
boolean _matched = false;
if (!_matched) {
if (Objects.equal(propName,"full name")) {
_matched=true;
final FullName property = CharacterScriptFactory.eINSTANCE.createFullName();
property.setValue("XYZ");
property.setComment("[FIX ME!]");
EList<Property> _properties = character.getProperties();
_properties.add(property);
}
}
if (!_matched) {
if (Objects.equal(propName,"sex")) {
_matched=true;
final Sex property_1 = CharacterScriptFactory.eINSTANCE.createSex();
property_1.setValue(CharaSex.FEMALE);
property_1.setComment("[FIX ME!]");
EList<Property> _properties_1 = character.getProperties();
_properties_1.add(property_1);
}
}
if (!_matched) {
if (Objects.equal(propName,"type")) {
_matched=true;
final Type property_2 = CharacterScriptFactory.eINSTANCE.createType();
property_2.setValue(CharaType.PC);
property_2.setComment("[FIX ME!]");
EList<Property> _properties_2 = character.getProperties();
_properties_2.add(property_2);
}
}
if (!_matched) {
if (Objects.equal(propName,"age")) {
_matched=true;
final Age property_3 = CharacterScriptFactory.eINSTANCE.createAge();
property_3.setValue(0);
property_3.setComment("[FIX ME!]");
EList<Property> _properties_3 = character.getProperties();
_properties_3.add(property_3);
}
}
if (!_matched) {
if (Objects.equal(propName,"description")) {
_matched=true;
final Description property_4 = CharacterScriptFactory.eINSTANCE.createDescription();
property_4.setValue("XYZ");
property_4.setComment("[FIX ME!]");
EList<Property> _properties_4 = character.getProperties();
_properties_4.add(property_4);
}
}
}
}
}
};
acceptor.accept(issue, (("Add missing attribute \'" + propName) + "\'"),
(("Add missing attribute \'" + propName) + "\'"), null, _function);
}
@Fix(CharacterScriptValidator.MISSING_REQUIRED_CUSTOM)
public void addRequiredCustom(final Issue issue, final IssueResolutionAcceptor acceptor) {
String[] _data = issue.getData();
final String propName = _data[0];
String[] _data_1 = issue.getData();
final String propValue = _data_1[1];
final ISemanticModification _function = new ISemanticModification() {
public void apply(final EObject element, final IModificationContext context) throws Exception {
if ((element instanceof de.unidue.ecg.characterScript.characterScript.Character)) {
final de.unidue.ecg.characterScript.characterScript.Character character = ((de.unidue.ecg.characterScript.characterScript.Character) element);
final Template template = character.getTemplate();
boolean _notEquals = (!Objects.equal(template, null));
if (_notEquals) {
final CustomProperty property = CharacterScriptFactory.eINSTANCE.createCustomProperty();
EList<CustomAttribute> _customs = template.getCustoms();
final Function1<CustomAttribute,Boolean> _function = new Function1<CustomAttribute,Boolean>() {
public Boolean apply(final CustomAttribute it) {
CustomAttributeName _caName = it.getCaName();
String _name = _caName.getName();
boolean _equals = _name.equals(propName);
return Boolean.valueOf(_equals);
}
};
final CustomAttribute ca = IterableExtensions.<CustomAttribute>findFirst(_customs, _function);
CustomAttributeName _caName = ca.getCaName();
property.setCustomAttributeRef(_caName);
EList<EnumValue> _enumValues = ca.getEnumValues();
boolean _isEmpty = _enumValues.isEmpty();
boolean _not = (!_isEmpty);
if (_not) {
EList<EnumValue> _enumValues_1 = ca.getEnumValues();
EnumValue _get = null;
if (_enumValues_1!=null) {
_get=_enumValues_1.get(0);
}
property.setEnumValue(_get);
} else {
AttributeType _type = ca.getType();
String _name = _type.getName();
final String _switchValue = _name;
boolean _matched = false;
if (!_matched) {
if (Objects.equal(_switchValue,"NUMBER")) {
_matched=true;
int _parseInt = Integer.parseInt(propValue);
property.setIntValue(_parseInt);
}
}
if (!_matched) {
if (Objects.equal(_switchValue,"TEXT")) {
_matched=true;
property.setStringValue(propValue);
}
}
}
EList<Property> _properties = character.getProperties();
_properties.add(property);
}
}
}
};
acceptor.accept(issue, (("Add missing attribute \'" + propName) + "\'"),
(("Add missing attribute \'" + propName) + "\'"), null, _function);
}
public void addImportTemplateFix(final Issue issue, final IssueResolutionAcceptor acceptor, final String linkText) {
boolean _notEquals = (!Objects.equal(linkText, null));
if (_notEquals) {
final ISemanticModification _function = new ISemanticModification() {
public void apply(final EObject element, final IModificationContext context) throws Exception {
if ((element instanceof de.unidue.ecg.characterScript.characterScript.Character)) {
final Characters root = EcoreUtil2.<Characters>getContainerOfType(element, Characters.class);
final Import import_ = CharacterScriptFactory.eINSTANCE.createImport();
import_.setImportedNamespace(linkText);
EList<Import> _imports = root.getImports();
_imports.add(import_);
}
}
};
acceptor.accept(issue, (("Add import for \'" + linkText) + "\'"), (("Add import for \'" + linkText) + "\'"), null, _function);
}
}
@Fix(Diagnostic.LINKING_DIAGNOSTIC)
public void createTemplate(final Issue issue, final IssueResolutionAcceptor acceptor) {
EClass _template = CharacterScriptPackage.eINSTANCE.getTemplate();
final String linkText = this.customLinkingDiagnosticMessageProvider.getLinkText(issue, _template);
this.addImportTemplateFix(issue, acceptor, linkText);
this.addLocalTemplateFix(issue, acceptor, linkText);
}
public void addLocalTemplateFix(final Issue issue, final IssueResolutionAcceptor acceptor, final String linkText) {
boolean _notEquals = (!Objects.equal(linkText, null));
if (_notEquals) {
final ISemanticModification _function = new ISemanticModification() {
public void apply(final EObject element, final IModificationContext context) throws Exception {
if ((element instanceof de.unidue.ecg.characterScript.characterScript.Character)) {
final Characters model = EcoreUtil2.<Characters>getContainerOfType(element, Characters.class);
final Template template = CharacterScriptFactory.eINSTANCE.createTemplate();
template.setName(linkText);
final de.unidue.ecg.characterScript.characterScript.Character character = ((de.unidue.ecg.characterScript.characterScript.Character) element);
EList<Property> _properties = character.getProperties();
final Procedure1<Property> _function = new Procedure1<Property>() {
public void apply(final Property it) {
boolean _matched = false;
if (!_matched) {
if (it instanceof FullName) {
_matched=true;
EList<String> _defaults = template.getDefaults();
_defaults.add("full name");
}
}
if (!_matched) {
if (it instanceof Age) {
_matched=true;
EList<String> _defaults = template.getDefaults();
_defaults.add("age");
}
}
if (!_matched) {
if (it instanceof Description) {
_matched=true;
EList<String> _defaults = template.getDefaults();
_defaults.add("description");
}
}
if (!_matched) {
if (it instanceof Sex) {
_matched=true;
EList<String> _defaults = template.getDefaults();
_defaults.add("sex");
}
}
if (!_matched) {
if (it instanceof Type) {
_matched=true;
EList<String> _defaults = template.getDefaults();
_defaults.add("type");
}
}
if (!_matched) {
if (it instanceof CustomProperty) {
_matched=true;
final ICompositeNode nodeForCARef = NodeModelUtils.findActualNodeFor(it);
BidiTreeIterable<INode> _asTreeIterable = nodeForCARef.getAsTreeIterable();
Iterable<LeafNode> _filter = Iterables.<LeafNode>filter(_asTreeIterable, LeafNode.class);
final Function1<LeafNode,Boolean> _function = new Function1<LeafNode,Boolean>() {
public Boolean apply(final LeafNode it) {
boolean _and = false;
if (!(!(it instanceof HiddenLeafNode))) {
_and = false;
} else {
_and = ((!(it instanceof HiddenLeafNode)) && (!(it.getGrammarElement() instanceof Keyword)));
}
return Boolean.valueOf(_and);
}
};
final Iterable<LeafNode> nodeCandidates = IterableExtensions.<LeafNode>filter(_filter, _function);
int _length = ((Object[])Conversions.unwrapArray(nodeCandidates, Object.class)).length;
boolean _lessEqualsThan = (_length <= 2);
if (_lessEqualsThan) {
final CustomAttribute ca = CharacterScriptFactory.eINSTANCE.createCustomAttribute();
final CustomAttributeName caName = CharacterScriptFactory.eINSTANCE.createCustomAttributeName();
LeafNode _get = ((LeafNode[])Conversions.unwrapArray(nodeCandidates, LeafNode.class))[0];
String _text = _get.getText();
caName.setName(_text);
ca.setCaName(caName);
EnumValue _enumValue = ((CustomProperty)it).getEnumValue();
boolean _notEquals = (!Objects.equal(_enumValue, null));
if (_notEquals) {
LeafNode _get_1 = ((LeafNode[])Conversions.unwrapArray(nodeCandidates, LeafNode.class))[1];
boolean _notEquals_1 = (!Objects.equal(_get_1, null));
if (_notEquals_1) {
final EnumValue ev = CharacterScriptFactory.eINSTANCE.createEnumValue();
LeafNode _get_2 = ((LeafNode[])Conversions.unwrapArray(nodeCandidates, LeafNode.class))[1];
String _text_1 = _get_2.getText();
ev.setName(_text_1);
EList<EnumValue> _enumValues = ca.getEnumValues();
_enumValues.add(ev);
}
} else {
String _stringValue = ((CustomProperty)it).getStringValue();
boolean _notEquals_2 = (!Objects.equal(_stringValue, null));
if (_notEquals_2) {
ca.setType(AttributeType.TEXT);
} else {
ca.setType(AttributeType.NUMBER);
}
}
ca.setRequired("!");
EList<CustomAttribute> _customs = template.getCustoms();
_customs.add(ca);
}
}
}
}
};
IterableExtensions.<Property>forEach(_properties, _function);
EList<Template> _templates = model.getTemplates();
_templates.add(template);
}
}
};
acceptor.accept(issue, (("Create local template \'" + linkText) + "\'"),
(("Create local template \'" + linkText) + "\'"), null, _function);
}
}
}