Merge pull request #723 from eclipse/so_generator2

IGenerator2 improvements
This commit is contained in:
Stefan Oehme 2015-10-22 17:57:21 +02:00
commit b542ba8e06
6 changed files with 48 additions and 48 deletions

View file

@ -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.')
}
}

View file

@ -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)

View file

@ -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);

View file

@ -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);
}
}
}

View file

@ -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);
}

View file

@ -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) {
}
}