mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 08:48:55 +00:00
Merge pull request #803 from eclipse/sz/bug482116
[482116] Fixed bug in GrammarAccessFragment
This commit is contained in:
commit
6a8ea1a411
7 changed files with 84 additions and 16 deletions
|
@ -191,16 +191,16 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
«ENDFOR»
|
||||
|
||||
private final «Grammar» grammar;
|
||||
«FOR g : language.grammar.usedGrammars»
|
||||
«FOR g : language.grammar.effectivelyUsedGrammars»
|
||||
|
||||
private final «g.grammarAccess» «g.gaGrammarAccessLocalVarName»;
|
||||
«ENDFOR»
|
||||
|
||||
@«Inject»
|
||||
public «language.grammar.grammarAccess.simpleName»(«GrammarProvider» grammarProvider«FOR g : language.grammar.usedGrammars»,
|
||||
public «language.grammar.grammarAccess.simpleName»(«GrammarProvider» grammarProvider«FOR g : language.grammar.effectivelyUsedGrammars»,
|
||||
«g.grammarAccess» «g.gaGrammarAccessLocalVarName»«ENDFOR») {
|
||||
this.grammar = internalFindGrammar(grammarProvider);
|
||||
«FOR g : language.grammar.usedGrammars»
|
||||
«FOR g : language.grammar.effectivelyUsedGrammars»
|
||||
this.«g.gaGrammarAccessLocalVarName» = «g.gaGrammarAccessLocalVarName»;
|
||||
«ENDFOR»
|
||||
«FOR r : language.grammar.rules»
|
||||
|
@ -229,7 +229,7 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
return grammar;
|
||||
}
|
||||
|
||||
«FOR g : language.grammar.usedGrammars»
|
||||
«FOR g : language.grammar.effectivelyUsedGrammars»
|
||||
|
||||
public «g.grammarAccess» get«g.grammarAccess.simpleName»() {
|
||||
return «g.gaGrammarAccessLocalVarName»;
|
||||
|
@ -311,7 +311,7 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
}
|
||||
«ELSE»
|
||||
public «it.grammar.grammarAccess».«gaBaseRuleAccessorClassName» «gaElementsAccessor» {
|
||||
return «usedGrammar(original).gaGrammarAccessLocalVarName».«gaBaseElementsAccessor»;
|
||||
return «it.grammar.gaGrammarAccessLocalVarName».«gaBaseElementsAccessor»;
|
||||
}
|
||||
«ENDIF»
|
||||
|
||||
|
@ -328,7 +328,7 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
}
|
||||
«ELSE»
|
||||
public «it.grammar.grammarAccess».«gaRuleAccessorClassName» «gaElementsAccessor» {
|
||||
return «usedGrammar(original).gaGrammarAccessLocalVarName».«gaElementsAccessor»;
|
||||
return «it.grammar.gaGrammarAccessLocalVarName».«gaElementsAccessor»;
|
||||
}
|
||||
«ENDIF»
|
||||
|
||||
|
@ -343,7 +343,7 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
«IF it.grammar === original»
|
||||
return «gaRuleAccessorLocalVarName»;
|
||||
«ELSE»
|
||||
return «usedGrammar(original).gaGrammarAccessLocalVarName».«gaBaseRuleAccessor»;
|
||||
return «it.grammar.gaGrammarAccessLocalVarName».«gaBaseRuleAccessor»;
|
||||
«ENDIF»
|
||||
}
|
||||
'''
|
||||
|
@ -379,8 +379,11 @@ class GrammarAccessFragment2 extends AbstractXtextGeneratorFragment {
|
|||
"rule"
|
||||
}
|
||||
|
||||
protected def Grammar usedGrammar(AbstractRule rule, Grammar parent) {
|
||||
parent.usedGrammars.findFirst[allRules.contains(rule)]
|
||||
/**
|
||||
* Returns all grammars from the hierarchy that are used from rules of this grammar.
|
||||
*/
|
||||
protected def getEffectivelyUsedGrammars(Grammar grammar) {
|
||||
grammar.allRules.map[ GrammarUtil.getGrammar(it) ].filter[ it !== grammar ].toSet.toList
|
||||
}
|
||||
|
||||
}
|
|
@ -9,6 +9,8 @@
|
|||
package org.eclipse.xtext.grammarinheritance;
|
||||
|
||||
import org.eclipse.emf.ecore.EPackage;
|
||||
import org.eclipse.emf.ecore.resource.Resource;
|
||||
import org.eclipse.xtext.AbstractRule;
|
||||
import org.eclipse.xtext.grammarinheritance.ametamodel.AmetamodelPackage;
|
||||
import org.eclipse.xtext.grammarinheritance.services.InheritanceTest2LanguageGrammarAccess;
|
||||
import org.eclipse.xtext.junit4.AbstractXtextTests;
|
||||
|
@ -27,6 +29,14 @@ public class AnotherInheritanceTest extends AbstractXtextTests {
|
|||
@Test public void testSimple() throws Exception {
|
||||
InheritanceTest2LanguageGrammarAccess g = (InheritanceTest2LanguageGrammarAccess) getGrammarAccess();
|
||||
assertNotNull(g.getFQNAccess());
|
||||
AbstractRule fromFQN = g.getFQNAccess().getIDTerminalRuleCall_0().getRule();
|
||||
assertEquals(fromFQN, g.getIDRule());
|
||||
assertNotNull(g.getModelAccess());
|
||||
}
|
||||
|
||||
@Test public void testFQNWithNumbers() throws Exception {
|
||||
Resource resource = getModelAndExpect("model a { ab.ab01 }", 1).eResource();
|
||||
String msg = resource.getErrors().get(0).getMessage();
|
||||
assertEquals("extraneous input '01' expecting '}'", msg);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,6 +15,7 @@ import org.eclipse.xtext.generator.*
|
|||
var projectName = "org.eclipse.xtext.tests"
|
||||
var runtimeProject = "../${projectName}"
|
||||
var lineDelimiter = '\n'
|
||||
var encoding = 'ISO-8859-1'
|
||||
|
||||
Workflow {
|
||||
bean = StandaloneSetup {
|
||||
|
@ -44,31 +45,31 @@ Workflow {
|
|||
component = Generator auto-inject {
|
||||
pathRtProject = runtimeProject
|
||||
projectNameRt = projectName
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/AbstractTestLanguage.xtext"
|
||||
fragment = @TestLanguagesFragments {
|
||||
srcGenOnly = false
|
||||
}
|
||||
}
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/BaseInheritanceTestLanguage.xtext"
|
||||
fragment = @TestLanguagesFragments {}
|
||||
}
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/ConcreteTestLanguage.xtext"
|
||||
fragment = @TestLanguagesFragments {}
|
||||
}
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTestLanguage.xtext"
|
||||
fragment = @TestLanguagesFragments {
|
||||
srcGenOnly = false
|
||||
}
|
||||
}
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTest2Language.xtext"
|
||||
fragment = @TestLanguagesFragments {}
|
||||
}
|
||||
language = {
|
||||
language = auto-inject {
|
||||
uri = "classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTest3Language.xtext"
|
||||
fragment = @TestLanguagesFragments {}
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@ Model:
|
|||
Element :
|
||||
super::Element
|
||||
| {Element} "element" name=super::ID
|
||||
| {Element} "element" name=Terminals::ID
|
||||
| {Element} "element" name=super::STRING
|
||||
;
|
||||
|
||||
|
|
|
@ -18,4 +18,6 @@ Model :
|
|||
|
||||
Element :
|
||||
"element" name=ID
|
||||
;
|
||||
;
|
||||
|
||||
terminal ID: ('a'..'z')+;
|
|
@ -67,4 +67,14 @@ public class ParserTest extends AbstractXtextTests {
|
|||
assertTrue(nodesForFeature.size() == 1);
|
||||
assertEquals("'with spaces'", nodesForFeature.get(0).getText());
|
||||
}
|
||||
|
||||
@Test public void test_05() throws Exception {
|
||||
Model model = (Model) getModel("model id { element withNumbers01 }");
|
||||
assertEquals("id", model.getName());
|
||||
Element element = model.getElements().get(0);
|
||||
assertEquals("withNumbers01", element.getName());
|
||||
List<INode> nodesForFeature = NodeModelUtils.findNodesForFeature(element, InheritanceTestPackage.Literals.ELEMENT__NAME);
|
||||
assertTrue(nodesForFeature.size() == 1);
|
||||
assertEquals("withNumbers01", nodesForFeature.get(0).getText());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,17 +8,27 @@
|
|||
package org.eclipse.xtext.serializer;
|
||||
|
||||
import org.eclipse.emf.common.util.URI;
|
||||
import org.eclipse.xtext.AbstractRule;
|
||||
import org.eclipse.xtext.Grammar;
|
||||
import org.eclipse.xtext.GrammarUtil;
|
||||
import org.eclipse.xtext.Group;
|
||||
import org.eclipse.xtext.RuleCall;
|
||||
import org.eclipse.xtext.TerminalRule;
|
||||
import org.eclipse.xtext.XtextStandaloneSetup;
|
||||
import org.eclipse.xtext.common.services.TerminalsGrammarAccess;
|
||||
import org.eclipse.xtext.grammarinheritance.services.BaseInheritanceTestLanguageGrammarAccess;
|
||||
import org.eclipse.xtext.grammarinheritance.services.InheritanceTestLanguageGrammarAccess;
|
||||
import org.eclipse.xtext.junit4.AbstractXtextTests;
|
||||
import org.eclipse.xtext.junit4.serializer.SerializerTester;
|
||||
import org.eclipse.xtext.resource.XtextResourceSet;
|
||||
import org.eclipse.xtext.service.GrammarProvider;
|
||||
import org.eclipse.xtext.services.XtextGrammarAccess;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.google.inject.Inject;
|
||||
import com.google.inject.Provider;
|
||||
|
||||
/**
|
||||
* @author Moritz Eysholdt - Initial contribution and API
|
||||
|
@ -62,4 +72,35 @@ public class XtextSerializerTest extends AbstractXtextTests {
|
|||
String string = get(ISerializer.class).serialize(grammarAccess.getGrammarAccess().getGroup_2());
|
||||
Assert.assertEquals("(\"with\" usedGrammars+=[Grammar|GrammarID] (\",\" usedGrammars+=[Grammar|GrammarID])*)?", string);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFQNInSuper_01() {
|
||||
GrammarProvider grammarProvider = new GrammarProvider("org.eclipse.xtext.grammarinheritance.InheritanceTestLanguage", new Provider<XtextResourceSet>() {
|
||||
@Override
|
||||
public XtextResourceSet get() {
|
||||
return XtextSerializerTest.this.get(XtextResourceSet.class);
|
||||
}
|
||||
});
|
||||
TerminalsGrammarAccess gaTerminals = new TerminalsGrammarAccess(grammarProvider);
|
||||
BaseInheritanceTestLanguageGrammarAccess gaBaseInheritanceTestLanguage = new BaseInheritanceTestLanguageGrammarAccess(grammarProvider, gaTerminals);
|
||||
InheritanceTestLanguageGrammarAccess grammarAccess = new InheritanceTestLanguageGrammarAccess(grammarProvider, gaBaseInheritanceTestLanguage, gaTerminals);
|
||||
String string = get(ISerializer.class).serialize(grammarAccess.getFQNRule().getAlternatives());
|
||||
Assert.assertEquals("ID (\".\" ID)*", string);
|
||||
}
|
||||
|
||||
@Ignore("Serialization does not have the correct context information")
|
||||
@Test
|
||||
public void testFQNInSuper_02() {
|
||||
Grammar grammar = load(URI.createURI("classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTestLanguage.xtext"));
|
||||
AbstractRule rule = GrammarUtil.findRuleForName(grammar, "FQN");
|
||||
Assert.assertNotNull(rule);
|
||||
Group group = (Group) rule.getAlternatives();
|
||||
RuleCall ruleCall = (RuleCall) group.getElements().get(0);
|
||||
TerminalRule id = (TerminalRule) ruleCall.getRule();
|
||||
Assert.assertSame(grammar, GrammarUtil.getGrammar(id));
|
||||
String string = get(ISerializer.class).serialize(rule.getAlternatives());
|
||||
Assert.assertEquals("ID (\".\" ID)*", string);
|
||||
// currently wrong result is
|
||||
Assert.assertEquals("super::ID (\".\" super::ID)*", string);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue