mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 00:38:56 +00:00
Merge pull request #735 from eclipse/so_generator2
Bug 480420 Generator2 improvements
This commit is contained in:
commit
0e7c64f372
9 changed files with 109 additions and 41 deletions
|
@ -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.')
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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) {
|
||||
}
|
||||
|
||||
}
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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,18 +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, 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);
|
||||
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -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) {
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue