mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-15 08:18:55 +00:00
fixed problem with clone method by using EcoreUtil.copy instead
This commit is contained in:
parent
b3e48838f3
commit
f23274e072
2 changed files with 31 additions and 17 deletions
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue