use of org.metaborg.spoofax.meta.core.config.ISpoofaxLanguageSpecConfig in project spoofax by metaborg.
the class LanguageSpecBuilder method archiveBuilderInput.
private ArchiveBuilder.Input archiveBuilderInput(LanguageSpecBuildInput input, Origin origin) {
final ISpoofaxLanguageSpec languageSpec = input.languageSpec();
final ISpoofaxLanguageSpecConfig config = languageSpec.config();
final FileObject baseLoc = input.languageSpec().location();
final SpoofaxLangSpecCommonPaths paths = new SpoofaxLangSpecCommonPaths(baseLoc);
final FileObject buildInfoLoc = paths.plutoBuildInfoDir();
final SpoofaxContext context = new SpoofaxContext(baseLoc, buildInfoLoc);
final Iterable<IExportConfig> exports = config.exports();
final LanguageIdentifier languageIdentifier = config.identifier();
return new ArchiveBuilder.Input(context, origin, exports, languageIdentifier);
}
use of org.metaborg.spoofax.meta.core.config.ISpoofaxLanguageSpecConfig in project spoofax by metaborg.
the class LanguageSpecBuilder method generateSources.
public void generateSources(LanguageSpecBuildInput input, @Nullable IFileAccess access) throws IOException, MetaborgException {
final ISpoofaxLanguageSpec languageSpec = input.languageSpec();
final FileObject location = languageSpec.location();
final ISpoofaxLanguageSpecConfig config = languageSpec.config();
logger.debug("Generating sources for {}", input.languageSpec().location());
final ContinuousLanguageSpecGenerator generator = new ContinuousLanguageSpecGenerator(new GeneratorSettings(location, config), access, config.sdfEnabled(), config.sdfVersion());
generator.generateAll();
componentConfigBuilder.reset();
componentConfigBuilder.copyFrom(input.languageSpec().config());
final ILanguageComponentConfig componentConfig = componentConfigBuilder.build(location);
componentConfigWriter.write(location, componentConfig, access);
for (IBuildStep buildStep : buildSteps) {
buildStep.execute(LanguageSpecBuildPhase.generateSources, input);
}
}
use of org.metaborg.spoofax.meta.core.config.ISpoofaxLanguageSpecConfig in project spoofax by metaborg.
the class LanguageSpecBuilder method generateSourcesBuilderInput.
private GenerateSourcesBuilder.Input generateSourcesBuilderInput(LanguageSpecBuildInput input) throws FileSystemException, MetaborgException {
final ISpoofaxLanguageSpec languageSpec = input.languageSpec();
final ISpoofaxLanguageSpecConfig config = languageSpec.config();
final FileObject baseLoc = input.languageSpec().location();
final SpoofaxLangSpecCommonPaths paths = new SpoofaxLangSpecCommonPaths(baseLoc);
final FileObject buildInfoLoc = paths.plutoBuildInfoDir();
final SpoofaxContext context = new SpoofaxContext(baseLoc, buildInfoLoc);
// SDF
final Boolean sdfEnabled = config.sdfEnabled();
final String sdfModule = config.sdfName();
final FileObject sdfFileCandidate;
final SdfVersion sdfVersion = config.sdfVersion();
final Sdf2tableVersion sdf2tableVersion = config.sdf2tableVersion();
switch(sdfVersion) {
case sdf2:
final Iterable<FileObject> sdfRoots = languagePathService.sourcePaths(input.project(), SpoofaxConstants.LANG_SDF_NAME);
sdfFileCandidate = paths.findSyntaxMainFile(sdfRoots, sdfModule);
break;
case sdf3:
sdfFileCandidate = paths.syntaxSrcGenMainFile(sdfModule);
break;
default:
throw new MetaborgException("Unknown SDF version: " + sdfVersion);
}
@Nullable final File sdfFile;
if (sdfFileCandidate != null && sdfFileCandidate.exists()) {
sdfFile = resourceService.localPath(sdfFileCandidate);
} else {
sdfFile = null;
}
@Nullable final File sdfExternalDef;
final String sdfExternalDefStr = config.sdfExternalDef();
if (sdfExternalDefStr != null) {
final FileObject sdfExternalDefLoc = resourceService.resolve(sdfExternalDefStr);
if (!sdfExternalDefLoc.exists()) {
throw new MetaborgException("External SDF definition at " + sdfExternalDefLoc + " does not exist");
}
sdfExternalDef = resourceService.localFile(sdfExternalDefLoc);
} else {
sdfExternalDef = null;
}
final Iterable<FileObject> sdfIncludePaths = languagePathService.sourceAndIncludePaths(languageSpec, SpoofaxConstants.LANG_SDF_NAME);
final FileObject packSdfIncludesReplicateDir = paths.replicateDir().resolveFile("pack-sdf-includes");
packSdfIncludesReplicateDir.delete(new AllFileSelector());
final List<File> packSdfIncludePaths = Lists.newArrayList();
for (FileObject path : sdfIncludePaths) {
if (!path.exists()) {
continue;
}
packSdfIncludePaths.add(resourceService.localFile(path, packSdfIncludesReplicateDir));
}
final Arguments packSdfArgs = config.sdfArgs();
// SDF completions
final String sdfCompletionModule = config.sdfName() + "-completion-insertions";
@Nullable final File sdfCompletionFile;
FileObject sdfCompletionFileCandidate = null;
if (sdf2tableVersion == Sdf2tableVersion.c) {
sdfCompletionFileCandidate = paths.syntaxCompletionMainFile(sdfCompletionModule);
} else if (sdf2tableVersion == Sdf2tableVersion.java || sdf2tableVersion == Sdf2tableVersion.dynamic) {
sdfCompletionFileCandidate = paths.syntaxCompletionMainFileNormalized(sdfCompletionModule);
}
boolean dataDependent = config.dataDependent();
if (sdfCompletionFileCandidate != null && sdfCompletionFileCandidate.exists()) {
sdfCompletionFile = resourceService.localPath(sdfCompletionFileCandidate);
} else {
sdfCompletionFile = null;
}
// Meta-SDF
final Iterable<FileObject> sdfRoots = languagePathService.sourcePaths(input.project(), SpoofaxConstants.LANG_SDF_NAME);
final String sdfMetaModule = config.metaSdfName();
final FileObject sdfMetaFileCandidate = paths.findSyntaxMainFile(sdfRoots, sdfMetaModule);
@Nullable final File sdfMetaFile;
if (sdfMetaFileCandidate != null && sdfMetaFileCandidate.exists()) {
sdfMetaFile = resourceService.localPath(sdfMetaFileCandidate);
} else {
sdfMetaFile = null;
}
// Stratego
final String strModule = config.strategoName();
final Iterable<FileObject> strRoots = languagePathService.sourcePaths(input.project(), SpoofaxConstants.LANG_STRATEGO_NAME);
final FileObject strFileCandidate = paths.findStrMainFile(strRoots, strModule);
@Nullable final File strFile;
if (strFileCandidate != null && strFileCandidate.exists()) {
strFile = resourceService.localPath(strFileCandidate);
} else {
strFile = null;
}
final String strStratPkg = paths.strJavaTransPkg(config.identifier().id);
final String strJavaStratPkg = paths.strJavaStratPkg(config.identifier().id);
final FileObject strJavaStratFileCandidate = paths.strMainJavaStratFile(config.identifier().id);
@Nullable final File strJavaStratFile;
if (strJavaStratFileCandidate.exists()) {
strJavaStratFile = resourceService.localPath(strJavaStratFileCandidate);
} else {
strJavaStratFile = null;
}
final StrategoFormat strFormat = config.strFormat();
@Nullable final File strExternalJar;
final String strExternalJarStr = config.strExternalJar();
if (strExternalJarStr != null) {
final FileObject strExternalJarLoc = resourceService.resolve(strExternalJarStr);
if (!strExternalJarLoc.exists()) {
throw new MetaborgException("External Stratego JAR at " + strExternalJarLoc + " does not exist");
}
strExternalJar = resourceService.localFile(strExternalJarLoc);
} else {
strExternalJar = null;
}
final String strExternalJarFlags = config.strExternalJarFlags();
final Iterable<FileObject> strIncludePaths = languagePathService.sourceAndIncludePaths(languageSpec, SpoofaxConstants.LANG_STRATEGO_NAME);
final FileObject strjIncludesReplicateDir = paths.replicateDir().resolveFile("strj-includes");
strjIncludesReplicateDir.delete(new AllFileSelector());
final List<File> strjIncludeDirs = Lists.newArrayList();
final List<File> strjIncludeFiles = Lists.newArrayList();
for (FileObject path : strIncludePaths) {
if (!path.exists()) {
continue;
}
if (path.isFolder()) {
strjIncludeDirs.add(resourceService.localFile(path, strjIncludesReplicateDir));
}
if (path.isFile()) {
strjIncludeFiles.add(resourceService.localFile(path, strjIncludesReplicateDir));
}
}
final Arguments strjArgs = config.strArgs();
return new GenerateSourcesBuilder.Input(context, config.identifier().id, config.sourceDeps(), sdfEnabled, sdfModule, sdfFile, sdfVersion, sdf2tableVersion, dataDependent, sdfExternalDef, packSdfIncludePaths, packSdfArgs, sdfCompletionModule, sdfCompletionFile, sdfMetaModule, sdfMetaFile, strFile, strStratPkg, strJavaStratPkg, strJavaStratFile, strFormat, strExternalJar, strExternalJarFlags, strjIncludeDirs, strjIncludeFiles, strjArgs);
}
use of org.metaborg.spoofax.meta.core.config.ISpoofaxLanguageSpecConfig in project spoofax by metaborg.
the class LangSpecGeneratorSettingsBuilder method build.
public LangSpecGeneratorSettings build(FileObject projectLocation, final ISpoofaxLanguageSpecConfigBuilder languageSpecConfigBuilder) throws ProjectException {
if (!canBuild()) {
throw new ProjectException("Cannot build incomplete configuration, missing " + Joiner.on(", ").join(stillMissing()));
}
if (groupId == null) {
groupId = defaultGroupId;
}
if (version == null) {
version = defaultVersion;
}
if (syntaxType == null) {
syntaxType = defaultSyntaxType;
}
if (analysisType == null) {
analysisType = defaultAnalysisType;
}
if (metaborgVersion == null) {
metaborgVersion = defaultMetaborgVersion;
}
final LanguageIdentifier identifier = new LanguageIdentifier(groupId, id, version);
final ISpoofaxLanguageSpecConfig config = languageSpecConfigBuilder.withIdentifier(identifier).withName(name).build(projectLocation);
final GeneratorSettings generatorSettings = new GeneratorSettings(projectLocation, config, analysisType);
generatorSettings.setMetaborgVersion(metaborgVersion);
return new LangSpecGeneratorSettings(generatorSettings, extensions, syntaxType);
}
use of org.metaborg.spoofax.meta.core.config.ISpoofaxLanguageSpecConfig in project spoofax by metaborg.
the class SpoofaxLanguageSpecService method get.
@Override
@Nullable
public ISpoofaxLanguageSpec get(IProject project) throws ConfigException {
if (project instanceof ISpoofaxLanguageSpec) {
return (ISpoofaxLanguageSpec) project;
}
final FileObject location = project.location();
if (!configService.available(location)) {
return null;
}
final ConfigRequest<ISpoofaxLanguageSpecConfig> configRequest = configService.get(location);
if (!configRequest.valid()) {
logger.error("Errors occurred when retrieving language specification configuration from project {}", project);
configRequest.reportErrors(new StreamMessagePrinter(sourceTextService, false, false, logger));
throw new ConfigException("Configuration for language specification at " + project + " is invalid");
}
final ISpoofaxLanguageSpecConfig config = configRequest.config();
if (config == null) {
// Configuration should never be null if it is available, but sanity check anyway.
return null;
}
return new SpoofaxLanguageSpecWrapper(config, project);
}
Aggregations