mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 00:38:56 +00:00
added test for languageinheritance, first steps towards generation of abstract languages
This commit is contained in:
parent
9a90cf75bf
commit
bab3003ab2
12 changed files with 157 additions and 42 deletions
|
@ -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 {
|
||||
|
|
|
@ -0,0 +1,5 @@
|
|||
package org.eclipse.xtext.grammarinheritance;
|
||||
|
||||
public class AbstractTestLanguage {
|
||||
|
||||
}
|
|
@ -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')*";
|
|
@ -0,0 +1,5 @@
|
|||
package org.eclipse.xtext.grammarinheritance;
|
||||
|
||||
public class ConcreteTestLanguage {
|
||||
|
||||
}
|
|
@ -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)*;
|
||||
|
|
@ -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<SyntaxError> errors = r.getParseResult().getParseErrors();
|
||||
for (SyntaxError syntaxError : errors) {
|
||||
System.out.println(syntaxError.getMessage()+" - "+syntaxError.getNode().getLine());
|
||||
}
|
||||
fail();
|
||||
}
|
||||
List<LexerRule> lexerRules = GrammarUtil.allLexerRules(element);
|
||||
assertEquals(9, lexerRules.size());
|
||||
for (LexerRule lexerRule : lexerRules) {
|
||||
System.out.println(lexerRule.getName());
|
||||
}
|
||||
List<MetaModel> mms = (List<MetaModel>) 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<LexerRule> lexerRules = GrammarUtil.allLexerRules(element);
|
||||
assertEquals(9, lexerRules.size());
|
||||
for (LexerRule lexerRule : lexerRules) {
|
||||
System.out.println(lexerRule.getName());
|
||||
}
|
||||
GrammarUtil.getReturnTypeName(GrammarUtil.findRuleForName(element, "REAL"));
|
||||
List<MetaModel> mms = (List<MetaModel>) invokeWithXtend("getAllMetaModels(this)", element);
|
||||
assertNotNull(mms);
|
||||
assertEquals(3,mms.size());
|
||||
for (MetaModel metaModel : mms) {
|
||||
assertNotNull(metaModel.getDeclaration());
|
||||
EList<AbstractType> types = metaModel.getTypes();
|
||||
for (AbstractType abstractType : types) {
|
||||
assertNotNull(abstractType);
|
||||
if (abstractType instanceof ComplexType) {
|
||||
ComplexType ct = (ComplexType) abstractType;
|
||||
EList<Feature> 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<EPackage> mms = (List<EPackage>) 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"
|
||||
};
|
||||
}
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ecore:EPackage xmi:version="2.0"
|
||||
xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="ametamodel"
|
||||
nsURI="http://www.eclipse.org/xtext/tests/grammarinheritance" nsPrefix="ametamodel">
|
||||
<eClassifiers xsi:type="ecore:EClass" name="AType">
|
||||
<eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
|
||||
</eClassifiers>
|
||||
</ecore:EPackage>
|
|
@ -1,5 +0,0 @@
|
|||
package org.eclipse.xtext.inheritance;
|
||||
|
||||
public class AbstractBaseLanguage {
|
||||
|
||||
}
|
|
@ -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'";
|
|
@ -1,5 +0,0 @@
|
|||
package org.eclipse.xtext.inheritance;
|
||||
|
||||
public class ConcreteSubLanguage {
|
||||
|
||||
}
|
|
@ -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'";
|
|
@ -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()+" {");
|
||||
|
|
Loading…
Reference in a new issue