[generator2] aggregate exceptions from generator fragments

This commit is contained in:
Stefan Oehme 2015-10-21 11:16:44 +02:00
parent c4d9d79983
commit b2060c6151
4 changed files with 109 additions and 35 deletions

View file

@ -0,0 +1,26 @@
/*******************************************************************************
* 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.xtext.generator
import java.lang.RuntimeException
import java.util.List
import org.eclipse.xtend.lib.annotations.Accessors
package class CompositeGeneratorException extends RuntimeException {
@Accessors
val List<Exception> exceptions = newArrayList
def addException(Exception exception) {
exceptions.add(exception)
}
def hasExceptions() {
exceptions.size > 0
}
}

View file

@ -0,0 +1,53 @@
/*******************************************************************************
* 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.xtext.generator
import com.google.inject.Injector
import java.util.List
import org.eclipse.xtend.lib.annotations.Accessors
/**
* @noreference
*/
class CompositeGeneratorFragment implements IXtextGeneratorFragment {
@Accessors(PROTECTED_GETTER)
val List<IXtextGeneratorFragment> fragments = newArrayList
def void addFragment(IXtextGeneratorFragment fragment) {
if (fragment === this)
throw new IllegalArgumentException
this.fragments.add(fragment)
}
override checkConfiguration(Issues issues) {
for (fragment : fragments) {
fragment.checkConfiguration(issues)
}
}
override generate() {
val composite = new CompositeGeneratorException
for (fragment : fragments) {
try {
fragment.generate
} catch (Exception e) {
composite.addException(e)
}
}
if (composite.hasExceptions) {
throw composite
}
}
override initialize(Injector injector) {
for (fragment : fragments) {
fragment.initialize(injector)
}
}
}

View file

@ -19,6 +19,7 @@ import java.util.HashMap
import java.util.List
import org.eclipse.emf.common.util.URI
import org.eclipse.emf.mwe.core.WorkflowContext
import org.eclipse.emf.mwe.core.issues.Issues
import org.eclipse.emf.mwe.core.lib.AbstractWorkflowComponent2
import org.eclipse.emf.mwe.core.monitor.ProgressMonitor
import org.eclipse.emf.mwe.utils.StandaloneSetup
@ -123,18 +124,34 @@ class XtextGenerator extends AbstractWorkflowComponent2 {
protected override invokeInternal(WorkflowContext ctx, ProgressMonitor monitor, org.eclipse.emf.mwe.core.issues.Issues issues) {
initialize
cleaner.clean
for (language : languageConfigs) {
LOG.info('Generating ' + language.grammar.name)
language.generate
language.generateSetups
language.generateModules
language.generateExecutableExtensionFactory
try {
cleaner.clean
for (language : languageConfigs) {
try {
LOG.info('Generating ' + language.grammar.name)
language.generate
language.generateSetups
language.generateModules
language.generateExecutableExtensionFactory
} catch(Exception e) {
handleException(e, issues)
}
}
LOG.info('Generating common infrastructure')
generatePluginXmls
generateManifests
generateActivator
} catch (Exception e) {
handleException(e, issues)
}
}
private def void handleException(Exception ex, Issues issues) {
if (ex instanceof CompositeGeneratorException) {
ex.exceptions.forEach[handleException(issues)]
} else {
issues.addError(this, "GeneratorException: ", null, ex, null)
}
LOG.info('Generating common infrastructure')
generatePluginXmls
generateManifests
generateActivator
}
protected def generateSetups(IXtextGeneratorLanguage language) {

View file

@ -43,7 +43,7 @@ import org.eclipse.xtext.xtext.generator.model.project.IXtextProjectConfig
* @noextend
*/
@Log
class XtextGeneratorLanguage implements IXtextGeneratorFragment, IXtextGeneratorLanguage {
class XtextGeneratorLanguage extends CompositeGeneratorFragment implements IXtextGeneratorLanguage {
String grammarUri
@ -82,8 +82,6 @@ class XtextGeneratorLanguage implements IXtextGeneratorFragment, IXtextGenerator
@Accessors
val webGenModule = new GuiceModuleAccess
@Accessors(PROTECTED_GETTER)
val List<IXtextGeneratorFragment> fragments = newArrayList
@Inject Provider<ResourceSet> resourceSetProvider
@ -113,24 +111,6 @@ class XtextGeneratorLanguage implements IXtextGeneratorFragment, IXtextGenerator
return fileExtensions
}
def void addFragment(IXtextGeneratorFragment fragment) {
if (fragment === this)
throw new IllegalArgumentException
this.fragments.add(fragment)
}
override checkConfiguration(Issues issues) {
for (fragment : fragments) {
fragment.checkConfiguration(issues)
}
}
override generate() {
for (fragment : fragments) {
fragment.generate()
}
}
override initialize(Injector injector) {
fragments.add(0, new ImplicitFragment)
injector.injectMembers(XtextGeneratorLanguage)
@ -164,9 +144,7 @@ class XtextGeneratorLanguage implements IXtextGeneratorFragment, IXtextGenerator
val grammar = resource.contents.get(0) as Grammar
validateGrammar(grammar)
initialize(grammar)
for (fragment : fragments) {
fragment.initialize(injector)
}
super.initialize(injector)
}
def void initialize(Grammar grammar) {