From 7dfaaf17d86c4f55a2d6427e4098de401bf55db1 Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Thu, 22 Oct 2015 14:06:25 +0200 Subject: [PATCH 1/2] Bug 477068 generator2 should expose a CancelIndicator --- .../xtext/build/IncrementalBuilder.xtend | 4 +- .../xtext/generator/GeneratorComponent.java | 3 +- .../xtext/generator/GeneratorDelegate.java | 38 +++++++++---------- .../eclipse/xtext/generator/IGenerator2.java | 20 ++++------ .../index/IndexTestLanguageGenerator.xtend | 7 ++-- 5 files changed, 34 insertions(+), 38 deletions(-) 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 af149383f..778a8fead 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 @@ -138,9 +138,7 @@ import org.eclipse.xtext.workspace.IProjectConfigProvider } } } - generator.beforeGenerate(resource, fileSystemAccess) - generator.doGenerate(resource, fileSystemAccess) - generator.afterGenerate(resource, fileSystemAccess) + generator.generate(resource, fileSystemAccess, request.cancelIndicator) // 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/GeneratorComponent.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/generator/GeneratorComponent.java index 6f63f7215..4794c464b 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 @@ -19,6 +19,7 @@ import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.emf.mwe2.runtime.workflow.IWorkflowComponent; import org.eclipse.emf.mwe2.runtime.workflow.IWorkflowContext; import org.eclipse.xtext.ISetup; +import org.eclipse.xtext.util.CancelIndicator; import com.google.common.base.Function; import com.google.inject.Injector; @@ -127,7 +128,7 @@ 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); + instance.generate((Resource) object2, fileSystemAccess, CancelIndicator.NullImpl); } } else if (object instanceof Resource) { instance.doGenerate((Resource) object, fileSystemAccess); 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 9f685bc6c..f7e4415bc 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 @@ -8,6 +8,7 @@ package org.eclipse.xtext.generator; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.xtext.util.CancelIndicator; import com.google.inject.Inject; @@ -26,36 +27,36 @@ public class GeneratorDelegate implements IGenerator, IGenerator2 { public IGenerator getLegacyGenerator() { return legacyGenerator; } + + public void generate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { + try { + beforeGenerate(input, fsa, cancelIndicator); + doGenerate(input, fsa, cancelIndicator); + } finally { + afterGenerate(input, fsa, cancelIndicator); + } + } @Override - public void doGenerate(Resource input, IFileSystemAccess2 fsa) { + public void doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { if (generator != null) { - generator.doGenerate(input, fsa); + generator.doGenerate(input, fsa, cancelIndicator); } else if (getLegacyGenerator() != null) { getLegacyGenerator().doGenerate(input, fsa); } } @Override - public void beforeGenerate(Resource input, IFileSystemAccess2 fsa) { + public void beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { if (generator != null) { - generator.beforeGenerate(input, fsa); + generator.beforeGenerate(input, fsa, cancelIndicator); } } @Override - public void afterGenerate(Resource input, IFileSystemAccess2 fsa) { + public void afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { if (generator != null) { - generator.afterGenerate(input, fsa); - } - } - - public void generate(Resource input, IFileSystemAccess2 fsa) { - try { - beforeGenerate(input, fsa); - doGenerate(input, fsa); - } finally { - afterGenerate(input, fsa); + generator.afterGenerate(input, fsa, cancelIndicator); } } @@ -63,11 +64,10 @@ public class GeneratorDelegate implements IGenerator, IGenerator2 { public void doGenerate(Resource input, IFileSystemAccess fsa) { IFileSystemAccess2 casted = (IFileSystemAccess2) fsa; try { - beforeGenerate(input, casted); - doGenerate(input, casted); + beforeGenerate(input, casted, CancelIndicator.NullImpl); + doGenerate(input, casted, CancelIndicator.NullImpl); } finally { - afterGenerate(input, casted); + afterGenerate(input, casted, CancelIndicator.NullImpl); } } - } 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 13cd5eacf..b36249351 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,16 +8,17 @@ 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)} to prepare the resource set. That + * extension interface and use {@link #beforeGenerate(Resource, IFileSystemAccess2, CancelIndicator)} 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)} is executed since this may be parallelized by the caller. The - * {@link #afterGenerate(Resource, IFileSystemAccess2)} is used to cleanup state. Also access to the file system is + * {@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 * guaranteed to be synchronous in the before and after hook. * * @author Sebastian Zarnekow - Initial contribution and API @@ -32,24 +33,19 @@ public interface IGenerator2 { * are non-blocking if the given fsa is implementing that pattern. * Read operations will happen in the background but * are blocking. - * - * @param input - * the input for which to generate artefacts - * @param fsa - * file system access to be used to generate files */ - void doGenerate(Resource input, IFileSystemAccess2 fsa); + void doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); /** * 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)} + * may be prepared such that no modification will happen while {@link #doGenerate(Resource, IFileSystemAccess2, CancelIndicator)} * is executed. */ - void beforeGenerate(Resource input, IFileSystemAccess2 fsa); + void beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); /** * Release any data that is no longer necessary after the generator ran. */ - void afterGenerate(Resource input, IFileSystemAccess2 fsa); + void afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator); } 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 7e51c53f3..fe3276194 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 @@ -4,13 +4,14 @@ import org.eclipse.emf.ecore.resource.Resource import org.eclipse.xtext.generator.IFileSystemAccess2 import org.eclipse.xtext.generator.IGenerator2 import org.eclipse.xtext.index.indexTestLanguage.Entity +import org.eclipse.xtext.util.CancelIndicator class IndexTestLanguageGenerator implements IGenerator2 { - override beforeGenerate(Resource input, IFileSystemAccess2 fsa) { + override beforeGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { } - override doGenerate(Resource input, IFileSystemAccess2 fsa) { + override doGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { val iter = input.allContents while (iter.hasNext) { switch e : iter.next { @@ -22,7 +23,7 @@ class IndexTestLanguageGenerator implements IGenerator2 { } } - override afterGenerate(Resource input, IFileSystemAccess2 fsa) { + override afterGenerate(Resource input, IFileSystemAccess2 fsa, CancelIndicator cancelIndicator) { } } From cef38085b239e158494ad2405b78cb7055d13553 Mon Sep 17 00:00:00 2001 From: Stefan Oehme Date: Thu, 22 Oct 2015 14:13:10 +0200 Subject: [PATCH 2/2] make Generator2 the default for new languages --- .../generator/GeneratorFragment2.xtend | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) 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 e33738c5d..b4e9a6dbc 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 @@ -19,8 +19,9 @@ import org.eclipse.xtend.lib.annotations.Accessors import org.eclipse.xtend2.lib.StringConcatenationClient import org.eclipse.xtext.Grammar import org.eclipse.xtext.GrammarUtil -import org.eclipse.xtext.generator.IFileSystemAccess -import org.eclipse.xtext.generator.IGenerator +import org.eclipse.xtext.generator.GeneratorDelegate +import org.eclipse.xtext.generator.IFileSystemAccess2 +import org.eclipse.xtext.generator.IGenerator2 import org.eclipse.xtext.generator.JavaIoFileSystemAccess import org.eclipse.xtext.util.CancelIndicator import org.eclipse.xtext.validation.CheckMode @@ -90,7 +91,7 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { override generate() { if (isGenerateStub) { new GuiceModuleAccess.BindingFactory() - .addTypeToType(IGenerator.typeRef, language.grammar.generatorStub) + .addTypeToType(IGenerator2.typeRef, language.grammar.generatorStub) .contributeTo(language.runtimeGenModule) if (projectConfig.runtime.manifest !== null) projectConfig.runtime.manifest.requiredBundles += 'org.eclipse.xtext.xbase.lib' @@ -138,16 +139,19 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { * * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#code-generation */ - class «language.grammar.generatorStub.simpleName» implements «IGenerator» { + class «language.grammar.generatorStub.simpleName» implements «IGenerator2» { - override void doGenerate(«Resource» resource, «IFileSystemAccess» fsa) { + override void doGenerate(«Resource» resource, «IFileSystemAccess2» fsa, «CancelIndicator» cancelIndicator) { // 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) } @@ -173,7 +177,7 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { private «IResourceValidator» validator; @«Inject» - private «IGenerator» generator; + private «GeneratorDelegate» generator; @«Inject» private «JavaIoFileSystemAccess» fileAccess; @@ -194,7 +198,7 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { // Configure and start the generator fileAccess.setOutputPath("src-gen/"); - generator.doGenerate(resource, fileAccess); + generator.generate(resource, fileAccess, «CancelIndicator».NullImpl); System.out.println("Code generation finished."); } @@ -220,7 +224,7 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { @«Inject» «IResourceValidator» validator - @«Inject» «IGenerator» generator + @«Inject» «GeneratorDelegate» generator @«Inject» «JavaIoFileSystemAccess» fileAccess @@ -238,7 +242,7 @@ class GeneratorFragment2 extends AbstractStubGeneratingFragment { // Configure and start the generator fileAccess.outputPath = 'src-gen/' - generator.doGenerate(resource, fileAccess) + generator.generate(resource, fileAccess, «CancelIndicator».NullImpl) System.out.println('Code generation finished.') } }