mirror of
https://github.com/sigmasternchen/xtext-core
synced 2025-03-16 16:58:56 +00:00
[generator2] aggregate exceptions from generator fragments
This commit is contained in:
parent
c4d9d79983
commit
b2060c6151
4 changed files with 109 additions and 35 deletions
|
@ -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
|
||||
}
|
||||
|
||||
}
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue