From 0ecf2f16a3b1bf7b7477fc64453e638b3d44168a Mon Sep 17 00:00:00 2001 From: sefftinge Date: Thu, 7 Aug 2008 15:05:29 +0000 Subject: [PATCH] cross references first draft --- .../xtext/GenerateAllTestGrammars.java | 8 ++-- .../eclipse/xtext/crossrefs/CrossRefTest.java | 19 ++++++++ .../org/eclipse/xtext/crossrefs/LangA.java | 5 ++ .../org/eclipse/xtext/crossrefs/LangA.xtext | 13 ++++++ .../eclipse/xtext/parser/XtextParserTest.java | 5 ++ .../xtext/xtext2ecore/XtextUtilTrafoTest.java | 46 +++++++++++++++++++ 6 files changed, 92 insertions(+), 4 deletions(-) create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/CrossRefTest.java create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.java create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.xtext create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/XtextUtilTrafoTest.java diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/GenerateAllTestGrammars.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/GenerateAllTestGrammars.java index ec76780e6..e0759f0a0 100755 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/GenerateAllTestGrammars.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/GenerateAllTestGrammars.java @@ -12,6 +12,7 @@ import org.apache.log4j.Logger; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl; +import org.eclipse.xtext.crossrefs.LangA; import org.eclipse.xtext.dummy.DummyLanguage; import org.eclipse.xtext.grammarinheritance.AbstractTestLanguage; import org.eclipse.xtext.grammarinheritance.ConcreteTestLanguage; @@ -36,12 +37,11 @@ public class GenerateAllTestGrammars { private static Logger log = Logger.getLogger(GenerateAllTestGrammars.class); - public final static Class[] testclasses = new Class[] { AbstractTestLanguage.class,ConcreteTestLanguage.class,XtextGrammarTest.class, MetamodelRefTest.class, + public final static Class[] testclasses = new Class[] { LangA.class, AbstractTestLanguage.class,ConcreteTestLanguage.class,XtextGrammarTest.class, MetamodelRefTest.class, DummyLanguage.class, TestLanguage.class, SimpleReconstrTest.class, ComplexReconstrTest.class, LexerLanguage.class, SimpleExpressions.class, ActionTestLanguage.class, OptionalEmptyLanguage.class, - ReferenceGrammar.class, LookaheadLanguage.class - };// MultiGenMMTest. - // class + ReferenceGrammar.class, LookaheadLanguage.class + }; public static void main(String[] args) throws Exception { XtextStandaloneSetup.doSetup(); diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/CrossRefTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/CrossRefTest.java new file mode 100644 index 000000000..d7274ecbd --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/CrossRefTest.java @@ -0,0 +1,19 @@ +package org.eclipse.xtext.crossrefs; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.tests.AbstractGeneratorTest; + +public class CrossRefTest extends AbstractGeneratorTest { + @Override + protected void setUp() throws Exception { + super.setUp(); + with(LangAStandaloneSetup.class); + } + + public void testSimple() throws Exception { + EObject model = getModel("type A extends B type B extends A"); + System.out.println(invokeWithXtend("types.collect(e|e.name+' '+e.extends.name).toString(',')", model)); + assertWithXtend("'B'", "types.first().extends.name", model); + assertWithXtend("types.first()", "types.first().extends.extends", model); + } +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.java new file mode 100644 index 000000000..6d0a0c778 --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.java @@ -0,0 +1,5 @@ +package org.eclipse.xtext.crossrefs; + +public class LangA { + +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.xtext b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.xtext new file mode 100644 index 000000000..d0c6c019e --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/crossrefs/LangA.xtext @@ -0,0 +1,13 @@ +language org.eclipse.xtext.crossrefs.LangA + +generate langA "http://eclipse.org/xtext/langA" + +Main : + imports+=Import* + types+=Type*; + +Import : + 'import' uri=STRING; + +Type : + 'type' name=ID 'extends' ^extends=[Type]; \ No newline at end of file diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/XtextParserTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/XtextParserTest.java index 6ed59dd6f..e66ba1191 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/XtextParserTest.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/parser/XtextParserTest.java @@ -15,4 +15,9 @@ public class XtextParserTest extends AbstractGeneratorTest { Grammar model = (Grammar) getModel("language foo generate foo 'bar' as x Model returns x::Foo : 'holla' name=ID;"); assertWithXtend("'x'", "metamodelDeclarations.first().alias", model); } + + public void testParseCrossRef() throws Exception { + Grammar model = (Grammar) getModel("language foo generate foo 'bar' Model : 'a' stuff+=Stuff*; Stuff : 'stuff' name=ID refersTo=[Stuff];"); + assertWithXtend("'Stuff'", "eAllContents.typeSelect(xtext::CrossReference).first().type.name", model); + } } diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/XtextUtilTrafoTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/XtextUtilTrafoTest.java new file mode 100644 index 000000000..2c00407a3 --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/XtextUtilTrafoTest.java @@ -0,0 +1,46 @@ +package org.eclipse.xtext.xtext2ecore; + +import java.util.List; + +import org.eclipse.xtext.Grammar; +import org.eclipse.xtext.RuleCall; +import org.eclipse.xtext.XtextStandaloneSetup; +import org.eclipse.xtext.tests.AbstractGeneratorTest; +import org.eclipse.xtext.xtextutil.MetaModel; +import org.eclipse.xtext.xtextutil.XtextutilPackage; + +public class XtextUtilTrafoTest extends AbstractGeneratorTest { + @Override + protected void setUp() throws Exception { + super.setUp(); + XtextutilPackage.eINSTANCE.getAbstractType(); // initialze and register + with(XtextStandaloneSetup.class); + } + + @SuppressWarnings("unchecked") + public void testCrossRefs() throws Exception { + Grammar model = (Grammar) getModel("language foo generate foo 'bar' Model : stuff+=Stuff*; Stuff : 'stuff' name=ID refersTo=[Stuff];"); + List metamodels = (List) invokeWithXtend("getAllMetaModels(this)", model); + assertEquals(2, metamodels.size()); + assertWithXtend("'Stuff'", + "eAllContents.flatten().typeSelect(xtextutil::ComplexType).select(e|e.name=='Stuff')" + + ".first().features.selectFirst(e|e.name=='refersTo').type.name", metamodels); + } + + @Override + protected String[] importedExtensions() { + return new String[] { "org::eclipse::xtext::XtextUtil" }; + } + + public void testCurrentType() throws Exception { + Grammar model = (Grammar) getModel("language org.eclipse.xtext.crossrefs.LangA" + + " generate langA 'http://eclipse.org/xtext/langA' " + + "Main : ^import+=Import* types+=Type*;" + + "Import : 'import' uri=STRING;" + + "Type : 'type' name=ID 'extends' ^extends=[Type];"); + RuleCall rc = (RuleCall) invokeWithXtend("parserRules.first().eAllContents.typeSelect(xtext::RuleCall).first()", model); + assertNotNull(rc); + assertWithXtend("'Main'", "testCurrentType().name", rc); + assertWithXtend("false", "testCurrentType().abstract", rc); + } +}