use of org.spoofax.interpreter.terms.IStrategoTerm in project spoofax by metaborg.
the class LanguageComponentFactory method esvTerm.
private IStrategoAppl esvTerm(FileObject location, FileObject esvFile) throws ParseError, IOException, MetaborgException {
final TermReader reader = new TermReader(termFactoryService.getGeneric().getFactoryWithStorageType(IStrategoTerm.MUTABLE));
final IStrategoTerm term = reader.parseFromStream(esvFile.getContent().getInputStream());
if (term.getTermType() != IStrategoTerm.APPL) {
final String message = logger.format("Cannot discover language at {}, ESV file at {} does not contain a valid ESV term", location, esvFile);
throw new MetaborgException(message);
}
return (IStrategoAppl) term;
}
use of org.spoofax.interpreter.terms.IStrategoTerm 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.spoofax.interpreter.terms.IStrategoTerm 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.spoofax.interpreter.terms.IStrategoTerm 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.spoofax.interpreter.terms.IStrategoTerm in project spoofax by metaborg.
the class OutlineFacetFromESV method create.
@Nullable
public static OutlineFacet create(IStrategoAppl esv) {
final IStrategoAppl outlineTerm = ESVReader.findTerm(esv, "OutlineView");
if (outlineTerm == null) {
return null;
}
final String strategyName = ESVReader.termContents(outlineTerm.getSubterm(0));
final int expandTo;
final IStrategoAppl expandToTerm = ESVReader.findTerm(esv, "ExpandToLevel");
if (expandToTerm == null) {
expandTo = 0;
} else {
final IStrategoTerm expandToNumberTerm = expandToTerm.getSubterm(0);
if (expandToNumberTerm instanceof IStrategoInt) {
final IStrategoInt expandToNumberIntTerm = (IStrategoInt) expandToNumberTerm;
expandTo = expandToNumberIntTerm.intValue();
} else if (expandToNumberTerm instanceof IStrategoString) {
final IStrategoString expandToNumberStringTerm = (IStrategoString) expandToNumberTerm;
expandTo = Integer.parseInt(expandToNumberStringTerm.stringValue());
} else {
expandTo = 0;
}
}
return new OutlineFacet(strategyName, expandTo);
}
Aggregations