fixed problem with clone method by using EcoreUtil.copy instead

This commit is contained in:
overflowerror 2021-12-02 21:19:27 +01:00
parent b3e48838f3
commit f23274e072
2 changed files with 31 additions and 17 deletions

View file

@ -13,6 +13,8 @@ import org.eclipse.emf.ecore.xml.type.XMLTypePackage;
import org.eclipse.xtext.AbstractRule;
import org.eclipse.xtext.Alternatives;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.Group;
import org.eclipse.xtext.UnorderedGroup;
import org.eclipse.xtext.XtextStandaloneSetup;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.testing.GlobalRegistries;
@ -288,10 +290,36 @@ public class HoistingProcessorTest extends AbstractXtextTests {
HoistingGuard guard = hoistingProcessor.findHoistingGuard(rule.getAlternatives());
assertFalse(guard.isTrivial());
assertTrue(guard.hasTerminal());
//assertEquals("((" + getSyntaxForKeywordToken("s", 1) + " || (p2)) && ((" + getSyntaxForKeywordToken("a", 1) + " && " + getSyntaxForKeywordToken("b", 1) + ") || ((" + getSyntaxForKeywordToken("a", 1)+ " || (p0)) && (" + getSyntaxForKeywordToken("b", 1) + " || (p1)))))", guard.render());
assertEquals("((" + getSyntaxForKeywordToken("s", 1) + " || (p2)) && (" + getSyntaxForKeywordToken("a", 1) + " || (p0)) && (" + getSyntaxForKeywordToken("b", 1) + " || (p1)))", guard.render());
}
@Test
public void testUnorderedGroups_bugGroupsChangeDuringHoisting_expectNoChange() throws Exception {
// @formatter:off
String model =
MODEL_PREAMBLE +
"S: (($$ p0 $$?=> 'a') & ($$ p1 $$?=> 'b')) $$ p2 $$?=> 's';";
// @formatter:off
XtextResource resource = getResourceFromString(model);
Grammar grammar = ((Grammar) resource.getContents().get(0));
AbstractRule rule = getRule(grammar, "S");
HoistingGuard guard = hoistingProcessor.findHoistingGuard(rule.getAlternatives());
assertFalse(guard.isTrivial());
assertTrue(guard.hasTerminal());
assertEquals("((" + getSyntaxForKeywordToken("s", 1) + " || (p2)) && (" + getSyntaxForKeywordToken("a", 1) + " || (p0)) && (" + getSyntaxForKeywordToken("b", 1) + " || (p1)))", guard.render());
// check sizes of groups in unordered group
Group group = (Group) rule.getAlternatives();
assertEquals(3, group.getElements().size());
UnorderedGroup unorderedGroup = (UnorderedGroup) group.getElements().get(0);
assertEquals(2, unorderedGroup.getElements().size());
group = (Group) unorderedGroup.getElements().get(0);
assertEquals(2, group.getElements().size());
group = (Group) unorderedGroup.getElements().get(1);
assertEquals(2, group.getElements().size());
}
@Test
public void testAlternativeNoToken() throws Exception {
// @formatter:off

View file

@ -32,6 +32,7 @@ import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.nodemodel.BidiIterator;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.ILeafNode;
@ -707,23 +708,8 @@ public class GrammarUtil {
return null;
}
public static EObject cloneEObject(EObject element) {
EObject clone = XtextFactory.eINSTANCE.create(element.eClass());
for (EStructuralFeature feature : element.eClass().getEAllStructuralFeatures()) {
Object value = element.eGet(feature);
if (value instanceof EObject) {
// if value is EObject a deep copy is needed since an EObject can only be
// referenced by one other EObject.
value = cloneEObject((EObject) value);
}
clone.eSet(feature, value);
}
return clone;
}
public static AbstractElement cloneAbstractElement(AbstractElement element) {
return (AbstractElement) cloneEObject(element);
return (AbstractElement) EcoreUtil.copy(element);
}
public static void addElementsToCompoundElement(CompoundElement element, Stream<? extends AbstractElement> elements) {