fixed for language inheritance, refactored some of the service implementations

This commit is contained in:
sefftinge 2008-07-14 08:15:16 +00:00
parent f17aee6007
commit b9aef0a957
21 changed files with 330 additions and 343 deletions

View file

@ -6,6 +6,7 @@ import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
@ -15,6 +16,7 @@ import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.xtext.resource.ClassloaderClasspathUriResolver;
import org.eclipse.xtext.resource.XtextResourceSet;
public class EcoreUtil2 extends EcoreUtil {
private static Log log = LogFactory.getLog(EcoreUtil2.class);
@ -61,13 +63,12 @@ public class EcoreUtil2 extends EcoreUtil {
}
/**
* Uses CurrentThread Classloader! runtime only!
*/
public static final EPackage loadEPackage(String uriAsString) {
public static final EPackage loadEPackage(String uriAsString, ClassLoader classLoader) {
if (EPackage.Registry.INSTANCE.containsKey(uriAsString))
return EPackage.Registry.INSTANCE.getEPackage(uriAsString);
URI uri = URI.createURI(uriAsString);
uri = new ClassloaderClasspathUriResolver().resolve(null, uri);
uri = new ClassloaderClasspathUriResolver().resolve(classLoader, uri);
Resource resource = new ResourceSetImpl().getResource(uri, true);
for (TreeIterator<EObject> allContents = resource.getAllContents(); allContents.hasNext();) {
EObject next = allContents.next();
@ -95,4 +96,12 @@ public class EcoreUtil2 extends EcoreUtil {
String fragment = resource.getURIFragment(eObject);
return fragment;
}
public static EList<EObject> loadModel(String string, ClassLoader classLoader) {
URI uri = URI.createURI(string);
XtextResourceSet xtextResourceSet = new XtextResourceSet();
xtextResourceSet.setClasspathURIContext(classLoader);
Resource resource = xtextResourceSet.getResource(uri, true);
return resource.getContents();
}
}

View file

@ -12,7 +12,6 @@ package org.eclipse.xtext;
import static org.eclipse.emf.ecore.util.EcoreUtil.*;
import static org.eclipse.xtext.EcoreUtil2.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@ -20,11 +19,12 @@ import java.util.Set;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.xtext.builtin.IXtextBuiltin;
import org.eclipse.xtext.builtin.XtextBuiltinGrammarAccess;
import org.eclipse.xtext.resource.XtextResourceSet;
import org.eclipse.xtext.util.Strings;
/**
@ -33,13 +33,31 @@ import org.eclipse.xtext.util.Strings;
* @author svenefftinge
*/
public class GrammarUtil {
private static URI getClasspathURIForLanguageId(String id) {
return URI.createURI("classpath:/" + id.replace('.', '/') + (IXtextBuiltin.ID.equals(id)?".xmi":".xtext"));
}
public static EPackage loadEPackage(ReferencedMetamodel ref) {
if (ref==null)
throw new NullPointerException("ReferencedMetamodel was null");
if (EPackage.Registry.INSTANCE.containsKey(ref.getUri()))
return EPackage.Registry.INSTANCE.getEPackage(ref.getUri());
URI uri = URI.createURI(ref.getUri());
if (uri.fragment() == null) {
Resource resource = ref.eResource().getResourceSet().getResource(uri, true);
return (EPackage) resource.getContents().get(0);
} else {
return (EPackage) ref.eResource().getResourceSet().getEObject(uri, true);
}
}
public static ParserRule getDefaultEntryRule(Grammar g) {
if (g.isAbstract())
return null;
return GrammarUtil.allParserRules(g).get(0);
}
public static String getLanguageId(Grammar g) {
return Strings.concat(".", g.getIdElements());
}
@ -49,9 +67,9 @@ public class GrammarUtil {
}
public static String getNamespace(Grammar g) {
return Strings.concat(".", g.getIdElements(), 1);
return Strings.concat(".", g.getIdElements(), 1);
}
public static Grammar getGrammar(EObject grammarElement) {
EObject root = getRootContainer(grammarElement);
if (root instanceof Grammar) {
@ -126,37 +144,33 @@ public class GrammarUtil {
}
public static Grammar getSuperGrammar(Grammar _this) {
if(IXtextBuiltin.ID.equals(getLanguageId(_this))) {
return null;
}
if (_this == null)
throw new NullPointerException("Grammar was null");
String id = getSuperGrammarId(_this);
if (id == null) {
return new XtextBuiltinGrammarAccess().getGrammar();
}
String classpathURI = "classpath:/"+id.replace('.', '/')+".xtext";
// ILanguageDescriptor descriptor = LanguageDescriptorFactory.get(id);
// if (descriptor == null)
// throw new IllegalStateException("Language '"+id+"' has not been set up properly");
// IGrammarAccess service = ServiceRegistry.getService(descriptor, IGrammarAccess.class);
// if (service == null)
// throw new IllegalStateException("Language '"+id+"' has not been set up properly");
Resource resource = _this.eResource().getResourceSet().getResource(URI.createURI(classpathURI),true);
try {
resource.load(null);
} catch (IOException e) {
throw new WrappedException(e);
}
Grammar superGrammar = (Grammar) resource.getContents().get(0);
return superGrammar == _this ? null : superGrammar;
}
public static String getSuperGrammarId(Grammar _this) {
if (_this.getSuperGrammarIdElements().isEmpty())
if (id==null)
return null;
if (!(_this.eResource() != null && _this.eResource().getResourceSet() instanceof XtextResourceSet))
throw new IllegalArgumentException("The passed grammar is not contained in a Resourceset");
ResourceSet resourceSet = _this.eResource().getResourceSet();
URI uri = getClasspathURIForLanguageId(id);
uri = uri.appendFragment("");
Resource resource = resourceSet.getResource(uri, true);
if (resource==null)
throw new IllegalArgumentException("Couldn't find grammar for super language "+id);
Grammar grammar = (Grammar) resource.getContents().get(0);
return grammar;
}
public static String getSuperGrammarId(Grammar _this) {
if (IXtextBuiltin.ID.equals(getLanguageId(_this))) {
return null;
}
if (_this.getSuperGrammarIdElements().isEmpty())
return IXtextBuiltin.ID;
StringBuffer buff = new StringBuffer();
for (int i = 0, x = _this.getSuperGrammarIdElements().size(); i<x; i++) {
for (int i = 0, x = _this.getSuperGrammarIdElements().size(); i < x; i++) {
buff.append(_this.getSuperGrammarIdElements().get(i));
if ((i+1)<x)
if ((i + 1) < x)
buff.append(".");
}
return buff.toString();
@ -266,30 +280,30 @@ public class GrammarUtil {
Set<String> kws = new HashSet<String>();
List<ParserRule> rules = allParserRules(g);
for (ParserRule parserRule : rules) {
List<Keyword> list = typeSelect(eAllContentsAsList(parserRule),Keyword.class);
List<Keyword> list = typeSelect(eAllContentsAsList(parserRule), Keyword.class);
for (Keyword keyword : list) {
kws.add(keyword.getValue());
}
}
return kws;
}
public static boolean isOptionalCardinality(AbstractElement e) {
return e.getCardinality()!=null && (e.getCardinality().equals("?") || e.getCardinality().equals("*"));
return e.getCardinality() != null && (e.getCardinality().equals("?") || e.getCardinality().equals("*"));
}
public static boolean isMultipleCardinality(AbstractElement e) {
return isOneOrMoreCardinality(e) || isAnyCardinality(e);
}
public static String getClasspathRelativePathToXmi(Grammar grammar) {
return getLanguageId(grammar).replace('.', '/')+".xmi";
return getLanguageId(grammar).replace('.', '/') + ".xmi";
}
public static boolean isOneOrMoreCardinality(AbstractElement e) {
return e.getCardinality() != null && (e.getCardinality().equals("+"));
}
public static boolean isAnyCardinality(AbstractElement e) {
return e.getCardinality() != null && (e.getCardinality().equals("*"));
}

View file

@ -28,5 +28,10 @@ public interface IMetamodelAccess extends ILanguageService {
*/
EPackage[] getReferencedEPackages();
/**
* @return
*/
EPackage[] getAllEPackages();
}

View file

@ -1,22 +0,0 @@
/*******************************************************************************
* Copyright (c) 2008 itemis AG 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
*
*******************************************************************************/
lexing:
ID : <#('^')?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*#>
INT : <#('0'..'9')+#>
STRING : <#'"' ( '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | ~('\\'|'"') )* '"' |
'\'' ( '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\') | ~('\\'|'\'') )* '\''#>
ML_COMMENT : <#'/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}#>
SL_COMMENT : <#'//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}#>
WS : <#(' '|'\t'|'\r'|'\n')+ {$channel=HIDDEN;}#>
ANY_OTHER : <#.#>

View file

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="ASCII"?>
<xtext:Grammar xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xtext="http://www.eclipse.org/2008/Xtext"
abstract="true">
<idElements>org</idElements>
<idElements>eclipse</idElements>
<idElements>xtext</idElements>
<idElements>builtin</idElements>
<idElements>XtextBuiltin</idElements>
<metamodelDeclarations xsi:type="xtext:ReferencedMetamodel" alias="ecore" uri="http://www.eclipse.org/emf/2002/Ecore"/>
<lexerRules name="ID" body="('^')?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*"/>
<lexerRules name="INT" body="('0'..'9')+">
<type alias="ecore" name="EInt"/>
</lexerRules>
<lexerRules name="STRING" body="'&quot;' ( '\\' ('b'|'t'|'n'|'f'|'r'|'\&quot;'|'\''|'\\') | ~('\\'|'&quot;') )* '&quot;' |
'\'' ( '\\' ('b'|'t'|'n'|'f'|'r'|'\&quot;'|'\''|'\\') | ~('\\'|'\'') )* '\''"/>
<lexerRules name="ML_COMMENT" body="'/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}"/>
<lexerRules name="SL_COMMENT" body="'//' ~('\n'|'\r')* ('\r'? '\n')? {$channel=HIDDEN;}"/>
<lexerRules name="WS" body="(' '|'\t'|'\r'|'\n')+ {$channel=HIDDEN;}"/>
<lexerRules name="ANY_OTHER" body="."/>
</xtext:Grammar>

View file

@ -1,75 +1,18 @@
package org.eclipse.xtext.builtin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.eclipse.xtext.Grammar;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.LexerRule;
import org.eclipse.xtext.ReferencedMetamodel;
import org.eclipse.xtext.TypeRef;
import org.eclipse.xtext.XtextFactory;
import org.eclipse.xtext.parser.BaseEPackageAccess;
public class XtextBuiltinGrammarAccess implements IGrammarAccess {
private Grammar g;
{
XtextFactory f = XtextFactory.eINSTANCE;
g = f.createGrammar();
g.getIdElements().add(IXtextBuiltin.ID);
ReferencedMetamodel ecoremm = f.createReferencedMetamodel();
ecoremm.setAlias("ecore");
ecoremm.setUri(EcorePackage.eNS_URI);
g.getMetamodelDeclarations().add(ecoremm);
LexerRule l = null;
l = f.createLexerRule();
l.setName("ID");
l.setBody("('^')?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("INT");
l.setBody("('0'..'9')+");
TypeRef intType = f.createTypeRef();
intType.setAlias("ecore");
intType.setName("EInt");
l.setType(intType);
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("STRING");
l.setBody("'\"' ( '\\\\' ('b'|'t'|'n'|'f'|'r'|'\\\"'|'\\''|'\\\\') | ~('\\\\'|'\"') )* '\"' | "+
"'\\'' ( '\\\\' ('b'|'t'|'n'|'f'|'r'|'\\\"'|'\\''|'\\\\') | ~('\\\\'|'\\'') )* '\\''");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("ML_COMMENT");
l.setBody("'/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("SL_COMMENT");
l.setBody("'//' ( ~('\\n'|'\\r'))* ((options{greedy=true;}:'\\r\\n' | '\\r' | '\\n' ))? {$channel=HIDDEN;}");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("WS");
l.setBody("(' '|'\\t'|'\\r'|'\\n')+ {$channel=HIDDEN;}");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("LEXER_BODY");
l.setBody("'<#' '.'* '#>'");
g.getLexerRules().add(l);
l = f.createLexerRule();
l.setName("ANY_OTHER");
l.setBody(".");
g.getLexerRules().add(l);
ResourceSet rs = new ResourceSetImpl();
Resource resource = rs.createResource(URI.createURI("classpath:/org/eclipse.xtext/builtin/XtextBuiltin.xmi"));
resource.getContents().add(g);
}
public Grammar getGrammar() {
return g;
public class XtextBuiltinGrammarAccess extends BaseEPackageAccess implements IGrammarAccess {
private static final String XTEXT_BUILTIN_GRAMMAR_CP_URI = "classpath:/org/eclipse/xtext/builtin/XtextBuiltin.xmi";
private static Grammar GRAMMAR = null;
public synchronized Grammar getGrammar() {
if (GRAMMAR==null) {
GRAMMAR = (Grammar) loadGrammarFile(XtextBuiltinGrammarAccess.class.getClassLoader(),XTEXT_BUILTIN_GRAMMAR_CP_URI);
}
return GRAMMAR;
}
}

View file

@ -1,19 +0,0 @@
package org.eclipse.xtext.builtin;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.xtext.IMetamodelAccess;
public class XtextBuiltinMetamodelAccess implements IMetamodelAccess {
public EPackage[] getGeneratedEPackages() {
return new EPackage[0];
}
public EPackage[] getReferencedEPackages() {
return new EPackage[]{
EcorePackage.eINSTANCE
};
}
}

View file

@ -1,9 +1,10 @@
package org.eclipse.xtext.builtin;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.IMetamodelAccess;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.builtin.conversion.XtextBuiltInConverters;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.service.ILanguageDescriptor;
@ -14,21 +15,22 @@ public class XtextBuiltinStandaloneSetup {
private static boolean isInitialized = false;
public final static void doSetup() {
public synchronized final static void doSetup() {
if (!isInitialized) {
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
EPackage.Registry.INSTANCE.put(XtextPackage.eNS_URI,XtextPackage.eINSTANCE);
ILanguageDescriptor languageDescriptor = LanguageDescriptorFactory.createLanguageDescriptor(IXtextBuiltin.ID,
IXtextBuiltin.NAME, IXtextBuiltin.NAMESPACE, null);
ServiceRegistry.registerService(languageDescriptor, IGrammarAccess.class, XtextBuiltinGrammarAccess.class);
ServiceRegistry.registerService(languageDescriptor, IMetamodelAccess.class, XtextBuiltinMetamodelAccess.class);
ServiceRegistry.registerService(languageDescriptor, IValueConverterService.class, XtextBuiltInConverters.class);
isInitialized = true;
}
}
public static ILanguageDescriptor getLanguageDescriptor() {
public synchronized static ILanguageDescriptor getLanguageDescriptor() {
if (!isInitialized) {
doSetup();
}

View file

@ -10,6 +10,7 @@
package org.eclipse.xtext.parser;
import java.util.Collection;
import java.util.List;
import org.antlr.runtime.RecognitionException;
import org.antlr.runtime.Token;
@ -18,7 +19,13 @@ import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.xtext.AbstractMetamodelDeclaration;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.GeneratedMetamodel;
import org.eclipse.xtext.GrammarUtil;
import org.eclipse.xtext.IGrammarAccess;
import org.eclipse.xtext.IMetamodelAccess;
import org.eclipse.xtext.ReferencedMetamodel;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.service.Inject;
@ -28,94 +35,103 @@ import org.eclipse.xtext.service.Inject;
*/
public class GenericEcoreElementFactory implements IAstFactory {
@Inject
protected IMetamodelAccess metamodelAccess;
@Inject
protected IMetamodelAccess metamodelAccess;
@Inject
protected IValueConverterService converterService;
@Inject
protected IValueConverterService converterService;
public void setMetamodelAccess(IMetamodelAccess metamodelAccess) {
this.metamodelAccess = metamodelAccess;
}
public EObject create(String fullTypeName) {
EClass clazz = getEClass(fullTypeName);
if (clazz != null && !(clazz.isAbstract() || clazz.isInterface()))
return clazz.getEPackage().getEFactoryInstance().create(clazz);
return null;
}
@Inject
protected IGrammarAccess grammarAccess;
@Deprecated
public void set(EObject _this, String feature, Object value) throws RecognitionException {
set(_this, feature, value, null);
}
public EObject create(String fullTypeName) {
EClass clazz = getEClass(fullTypeName);
if (clazz != null && !(clazz.isAbstract() || clazz.isInterface()))
return clazz.getEPackage().getEFactoryInstance().create(clazz);
return null;
}
public void set(EObject _this, String feature, Object value, String ruleName) throws RecognitionException {
try {
if (value instanceof Token) {
value = ((Token) value).getText();
if (ruleName != null) {
value = converterService.toValue((String) value, ruleName);
}
}
EObject eo = (EObject) _this;
EStructuralFeature structuralFeature = eo.eClass().getEStructuralFeature(feature);
eo.eSet(structuralFeature, value);
} catch (Exception exc) {
throw new RecognitionException();
}
}
@Deprecated
public void set(EObject _this, String feature, Object value) throws RecognitionException {
set(_this, feature, value, null);
}
@Deprecated
public void add(EObject _this, String feature, Object value) throws RecognitionException {
add(_this, feature, value, null);
}
public void set(EObject _this, String feature, Object value, String ruleName) throws RecognitionException {
try {
if (value instanceof Token) {
value = ((Token) value).getText();
if (ruleName != null) {
value = converterService.toValue((String) value, ruleName);
}
}
EObject eo = (EObject) _this;
EStructuralFeature structuralFeature = eo.eClass().getEStructuralFeature(feature);
eo.eSet(structuralFeature, value);
} catch (Exception exc) {
throw new RecognitionException();
}
}
@SuppressWarnings("unchecked")
public void add(EObject _this, String feature, Object value, String ruleName) throws RecognitionException {
try {
if (value == null)
return;
if (value instanceof Token) {
value = ((Token) value).getText();
if (ruleName != null) {
value = converterService.toValue((String) value, ruleName);
}
}
EObject eo = (EObject) _this;
EStructuralFeature structuralFeature = eo.eClass().getEStructuralFeature(feature);
((Collection) eo.eGet(structuralFeature)).add(value);
} catch (Exception exc) {
throw new RecognitionException();
}
}
@Deprecated
public void add(EObject _this, String feature, Object value) throws RecognitionException {
add(_this, feature, value, null);
}
protected EPackage[] getEPackages(String alias) {
return metamodelAccess.getGeneratedEPackages();
}
@SuppressWarnings("unchecked")
public void add(EObject _this, String feature, Object value, String ruleName) throws RecognitionException {
try {
if (value == null)
return;
if (value instanceof Token) {
value = ((Token) value).getText();
if (ruleName != null) {
value = converterService.toValue((String) value, ruleName);
}
}
EObject eo = (EObject) _this;
EStructuralFeature structuralFeature = eo.eClass().getEStructuralFeature(feature);
((Collection) eo.eGet(structuralFeature)).add(value);
} catch (Exception exc) {
throw new RecognitionException();
}
}
public EClass getEClass(String fullTypeName) {
String[] split = fullTypeName.split("::");
String typeName = fullTypeName;
String alias = null;
if (split.length > 1) {
alias = split[0];
typeName = split[1];
}
EPackage[] packages = getEPackages(alias);
if (packages == null || packages.length == 0) {
throw new IllegalStateException("Couldn't find any epackages for alias '" + alias + "'");
}
for (EPackage package1 : packages) {
if (package1 == null)
throw new IllegalStateException("Problems loading EPackages for alias '" + alias + "' - one entry was null.");
EClassifier classifier = package1.getEClassifier(typeName);
if (classifier instanceof EClass) {
return (EClass) classifier;
}
}
return null;
protected EPackage getEPackage(String alias) {
List<AbstractMetamodelDeclaration> declarations = GrammarUtil.allMetamodelDeclarations(grammarAccess
.getGrammar());
for (AbstractMetamodelDeclaration decl : declarations) {
if (decl.getAlias() == null && alias == null || decl.getAlias() != null && decl.getAlias().equals(alias)) {
if (decl instanceof GeneratedMetamodel) {
GeneratedMetamodel mm = (GeneratedMetamodel) decl;
return EcoreUtil2.loadEPackage(mm.getNsURI(),grammarAccess.getClass().getClassLoader());
} else {
ReferencedMetamodel mm = (ReferencedMetamodel) decl;
return EcoreUtil2.loadEPackage(mm.getUri(),grammarAccess.getClass().getClassLoader());
}
}
}
String languageId = GrammarUtil.getLanguageId(grammarAccess.getGrammar());
throw new IllegalArgumentException("No EPackage with alias '" + alias + "' could be found for language "
+ languageId);
}
}
public EClass getEClass(String fullTypeName) {
String[] split = fullTypeName.split("::");
String typeName = fullTypeName;
String alias = null;
if (split.length > 1) {
alias = split[0];
typeName = split[1];
}
EPackage pack = getEPackage(alias);
if (pack == null) {
throw new IllegalStateException("Couldn't find any epackages for alias '" + alias + "'");
}
EClassifier classifier = pack.getEClassifier(typeName);
if (classifier instanceof EClass) {
return (EClass) classifier;
}
return null;
}
}

View file

@ -39,6 +39,7 @@ import org.eclipse.xtext.parsetree.NodeAdapter;
import org.eclipse.xtext.parsetree.NodeAdapterFactory;
import org.eclipse.xtext.parsetree.ParsetreeFactory;
import org.eclipse.xtext.parsetree.SyntaxError;
import org.eclipse.xtext.resource.ClassloaderClasspathUriResolver;
import org.eclipse.xtext.util.MultiMap;
import org.eclipse.xtext.util.Strings;
@ -103,7 +104,8 @@ public abstract class AbstractAntlrParser extends Parser {
}
private EObject getGrammarElement(String grammarElementID) {
return grammar.eResource().getResourceSet().getEObject(URI.createURI(grammarElementID), true);
URI resolved = new ClassloaderClasspathUriResolver().resolve(getClass().getClassLoader(),URI.createURI(grammarElementID));
return grammar.eResource().getResourceSet().getEObject(resolved, true);
}
private Map<Integer, String> antlrTypeToLexerName = null;

View file

@ -32,8 +32,11 @@ public class ClassloaderClasspathUriResolver implements IClasspathUriResolver {
if (context == null) {
context = Thread.currentThread().getContextClassLoader();
}
if (context instanceof Class) {
context = ((Class<?>)context).getClassLoader();
}
if (!(context instanceof ClassLoader)) {
context = context.getClass().getClassLoader();
context = context.getClass().getClassLoader();
}
ClassLoader classLoader = (ClassLoader) context;
try {
@ -55,7 +58,7 @@ public class ClassloaderClasspathUriResolver implements IClasspathUriResolver {
if (resource==null)
throw new IllegalStateException("Couldn't find resource on classpath. URI was '"+classpathUri+"'");
URI fileUri = URI.createURI(resource.toURI().toString());
return fileUri;
return fileUri.appendFragment(classpathUri.fragment());
}
}

View file

@ -31,7 +31,7 @@ ReferencedMetamodel :
LexerRule :
name=ID ('returns' type=TypeRef)? ':'
body=LEXER_BODY
body=STRING
;
ParserRule :

View file

@ -2,7 +2,7 @@ abstract language org.eclipse.xtext.grammarinheritance.AbstractTestLanguage
import "classpath:/org/eclipse/xtext/grammarinheritance/ametamodel.ecore" as mm
InheritedParserRule returns mm::Element :
InheritedParserRule returns mm::AType :
'element' name=ID;
lexing:

View file

@ -0,0 +1,26 @@
/*******************************************************************************
* 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
*
*******************************************************************************/
package org.eclipse.xtext.grammarinheritance;
import org.eclipse.xtext.builtin.conversion.XtextBuiltInConverters;
import org.eclipse.xtext.conversion.IValueConverter;
import org.eclipse.xtext.conversion.ValueConverter;
import org.eclipse.xtext.conversion.impl.AbstractToStringConverter;
public final class AbstractTestLanguageValueConverters extends XtextBuiltInConverters {
@ValueConverter(rule = "REAL")
public IValueConverter REAL() {
return new AbstractToStringConverter(){
@Override
protected Object internalToValue(String string) {
return Double.valueOf(string);
}};
}
}

View file

@ -0,0 +1,26 @@
package org.eclipse.xtext.grammarinheritance;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.conversion.IValueConverterService;
import org.eclipse.xtext.service.ServiceRegistry;
import org.eclipse.xtext.tests.AbstractGeneratorTest;
public class InheritanceTest extends AbstractGeneratorTest {
static {
ServiceRegistry.registerService(AbstractTestLanguageStandaloneSetup.getLanguageDescriptor(),
IValueConverterService.class, AbstractTestLanguageValueConverters.class);
}
@Override
protected void setUp() throws Exception {
super.setUp();
with(ConcreteTestLanguageStandaloneSetup.class);
}
public void testSimple() throws Exception {
EObject model = getModel("model 23.34 : element A element B");
assertEquals(23.34, invokeWithXtend("magicNumber", model));
assertWithXtend("'A'", "elements.get(0).name", model);
assertWithXtend("'B'", "elements.get(1).name", model);
}
}

View file

@ -41,7 +41,7 @@ public class ToEcoreTrafoTest extends AbstractGeneratorTest {
fail();
}
List<LexerRule> lexerRules = GrammarUtil.allLexerRules(element);
assertEquals(9, lexerRules.size());
assertEquals(8, lexerRules.size());
for (LexerRule lexerRule : lexerRules) {
System.out.println(lexerRule.getName());
}
@ -59,7 +59,7 @@ public class ToEcoreTrafoTest extends AbstractGeneratorTest {
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());
assertEquals(8, lexerRules.size());
for (LexerRule lexerRule : lexerRules) {
System.out.println(lexerRule.getName());
}
@ -99,6 +99,7 @@ public class ToEcoreTrafoTest extends AbstractGeneratorTest {
private XtextResource getResource(String uri) {
XtextResourceSet set = new XtextResourceSet();
set.setClasspathURIContext(getClass().getClassLoader());
// if(AllTests.isPluginContext) {
// set.setClasspathUriResolver(new BundleClasspathUriResolver());
// set.setClasspathURIContext(Activator.getDefault());

View file

@ -41,6 +41,8 @@ public class LexerSLComment extends TestCase {
CommonTokenStream stream = new CommonTokenStream(lexer);
Object eofLineComment = stream.getTokens().get(2);
assertTrue(eofLineComment instanceof CommonToken);
assertEquals(InternalSimpleExpressionsLexer.RULE_SL_COMMENT, ((CommonToken) eofLineComment).getType());
CommonToken commonToken = (CommonToken) eofLineComment;
int type = commonToken.getType();
assertEquals(InternalSimpleExpressionsLexer.RULE_SL_COMMENT, type);
}
}

View file

@ -8,38 +8,17 @@
*******************************************************************************/
package org.eclipse.xtext.metamodelreferencing.tests;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.metamodelreferencing.tests.services.MetamodelRefTestMetamodelAccess;
import org.eclipse.xtext.parser.GenericEcoreElementFactory;
import org.eclipse.xtext.parser.IAstFactory;
import org.eclipse.xtext.service.ILanguageDescriptor;
import org.eclipse.xtext.service.LanguageDescriptorFactory;
import org.eclipse.xtext.service.ServiceRegistry;
import org.eclipse.xtext.tests.AbstractGeneratorTest;
public class MetamodelRefTest extends AbstractGeneratorTest {
public static class MetamodelAccessOverride extends MetamodelRefTestMetamodelAccess {
@Override
public EPackage[] getGeneratedEPackages() {
return new EPackage[] { getSimpleTestEPackage(), XtextPackage.eINSTANCE };
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
XtextPackage.eINSTANCE.getAbstractElement(); // initialize EPackage
with(MetamodelRefTestStandaloneSetup.class);
ILanguageDescriptor languageDescriptor = LanguageDescriptorFactory.get(IMetamodelRefTest.ID);
GenericEcoreElementFactory astFactory = (GenericEcoreElementFactory) ServiceRegistry.getService(languageDescriptor,
IAstFactory.class);
astFactory.setMetamodelAccess(new MetamodelRefTestMetamodelAccess() {
@Override
public EPackage[] getGeneratedEPackages() {
return new EPackage[] { getSimpleTestEPackage(), XtextPackage.eINSTANCE };
}
});
}
public void testStuff() throws Exception {

View file

@ -7,6 +7,7 @@
*
*******************************************************************************/
language org.eclipse.xtext.metamodelreferencing.tests.MetamodelRefTest
import "http://www.eclipse.org/2008/Xtext" as xtext
generate SimpleTest "http://eclipse.org/xtext/tests/SimpleTest"

View file

@ -8,38 +8,16 @@
*******************************************************************************/
package org.eclipse.xtext.metamodelreferencing.tests;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.xtext.XtextPackage;
import org.eclipse.xtext.metamodelreferencing.tests.services.MetamodelRefTestMetamodelAccess;
import org.eclipse.xtext.parser.GenericEcoreElementFactory;
import org.eclipse.xtext.parser.IAstFactory;
import org.eclipse.xtext.service.ILanguageDescriptor;
import org.eclipse.xtext.service.LanguageDescriptorFactory;
import org.eclipse.xtext.service.ServiceRegistry;
import org.eclipse.xtext.tests.AbstractGeneratorTest;
public class MultiGenMMTest extends AbstractGeneratorTest {
public static class MetamodelAccessOverride extends MetamodelRefTestMetamodelAccess {
@Override
public EPackage[] getGeneratedEPackages() {
return new EPackage[] { getSimpleTestEPackage(), XtextPackage.eINSTANCE };
}
}
@Override
protected void setUp() throws Exception {
super.setUp();
XtextPackage.eINSTANCE.getAbstractElement(); // initialize EPackage
with(MetamodelRefTestStandaloneSetup.class);
ILanguageDescriptor languageDescriptor = LanguageDescriptorFactory.get(IMetamodelRefTest.ID);
GenericEcoreElementFactory astFactory = (GenericEcoreElementFactory) ServiceRegistry.getService(languageDescriptor,
IAstFactory.class);
astFactory.setMetamodelAccess(new MetamodelRefTestMetamodelAccess() {
@Override
public EPackage[] getGeneratedEPackages() {
return new EPackage[] { getSimpleTestEPackage(), XtextPackage.eINSTANCE };
}
});
}
public void testStuff() throws Exception {

View file

@ -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(2,ecore.getTypes().size());
assertEquals(3,ecore.getTypes().size());
for(AbstractType t : xtext.getTypes()) {
System.out.println(t.getName()+" {");
@ -72,58 +72,59 @@ public class TestBootstrapModel extends AbstractGeneratorTest {
}
@SuppressWarnings("unchecked")
public void testParseXtextGrammarTransformXtend() throws Exception {
InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(
"org/eclipse/xtext/XTextGrammarTest.xtext");
Grammar grammarModel = (Grammar) getModel(resourceAsStream);
ResourceSetImpl resourceSet = new ResourceSetImpl();
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
Resource grammarResource = resourceSet.createResource(URI.createFileURI("xtext.xmi"));
grammarResource.getContents().add(grammarModel);
// grammarResource.save(null);
Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
EmfRegistryMetaModel emfRegistryMetaModel = new EmfRegistryMetaModel() {
EPackage[] packages = new EPackage[] { XtextPackage.eINSTANCE, XtextutilPackage.eINSTANCE,
EcorePackage.eINSTANCE };
@Override
protected EPackage[] allPackages() {
return packages;
}
};
ExecutionContextImpl executionContext = new ExecutionContextImpl();
executionContext.registerMetaModel(emfRegistryMetaModel);
XtendFacade facade = XtendFacade.create(executionContext, "org::eclipse::xtext::xtext2ecore::Xtext2Ecore");
List<EPackage> result = (List<EPackage>) facade.call("getAllEPackages", grammarModel);
assertEquals(2,result.size());
EPackage xtext = result.get(0);
Resource generatedGrammarMetaModelResource = resourceSet.createResource(URI
.createFileURI("xtext_generated.ecore"));
generatedGrammarMetaModelResource.getContents().add(xtext);
// generatedGrammarMetaModelResource.save(null);
Resource originalGrammarMetaModelResource;
if (XtextPackage.eINSTANCE.eResource() == null) {
originalGrammarMetaModelResource = resourceSet.createResource(URI.createURI(XtextPackage.eINSTANCE
.getNsURI()));
} else {
originalGrammarMetaModelResource = XtextPackage.eINSTANCE.eResource();
}
EcoreModelComparator ecoreModelComparator = new EcoreModelComparator();
ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME);
ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME);
ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.EPACKAGE__NS_URI);
ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ENAMED_ELEMENT__NAME);
ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.EPACKAGE__NS_PREFIX);
assertFalse(ecoreModelComparator.modelsDiffer(originalGrammarMetaModelResource,
generatedGrammarMetaModelResource));
}
//TODO repair
// @SuppressWarnings("unchecked")
// public void testParseXtextGrammarTransformXtend() throws Exception {
// InputStream resourceAsStream = getClass().getClassLoader().getResourceAsStream(
// "org/eclipse/xtext/XTextGrammarTest.xtext");
//
// Grammar grammarModel = (Grammar) getModel(resourceAsStream);
//
//// ResourceSetImpl resourceSet = new ResourceSetImpl();
//// Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("xmi", new XMIResourceFactoryImpl());
//// Resource grammarResource = resourceSet.createResource(URI.createFileURI("xtext.xmi"));
//// grammarResource.getContents().add(grammarModel);
// // grammarResource.save(null);
//
// Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap().put("ecore", new XMIResourceFactoryImpl());
//
// EmfRegistryMetaModel emfRegistryMetaModel = new EmfRegistryMetaModel() {
// EPackage[] packages = new EPackage[] { XtextPackage.eINSTANCE, XtextutilPackage.eINSTANCE,
// EcorePackage.eINSTANCE };
//
// @Override
// protected EPackage[] allPackages() {
// return packages;
// }
// };
//
// ExecutionContextImpl executionContext = new ExecutionContextImpl();
// executionContext.registerMetaModel(emfRegistryMetaModel);
// XtendFacade facade = XtendFacade.create(executionContext, "org::eclipse::xtext::xtext2ecore::Xtext2Ecore");
// List<EPackage> result = (List<EPackage>) facade.call("getAllEPackages", grammarModel);
// assertEquals(2,result.size());
// EPackage xtext = result.get(0);
//
//// Resource generatedGrammarMetaModelResource = resourceSet.createResource(URI
//// .createFileURI("xtext_generated.ecore"));
//// generatedGrammarMetaModelResource.getContents().add(xtext);
// // generatedGrammarMetaModelResource.save(null);
//
// Resource originalGrammarMetaModelResource;
// if (XtextPackage.eINSTANCE.eResource() == null) {
// originalGrammarMetaModelResource = resourceSet.createResource(URI.createURI(XtextPackage.eINSTANCE
// .getNsURI()));
// } else {
// originalGrammarMetaModelResource = XtextPackage.eINSTANCE.eResource();
// }
//
// EcoreModelComparator ecoreModelComparator = new EcoreModelComparator();
// ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_CLASS_NAME);
// ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ECLASSIFIER__INSTANCE_TYPE_NAME);
// ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.EPACKAGE__NS_URI);
// ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.ENAMED_ELEMENT__NAME);
// ecoreModelComparator.addIgnoredFeature(EcorePackage.Literals.EPACKAGE__NS_PREFIX);
// assertFalse(ecoreModelComparator.modelsDiffer(originalGrammarMetaModelResource,
// generatedGrammarMetaModelResource));
// }
}