use of org.metaborg.core.language.IFacet in project spoofax by metaborg.
the class DialectService method update.
@Override
public Iterable<ILanguageImpl> update(ILanguageImpl base) {
final Collection<ILanguageImpl> dialects = baseLanguageToDialects.get(base);
if (dialects.isEmpty()) {
return dialects;
}
logger.debug("Updating base language for {} dialects", dialects.size());
final Collection<ILanguageImpl> newDialects = Lists.newArrayListWithCapacity(dialects.size());
for (ILanguageImpl dialect : dialects) {
final String name = dialect.belongsTo().name();
final FileObject location = Iterables.get(dialect.components(), 0).location();
// HACK: assuming single syntax facet
final IFacet syntaxFacet = dialect.facet(SyntaxFacet.class);
final ILanguageImpl newDialect;
try {
// Add dialect before updating maps, adding can cause an exception; maps should not be updated.
// Adding reloads the dialect because location is the same, no need to remove old dialect.
// GTODO: what if id's or version change?
newDialect = createDialect(name, location, base, syntaxFacet, true, true);
} catch (IllegalStateException e) {
final String message = String.format("Error updating dialect %s", name);
logger.error(message, e);
continue;
}
nameToDialect.put(name, newDialect);
newDialects.add(newDialect);
}
return newDialects;
}
use of org.metaborg.core.language.IFacet in project spoofax by metaborg.
the class DialectService method createDialect.
private ILanguageImpl createDialect(String name, FileObject location, ILanguageImpl base, IFacet syntaxFacet, boolean replaceIdentification, boolean appendDialectName) {
final LanguageIdentifier baseId = base.id();
final String dialectId;
if (appendDialectName) {
dialectId = baseId.id + "-Dialect-" + name;
} else {
dialectId = baseId.id;
}
final LanguageIdentifier id = new LanguageIdentifier(baseId.groupId, dialectId, baseId.version);
// HACK: use config of first component.
final ILanguageComponentConfig config = Iterables.get(base.components(), 0).config();
final ComponentCreationConfig creationConfig = languageService.create(id, location, Iterables2.singleton(new LanguageContributionIdentifier(id, name)), config);
for (IFacet facet : base.facets()) {
if (facet instanceof IdentificationFacet && replaceIdentification) {
creationConfig.addFacet(new IdentificationFacet(new MetaFileIdentifier((IdentificationFacet) facet)));
} else if (facet instanceof SyntaxFacet || facet instanceof ResourceExtensionFacet) {
// Ignore
} else {
creationConfig.addFacet(facet);
}
}
creationConfig.addFacet(syntaxFacet);
final ILanguageComponent dialectComponent = languageService.add(creationConfig);
final ILanguageImpl dialect = Iterables.get(dialectComponent.contributesTo(), 0);
return dialect;
}
use of org.metaborg.core.language.IFacet in project spoofax by metaborg.
the class LanguageServiceTest method implementationFacets.
/**
* Add multiple components with facets to a single implementation, assert correctness of returned facets.
*/
@Test
public void implementationFacets() throws Exception {
final String id1 = "org.metaborg.lang.entity.component1";
final String id2 = "org.metaborg.lang.entity.component2";
final LanguageVersion version = version(0, 0, 1);
final LanguageIdentifier identifier1 = new LanguageIdentifier(groupId, id1, version);
final LanguageIdentifier identifier2 = new LanguageIdentifier(groupId, id2, version);
final FileObject location1 = createDir("ram:///Entity1");
final FileObject location2 = createDir("ram:///Entity2");
final String implId = "org.metaborg.lang.entity.impl1";
final String name = "Entity";
final LanguageIdentifier implIdentifier = new LanguageIdentifier(groupId, implId, version);
final LanguageContributionIdentifier requestIdentifier = new LanguageContributionIdentifier(implIdentifier, name);
final DescriptionFacet facet1 = new DescriptionFacet("Component1", null);
final ResourceExtensionFacet facet2 = new ResourceExtensionFacet(Iterables2.singleton("com"));
final DescriptionFacet facet3 = new DescriptionFacet("Component2", null);
final ILanguageComponent component1 = language(identifier1, location1, requestIdentifier, facet1, facet2);
final ILanguageComponent component2 = language(identifier2, location2, requestIdentifier, facet3);
final ILanguageImpl impl = languageService.getImpl(implIdentifier);
assertContains(facet1, component1.facets());
assertContains(facet2, component1.facets());
assertContains(facet3, component2.facets());
assertSize(2, component1.facets());
assertSize(1, component2.facets());
assertContains(facet1, component1.facets(DescriptionFacet.class));
assertSame(facet1, component1.facet(DescriptionFacet.class));
assertSize(1, component1.facets(DescriptionFacet.class));
assertContains(facet2, component1.facets(ResourceExtensionFacet.class));
assertSame(facet2, component1.facet(ResourceExtensionFacet.class));
assertSize(1, component1.facets(ResourceExtensionFacet.class));
assertContains(facet3, component2.facets(DescriptionFacet.class));
assertSame(facet3, component2.facet(DescriptionFacet.class));
assertSize(1, component2.facets(DescriptionFacet.class));
assertContains(facet1, impl.facets());
assertContains(facet2, impl.facets());
assertContains(facet3, impl.facets());
assertSize(3, impl.facets());
assertContains(facet1, impl.facets(DescriptionFacet.class));
assertContains(facet2, impl.facets(ResourceExtensionFacet.class));
assertContains(facet3, impl.facets(DescriptionFacet.class));
assertSize(2, impl.facets(DescriptionFacet.class));
assertSize(1, impl.facets(ResourceExtensionFacet.class));
for (FacetContribution<IFacet> facetContribution : component1.facetContributions()) {
assertSame(facetContribution.contributor, component1);
}
assertSame(component1, component1.facetContribution(DescriptionFacet.class).contributor);
assertSame(facet1, component1.facetContribution(DescriptionFacet.class).facet);
assertSize(1, component1.facetContributions(DescriptionFacet.class));
assertSame(component1, component1.facetContribution(ResourceExtensionFacet.class).contributor);
assertSame(facet2, component1.facetContribution(ResourceExtensionFacet.class).facet);
assertSize(1, component1.facetContributions(ResourceExtensionFacet.class));
for (FacetContribution<IFacet> facetContribution : component2.facetContributions()) {
assertSame(facetContribution.contributor, component2);
}
assertSame(component2, component2.facetContribution(DescriptionFacet.class).contributor);
assertSame(facet3, component2.facetContribution(DescriptionFacet.class).facet);
assertSize(1, component2.facetContributions(DescriptionFacet.class));
for (FacetContribution<IFacet> facetContribution : impl.facetContributions()) {
final ILanguageComponent contributor = facetContribution.contributor;
final IFacet facet = facetContribution.facet;
if (facet.equals(facet1)) {
assertSame(component1, contributor);
} else if (facet.equals(facet2)) {
assertSame(component1, contributor);
} else if (facet.equals(facet3)) {
assertSame(component2, contributor);
} else {
fail("Facet does not equals any created facet");
}
}
}
Aggregations