xText - use custom properties in CustomOutputConfigurationProvider
Ok, that is a very special topic and I guess not many will need this.
My problem was that I created a properties-page and wanted to use the folders selected there or to use IProject-related paths or such. I had to hack a little bit to get it to work, but I did it. In the end I could have context-based CustomOutputConfigurations.
Ok, I got it to work but it feels a bit hacky. Here is what I did.
- Write OutputConfigurationProvider that implements IContextualOutputProvider2 and place it somewhere in your MyDSL-Modules main-module
public class CustomOutputConfigurationProvider implements IContextualOutputConfigurationProvider2 {
override getOutputConfigurations(ResourceSet context) {
if (context.resources.size()>0){
// we are now context-aware. With the resource we can access the project
val Resource res = context.resources.get(0);
val path = res.URI.toPlatformString(true);
val file = ResourcesPlugin.workspace.root.findMember(path) as IFile;
val IProject project = file.project
// do what you want! e.g. read properties (as I intend to do)
val OutputConfiguration defaultOutput = new OutputConfiguration(IFileSystemAccess.DEFAULT_OUTPUT);
defaultOutput.setDescription("Default Output - Overwrite");
defaultOutput.setOutputDirectory("./out-src/src-gen");
defaultOutput.setOverrideExistingResources(true);
defaultOutput.setCreateOutputDirectory(true);
defaultOutput.setCleanUpDerivedResources(true);
defaultOutput.setSetDerivedProperty(true);
defaultOutput.useOutputPerSourceFolder = true;
return newHashSet(defaultOutput);
}
return newHashSet();
}
}
- Bind it in your MyDSLRuntimeModule:
def Class<? extends IContextualOutputConfigurationProvider2> bindIContextualOutputConfigurationProvider2() {
CustomOutputConfigurationProvider
}
3)In the UI-Module create a CustomBuilderParticipant that derives from BuilderPartiticpant:
public class CustomBuilderParticipant extends BuilderParticipant {
@Inject
private IContextualOutputConfigurationProvider2 outputConfigurationProvider;
@Override
protected Map<String, OutputConfiguration> getOutputConfigurations(IBuildContext context) {
Set<OutputConfiguration> configurations = outputConfigurationProvider.getOutputConfigurations(context
.getResourceSet());
return uniqueIndex(configurations, new Function<OutputConfiguration, String>() {
@Override
public String apply(OutputConfiguration from) {
return from.getName();
}
});
}
}
- Bind this in your UI-Modules MsDSLUIModule.xtend:
override Class<? extends IXtextBuilderParticipant> bindIXtextBuilderParticipant() {
return CustomBuilderParticipant;
}
That's it. Seems to work. Also have a look at a corresponding forum-thread .