PageRenderTime 25ms CodeModel.GetById 10ms RepoModel.GetById 0ms app.codeStats 0ms

/plugins/org.jnario.standalone/xtend-gen/org/jnario/compiler/JnarioStandaloneCompiler.java

http://github.com/bmwcarit/Jnario
Java | 301 lines | 278 code | 16 blank | 7 comment | 12 complexity | 399342361d25ca683b71b52770206319 MD5 | raw file
Possible License(s): Apache-2.0
  1. /**
  2. * Copyright (c) 2014 itemis AG (http://www.itemis.eu) and others.
  3. * All rights reserved. This program and the accompanying materials
  4. * are made available under the terms of the Eclipse Public License v1.0
  5. * which accompanies this distribution, and is available at
  6. * http://www.eclipse.org/legal/epl-v10.html
  7. */
  8. package org.jnario.compiler;
  9. import com.google.common.base.Joiner;
  10. import com.google.common.base.Objects;
  11. import com.google.common.base.Predicate;
  12. import com.google.common.collect.Lists;
  13. import com.google.common.collect.Multimap;
  14. import com.google.inject.Inject;
  15. import com.google.inject.Injector;
  16. import java.io.File;
  17. import java.util.ArrayList;
  18. import java.util.Collection;
  19. import java.util.Collections;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import java.util.Set;
  24. import org.apache.log4j.Logger;
  25. import org.eclipse.emf.common.notify.Adapter;
  26. import org.eclipse.emf.common.util.EList;
  27. import org.eclipse.emf.common.util.URI;
  28. import org.eclipse.emf.ecore.EObject;
  29. import org.eclipse.emf.ecore.resource.Resource;
  30. import org.eclipse.emf.ecore.resource.ResourceSet;
  31. import org.eclipse.emf.ecore.resource.URIConverter;
  32. import org.eclipse.xtend.core.compiler.batch.XtendBatchCompiler;
  33. import org.eclipse.xtext.ISetup;
  34. import org.eclipse.xtext.common.types.JvmDeclaredType;
  35. import org.eclipse.xtext.common.types.TypesPackage;
  36. import org.eclipse.xtext.common.types.descriptions.IStubGenerator;
  37. import org.eclipse.xtext.common.types.descriptions.JvmTypesResourceDescriptionStrategy;
  38. import org.eclipse.xtext.generator.JavaIoFileSystemAccess;
  39. import org.eclipse.xtext.mwe.NameBasedFilter;
  40. import org.eclipse.xtext.mwe.PathTraverser;
  41. import org.eclipse.xtext.naming.IQualifiedNameProvider;
  42. import org.eclipse.xtext.naming.QualifiedName;
  43. import org.eclipse.xtext.parser.IEncodingProvider;
  44. import org.eclipse.xtext.resource.FileExtensionProvider;
  45. import org.eclipse.xtext.resource.IEObjectDescription;
  46. import org.eclipse.xtext.resource.IResourceDescription;
  47. import org.eclipse.xtext.resource.containers.FlatResourceSetBasedAllContainersState;
  48. import org.eclipse.xtext.resource.impl.ResourceSetBasedResourceDescriptions;
  49. import org.eclipse.xtext.util.Strings;
  50. import org.eclipse.xtext.xbase.compiler.GeneratorConfig;
  51. import org.eclipse.xtext.xbase.compiler.IGeneratorConfigProvider;
  52. import org.eclipse.xtext.xbase.compiler.JvmModelGenerator;
  53. import org.eclipse.xtext.xbase.lib.CollectionExtensions;
  54. import org.eclipse.xtext.xbase.lib.CollectionLiterals;
  55. import org.eclipse.xtext.xbase.lib.Conversions;
  56. import org.eclipse.xtext.xbase.lib.Functions.Function1;
  57. import org.eclipse.xtext.xbase.lib.IterableExtensions;
  58. import org.eclipse.xtext.xbase.lib.ListExtensions;
  59. import org.eclipse.xtext.xbase.lib.Pair;
  60. import org.eclipse.xtext.xbase.lib.Procedures.Procedure1;
  61. import org.jnario.feature.FeatureStandaloneSetup;
  62. import org.jnario.spec.SpecStandaloneSetup;
  63. import org.jnario.suite.SuiteStandaloneSetup;
  64. @SuppressWarnings("all")
  65. public class JnarioStandaloneCompiler extends XtendBatchCompiler {
  66. private final static Logger log = Logger.getLogger(JnarioStandaloneCompiler.class.getName());
  67. @Inject
  68. private IEncodingProvider.Runtime encodingProvider;
  69. @Inject
  70. private IStubGenerator stubGenerator;
  71. private List<Injector> injectors;
  72. private Map<String, Injector> injectorMap;
  73. public static JnarioStandaloneCompiler create() {
  74. FeatureStandaloneSetup _featureStandaloneSetup = new FeatureStandaloneSetup();
  75. SpecStandaloneSetup _specStandaloneSetup = new SpecStandaloneSetup();
  76. SuiteStandaloneSetup _suiteStandaloneSetup = new SuiteStandaloneSetup();
  77. final List<? extends ISetup> setups = Collections.<ISetup>unmodifiableList(CollectionLiterals.<ISetup>newArrayList(_featureStandaloneSetup, _specStandaloneSetup, _suiteStandaloneSetup));
  78. return new JnarioStandaloneCompiler(setups);
  79. }
  80. public JnarioStandaloneCompiler(final List<? extends ISetup> setups) {
  81. final Function1<ISetup, Injector> _function = new Function1<ISetup, Injector>() {
  82. public Injector apply(final ISetup it) {
  83. return it.createInjectorAndDoEMFRegistration();
  84. }
  85. };
  86. List<Injector> _eagerMap = JnarioStandaloneCompiler.eagerMap(setups, _function);
  87. List<Injector> _list = IterableExtensions.<Injector>toList(_eagerMap);
  88. this.injectors = _list;
  89. Injector _head = IterableExtensions.<Injector>head(this.injectors);
  90. _head.injectMembers(this);
  91. final Function1<Injector, Pair<String, Injector>> _function_1 = new Function1<Injector, Pair<String, Injector>>() {
  92. public Pair<String, Injector> apply(final Injector it) {
  93. Pair<String, Injector> _xblockexpression = null;
  94. {
  95. FileExtensionProvider _instance = it.<FileExtensionProvider>getInstance(FileExtensionProvider.class);
  96. final String fileExtension = _instance.getPrimaryFileExtension();
  97. _xblockexpression = Pair.<String, Injector>of(fileExtension, it);
  98. }
  99. return _xblockexpression;
  100. }
  101. };
  102. List<Pair<String, Injector>> _map = ListExtensions.<Injector, Pair<String, Injector>>map(this.injectors, _function_1);
  103. HashMap<String, Injector> _newHashMap = CollectionLiterals.<String, Injector>newHashMap(((Pair<? extends String, ? extends Injector>[])Conversions.unwrapArray(_map, Pair.class)));
  104. this.injectorMap = _newHashMap;
  105. }
  106. protected ResourceSet loadXtendFiles(final ResourceSet resourceSet) {
  107. EList<Adapter> _eAdapters = resourceSet.eAdapters();
  108. _eAdapters.add(
  109. new FlatResourceSetBasedAllContainersState(resourceSet) {
  110. public Collection<URI> getContainedURIs(final String containerHandle) {
  111. ResourceSet _resourceSet = this.getResourceSet();
  112. EList<Resource> _resources = _resourceSet.getResources();
  113. int _size = _resources.size();
  114. final ArrayList<URI> uris = Lists.<URI>newArrayListWithCapacity(_size);
  115. ResourceSet _resourceSet_1 = this.getResourceSet();
  116. EList<Resource> _resources_1 = _resourceSet_1.getResources();
  117. for (final Resource r : _resources_1) {
  118. URI _uRI = r.getURI();
  119. uris.add(_uRI);
  120. }
  121. return uris;
  122. }
  123. });
  124. String _fileEncoding = this.getFileEncoding();
  125. this.encodingProvider.setDefaultEncoding(_fileEncoding);
  126. final List<NameBasedFilter> nameBasedFilter = this.getNameBasedFilters();
  127. final PathTraverser pathTraverser = new PathTraverser();
  128. final List<String> sourcePathDirectories = this.getSourcePathDirectories();
  129. final Predicate<URI> _function = new Predicate<URI>() {
  130. public boolean apply(final URI src) {
  131. final Function1<NameBasedFilter, Boolean> _function = new Function1<NameBasedFilter, Boolean>() {
  132. public Boolean apply(final NameBasedFilter it) {
  133. return Boolean.valueOf(it.matches(src));
  134. }
  135. };
  136. return IterableExtensions.<NameBasedFilter>exists(nameBasedFilter, _function);
  137. }
  138. };
  139. final Multimap<String, URI> pathes = pathTraverser.resolvePathes(sourcePathDirectories, _function);
  140. Set<String> _keySet = pathes.keySet();
  141. final Procedure1<String> _function_1 = new Procedure1<String>() {
  142. public void apply(final String src) {
  143. final URI baseDir = URI.createFileURI((src + "/"));
  144. Joiner _on = Joiner.on("_");
  145. String[] _segments = baseDir.segments();
  146. final String identifier = _on.join(_segments);
  147. final URI platformResourceURI = URI.createPlatformResourceURI((identifier + "/"), true);
  148. URIConverter _uRIConverter = resourceSet.getURIConverter();
  149. Map<URI, URI> _uRIMap = _uRIConverter.getURIMap();
  150. _uRIMap.put(platformResourceURI, baseDir);
  151. Collection<URI> _get = pathes.get(src);
  152. for (final URI uri : _get) {
  153. {
  154. boolean _isDebugEnabled = JnarioStandaloneCompiler.log.isDebugEnabled();
  155. if (_isDebugEnabled) {
  156. JnarioStandaloneCompiler.log.debug((("load xtend file \'" + uri) + "\'"));
  157. }
  158. final URI uriToUse = uri.replacePrefix(baseDir, platformResourceURI);
  159. resourceSet.getResource(uriToUse, true);
  160. }
  161. }
  162. }
  163. };
  164. IterableExtensions.<String>forEach(_keySet, _function_1);
  165. return resourceSet;
  166. }
  167. public List<NameBasedFilter> getNameBasedFilters() {
  168. final Function1<Injector, NameBasedFilter> _function = new Function1<Injector, NameBasedFilter>() {
  169. public NameBasedFilter apply(final Injector it) {
  170. NameBasedFilter _xblockexpression = null;
  171. {
  172. final NameBasedFilter filter = new NameBasedFilter();
  173. FileExtensionProvider _instance = it.<FileExtensionProvider>getInstance(FileExtensionProvider.class);
  174. String _primaryFileExtension = _instance.getPrimaryFileExtension();
  175. filter.setExtension(_primaryFileExtension);
  176. _xblockexpression = filter;
  177. }
  178. return _xblockexpression;
  179. }
  180. };
  181. return JnarioStandaloneCompiler.<Injector, NameBasedFilter>eagerMap(this.injectors, _function);
  182. }
  183. public File createStubs(final ResourceSet resourceSet) {
  184. final File outputDirectory = this.createTempDir("stubs");
  185. final JavaIoFileSystemAccess fileSystemAccess = this.javaIoFileSystemAccessProvider.get();
  186. String _string = outputDirectory.toString();
  187. fileSystemAccess.setOutputPath(_string);
  188. EList<Resource> _resources = resourceSet.getResources();
  189. ArrayList<Resource> _newArrayList = Lists.<Resource>newArrayList(_resources);
  190. final Procedure1<Resource> _function = new Procedure1<Resource>() {
  191. public void apply(final Resource it) {
  192. IResourceDescription.Manager _findResourceDescriptionManager = JnarioStandaloneCompiler.this.findResourceDescriptionManager(it);
  193. final IResourceDescription description = _findResourceDescriptionManager.getResourceDescription(it);
  194. JnarioStandaloneCompiler.this.stubGenerator.doGenerateStubs(fileSystemAccess, description);
  195. }
  196. };
  197. IterableExtensions.<Resource>forEach(_newArrayList, _function);
  198. return outputDirectory;
  199. }
  200. public IResourceDescription.Manager findResourceDescriptionManager(final Resource resource) {
  201. return this.<IResourceDescription.Manager>getInstance(resource, IResourceDescription.Manager.class);
  202. }
  203. public <T extends Object> T getInstance(final Resource resource, final Class<T> type) {
  204. URI _uRI = resource.getURI();
  205. String _fileExtension = _uRI.fileExtension();
  206. String _lowerCase = _fileExtension.toLowerCase();
  207. Injector _get = this.injectorMap.get(_lowerCase);
  208. return _get.<T>getInstance(type);
  209. }
  210. public void generateJavaFiles(final ResourceSet resourceSet) {
  211. final JavaIoFileSystemAccess javaIoFileSystemAccess = this.javaIoFileSystemAccessProvider.get();
  212. javaIoFileSystemAccess.setOutputPath(this.outputPath);
  213. javaIoFileSystemAccess.setWriteTrace(this.writeTraceFiles);
  214. final ResourceSetBasedResourceDescriptions resourceDescriptions = this.getResourceDescriptions(resourceSet);
  215. final Iterable<IEObjectDescription> exportedObjectsByType = resourceDescriptions.getExportedObjectsByType(TypesPackage.Literals.JVM_DECLARED_TYPE);
  216. boolean _isInfoEnabled = JnarioStandaloneCompiler.log.isInfoEnabled();
  217. if (_isInfoEnabled) {
  218. final int size = IterableExtensions.size(exportedObjectsByType);
  219. if ((size == 0)) {
  220. JnarioStandaloneCompiler.log.info((("No sources to compile in \'" + this.sourcePath) + "\'"));
  221. } else {
  222. String _xifexpression = null;
  223. if ((size == 1)) {
  224. _xifexpression = "file";
  225. } else {
  226. _xifexpression = "files";
  227. }
  228. String _plus = ((("Compiling " + Integer.valueOf(size)) + " source ") + _xifexpression);
  229. String _plus_1 = (_plus + " to ");
  230. String _plus_2 = (_plus_1 + this.outputPath);
  231. JnarioStandaloneCompiler.log.info(_plus_2);
  232. }
  233. }
  234. final Function1<IEObjectDescription, Boolean> _function = new Function1<IEObjectDescription, Boolean>() {
  235. public Boolean apply(final IEObjectDescription it) {
  236. String _userData = it.getUserData(JvmTypesResourceDescriptionStrategy.IS_NESTED_TYPE);
  237. return Boolean.valueOf(Objects.equal(_userData, null));
  238. }
  239. };
  240. Iterable<IEObjectDescription> _filter = IterableExtensions.<IEObjectDescription>filter(exportedObjectsByType, _function);
  241. final Procedure1<IEObjectDescription> _function_1 = new Procedure1<IEObjectDescription>() {
  242. public void apply(final IEObjectDescription eObjectDescription) {
  243. EObject _eObjectOrProxy = eObjectDescription.getEObjectOrProxy();
  244. final JvmDeclaredType jvmGenericType = ((JvmDeclaredType) _eObjectOrProxy);
  245. Resource _eResource = jvmGenericType.eResource();
  246. final JvmModelGenerator generator = JnarioStandaloneCompiler.this.<JvmModelGenerator>getInstance(_eResource, JvmModelGenerator.class);
  247. Resource _eResource_1 = jvmGenericType.eResource();
  248. final IGeneratorConfigProvider generatorConfig = JnarioStandaloneCompiler.this.<IGeneratorConfigProvider>getInstance(_eResource_1, IGeneratorConfigProvider.class);
  249. Resource _eResource_2 = jvmGenericType.eResource();
  250. final IQualifiedNameProvider nameProvider = JnarioStandaloneCompiler.this.<IQualifiedNameProvider>getInstance(_eResource_2, IQualifiedNameProvider.class);
  251. GeneratorConfig _get = generatorConfig.get(jvmGenericType);
  252. final CharSequence generatedType = generator.generateType(jvmGenericType, _get);
  253. final QualifiedName qualifiedName = nameProvider.getFullyQualifiedName(jvmGenericType);
  254. boolean _isDebugEnabled = JnarioStandaloneCompiler.log.isDebugEnabled();
  255. if (_isDebugEnabled) {
  256. String _javaFileName = JnarioStandaloneCompiler.this.getJavaFileName(qualifiedName);
  257. String _plus = ((("write \'" + JnarioStandaloneCompiler.this.outputPath) + File.separator) + _javaFileName);
  258. String _plus_1 = (_plus + "\'");
  259. JnarioStandaloneCompiler.log.debug(_plus_1);
  260. }
  261. String _javaFileName_1 = JnarioStandaloneCompiler.this.getJavaFileName(qualifiedName);
  262. javaIoFileSystemAccess.generateFile(_javaFileName_1, generatedType);
  263. }
  264. };
  265. IterableExtensions.<IEObjectDescription>forEach(_filter, _function_1);
  266. }
  267. public String getJavaFileName(final QualifiedName typeName) {
  268. List<String> _segments = typeName.getSegments();
  269. String _concat = Strings.concat("/", _segments);
  270. return (_concat + ".java");
  271. }
  272. public static <T extends Object, R extends Object> List<R> eagerMap(final List<T> list, final Function1<? super T, ? extends R> transformation) {
  273. ArrayList<R> _xblockexpression = null;
  274. {
  275. int _size = list.size();
  276. final ArrayList<R> result = new ArrayList<R>(_size);
  277. for (final T t : list) {
  278. R _apply = transformation.apply(t);
  279. CollectionExtensions.<R>addAll(result, _apply);
  280. }
  281. _xblockexpression = result;
  282. }
  283. return _xblockexpression;
  284. }
  285. }