use of org.metaborg.core.language.ILanguage in project spoofax by metaborg.
the class DialectIdentifier method identify.
@Override
public IdentifiedDialect identify(FileObject resource) throws MetaborgException {
final ILanguage strategoLanguage = languageService.getLanguage(SpoofaxConstants.LANG_STRATEGO_NAME);
if (strategoLanguage == null) {
final String message = logger.format("Could not find Stratego language, Stratego dialects cannot be identified for resource: {}", resource);
throw new MetaborgRuntimeException(message);
}
// GTODO: use identifier service instead, but that introduces a cyclic dependency. Could use a provider.
final ILanguageImpl strategoImpl = strategoLanguage.activeImpl();
if (strategoImpl == null) {
return null;
}
// HACK: assuming single identification facet
final IdentificationFacet facet = strategoImpl.facet(IdentificationFacet.class);
if (facet == null || !facet.identify(resource)) {
return null;
}
try {
final FileObject metaResource = metaResource(resource);
if (metaResource == null) {
return null;
}
final TermReader termReader = new TermReader(termFactoryService.getGeneric());
final IStrategoTerm term = termReader.parseFromStream(metaResource.getContent().getInputStream());
final String name = getSyntaxName(term.getSubterm(0));
if (name == null) {
return null;
}
final ILanguageImpl dialect = dialectService.getDialect(name);
if (dialect == null) {
final String message = String.format("Resource %s requires dialect %s, but that dialect does not exist", resource, name);
throw new MetaborgException(message);
}
final ILanguageImpl base = dialectService.getBase(dialect);
return new IdentifiedDialect(dialect, base);
} catch (ParseError | IOException e) {
throw new MetaborgException("Unable to open or parse .meta file", e);
}
}
use of org.metaborg.core.language.ILanguage in project spoofax by metaborg.
the class DialectProcessor method update.
@Override
public void update(FileObject location, Iterable<ResourceChange> changes) {
final int numChanges = Iterables.size(changes);
if (numChanges == 0) {
return;
}
final ILanguage strategoLanguage = languageService.getLanguage(SpoofaxConstants.LANG_STRATEGO_NAME);
if (strategoLanguage == null) {
logger.debug("Could not find Stratego language, Stratego dialects cannot be updated");
return;
}
final ILanguageImpl strategoImpl = strategoLanguage.activeImpl();
if (strategoImpl == null) {
logger.debug("Could not find active Stratego language implementation, " + "Stratego dialects cannot be updated");
return;
}
logger.debug("Processing dialect updates for {}", location);
// HACK: assuming single syntax facet
final SyntaxFacet baseFacet = strategoImpl.facet(SyntaxFacet.class);
if (baseFacet == null) {
logger.debug("Active Stratego language implementation has no syntax facet, " + "Stratego dialects cannot be updated");
return;
}
for (ResourceChange change : changes) {
final FileObject resource = change.resource;
try {
if (!FileSelectorUtils.include(selector, resource, location)) {
continue;
}
} catch (FileSystemException e) {
continue;
}
final String fileName = FilenameUtils.getBaseName(resource.getName().getBaseName());
final SyntaxFacet newFacet = new SyntaxFacet(resource, baseFacet.completionParseTable, baseFacet.startSymbols, baseFacet.singleLineCommentPrefixes, baseFacet.multiLineCommentCharacters, baseFacet.fenceCharacters);
final ResourceChangeKind changeKind = change.kind;
try {
switch(changeKind) {
case Create:
add(fileName, resource, strategoImpl, newFacet);
break;
case Delete:
remove(fileName, resource);
break;
case Modify:
update(fileName, resource, newFacet);
break;
case Rename:
if (change.from != null) {
remove(fileName, resource);
}
if (change.to != null) {
add(fileName, resource, strategoImpl, newFacet);
}
break;
case Copy:
if (change.to != null) {
add(fileName, resource, strategoImpl, newFacet);
}
break;
default:
logger.error("Unhandled resource change kind {}", changeKind);
break;
}
} catch (MetaborgRuntimeException e) {
logger.error("Failed to update dialect", e);
}
}
}
use of org.metaborg.core.language.ILanguage in project spoofax by metaborg.
the class LanguageIncludeFilesPrimitive method call.
@Override
protected IStrategoTerm call(IStrategoTerm current, Strategy[] svars, IStrategoTerm[] tvars, ITermFactory factory, IContext context) throws MetaborgException {
if (!Tools.isTermString(tvars[0])) {
return null;
}
final IProject project = projectService.get(context.location());
if (project == null) {
return factory.makeList();
}
// GTODO: require language identifier instead of language name
final String languageName = Tools.asJavaString(tvars[0]);
final ILanguage language = languageService.getLanguage(languageName);
if (language == null) {
final String message = String.format("Getting include files for %s failed, language could not be found", languageName);
throw new MetaborgException(message);
}
final ILanguageImpl impl = language.activeImpl();
if (impl == null) {
final String message = String.format("Getting include files for %s failed, no active language implementation could be found", languageName);
throw new MetaborgException(message);
}
final Iterable<IdentifiedResource> includeFiles = languagePathService.includeFiles(project, impl);
final List<IStrategoTerm> terms = Lists.newArrayList();
for (IdentifiedResource includeFile : includeFiles) {
terms.add(factory.makeString(includeFile.resource.getName().getURI()));
}
return factory.makeList(terms);
}
use of org.metaborg.core.language.ILanguage in project spoofax by metaborg.
the class ParsePrimitive method call.
@Override
protected IStrategoTerm call(IStrategoTerm current, Strategy[] svars, IStrategoTerm[] tvars, ITermFactory factory, org.spoofax.interpreter.core.IContext strategoContext) throws MetaborgException, IOException {
// Determine what to parse.
if (!(current instanceof IStrategoString)) {
throw new MetaborgException("Cannot parse, input string or file " + current + " is not a string");
}
final String stringOrFile = ((IStrategoString) current).stringValue();
final String text;
@Nullable final FileObject file;
final IStrategoTerm isFileTerm = tvars[0];
if (!(isFileTerm instanceof IStrategoInt)) {
throw new MetaborgException("Cannot parse, input kind " + isFileTerm + " is not an integer");
}
if (((IStrategoInt) isFileTerm).intValue() == 1) {
file = resourceService.resolve(stringOrFile);
if (!file.exists() || !file.isFile()) {
throw new MetaborgException("Cannot parse, input file " + file + " does not exist or is not a file");
}
text = sourceTextService.text(file);
} else {
file = null;
text = stringOrFile;
}
// Determine which language to parse it with.
final ILanguageImpl langImpl;
final IStrategoTerm nameOrGroupIdTerm = tvars[1];
final IStrategoTerm idTerm = tvars[2];
final IStrategoTerm versionTerm = tvars[3];
if (nameOrGroupIdTerm instanceof IStrategoTuple) {
// No name, groupId, id, and version was set, auto detect language to parse with.
if (file == null) {
throw new MetaborgException("Cannot parse a string, no language to parse it with was given");
}
final IContext context = metaborgContext(strategoContext);
if (context != null) {
langImpl = languageIdentifierService.identify(file, context.project());
} else {
langImpl = languageIdentifierService.identify(file);
}
if (langImpl == null) {
throw new MetaborgException("Cannot parse, language for " + file + " could not be identified");
}
} else if (idTerm instanceof IStrategoTuple) {
// No id was set, name is set.
if (!(nameOrGroupIdTerm instanceof IStrategoString)) {
throw new MetaborgException("Cannot parse, language name " + nameOrGroupIdTerm + " is not a string");
}
final String name = ((IStrategoString) nameOrGroupIdTerm).stringValue();
final ILanguage lang = languageService.getLanguage(name);
if (lang == null) {
throw new MetaborgException("Cannot parse, language " + nameOrGroupIdTerm + " does not exist");
}
langImpl = lang.activeImpl();
if (langImpl == null) {
throw new MetaborgException("Cannot parse, language " + lang + " has no implementation loaded");
}
} else {
// A groupId, id, and version is set.
if (!(nameOrGroupIdTerm instanceof IStrategoString)) {
throw new MetaborgException("Cannot parse, language groupId " + nameOrGroupIdTerm + " is not a string");
}
final String groupId = ((IStrategoString) nameOrGroupIdTerm).stringValue();
if (!(idTerm instanceof IStrategoString)) {
throw new MetaborgException("Cannot parse, language id " + idTerm + " is not a string");
}
final String id = ((IStrategoString) idTerm).stringValue();
if (!(versionTerm instanceof IStrategoString)) {
throw new MetaborgException("Cannot parse, language version " + versionTerm + " is not a string");
}
final String versionStr = ((IStrategoString) versionTerm).stringValue();
final LanguageVersion version = LanguageVersion.parse(versionStr);
final LanguageIdentifier langId = new LanguageIdentifier(groupId, id, version);
langImpl = languageService.getImpl(langId);
if (langImpl == null) {
throw new MetaborgException("Cannot parse, language implementation " + langId + " does not exist");
}
}
// Parse the text.
final ISpoofaxInputUnit input;
if (file != null) {
@Nullable ILanguageImpl dialect;
try {
final IdentifiedDialect identifierDialect = dialectIdentifier.identify(file);
if (identifierDialect != null) {
dialect = identifierDialect.dialect;
} else {
dialect = null;
}
} catch (MetaborgException | MetaborgRuntimeException e) {
// Ignore
dialect = null;
}
input = unitService.inputUnit(file, text, langImpl, dialect);
} else {
input = unitService.inputUnit(text, langImpl, null);
}
final ISpoofaxParseUnit result = syntaxService.parse(input);
if (result.valid() && result.success()) {
return result.ast();
} else {
return null;
}
}
use of org.metaborg.core.language.ILanguage in project spoofax by metaborg.
the class CLIUtils method getLanguage.
/**
* Get a already loaded language by language name
*/
public ILanguageImpl getLanguage(String languageName) throws MetaborgException {
final ILanguage lang = spoofax.languageService.getLanguage(languageName);
if (lang == null) {
throw new MetaborgException("Cannot find language " + languageName);
}
final ILanguageImpl langImpl = lang.activeImpl();
if (langImpl == null) {
throw new MetaborgException("Language " + languageName + " has no active implementation");
}
return langImpl;
}
Aggregations