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}