use of org.metaborg.core.language.ILanguageImpl in project spoofax by metaborg.
the class SpoofaxContext method parse.
@Nullable
public IStrategoTerm parse(File file) throws IOException, ParseException {
final FileObject resource = resourceService.resolve(file);
final ILanguageImpl language = languageIdentifierService.identify(resource);
if (language == null) {
return null;
}
final String text = sourceTextService.text(resource);
final ISpoofaxInputUnit inputUnit = unitService.inputUnit(resource, text, language, null);
final ISpoofaxParseUnit result = syntaxService.parse(inputUnit);
if (!result.valid() || !result.success()) {
return null;
}
final IStrategoTerm term = result.ast();
return term;
}
use of org.metaborg.core.language.ILanguageImpl in project spoofax by metaborg.
the class LanguageServiceTest method activeHigherVersion.
/**
* Add an implementation with a higher version number, assert that the newer implementation becomes active.
*/
@Test
public void activeHigherVersion() throws Exception {
final String id = "org.metaborg.lang.entity";
final LanguageVersion version1 = version(0, 0, 1);
final LanguageVersion version2 = version(0, 1, 0);
final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id, version1);
final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id, version2);
final FileObject location1 = createDir("ram:///Entity1");
final FileObject location2 = createDir("ram:///Entity2");
final String name = "Entity";
final ILanguageComponent component1 = language(identifier1, location1, name);
final ILanguageImpl impl1 = Iterables.get(component1.contributesTo(), 0);
final ILanguage lang = impl1.belongsTo();
assertSame(component1, languageService.getComponent(location1.getName()));
assertSame(impl1, languageService.getImpl(identifier1));
assertSame(impl1, lang.activeImpl());
assertSame(lang, languageService.getLanguage(name));
final ILanguageComponent component2 = language(identifier2, location2, name);
final ILanguageImpl impl2 = Iterables.get(component2.contributesTo(), 0);
// Language 2 with higher version number becomes active.
assertSame(component1, languageService.getComponent(location1.getName()));
assertSame(component2, languageService.getComponent(location2.getName()));
assertSame(impl1, languageService.getImpl(identifier1));
assertSame(impl2, languageService.getImpl(identifier2));
assertSame(impl2, lang.activeImpl());
assertSame(lang, languageService.getLanguage(name));
assertSize(1, impl1.components());
assertSize(1, impl2.components());
assertSize(2, lang.impls());
assertSize(2, languageService.getAllComponents());
assertSize(2, languageService.getAllImpls());
assertSize(1, languageService.getAllLanguages());
}
use of org.metaborg.core.language.ILanguageImpl in project spoofax by metaborg.
the class LanguageServiceTest method reloadComponent.
/**
* Reload a single component, assert that it was reloaded and its implementations and language stays the same.
*/
@Test
public void reloadComponent() throws Exception {
final String id = "org.metaborg.lang.entity";
final LanguageVersion version = version(0, 0, 1);
final FileObject location = createDir("ram:///");
final String name = "Entity";
// GTODO: test multiple contributing components
final ILanguageComponent componentBefore = language(groupId, id, version, location, name);
final ILanguageImpl implBefore = Iterables.get(componentBefore.contributesTo(), 0);
final ILanguage langBefore = implBefore.belongsTo();
assertSame(componentBefore, languageService.getComponent(location.getName()));
final ILanguageComponent componentAfter = language(groupId, id, version, location, name);
final ILanguageImpl implAfter = Iterables.get(componentAfter.contributesTo(), 0);
final ILanguage langAfter = implAfter.belongsTo();
// Before components are equal, but not the same object, since they are re-created.
assertEquals(componentBefore, languageService.getComponent(location.getName()));
assertNotSame(componentBefore, languageService.getComponent(location.getName()));
assertEquals(componentBefore, componentAfter);
assertNotSame(componentBefore, componentAfter);
assertSame(componentAfter, languageService.getComponent(location.getName()));
assertSame(implBefore, implAfter);
assertSame(langBefore, langAfter);
}
use of org.metaborg.core.language.ILanguageImpl in project spoofax by metaborg.
the class LanguageServiceTest method languageChanges.
/**
* Add/reload/remove components, assert change events correctness.
*/
@Test
public void languageChanges() throws Exception {
final String id1 = "org.metaborg.lang.entity.component1";
final String id2 = "org.metaborg.lang.entity.component2";
final String id3 = "org.metaborg.lang.entity.component3";
final LanguageVersion version = version(0, 0, 1);
final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
final LanguageIdentifier identifier3 = new LanguageIdentifier(groupId, id3, version);
final FileObject location1 = createDir("ram:///Entity1");
final FileObject location2 = createDir("ram:///Entity2");
final FileObject location3 = createDir("ram:///Entity3");
final String implId1 = "org.metaborg.lang.entity.impl1";
final String implId2 = "org.metaborg.lang.entity.impl2";
final String implId3 = "org.metaborg.lang.entity.impl3";
final String name = "Entity";
final LanguageIdentifier implIdentifier1 = new LanguageIdentifier(groupId, implId1, version);
final LanguageIdentifier implIdentifier2 = new LanguageIdentifier(groupId, implId2, version);
final LanguageIdentifier implIdentifier3 = new LanguageIdentifier(groupId, implId3, version);
final LanguageContributionIdentifier requestIdentifier1 = new LanguageContributionIdentifier(implIdentifier1, name);
final LanguageContributionIdentifier requestIdentifier2 = new LanguageContributionIdentifier(implIdentifier2, name);
final LanguageContributionIdentifier requestIdentifier3 = new LanguageContributionIdentifier(implIdentifier3, name);
final ITestableObserver<LanguageComponentChange> compObs = new TestableObserver<LanguageComponentChange>();
languageService.componentChanges().subscribe(compObs);
final ITestableObserver<LanguageImplChange> implObs = new TestableObserver<LanguageImplChange>();
languageService.implChanges().subscribe(implObs);
// Add component1 to impl1, expect component add, impl add
final ILanguageComponent component1 = language(identifier1, location1, requestIdentifier1);
final ILanguageImpl impl1 = languageService.getImpl(implIdentifier1);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component1), compObs);
assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Add, impl1), implObs);
// Add component2 to impl1, expect component2 add, impl1 reload
final ILanguageComponent component2 = language(identifier2, location2, requestIdentifier1);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component2), compObs);
assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), implObs);
// Add component3 to impl1, impl2, impl3, expect component add, [impl1 reload, impl2 add, impl3 add] (order
// unknown)
final ILanguageComponent component3 = language(identifier3, location3, requestIdentifier1, requestIdentifier2, requestIdentifier3);
final ILanguageImpl impl2 = languageService.getImpl(implIdentifier2);
final ILanguageImpl impl3 = languageService.getImpl(implIdentifier3);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Add, null, component3), compObs);
{
final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), new LanguageImplChange(LanguageImplChange.Kind.Add, impl2), new LanguageImplChange(LanguageImplChange.Kind.Add, impl3));
assertOnNext(changes, implObs);
assertOnNext(changes, implObs);
assertOnNext(changes, implObs);
}
// Remove component1, expect component1 remove, impl1 reload
languageService.remove(component1);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component1, null), compObs);
assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), implObs);
// Reload component2, contribute to impl2 now, expect component2 reload, [impl1 reload, impl2 reload] (order
// unknown)
final ILanguageComponent component2Reload = language(identifier2, location2, requestIdentifier2);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Reload, component2, component2Reload), compObs);
{
final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Reload, impl1), new LanguageImplChange(LanguageImplChange.Kind.Reload, impl2));
assertOnNext(changes, implObs);
assertOnNext(changes, implObs);
}
// Remove component3, expect component3 remove, [impl1 remove, impl2 reload, impl3 remove] (order unknown)
languageService.remove(component3);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component3, null), compObs);
{
final Iterable<LanguageImplChange> changes = Iterables2.from(new LanguageImplChange(LanguageImplChange.Kind.Remove, impl3), new LanguageImplChange(LanguageImplChange.Kind.Reload, impl2), new LanguageImplChange(LanguageImplChange.Kind.Remove, impl1));
assertOnNext(changes, implObs);
assertOnNext(changes, implObs);
assertOnNext(changes, implObs);
}
// Remove component2, expect component2 remove, impl2 remove
languageService.remove(component2);
assertOnNext(new LanguageComponentChange(LanguageComponentChange.Kind.Remove, component2, null), compObs);
assertOnNext(new LanguageImplChange(LanguageImplChange.Kind.Remove, impl2), implObs);
assertEmpty(compObs);
assertEmpty(implObs);
}
use of org.metaborg.core.language.ILanguageImpl in project spoofax by metaborg.
the class Builder method identifyResources.
private void identifyResources(Iterable<ResourceChange> changes, BuildInput input, Multimap<ILanguageImpl, IdentifiedResourceChange> identifiedChanges, ICancel cancel) throws InterruptedException {
final Iterable<ILanguageImpl> languages = input.buildOrder.languages();
final FileSelector selector = input.selector;
final FileObject location = input.project.location();
for (ResourceChange change : changes) {
cancel.throwIfCancelled();
final FileObject resource = change.resource;
if (selector != null) {
try {
if (!FileSelectorUtils.include(selector, resource, location)) {
continue;
}
} catch (FileSystemException e) {
logger.error("Error determining if {} should be ignored from the build, including it", e, resource);
}
}
final IdentifiedResource identifiedResource = languageIdentifier.identifyToResource(resource, languages);
if (identifiedResource != null) {
final IdentifiedResourceChange identifiedChange = new IdentifiedResourceChange(change, identifiedResource);
identifiedChanges.put(identifiedChange.language, identifiedChange);
}
}
}
Aggregations