package com.freetmp.mbg.merge; import com.github.javaparser.JavaParser; import com.github.javaparser.ParseException; import com.github.javaparser.ast.CompilationUnit; import com.github.javaparser.ast.body.ModifierSet; import com.github.javaparser.ast.body.TypeDeclaration; import java.io.StringReader; /** * Created by LiuPin on 2015/3/27. */ public class CompilationUnitMerger extends AbstractMerger<CompilationUnit> { @Override public CompilationUnit doMerge(CompilationUnit first, CompilationUnit second) { CompilationUnit unit = new CompilationUnit(); unit.setPackage(mergeSingle(first.getPackage(), second.getPackage())); unit.setImports(mergeCollections(first.getImports(), second.getImports())); unit.setTypes(mergeCollections(first.getTypes(), second.getTypes())); return unit; } @Override public boolean doIsEquals(CompilationUnit first, CompilationUnit second) { // 检测包声明 if (!isEqualsUseMerger(first.getPackage(), second.getPackage())) return false; // 检查公共类声明 for (TypeDeclaration outer : first.getTypes()) { for (TypeDeclaration inner : second.getTypes()) { if (ModifierSet.isPublic(outer.getModifiers()) && ModifierSet.isPublic(inner.getModifiers())) { if (outer.getName().equals(inner.getName())) { return true; } } } } return false; } /** * Util method to make source merge more convenient * * @param first merge params, specifically for the existing source * @param second merge params, specifically for the new source * @return merged result * @throws ParseException cannot parse the input params */ public static String merge(String first, String second) throws ParseException { JavaParser.setDoNotAssignCommentsPreceedingEmptyLines(false); CompilationUnit cu1 = JavaParser.parse(new StringReader(first), true); CompilationUnit cu2 = JavaParser.parse(new StringReader(second), true); AbstractMerger<CompilationUnit> merger = AbstractMerger.getMerger(CompilationUnit.class); CompilationUnit result = merger.merge(cu1, cu2); return result.toString(); } }