Search in sources :

Example 1 with IRegionCategory

use of org.metaborg.core.style.IRegionCategory in project spoofax by metaborg.

the class CategorizerValidator method validate.

public static <T> Iterable<IRegionCategory<T>> validate(Iterable<IRegionCategory<T>> categorization) {
    int offset = -1;
    final Collection<IRegionCategory<T>> validated = Lists.newLinkedList();
    for (IRegionCategory<T> regionCategory : categorization) {
        final ISourceRegion region = regionCategory.region();
        if (offset >= region.startOffset()) {
            logger.warn("Invalid {}, starting offset is greater than offset in previous regions, " + "region category will be skipped", regionCategory);
        } else if (offset >= region.endOffset()) {
            logger.warn("Invalid {}, ending offset is greater than offset in previous regions, " + "region category will be skipped", regionCategory);
        } else if (region.startOffset() > region.endOffset()) {
            logger.warn("Invalid {}, starting offset is greater than ending offset, " + "region category will be skipped", regionCategory);
        } else {
            validated.add(regionCategory);
            offset = regionCategory.region().endOffset();
        }
    }
    return validated;
}
Also used : ISourceRegion(org.metaborg.core.source.ISourceRegion) IRegionCategory(org.metaborg.core.style.IRegionCategory)

Example 2 with IRegionCategory

use of org.metaborg.core.style.IRegionCategory in project spoofax by metaborg.

the class CategorizerService method categorize.

@Override
public Iterable<IRegionCategory<IStrategoTerm>> categorize(ILanguageImpl language, ISpoofaxParseUnit parseResult) {
    final List<IRegionCategory<IStrategoTerm>> regionCategories = Lists.newLinkedList();
    if (!parseResult.valid()) {
        return regionCategories;
    }
    final StylerFacet facet = language.facet(StylerFacet.class);
    if (facet == null) {
        logger.error("Cannot categorize input of {}, it does not have a styler facet", language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final ImploderAttachment rootImploderAttachment = ImploderAttachment.get(parseResult.ast());
    if (rootImploderAttachment == null) {
        logger.error("Cannot categorize input {} of {}, it does not have an imploder attachment", parseResult, language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final ITokens tokenizer = rootImploderAttachment.getLeftToken().getTokenizer();
    if (tokenizer == null) {
        logger.error("Cannot categorize input {} of {}, it does not have a tokenizer", parseResult, language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final int tokenCount = tokenizer.getTokenCount();
    int offset = -1;
    for (int i = 0; i < tokenCount; ++i) {
        final IToken token = tokenizer.getTokenAt(i);
        if (tokenizer.isAmbigous() && token.getStartOffset() < offset) {
            // In case of ambiguities, tokens inside the ambiguity are duplicated, ignore.
            continue;
        }
        if (token.getStartOffset() > token.getEndOffset()) {
            // Indicates an invalid region. Empty lists have regions like this.
            continue;
        }
        if (offset >= token.getStartOffset()) {
            // Duplicate region, skip.
            continue;
        }
        offset = token.getEndOffset();
        final ICategory category = category(facet, token);
        if (category != null) {
            final ISourceRegion region = JSGLRSourceRegionFactory.fromToken(token);
            final IStrategoTerm term = (IStrategoTerm) token.getAstNode();
            regionCategories.add(new RegionCategory<>(region, category, term));
        }
    }
    return regionCategories;
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) ICategory(org.metaborg.core.style.ICategory) ISourceRegion(org.metaborg.core.source.ISourceRegion) IRegionCategory(org.metaborg.core.style.IRegionCategory) ImploderAttachment(org.spoofax.jsglr.client.imploder.ImploderAttachment) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Aggregations

ISourceRegion (org.metaborg.core.source.ISourceRegion)2 IRegionCategory (org.metaborg.core.style.IRegionCategory)2 ICategory (org.metaborg.core.style.ICategory)1 IStrategoTerm (org.spoofax.interpreter.terms.IStrategoTerm)1 IToken (org.spoofax.jsglr.client.imploder.IToken)1 ITokens (org.spoofax.jsglr.client.imploder.ITokens)1 ImploderAttachment (org.spoofax.jsglr.client.imploder.ImploderAttachment)1