001package org.clafer.ast.analysis;
002
003import java.util.HashMap;
004import java.util.Map;
005import org.clafer.ast.AstAbstractClafer;
006import org.clafer.ast.AstClafer;
007import org.clafer.ast.AstConcreteClafer;
008
009/**
010 *
011 * @author jimmy
012 */
013public class FormatAnalyzer implements Analyzer {
014
015    @Override
016    public Analysis analyze(Analysis analysis) {
017        Map<AstClafer, Format> formatMap = new HashMap<>();
018        formatMap.put(analysis.getModel(), Format.LowGroup);
019        for (AstAbstractClafer abstractClafer : analysis.getAbstractClafers()) {
020            analyze(abstractClafer, analysis, formatMap);
021        }
022        for (AstConcreteClafer child : analysis.getModel().getChildren()) {
023            analyze(child, analysis, formatMap);
024        }
025        return analysis.setFormatMap(formatMap);
026    }
027
028    private static void analyze(AstAbstractClafer clafer, Analysis analysis, Map<AstClafer, Format> formatMap) {
029        formatMap.put(clafer, Format.ParentGroup);
030        for (AstConcreteClafer child : clafer.getChildren()) {
031            analyze(child, analysis, formatMap);
032        }
033    }
034
035    private static void analyze(AstConcreteClafer clafer, Analysis analysis, Map<AstClafer, Format> formatMap) {
036        formatMap.put(clafer,
037                analysis.getCard(clafer).isExact()
038                && analysis.getScope(clafer) >= analysis.getCard(clafer).getHigh() * analysis.getScope(clafer.getParent())
039                ? Format.ParentGroup : Format.LowGroup);
040        for (AstConcreteClafer child : clafer.getChildren()) {
041            analyze(child, analysis, formatMap);
042        }
043    }
044}