Search in sources :

Example 1 with IFacet

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;
}
Also used : ILanguageImpl(org.metaborg.core.language.ILanguageImpl) IFacet(org.metaborg.core.language.IFacet) FileObject(org.apache.commons.vfs2.FileObject)

Example 2 with IFacet

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;
}
Also used : SyntaxFacet(org.metaborg.spoofax.core.syntax.SyntaxFacet) LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) IdentificationFacet(org.metaborg.core.language.IdentificationFacet) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) IFacet(org.metaborg.core.language.IFacet) ResourceExtensionFacet(org.metaborg.core.language.ResourceExtensionFacet) ComponentCreationConfig(org.metaborg.core.language.ComponentCreationConfig) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) ILanguageComponentConfig(org.metaborg.core.config.ILanguageComponentConfig) LanguageContributionIdentifier(org.metaborg.core.language.LanguageContributionIdentifier)

Example 3 with IFacet

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");
        }
    }
}
Also used : LanguageIdentifier(org.metaborg.core.language.LanguageIdentifier) ILanguageImpl(org.metaborg.core.language.ILanguageImpl) ResourceExtensionFacet(org.metaborg.core.language.ResourceExtensionFacet) IFacet(org.metaborg.core.language.IFacet) LanguageVersion(org.metaborg.core.language.LanguageVersion) FileObject(org.apache.commons.vfs2.FileObject) ILanguageComponent(org.metaborg.core.language.ILanguageComponent) DescriptionFacet(org.metaborg.core.language.DescriptionFacet) LanguageContributionIdentifier(org.metaborg.core.language.LanguageContributionIdentifier) Test(org.junit.Test) MetaborgTest(org.metaborg.core.test.MetaborgTest)

Aggregations

IFacet (org.metaborg.core.language.IFacet)3 ILanguageImpl (org.metaborg.core.language.ILanguageImpl)3 FileObject (org.apache.commons.vfs2.FileObject)2 ILanguageComponent (org.metaborg.core.language.ILanguageComponent)2 LanguageContributionIdentifier (org.metaborg.core.language.LanguageContributionIdentifier)2 LanguageIdentifier (org.metaborg.core.language.LanguageIdentifier)2 ResourceExtensionFacet (org.metaborg.core.language.ResourceExtensionFacet)2 Test (org.junit.Test)1 ILanguageComponentConfig (org.metaborg.core.config.ILanguageComponentConfig)1 ComponentCreationConfig (org.metaborg.core.language.ComponentCreationConfig)1 DescriptionFacet (org.metaborg.core.language.DescriptionFacet)1 IdentificationFacet (org.metaborg.core.language.IdentificationFacet)1 LanguageVersion (org.metaborg.core.language.LanguageVersion)1 MetaborgTest (org.metaborg.core.test.MetaborgTest)1 SyntaxFacet (org.metaborg.spoofax.core.syntax.SyntaxFacet)1