Skip to content
This repository was archived by the owner on Apr 21, 2023. It is now read-only.

Commit 49ec090

Browse files
committed
[#1489] Java based Xtext formatter (formatter2 API).
Signed-off-by: Arne Deutsch <[email protected]>
1 parent a514456 commit 49ec090

File tree

11 files changed

+446
-180
lines changed

11 files changed

+446
-180
lines changed

org.eclipse.xtext.tests/src/org/eclipse/xtext/parsetree/formatter/XtextFormatterExpected.xtext

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,4 @@ terminal ML_COMMENT2:
4747

4848
@Override
4949
terminal ID:
50-
super;
50+
super;

org.eclipse.xtext.tests/src/org/eclipse/xtext/parsetree/reconstr/XtextGrammarReconcilationTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ public void setUp() throws Exception {
4343

4444
// check
4545
assertFalse(model.equals(result));
46-
String expectedModel = LineDelimiters.toPlatform("grammar foo with org.eclipse.xtext.common.Terminals\n\nHONOLULU:\n name=ID;");
46+
String expectedModel = LineDelimiters.toPlatform("grammar foo with org.eclipse.xtext.common.Terminals\n\nHONOLULU:\n name=ID;\n");
4747
assertEquals(expectedModel, result);
4848
}
4949

5050
@Test public void testSelf() {
51-
Grammar g = getGrammarAccess().getGrammar();
51+
Grammar g = load(URI.createURI("classpath:/org/eclipse/xtext/Xtext.xtext"));
5252
for (AbstractRule r : g.getRules()) {
5353
// AbstractRule r = GrammarUtil.findRuleForName(g, "GrammarID");
5454
// System.out.println("serializing :" + r.getName());

org.eclipse.xtext.tests/src/org/eclipse/xtext/serializer/XtextSerializerTest.java

+17-54
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,30 @@
88
*******************************************************************************/
99
package org.eclipse.xtext.serializer;
1010

11+
import java.util.Iterator;
12+
import java.util.List;
13+
14+
import org.eclipse.emf.common.notify.Adapter;
1115
import org.eclipse.emf.common.util.URI;
16+
import org.eclipse.emf.ecore.EObject;
17+
import org.eclipse.emf.ecore.util.EcoreUtil;
1218
import org.eclipse.xtext.AbstractRule;
1319
import org.eclipse.xtext.Grammar;
1420
import org.eclipse.xtext.GrammarUtil;
1521
import org.eclipse.xtext.Group;
16-
import org.eclipse.xtext.RuleCall;
17-
import org.eclipse.xtext.TerminalRule;
1822
import org.eclipse.xtext.XtextStandaloneSetup;
19-
import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
20-
import org.eclipse.xtext.grammarinheritance.services.BaseInheritanceTestLanguageGrammarAccess;
21-
import org.eclipse.xtext.grammarinheritance.services.InheritanceTestLanguageGrammarAccess;
23+
import org.eclipse.xtext.nodemodel.ICompositeNode;
2224
import org.eclipse.xtext.resource.XtextResourceSet;
23-
import org.eclipse.xtext.service.GrammarProvider;
24-
import org.eclipse.xtext.services.XtextGrammarAccess;
2525
import org.eclipse.xtext.testing.serializer.SerializerTestHelper;
2626
import org.eclipse.xtext.tests.AbstractXtextTests;
27+
import org.eclipse.xtext.util.Pair;
28+
import org.eclipse.xtext.util.Tuples;
2729
import org.junit.Assert;
2830
import org.junit.Ignore;
2931
import org.junit.Test;
3032

33+
import com.google.common.collect.Lists;
3134
import com.google.inject.Inject;
32-
import com.google.inject.Provider;
3335

3436
/**
3537
* @author Moritz Eysholdt - Initial contribution and API
@@ -38,11 +40,6 @@ public class XtextSerializerTest extends AbstractXtextTests {
3840
@Inject
3941
private SerializerTestHelper tester;
4042

41-
private Grammar load(URI uri) {
42-
XtextResourceSet rs = new XtextResourceSet();
43-
return (Grammar) rs.getResource(uri, true).getContents().get(0);
44-
}
45-
4643
@Override
4744
public void setUp() throws Exception {
4845
super.setUp();
@@ -58,48 +55,14 @@ public void testXtextXtextWithNM() throws Exception {
5855
}
5956

6057
@Test
61-
@Ignore("To be done")
62-
public void testXtextXtextWithoutNM() throws Exception {
58+
public void testGroup() {
6359
Grammar grammar = load(URI.createURI("classpath:/org/eclipse/xtext/Xtext.xtext"));
64-
tester.assertSerializeWithoutNodeModel(grammar);
60+
AbstractRule rule = GrammarUtil.findRuleForName(grammar, "org.eclipse.xtext.Xtext.Grammar");
61+
Group cGroup_2 = (Group) rule.eContents().get(1).eContents().get(2);
62+
detachNodeModel(grammar);
63+
String string = get(ISerializer.class).serialize(cGroup_2);
64+
Assert.assertEquals("(\"with\" usedGrammars+=[Grammar|GrammarID] (\",\" usedGrammars+=[Grammar|GrammarID])*)?",
65+
string);
6566
}
6667

67-
@Test
68-
public void testGroup() {
69-
XtextGrammarAccess grammarAccess = get(XtextGrammarAccess.class);
70-
String string = get(ISerializer.class).serialize(grammarAccess.getGrammarAccess().getGroup_2());
71-
Assert.assertEquals("(\"with\" usedGrammars+=[Grammar|GrammarID] (\",\" usedGrammars+=[Grammar|GrammarID])*)?", string);
72-
}
73-
74-
@Test
75-
public void testFQNInSuper_01() {
76-
GrammarProvider grammarProvider = new GrammarProvider("org.eclipse.xtext.grammarinheritance.InheritanceTestLanguage", new Provider<XtextResourceSet>() {
77-
@Override
78-
public XtextResourceSet get() {
79-
return XtextSerializerTest.this.get(XtextResourceSet.class);
80-
}
81-
});
82-
grammarProvider.setClassLoader(getClass().getClassLoader());
83-
TerminalsGrammarAccess gaTerminals = new TerminalsGrammarAccess(grammarProvider);
84-
BaseInheritanceTestLanguageGrammarAccess gaBaseInheritanceTestLanguage = new BaseInheritanceTestLanguageGrammarAccess(grammarProvider, gaTerminals);
85-
InheritanceTestLanguageGrammarAccess grammarAccess = new InheritanceTestLanguageGrammarAccess(grammarProvider, gaBaseInheritanceTestLanguage, gaTerminals);
86-
String string = get(ISerializer.class).serialize(grammarAccess.getFQNRule().getAlternatives());
87-
Assert.assertEquals("ID (\".\" ID)*", string);
88-
}
89-
90-
@Ignore("Serialization does not have the correct context information")
91-
@Test
92-
public void testFQNInSuper_02() {
93-
Grammar grammar = load(URI.createURI("classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTestLanguage.xtext"));
94-
AbstractRule rule = GrammarUtil.findRuleForName(grammar, "FQN");
95-
Assert.assertNotNull(rule);
96-
Group group = (Group) rule.getAlternatives();
97-
RuleCall ruleCall = (RuleCall) group.getElements().get(0);
98-
TerminalRule id = (TerminalRule) ruleCall.getRule();
99-
Assert.assertSame(grammar, GrammarUtil.getGrammar(id));
100-
String string = get(ISerializer.class).serialize(rule.getAlternatives());
101-
Assert.assertEquals("ID (\".\" ID)*", string);
102-
// currently wrong result is
103-
Assert.assertEquals("super::ID (\".\" super::ID)*", string);
104-
}
10568
}

org.eclipse.xtext.tests/src/org/eclipse/xtext/tests/AbstractXtextTests.java

+31
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
import java.io.InputStream;
1414
import java.net.URL;
1515
import java.nio.charset.Charset;
16+
import java.util.Iterator;
17+
import java.util.List;
1618

19+
import org.eclipse.emf.common.notify.Adapter;
1720
import org.eclipse.emf.common.util.URI;
1821
import org.eclipse.emf.ecore.EObject;
1922
import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
2023
import org.eclipse.emf.ecore.util.EcoreUtil;
2124
import org.eclipse.xtext.Constants;
25+
import org.eclipse.xtext.Grammar;
2226
import org.eclipse.xtext.IGrammarAccess;
2327
import org.eclipse.xtext.ISetup;
2428
import org.eclipse.xtext.conversion.IValueConverterService;
@@ -42,11 +46,14 @@
4246
import org.eclipse.xtext.testing.serializer.SerializerTestHelper;
4347
import org.eclipse.xtext.util.CancelIndicator;
4448
import org.eclipse.xtext.util.LazyStringInputStream;
49+
import org.eclipse.xtext.util.Pair;
50+
import org.eclipse.xtext.util.Tuples;
4551
import org.junit.After;
4652
import org.junit.Assert;
4753
import org.junit.Before;
4854

4955
import com.google.common.base.Joiner;
56+
import com.google.common.collect.Lists;
5057
import com.google.inject.Guice;
5158
import com.google.inject.Injector;
5259
import com.google.inject.Key;
@@ -390,6 +397,30 @@ protected String readFileIntoString(String filePath) throws IOException {
390397
throw new IllegalStateException("May not happen, but helps to suppress false positives in eclipse' control flow analysis.");
391398
}
392399

400+
protected Grammar load(URI uri) {
401+
XtextResourceSet rs = new XtextResourceSet();
402+
return (Grammar) rs.getResource(uri, true).getContents().get(0);
403+
}
404+
405+
protected List<Pair<EObject, ICompositeNode>> detachNodeModel(EObject eObject) {
406+
EcoreUtil.resolveAll(eObject);
407+
List<Pair<EObject, ICompositeNode>> result = Lists.newArrayList();
408+
Iterator<Object> iterator = EcoreUtil.getAllContents(eObject.eResource(), false);
409+
while (iterator.hasNext()) {
410+
EObject object = (EObject) iterator.next();
411+
Iterator<Adapter> adapters = object.eAdapters().iterator();
412+
while (adapters.hasNext()) {
413+
Adapter adapter = adapters.next();
414+
if (adapter instanceof ICompositeNode) {
415+
adapters.remove();
416+
result.add(Tuples.create(object, (ICompositeNode) adapter));
417+
break;
418+
}
419+
}
420+
}
421+
return result;
422+
}
423+
393424
public static final class Keys {
394425
private static final TypeLiteral<Provider<XtextResourceSet>> resourceSetLiteral = new TypeLiteral<Provider<XtextResourceSet>>(){
395426
};

0 commit comments

Comments
 (0)