mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-15 08:18:55 +00:00
added test and implementation for bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=231773
This commit is contained in:
parent
b7af487e94
commit
9f3fa1c6db
11 changed files with 90 additions and 21 deletions
|
@ -41,7 +41,7 @@ ParserRule :
|
|||
;
|
||||
|
||||
TypeRef :
|
||||
name=ID
|
||||
(alias=ID '::')? name=ID
|
||||
;
|
||||
|
||||
Alternatives returns AbstractElement:
|
||||
|
|
|
@ -81,7 +81,7 @@ AbstractRule calledRule(RuleCall this) :
|
|||
|
||||
String getReturnTypeName(ParserRule p) :
|
||||
if p.type != null then
|
||||
p.type.name
|
||||
(if p.type.alias!=null then p.type.alias+'::' else '')+p.type.name
|
||||
else
|
||||
p.name
|
||||
;
|
||||
|
|
|
@ -195,6 +195,9 @@ private String getAlias(String fqn) :
|
|||
fqn.split("::").first()
|
||||
;
|
||||
|
||||
qualifiedName(ResolvedType this) :
|
||||
(if metaModel.alias!=null then metaModel.alias+'::' else '') + name;
|
||||
|
||||
|
||||
// ***********************************************************************************
|
||||
// Metamodels
|
||||
|
@ -218,7 +221,7 @@ private create MetaModel createMetamodel(GeneratedMetamodel gmm) :
|
|||
;
|
||||
|
||||
create MetaModel loadMetaModel(ReferencedMetamodel rmm) :
|
||||
setEPackage(loadEPackage(rmm.uri)) ->
|
||||
setEPackage(loadEPackage(rmm.uri.trimFromStartAndEnd(1))) ->
|
||||
setReferenced(true) ->
|
||||
setAlias(rmm.alias) ->
|
||||
setDeclaration(rmm)
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
<classpath>
|
||||
<classpathentry kind="src" path="src"/>
|
||||
<classpathentry kind="src" path="src-gen"/>
|
||||
<classpathentry kind="src" path="emf-gen"/>
|
||||
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
|
||||
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
|
||||
<classpathentry kind="output" path="bin"/>
|
||||
|
|
|
@ -18,7 +18,7 @@ import org.eclipse.emf.ecore.EPackage;
|
|||
import org.eclipse.m2t.type.emf.EmfRegistryMetaModel;
|
||||
import org.eclipse.xtext.generator.tests.AbstractGeneratorTest;
|
||||
import org.eclipse.xtext.generator.tests.Invocation;
|
||||
import org.eclipse.xtext.parser.XtextGrammarTestFactory;
|
||||
import org.eclipse.xtext.parser.XtextGrammarTestASTFactory;
|
||||
import org.openarchitectureware.expression.ExecutionContextImpl;
|
||||
import org.openarchitectureware.xtend.XtendFacade;
|
||||
|
||||
|
@ -43,7 +43,7 @@ public class XtextGrammarTest extends AbstractGeneratorTest {
|
|||
assertEquals("set(name,[@6,19:21='Foo',<4>,1:19])", iter.next().toString());
|
||||
assertEquals("create(Assignment)", iter.next().toString());
|
||||
assertEquals("set(feature,[@10,25:28='name',<4>,1:25])", iter.next().toString());
|
||||
assertEquals("set(operator,[@11,29:29='=',<23>,1:29])", iter.next().toString());
|
||||
assertEquals("set(operator,[@11,29:29='=',<24>,1:29])", iter.next().toString());
|
||||
assertEquals("create(RuleCall)", iter.next().toString());
|
||||
assertEquals("set(name,[@12,30:31='ID',<4>,1:30])", iter.next().toString());
|
||||
assertEquals("set(terminal,RuleCall)", iter.next().toString());
|
||||
|
@ -52,14 +52,14 @@ public class XtextGrammarTest extends AbstractGeneratorTest {
|
|||
}
|
||||
|
||||
public void testInstantiate() throws Exception {
|
||||
EObject grammar = (EObject) parse("generate foo 'bar' Foo : name=ID;", new XtextGrammarTestFactory());
|
||||
EObject grammar = (EObject) parse("generate foo 'bar' Foo : name=ID;", new XtextGrammarTestASTFactory());
|
||||
assertWithXtend("'Foo'","parserRules.first().name",grammar);
|
||||
assertWithXtend("'name'","parserRules.first().alternatives.feature",grammar);
|
||||
}
|
||||
|
||||
public void testInstantiateXtextGrammar() throws Exception {
|
||||
InputStream bootGrammar = getClass().getClassLoader().getResourceAsStream(getClass().getName().replace('.','/')+".xtext");
|
||||
EObject grammar = (EObject) parse(bootGrammar , new XtextGrammarTestFactory());
|
||||
EObject grammar = (EObject) parse(bootGrammar , new XtextGrammarTestASTFactory());
|
||||
assertWithXtend("true","parserRules.select(e|e.name=='AbstractToken').first()!=null",grammar);
|
||||
assertWithXtend("'AbstractElement'","parserRules.select(e|e.name=='AbstractToken').first().type.name",grammar);
|
||||
// Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put(
|
||||
|
|
|
@ -7,7 +7,7 @@
|
|||
*
|
||||
*******************************************************************************/
|
||||
|
||||
generate XtextTest "http://www.eclipse.org/2008/Test/XtextTest"
|
||||
generate XtextTest "http://www.eclipse.org/2008/Test/XtextTest"
|
||||
|
||||
Grammar :
|
||||
metamodelDeclarations+=AbstractMetamodelDeclaration*
|
||||
|
@ -39,9 +39,8 @@ ParserRule :
|
|||
;
|
||||
|
||||
TypeRef :
|
||||
name=ID
|
||||
(alias=ID '::')? name=ID
|
||||
;
|
||||
|
||||
Alternatives returns AbstractElement:
|
||||
Group ({Alternatives.groups+=current} '|' groups+=Group)*
|
||||
;
|
||||
|
|
|
@ -20,10 +20,10 @@ import org.openarchitectureware.xtend.XtendFacade;
|
|||
|
||||
/**
|
||||
* @author Sven Efftinge - Initial contribution and API
|
||||
*
|
||||
*
|
||||
*/
|
||||
public abstract class AbstractGeneratorTest extends TestCase {
|
||||
|
||||
|
||||
public Object parse(String model, IElementFactory factory) throws Exception {
|
||||
String name = getClass().getPackage().getName() + ".parser." + getClass().getSimpleName();
|
||||
String parser = name + "Parser";
|
||||
|
@ -33,15 +33,15 @@ public abstract class AbstractGeneratorTest extends TestCase {
|
|||
return parserClass.getMethod("parse", InputStream.class, IElementFactory.class).invoke(parserInstance,
|
||||
new StringInputStream(model), factory);
|
||||
}
|
||||
|
||||
|
||||
public Object parse(InputStream model, IElementFactory factory) throws Exception {
|
||||
String name = getClass().getPackage().getName() + ".parser." + getClass().getSimpleName();
|
||||
String parser = name + "Parser";
|
||||
|
||||
|
||||
Class<?> parserClass = getClass().getClassLoader().loadClass(parser);
|
||||
Object parserInstance = parserClass.newInstance();
|
||||
return parserClass.getMethod("parse", InputStream.class, IElementFactory.class).invoke(parserInstance,
|
||||
model, factory);
|
||||
return parserClass.getMethod("parse", InputStream.class, IElementFactory.class).invoke(parserInstance, model,
|
||||
factory);
|
||||
}
|
||||
|
||||
public List<Invocation> parse(String model) throws Exception {
|
||||
|
@ -65,12 +65,21 @@ public abstract class AbstractGeneratorTest extends TestCase {
|
|||
}
|
||||
|
||||
protected void assertWithXtend(String left, String right, Object _this) {
|
||||
assertWithXtend(left+" != "+right, left, right, _this);
|
||||
assertWithXtend(left + " != " + right, left, right, _this);
|
||||
}
|
||||
|
||||
protected void assertWithXtend(String message, String left, String right, Object _this) {
|
||||
XtendFacade f = getXtendFacade();
|
||||
f = f.cloneWithExtensions("__compare(Object this) : __left(this) == __right(this);__left(Object this) : "+left+"; __right(Object this) :"+right+";");
|
||||
assertTrue(message,(Boolean) f.call("__compare",_this));
|
||||
f = f.cloneWithExtensions("__compare(Object this) : __left(this) == __right(this);__left(Object this) : "
|
||||
+ left + "; __right(Object this) :" + right + ";");
|
||||
Boolean result = (Boolean) f.call("__compare", _this);
|
||||
if (!result) {
|
||||
Object leftResult = f.call("__left", _this);
|
||||
Object rightResult = f.call("__right", _this);
|
||||
fail(message + " was : " + leftResult + "("
|
||||
+ (leftResult != null ? leftResult.getClass().getSimpleName() : "") + ") != " + rightResult + "("
|
||||
+ (leftResult != null ? leftResult.getClass().getSimpleName() : "") + ")");
|
||||
}
|
||||
}
|
||||
|
||||
protected XtendFacade getXtendFacade() {
|
||||
|
|
|
@ -18,6 +18,7 @@ import org.eclipse.xtext.XtextGrammarTest;
|
|||
import org.eclipse.xtext.XtextPackage;
|
||||
import org.eclipse.xtext.grammargen.tests.SimpleTest;
|
||||
import org.eclipse.xtext.grammargen.tests.SimpleTest2;
|
||||
import org.eclipse.xtext.metamodelreferencing.tests.MetamodelRefTest;
|
||||
import org.eclipse.xtext.parser.XtextFactory;
|
||||
import org.eclipse.xtext.parser.XtextParser;
|
||||
|
||||
|
@ -28,7 +29,9 @@ import org.eclipse.xtext.parser.XtextParser;
|
|||
public class GenerateAllTestGrammars {
|
||||
private static final String PATH = "./src-gen";
|
||||
|
||||
private final static Class<?>[] testclasses = new Class[] { SimpleTest.class, SimpleTest2.class, XtextGrammarTest.class };
|
||||
private final static Class<?>[] testclasses = new Class[] {
|
||||
SimpleTest.class, SimpleTest2.class, XtextGrammarTest.class,
|
||||
MetamodelRefTest.class};
|
||||
|
||||
public static void main(String[] args) throws Exception {
|
||||
for (Class<?> c : testclasses) {
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
package org.eclipse.xtext.metamodelreferencing.tests;
|
||||
|
||||
import org.eclipse.emf.ecore.EPackage;
|
||||
import org.eclipse.m2t.type.emf.EmfRegistryMetaModel;
|
||||
import org.eclipse.xtext.XtextPackage;
|
||||
import org.eclipse.xtext.generator.tests.AbstractGeneratorTest;
|
||||
import org.eclipse.xtext.metamodelreferencing.tests.parser.MetamodelRefTestASTFactory;
|
||||
import org.openarchitectureware.expression.ExecutionContextImpl;
|
||||
import org.openarchitectureware.xtend.XtendFacade;
|
||||
|
||||
public class MetamodelRefTest extends AbstractGeneratorTest {
|
||||
|
||||
@Override
|
||||
protected void setUp() throws Exception {
|
||||
super.setUp();
|
||||
XtextPackage.eINSTANCE.getRuleCall(); // register Xtext EPackage
|
||||
}
|
||||
|
||||
public void testStuff() throws Exception {
|
||||
Object parse = parse("foo 'bar'", new MetamodelRefTestASTFactory());
|
||||
assertWithXtend("'SimpleTest::Foo'","metaType.name",parse);
|
||||
assertWithXtend("'xtext::RuleCall'","nameRefs.first().metaType.name",parse);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected XtendFacade getXtendFacade() {
|
||||
ExecutionContextImpl ctx = new ExecutionContextImpl();
|
||||
ctx.registerMetaModel(new EmfRegistryMetaModel() {
|
||||
@Override
|
||||
protected EPackage[] allPackages() {
|
||||
return new EPackage[]{MetamodelRefTestEPackageAccess.getSimpleTestEPackage()};
|
||||
}
|
||||
});
|
||||
XtendFacade facade = XtendFacade.create(ctx);
|
||||
return facade;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,17 @@
|
|||
/*******************************************************************************
|
||||
* 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
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
import "http://www.eclipse.org/2008/Xtext" as xtext
|
||||
generate SimpleTest "http://eclipse.org/xtext/tests/SimpleTest"
|
||||
|
||||
Foo :
|
||||
name=ID (nameRefs+=NameRef)*;
|
||||
|
||||
NameRef returns xtext::RuleCall :
|
||||
name=STRING;
|
|
@ -103,7 +103,7 @@ public class EcoreModelComparator {
|
|||
System.err.println("\t" + change.getRightElement());
|
||||
} else {
|
||||
// TODO: add more sysouts here...
|
||||
System.err.println(diffElement.getClass());
|
||||
System.err.println(diffElement.toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue