From 2aa57b0034df7308a11059da245d70b2597005b1 Mon Sep 17 00:00:00 2001 From: sefftinge Date: Tue, 8 Jul 2008 10:28:17 +0000 Subject: [PATCH] added test for languageinheritance, first steps towards generation of abstract languages --- .../src/org/eclipse/xtext/EcoreUtil2.java | 9 +++- .../src/org/eclipse/xtext/GrammarUtil.java | 42 ++++++++++--------- ...=> XtextBuiltIn_LEXER_ESCAPE_SYNTAX.xtext} | 0 ...uiltin_STRING.xtext => XtextBuiltin.xtext} | 7 ++-- .../ClassloaderClasspathUriResolver.java | 2 + 5 files changed, 35 insertions(+), 25 deletions(-) rename plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/{XtextBuiltIn.xtext => XtextBuiltIn_LEXER_ESCAPE_SYNTAX.xtext} (100%) rename plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/{XtextBuiltin_STRING.xtext => XtextBuiltin.xtext} (77%) diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java index 2446e675a..9f5514360 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java @@ -14,6 +14,7 @@ import org.eclipse.emf.ecore.resource.Resource; 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; public class EcoreUtil2 extends EcoreUtil { private static Log log = LogFactory.getLog(EcoreUtil2.class); @@ -59,18 +60,22 @@ public class EcoreUtil2 extends EcoreUtil { return result; } + /** + * Uses CurrentThread Classloader! runtime only! + */ public static final EPackage loadEPackage(String uriAsString) { if (EPackage.Registry.INSTANCE.containsKey(uriAsString)) return EPackage.Registry.INSTANCE.getEPackage(uriAsString); URI uri = URI.createURI(uriAsString); + uri = new ClassloaderClasspathUriResolver().resolve(null, uri); Resource resource = new ResourceSetImpl().getResource(uri, true); for (TreeIterator allContents = resource.getAllContents(); allContents.hasNext();) { EObject next = allContents.next(); if (next instanceof EPackage) { EPackage ePackage = (EPackage) next; - if (ePackage.getNsURI() != null && ePackage.getNsURI().equals(uriAsString)) { +// if (ePackage.getNsURI() != null && ePackage.getNsURI().equals(uriAsString)) { return ePackage; - } +// } } } log.error("Could not load EPackage with nsURI" + uriAsString); diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java index c16b916c5..621ae0edf 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/GrammarUtil.java @@ -9,28 +9,23 @@ package org.eclipse.xtext; -import static org.eclipse.emf.ecore.util.EcoreUtil.getRootContainer; -import static org.eclipse.xtext.EcoreUtil2.eAllContentsAsList; -import static org.eclipse.xtext.EcoreUtil2.getAllContentsOfType; -import static org.eclipse.xtext.EcoreUtil2.getContainerOfType; -import static org.eclipse.xtext.EcoreUtil2.typeSelect; +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; 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.resource.Resource; import org.eclipse.xtext.builtin.IXtextBuiltin; -import org.eclipse.xtext.conversion.IValueConverterService; -import org.eclipse.xtext.parsetree.reconstr.IParseTreeConstructor; -import org.eclipse.xtext.parsetree.reconstr.callbacks.SimpleSerializingCallback; -import org.eclipse.xtext.service.ILanguageDescriptor; -import org.eclipse.xtext.service.LanguageDescriptorFactory; -import org.eclipse.xtext.service.ServiceRegistry; +import org.eclipse.xtext.builtin.XtextBuiltinGrammarAccess; import org.eclipse.xtext.util.Strings; -import org.eclipse.xtext.util.XtextSwitch; /** * @@ -136,15 +131,22 @@ public class GrammarUtil { } String id = getSuperGrammarId(_this); if (id == null) { - id = IXtextBuiltin.ID; + return new XtextBuiltinGrammarAccess().getGrammar(); } - 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"); - Grammar superGrammar = service.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; } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltIn.xtext b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltIn_LEXER_ESCAPE_SYNTAX.xtext similarity index 100% rename from plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltIn.xtext rename to plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltIn_LEXER_ESCAPE_SYNTAX.xtext diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin_STRING.xtext b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin.xtext similarity index 77% rename from plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin_STRING.xtext rename to plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin.xtext index 38f8661a5..9461db5fe 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin_STRING.xtext +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/builtin/XtextBuiltin.xtext @@ -1,12 +1,13 @@ // when LEXER_BODY has been removed use the following... -abstract language XtextBuiltIns +abstract language org.eclipse.xtext.builtin.XtextBuiltIn_Temp -import "http://ecore" as ecore; +import "http://www.eclipse.org/emf/2002/Ecore" as ecore; lexing: ID : "('^')?('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'_'|'0'..'9')*"; -INT : "('0'..'9')+"; +INT returns ecore::EInt + : "('0'..'9')+"; STRING : " '\"' ( '\\\\' ('b'|'t'|'n'|'f'|'r'|'\\\"'|'\\''|'\\\\') | ~('\\\\'|'\"') )* '\"' | '\\'' ( '\\\\' ('b'|'t'|'n'|'f'|'r'|'\\\"'|'\\''|'\\\\') | ~('\\\\'|'\\'') )* '\\'' diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ClassloaderClasspathUriResolver.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ClassloaderClasspathUriResolver.java index 494520ed6..0ffb19974 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ClassloaderClasspathUriResolver.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/ClassloaderClasspathUriResolver.java @@ -52,6 +52,8 @@ public class ClassloaderClasspathUriResolver implements IClasspathUriResolver { pathAsString = pathAsString.substring(1); } URL resource = classLoader.getResource(pathAsString); + if (resource==null) + throw new IllegalStateException("Couldn't find resource on classpath. URI was '"+classpathUri+"'"); URI fileUri = URI.createURI(resource.toURI().toString()); return fileUri; }