Created
April 23, 2014 13:22
-
-
Save ko2ic/11215003 to your computer and use it in GitHub Desktop.
自動生成したJavaコードに手を加えても綺麗にマージしてくれるJmerge ref: http://qiita.com/ko2ic/items/eb8107bd74ab510e0a6d
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
public class EclipseJavaMerger { | |
private final JMerger merger = new JMerger(buildMergeRule()); | |
public String merge(String source, String target) { | |
try { | |
if (target == null) { | |
return source; | |
} | |
merger.setSourceCompilationUnit(merger.createCompilationUnitForContents(source)); | |
merger.setTargetCompilationUnit(merger.createCompilationUnitForContents(target)); | |
merger.merge(); | |
return merger.getTargetCompilationUnitContents(); | |
} finally { | |
merger.reset(); | |
} | |
} | |
private JControlModel buildMergeRule() { | |
JControlModel controlModel = new JControlModel(); | |
String configFileUri = getClass().getResource("/emf-merge.xml").toString(); | |
controlModel.initialize(new ASTFacadeHelper(), configFileUri); | |
return controlModel; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?xml version="1.0" encoding="UTF-8"?> | |
<merge:options | |
indent=" " | |
braceStyle="matching" | |
redirect="Gen" | |
block="\s*@\s*generated\s*NOT\s*(?:\n\r?|\r\n?)" | |
noImport="\s*//\s*import\s+([\w.*]*)\s*;\s*(?:\n\r?|\r\n?)" | |
xmlns:merge="http://www.eclipse.org/org/eclipse/emf/codegen/jmerge/Options"> | |
<!-- Tabbed Standard | |
indent="	" | |
braceStyle="standard" | |
--> | |
<!-- this accepts both new and old style markup. --> | |
<merge:dictionaryPattern | |
name="modelMembers" | |
select="Member/getComment" | |
match="@\s*(model)"/> | |
<merge:dictionaryPattern | |
name="generatedUnmodifiableMembers" | |
select="Member/getComment" | |
match="@\s*(gen)erated\s*(This field/method[^(?:\n\r?|\r\n?)]*)*(?:\n\r?|\r\n?)"/> | |
<merge:dictionaryPattern | |
name="generatedModifiableMembers" | |
select="Member/getComment" | |
match="@\s*generated\s*(modifiable)\s*(?:\n\r?|\r\n?)"/> | |
<!-- This is like the above, but for backward compatibility --> | |
<merge:dictionaryPattern | |
name="generatedLastGenMembers" | |
select="Member/getComment" | |
match="@\s*(lastgen).*(?:\n\r?|\r\n?)"/> | |
<merge:dictionaryPattern | |
name="orderedMembers" | |
select="Member/getComment" | |
match="@\s*(ordered)\s*(?:\n\r?|\r\n?)"/> | |
<!-- Only push Annotations for the Members marked by gen--> | |
<merge:push targetParentMarkup="^gen$" select="Annotation"/> | |
<merge:pull | |
sourceMarkup="^modifiable$" | |
sourceGet="Member/getComment" | |
sourceTransfer="(\s*<!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)(?:\n\r?|\r\n?)" | |
targetMarkup="^modifiable$" | |
targetPut="Member/setComment"/> | |
<merge:pull | |
sourceMarkup="^gen$" | |
sourceGet="Member/getComment" | |
sourceTransfer="(\s*<!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)(?:\n\r?|\r\n?)" | |
targetMarkup="^gen$" | |
targetPut="Member/setComment"/> | |
<merge:pull | |
sourceGet="Member/getFlags" | |
targetMarkup="^gen$" | |
equals="Member/getName" | |
targetPut="Member/setFlags"/> | |
<merge:pull | |
sourceMarkup="^gen$" | |
sourceGet="AbstractType/getComment" | |
sourceTransfer="(\s*<!--\s*begin-user-doc.*?end-user-doc\s*-->\s*)(?:\n\r?|\r\n?)" | |
targetMarkup="^modifiable$" | |
targetPut="AbstractType/setComment"/> | |
<merge:pull | |
sourceGet="Type/getTypeParameters" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$" | |
targetPut="Type/setTypeParameters"/> | |
<merge:pull | |
sourceGet="Type/getSuperclass" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$" | |
targetPut="Type/setSuperclass"/> | |
<merge:pull | |
sourceGet="Type/getSuperInterfaces" | |
sourceTransfer="(\s*@\s*extends|\s*@\s*implements)(.*?)(?:<!--|(?:\n\r?|\r\n?))" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$" | |
targetPut="Type/addSuperInterface"/> | |
<merge:pull | |
sourceGet="Enum/getSuperInterfaces" | |
sourceTransfer="(\s*@\s*extends|\s*@\s*implements)(.*?)(?:<!--|(?:\n\r?|\r\n?))" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$" | |
targetPut="Enum/addSuperInterface"/> | |
<merge:pull | |
sourceGet="EnumConstant/getArguments" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$" | |
targetPut="EnumConstant/setArguments"/> | |
<merge:pull | |
sourceGet="EnumConstant/getBody" | |
targetMarkup="^lastgen$|^gen$|^modifiable$|^model$$" | |
targetPut="EnumConstant/setBody"/> | |
<merge:pull | |
sourceGet="AnnotationTypeMember/getType" | |
targetMarkup="^gen$" | |
targetPut="AnnotationTypeMember/setType"/> | |
<merge:pull | |
sourceGet="AnnotationTypeMember/getDefaultValue" | |
targetMarkup="^gen$" | |
targetPut="AnnotationTypeMember/setDefaultValue"/> | |
<merge:pull | |
sourceGet="Initializer/getBody" | |
targetMarkup="^gen$" | |
targetPut="Initializer/setBody"/> | |
<merge:pull | |
sourceGet="Field/getType" | |
targetMarkup="^gen$" | |
targetPut="Field/setType"/> | |
<merge:pull | |
sourceGet="Field/getInitializer" | |
targetMarkup="^gen$" | |
targetPut="Field/setInitializer"/> | |
<merge:pull | |
sourceGet="Method/getTypeParameters" | |
targetMarkup="^gen$" | |
targetPut="Method/setTypeParameters"/> | |
<merge:pull | |
sourceGet="Method/getReturnType" | |
targetMarkup="^gen$|^model$" | |
targetPut="Method/setReturnType"/> | |
<merge:pull | |
sourceGet="Method/getParameters" | |
targetMarkup="^gen$" | |
targetPut="Method/setParameters"/> | |
<merge:pull | |
sourceGet="Method/getBody" | |
targetMarkup="^gen$" | |
targetPut="Method/setBody"/> | |
<merge:pull | |
sourceGet="Method/getExceptions" | |
targetMarkup="^gen$" | |
targetPut="Method/addException"/> | |
<merge:sweep markup="^gen$" select="Member"/> | |
<merge:sweep markup="^org.eclipse.emf.ecore.EMetaObject$" select="Import"/> | |
<merge:sweep markup="^org.eclipse.emf.ecore.impl.EMetaObjectImpl$" select="Import"/> | |
<merge:sweep markup="^org.eclipse.emf.ecore.util.EObjectCompositeEList$" select="Import"/> | |
<merge:sweep markup="^org.eclipse.emf.ecore.util.EObjectCompositeWithInverseEList$" select="Import"/> | |
<merge:sweep markup="^org.eclipse.emf.common.util.AbstractEnumerator$" select="Import"/> | |
<merge:sort markup="^ordered$" select="Field"/> | |
<merge:sort markup="^ordered$" select="EnumConstant"/> | |
<!-- Basic Rules | |
<merge:pull | |
sourceGet="CompilationUnit/getHeader" | |
targetPut="CompilationUnit/setHeader"/> | |
<merge:pull | |
sourceGet="Package/getName" | |
targetPut="Package/setName"/> | |
<merge:pull | |
sourceGet="Member/getFlags" | |
targetPut="Member/setFlags"/> | |
<merge:pull | |
sourceGet="Member/getComment" | |
targetPut="Member/setComment"/> | |
<merge:pull | |
sourceGet="Type/getSuperclass" | |
targetPut="Type/setSuperclass"/> | |
<merge:pull | |
sourceGet="Type/getSuperInterfaces" | |
targetPut="Type/addSuperInterface"/> | |
<merge:pull | |
sourceGet="Initializer/getBody" | |
targetPut="Initializer/setBody"/> | |
<merge:pull | |
sourceGet="Field/getType" | |
targetPut="Field/setType"/> | |
<merge:pull | |
sourceGet="Field/getInitializer" | |
targetPut="Field/setInitializer"/> | |
<merge:pull | |
sourceGet="Method/getBody" | |
targetPut="Method/setBody"/> | |
<merge:pull | |
sourceGet="Method/getReturnType" | |
targetPut="Method/setReturnType"/> | |
<merge:pull | |
sourceGet="Method/getExceptions" | |
targetPut="Method/addException"/> | |
--> | |
<!-- Push Enum Constants only for generated Enums --> | |
<!-- | |
<merge:push targetParentMarkup="^gen$" select="EnumConstant"/> | |
--> | |
<!-- Push Annotation Type Members only for generated Annotation Types --> | |
<!-- | |
<merge:push targetParentMarkup="^gen$" select="AnnotationTypeMember"/> | |
--> | |
<!-- Sets the content of annotations if the parent is marked with gen --> | |
<!-- | |
<merge:pull | |
sourceGet="Annotation/getContents" | |
targetParentMarkup="^gen$" | |
targetPut="Annotation/setContents"/> | |
--> | |
<!-- Remove annotations of generated target nodes if the annotation is not in the source --> | |
<!-- | |
<merge:sweep parentMarkup="^gen$" select="Annotation"/> | |
--> | |
<!-- | |
<merge:pull | |
sourceMarkup="^modifiable$" | |
sourceGet="Member/getComment" | |
targetMarkup="^gen$" | |
targetPut="Member/setComment"/> | |
--> | |
</merge:options> |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("a"); | |
} | |
/** | |
* method2.<br/> | |
* @generated | |
*/ | |
public void method2() { | |
System.out.println("a"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("あ"); | |
} | |
/** | |
* method2.<br/> | |
*/ | |
public void method2() { | |
System.out.println("あ"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("a"); | |
} | |
/** | |
* method2.<br/> | |
*/ | |
public void method2() { | |
System.out.println("あ"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("あ"); | |
} | |
/** | |
* method2.<br/> | |
*/ | |
public void method2() { | |
System.out.println("あ"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("a"); | |
} | |
/** | |
* method2.<br/> | |
*/ | |
public void method2() { | |
System.out.println("あ"); | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* method1.<br/> | |
* @generated | |
*/ | |
public void method1() { | |
System.out.println("a"); | |
} | |
/** | |
* method2.<br/> | |
* @generated | |
*/ | |
public void method2() { | |
System.out.println("a"); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment