/** * 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); } } }