From 974b462e3d366a7c0b8e1acb79fbd6b4e1fec4f7 Mon Sep 17 00:00:00 2001 From: sefftinge Date: Tue, 8 Jul 2008 08:09:56 +0000 Subject: [PATCH] added test for languageinheritance, first steps towards generation of abstract languages --- .../xtext/GenerateAllTestGrammars.java | 7 +- .../AbstractTestLanguage.java | 5 + .../AbstractTestLanguage.xtext | 12 ++ .../ConcreteTestLanguage.java | 5 + .../ConcreteTestLanguage.xtext | 7 ++ .../grammarinheritance/ToEcoreTrafoTest.java | 113 ++++++++++++++++++ .../xtext/grammarinheritance/ametamodel.ecore | 9 ++ .../inheritance/AbstractBaseLanguage.java | 5 - .../inheritance/AbstractBaseLanguage.xtext | 14 --- .../inheritance/ConcreteSubLanguage.java | 5 - .../inheritance/ConcreteSubLanguage.xtext | 15 --- .../xtext/xtext2ecore/TestBootstrapModel.java | 2 +- 12 files changed, 157 insertions(+), 42 deletions(-) create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.java create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.xtext create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.java create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.xtext create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ToEcoreTrafoTest.java create mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ametamodel.ecore delete mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.java delete mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.xtext delete mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.java delete mode 100644 tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.xtext 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 9f717aa52..95d0cd918 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 @@ -14,6 +14,8 @@ 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.dummy.DummyLanguage; +import org.eclipse.xtext.grammarinheritance.AbstractTestLanguage; +import org.eclipse.xtext.grammarinheritance.ConcreteTestLanguage; import org.eclipse.xtext.metamodelreferencing.tests.MetamodelRefTest; import org.eclipse.xtext.parsetree.reconstr.ComplexReconstrTest; import org.eclipse.xtext.parsetree.reconstr.SimpleReconstrTest; @@ -34,10 +36,11 @@ public class GenerateAllTestGrammars { private static String path = "./src-gen"; private static Log log = LogFactory.getLog(GenerateAllTestGrammars.class); - public final static Class[] testclasses = new Class[] { XtextGrammarTest.class, MetamodelRefTest.class, + public final static Class[] testclasses = new 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. + ReferenceGrammar.class, LookaheadLanguage.class + };// MultiGenMMTest. // class public static void main(String[] args) throws Exception { diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.java new file mode 100644 index 000000000..59d7bff4c --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.java @@ -0,0 +1,5 @@ +package org.eclipse.xtext.grammarinheritance; + +public class AbstractTestLanguage { + +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.xtext b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.xtext new file mode 100644 index 000000000..f37ccad77 --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.xtext @@ -0,0 +1,12 @@ +abstract language org.eclipse.xtext.grammarinheritance.AbstractTestLanguage + +import "classpath:/org/eclipse/xtext/grammarinheritance/ametamodel.ecore" as mm + +InheritedParserRule returns mm::Element : + 'element' name=ID; + +lexing: + +REAL returns ecore::EDouble : "RULE_INT '.' RULE_INT"; + +ID : "('^')?('a'..'z'|'A'..'Z'|'ö'|'ä'|'ü'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*"; \ No newline at end of file diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.java new file mode 100644 index 000000000..c4eec8534 --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.java @@ -0,0 +1,5 @@ +package org.eclipse.xtext.grammarinheritance; + +public class ConcreteTestLanguage { + +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.xtext b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.xtext new file mode 100644 index 000000000..c6b49be63 --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.xtext @@ -0,0 +1,7 @@ +language org.eclipse.xtext.grammarinheritance.ConcreteTestLanguage extends org.eclipse.xtext.grammarinheritance.AbstractTestLanguage + +generate foo "http://holla" + +ConcreteParserRule : + 'model' magicNumber=REAL ':' (elements+=InheritedParserRule)*; + diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ToEcoreTrafoTest.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ToEcoreTrafoTest.java new file mode 100644 index 000000000..8ff61ef1f --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ToEcoreTrafoTest.java @@ -0,0 +1,113 @@ +package org.eclipse.xtext.grammarinheritance; + +import java.util.List; + +import org.eclipse.emf.common.util.EList; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.emf.ecore.EPackage; +import org.eclipse.xtext.Grammar; +import org.eclipse.xtext.GrammarUtil; +import org.eclipse.xtext.LexerRule; +import org.eclipse.xtext.ReferencedMetamodel; +import org.eclipse.xtext.XtextStandaloneSetup; +import org.eclipse.xtext.parsetree.SyntaxError; +import org.eclipse.xtext.resource.XtextResource; +import org.eclipse.xtext.resource.XtextResourceSet; +import org.eclipse.xtext.tests.AbstractGeneratorTest; +import org.eclipse.xtext.xtextutil.AbstractType; +import org.eclipse.xtext.xtextutil.ComplexType; +import org.eclipse.xtext.xtextutil.Feature; +import org.eclipse.xtext.xtextutil.MetaModel; +import org.eclipse.xtext.xtextutil.XtextutilPackage; + +public class ToEcoreTrafoTest extends AbstractGeneratorTest { + @Override + protected void setUp() throws Exception { + super.setUp(); + with(XtextStandaloneSetup.class); + XtextutilPackage.eINSTANCE.getAbstractType(); + } + + @SuppressWarnings("unchecked") + public void testAbstractLanguageToMetamodel() throws Exception { + XtextResource r = getResource("classpath:/"+AbstractTestLanguage.class.getName().replace('.', '/')+".xtext"); + Grammar element = (Grammar) r.getParseResult().getRootASTElement(); + if (!r.getParseResult().getParseErrors().isEmpty()) { + List errors = r.getParseResult().getParseErrors(); + for (SyntaxError syntaxError : errors) { + System.out.println(syntaxError.getMessage()+" - "+syntaxError.getNode().getLine()); + } + fail(); + } + List lexerRules = GrammarUtil.allLexerRules(element); + assertEquals(9, lexerRules.size()); + for (LexerRule lexerRule : lexerRules) { + System.out.println(lexerRule.getName()); + } + List mms = (List) invokeWithXtend("getAllMetaModels(this)", element); + assertNotNull(mms); + assertEquals(2,mms.size()); + for (MetaModel metaModel : mms) { + assertNotNull(metaModel.getDeclaration()); + assertNotNull(((ReferencedMetamodel)metaModel.getDeclaration()).getUri()); + } + } + + @SuppressWarnings("unchecked") + public void testConcreteLanguageToMetamodel() throws Exception { + XtextResource r = getResource("classpath:/"+ConcreteTestLanguage.class.getName().replace('.', '/')+".xtext"); + Grammar element = (Grammar) r.getParseResult().getRootASTElement(); + List lexerRules = GrammarUtil.allLexerRules(element); + assertEquals(9, lexerRules.size()); + for (LexerRule lexerRule : lexerRules) { + System.out.println(lexerRule.getName()); + } + GrammarUtil.getReturnTypeName(GrammarUtil.findRuleForName(element, "REAL")); + List mms = (List) invokeWithXtend("getAllMetaModels(this)", element); + assertNotNull(mms); + assertEquals(3,mms.size()); + for (MetaModel metaModel : mms) { + assertNotNull(metaModel.getDeclaration()); + EList types = metaModel.getTypes(); + for (AbstractType abstractType : types) { + assertNotNull(abstractType); + if (abstractType instanceof ComplexType) { + ComplexType ct = (ComplexType) abstractType; + EList features = ct.getFeatures(); + for (Feature feature : features) { + assertNotNull(feature); + assertNotNull(feature.getName(), feature.getType()); + } + } + } + } + } + + @SuppressWarnings("unchecked") + public void testConcreteLanguageToMetamodel1() throws Exception { + try { + XtextResource r = getResource("classpath:/"+ConcreteTestLanguage.class.getName().replace('.', '/')+".xtext"); + EObject element = r.getParseResult().getRootASTElement(); + List mms = (List) invokeWithXtend("getGeneratedEPackages(this)", element); + assertNotNull(mms); + assertEquals(1,mms.size()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private XtextResource getResource(String uri) { + XtextResourceSet set = new XtextResourceSet(); + XtextResource r = (XtextResource) set.getResource(URI.createURI(uri),true); + return r; + } + + @Override + protected String[] importedExtensions() { + return new String[]{ + "org::eclipse::xtext::XtextUtil", + "org::eclipse::xtext::xtext2ecore::Xtext2Ecore" + }; + } +} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ametamodel.ecore b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ametamodel.ecore new file mode 100644 index 000000000..e2c24a45d --- /dev/null +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/grammarinheritance/ametamodel.ecore @@ -0,0 +1,9 @@ + + + + + + diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.java deleted file mode 100644 index 9623b27e0..000000000 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.eclipse.xtext.inheritance; - -public class AbstractBaseLanguage { - -} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.xtext b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.xtext deleted file mode 100644 index 20adf7005..000000000 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/AbstractBaseLanguage.xtext +++ /dev/null @@ -1,14 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - *******************************************************************************/ -abstract language org.eclipse.xtext.inheritance.AbstractBaseLanguage - -lexing : - -MY_SPECIAL1 : "'special1'"; -MY_SPECIAL2 returns ecore::EJavaObject: "'special2'"; \ No newline at end of file diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.java deleted file mode 100644 index 62adbeda3..000000000 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.eclipse.xtext.inheritance; - -public class ConcreteSubLanguage { - -} diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.xtext b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.xtext deleted file mode 100644 index 3ce8be419..000000000 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/inheritance/ConcreteSubLanguage.xtext +++ /dev/null @@ -1,15 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2008 itemis AG (http://www.itemis.eu) and others. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - *******************************************************************************/ -language org.eclipse.xtext.inheritance.ConcreteSubLanguage extends org.eclipse.xtext.inheritance.AbstractBaseLanguage - -Model : s1=MY_SPECIAL1 s2=MY_SPECIAL2 s3=MY_SPECIAL3; - -lexing: - -MY_SPECIAL3 : "'special3'"; diff --git a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/TestBootstrapModel.java b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/TestBootstrapModel.java index ad545d54d..8af947900 100644 --- a/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/TestBootstrapModel.java +++ b/tests/org.eclipse.xtext.generator.tests/src/org/eclipse/xtext/xtext2ecore/TestBootstrapModel.java @@ -60,7 +60,7 @@ public class TestBootstrapModel extends AbstractGeneratorTest { MetaModel xtext = (MetaModel) invokeWithXtend("select(e|e.alias()==null).first()", result); MetaModel ecore = (MetaModel) invokeWithXtend("select(e|e.alias()=='ecore').first()", result); assertEquals(15,xtext.getTypes().size()); - assertEquals(3,ecore.getTypes().size()); + assertEquals(2,ecore.getTypes().size()); for(AbstractType t : xtext.getTypes()) { System.out.println(t.getName()+" {");