From 69093080fc0f251901ebc5cc36dae0689753c411 Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Fri, 23 Oct 2015 10:26:37 +0200 Subject: [PATCH] introduce AbstractGenerator and IGeneratorContext --- .../generator/GeneratorFragment2.xtend | 20 +++++++------ .../xtext/build/IncrementalBuilder.xtend | 5 +++- .../xtext/generator/AbstractGenerator.java | 25 +++++++++++++++++ .../xtext/generator/GeneratorComponent.java | 4 ++- .../xtext/generator/GeneratorContext.xtend | 19 +++++++++++++ .../xtext/generator/GeneratorDelegate.java | 28 ++++++++++--------- .../eclipse/xtext/generator/IGenerator2.java | 19 ++++++------- .../xtext/generator/IGeneratorContext.java | 18 ++++++++++++ .../index/IndexTestLanguageGenerator.xtend | 14 +++------- 9 files changed, 109 insertions(+), 43 deletions(-) create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractGenerator.java create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorContext.xtend create mode 100644 plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGeneratorContext.java diff --git a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend index b4e9a6dbc..5d8309420 100644 --- a/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend +++ b/plugins/org.eclipse.xtext.xtext.generator/src/org/eclipse/xtext/xtext/generator/generator/GeneratorFragment2.xtend @@ -37,6 +37,9 @@ import org.eclipse.xtext.xtext.generator.model.TypeReference import org.eclipse.xtext.xtext.generator.xbase.XbaseUsageDetector import static extension org.eclipse.xtext.xtext.generator.model.TypeReference.* +import org.eclipse.xtext.generator.AbstractGenerator +import org.eclipse.xtext.generator.IGeneratorContext +import org.eclipse.xtext.generator.GeneratorContext class GeneratorFragment2 extends AbstractStubGeneratingFragment { @@ -139,19 +142,15 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { * * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation */ - class «language.grammar.generatorStub.simpleName» implements «IGenerator2» { + class «language.grammar.generatorStub.simpleName» extends «AbstractGenerator» { - override void doGenerate(«Resource» resource, «IFileSystemAccess2» fsa, «CancelIndicator» cancelIndicator) { + override void doGenerate(«Resource» resource, «IFileSystemAccess2» fsa, «IGeneratorContext» context) { // fsa.generateFile('greetings.txt', 'People to greet: ' + // resource.allContents // .filter(typeof(Greeting)) // .map[name] // .join(', ')) } - - override void beforeGenerate(«Resource» resource, «IFileSystemAccess2» fsa, «CancelIndicator» cancelIndicator) {} - - override void afterGenerate(«Resource» resource, «IFileSystemAccess2» fsa, «CancelIndicator» cancelIndicator) {} } ''').writeTo(projectConfig.runtime.src) } @@ -198,7 +197,9 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { // Configure and start the generator fileAccess.setOutputPath("src-gen/"); - generator.generate(resource, fileAccess, «CancelIndicator».NullImpl); + «GeneratorContext» context = new «GeneratorContext»(); + context.setCancelIndicator(«CancelIndicator».NullImpl); + generator.generate(resource, fileAccess, context); System.out.println("Code generation finished."); } @@ -242,7 +243,10 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { // Configure and start the generator fileAccess.outputPath = 'src-gen/' - generator.generate(resource, fileAccess, «CancelIndicator».NullImpl) + val context = new «GeneratorContext» => [ + cancelIndicator = «CancelIndicator».NullImpl + ] + generator.generate(resource, fileAccess, context) System.out.println('Code generation finished.') } } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/build/IncrementalBuilder.xtend b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/build/IncrementalBuilder.xtend index 778a8fead..8a92870ff 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/build/IncrementalBuilder.xtend +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/build/IncrementalBuilder.xtend @@ -35,6 +35,7 @@ import org.eclipse.xtext.util.CancelIndicator import org.eclipse.xtext.util.internal.Log import org.eclipse.xtext.validation.CheckMode import org.eclipse.xtext.workspace.IProjectConfigProvider +import org.eclipse.xtext.generator.GeneratorContext /** * @author Jan Koehnlein - Initial contribution and API @@ -138,7 +139,9 @@ import org.eclipse.xtext.workspace.IProjectConfigProvider } } } - generator.generate(resource, fileSystemAccess, request.cancelIndicator) + val generatorContext = new GeneratorContext + generatorContext.cancelIndicator = request.cancelIndicator + generator.generate(resource, fileSystemAccess, generatorContext) // delete everything that was previously generated, but not this time previous.forEach[ LOG.info('Deleting stale generated file ' + it) diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractGenerator.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractGenerator.java new file mode 100644 index 000000000..25efb67de --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/AbstractGenerator.java @@ -0,0 +1,25 @@ +/******************************************************************************* + * Copyright (c) 2015 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.generator; + +import org.eclipse.emf.ecore.resource.Resource; + +/** + * @since 2.9 + */ +public abstract class AbstractGenerator implements IGenerator2 { + + @Override + public void beforeGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { + } + + @Override + public void afterGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { + } + +} diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorComponent.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorComponent.java index 4794c464b..dd4de5222 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorComponent.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorComponent.java @@ -128,7 +128,9 @@ public class GeneratorComponent implements IWorkflowComponent { if (!(object2 instanceof Resource)) { throw new IllegalStateException("Slot contents was not a Resource but a '"+object.getClass().getSimpleName()+"'!"); } - instance.generate((Resource) object2, fileSystemAccess, CancelIndicator.NullImpl); + GeneratorContext context = new GeneratorContext(); + context.setCancelIndicator(CancelIndicator.NullImpl); + instance.generate((Resource) object2, fileSystemAccess, context); } } else if (object instanceof Resource) { instance.doGenerate((Resource) object, fileSystemAccess); diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorContext.xtend b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorContext.xtend new file mode 100644 index 000000000..b054033d2 --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorContext.xtend @@ -0,0 +1,19 @@ +/******************************************************************************* + * Copyright (c) 2015 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.generator + +import org.eclipse.xtend.lib.annotations.Accessors +import org.eclipse.xtext.util.CancelIndicator + +/** + * @since 2.9 + */ +@Accessors +class GeneratorContext implements IGeneratorContext { + CancelIndicator cancelIndicator +} \ No newline at end of file diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorDelegate.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorDelegate.java index f7e4415bc..de9265bc9 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorDelegate.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorDelegate.java @@ -28,46 +28,48 @@ public class GeneratorDelegate implements IGenerator, IGenerator2 { return legacyGenerator; } - public void generate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + public void generate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { try { - beforeGenerate(input, fsa, cancelIndicator); - doGenerate(input, fsa, cancelIndicator); + beforeGenerate(input, fsa, context); + doGenerate(input, fsa, context); } finally { - afterGenerate(input, fsa, cancelIndicator); + afterGenerate(input, fsa, context); } } @Override - public void doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + public void doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { if (generator != null) { - generator.doGenerate(input, fsa, cancelIndicator); + generator.doGenerate(input, fsa, context); } else if (getLegacyGenerator() != null) { getLegacyGenerator().doGenerate(input, fsa); } } @Override - public void beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + public void beforeGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { if (generator != null) { - generator.beforeGenerate(input, fsa, cancelIndicator); + generator.beforeGenerate(input, fsa, context); } } @Override - public void afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + public void afterGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { if (generator != null) { - generator.afterGenerate(input, fsa, cancelIndicator); + generator.afterGenerate(input, fsa, context); } } @Override public void doGenerate(Resource input, IFileSystemAccess fsa) { IFileSystemAccess2 casted = (IFileSystemAccess2) fsa; + GeneratorContext context = new GeneratorContext(); + context.setCancelIndicator(CancelIndicator.NullImpl); try { - beforeGenerate(input, casted, CancelIndicator.NullImpl); - doGenerate(input, casted, CancelIndicator.NullImpl); + beforeGenerate(input, casted, context); + doGenerate(input, casted, context); } finally { - afterGenerate(input, casted, CancelIndicator.NullImpl); + afterGenerate(input, casted, context); } } } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGenerator2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGenerator2.java index 8ab4a00b9..b53ab91d1 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGenerator2.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGenerator2.java @@ -8,17 +8,16 @@ package org.eclipse.xtext.generator; import org.eclipse.emf.ecore.resource.Resource; -import org.eclipse.xtext.util.CancelIndicator; /** * Replacement interface for the {@link IGenerator} that adds support for parallel code generation. * * Clients of {@link IGenerator} that want to perform the code generation in the background will check for this - * extension interface and use {@link #beforeGenerate(Resource, IFileSystemAccess2, CancelIndicator)} to prepare the resource set. That + * extension interface and use {@link #beforeGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} to prepare the resource set. That * is, implementors may alter the state of the resource set in the before hook. This may happen implicitly by resolving * proxies or explicitly by loading new resources into the resource set. No changes are allowed while - * {@link #doGenerate(Resource, IFileSystemAccess2, CancelIndicator)} is executed since this may be parallelized by the caller. The - * {@link #afterGenerate(Resource, IFileSystemAccess2, CancelIndicator)} is used to cleanup state. Also access to the file system is + * {@link #doGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} is executed since this may be parallelized by the caller. The + * {@link #afterGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} is used to cleanup state. Also access to the file system is * guaranteed to be synchronous in the before and after hook. * * @author Sebastian Zarnekow - Initial contribution and API @@ -34,20 +33,20 @@ public interface IGenerator2 { * Read operations will happen in the background but * are blocking. */ - void doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); + void doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context); /** * Before the generation is triggered, the resource or the entire resource set - * may be prepared such that no modification will happen while {@link #doGenerate(Resource, IFileSystemAccess2, CancelIndicator)} + * may be prepared such that no modification will happen while {@link #doGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} * is executed. */ - void beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); + void beforeGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context); /** * Release any data that is no longer necessary after the generator ran. - * This is guaranteed to be called if {@link #beforeGenerate(Resource, IFileSystemAccess2, CancelIndicator)} was called. - * It may be called several times, even if {@link #beforeGenerate(Resource, IFileSystemAccess2, CancelIndicator)} was not called. + * This is guaranteed to be called if {@link #beforeGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} was called. + * It may be called several times. It may be called even if {@link #beforeGenerate(Resource, IFileSystemAccess2, IGeneratorContext)} was not called. */ - void afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); + void afterGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context); } diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGeneratorContext.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGeneratorContext.java new file mode 100644 index 000000000..f416d272a --- /dev/null +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/IGeneratorContext.java @@ -0,0 +1,18 @@ +/******************************************************************************* + * Copyright (c) 2015 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.generator; + +import org.eclipse.xtext.util.CancelIndicator; + +/** + * @noimplement + * @since 2.9 + */ +public interface IGeneratorContext { + public CancelIndicator getCancelIndicator(); +} diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/index/IndexTestLanguageGenerator.xtend b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/index/IndexTestLanguageGenerator.xtend index fe3276194..8aff5e553 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/index/IndexTestLanguageGenerator.xtend +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/index/IndexTestLanguageGenerator.xtend @@ -1,17 +1,14 @@ package org.eclipse.xtext.index import org.eclipse.emf.ecore.resource.Resource +import org.eclipse.xtext.generator.AbstractGenerator import org.eclipse.xtext.generator.IFileSystemAccess2 -import org.eclipse.xtext.generator.IGenerator2 +import org.eclipse.xtext.generator.IGeneratorContext import org.eclipse.xtext.index.indexTestLanguage.Entity -import org.eclipse.xtext.util.CancelIndicator -class IndexTestLanguageGenerator implements IGenerator2 { +class IndexTestLanguageGenerator extends AbstractGenerator { - override beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { - } - - override doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + override doGenerate(Resource input, IFileSystemAccess2 fsa, IGeneratorContext context) { val iter = input.allContents while (iter.hasNext) { switch e : iter.next { @@ -23,7 +20,4 @@ class IndexTestLanguageGenerator implements IGenerator2 { } } - override afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { - } - }