[英]Eclipse Abstract Syntax Tree Diff
在Eclipse中給出以下代碼:
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.CompilationUnit;
public class Question {
public static void main(String[] args) {
String source = "class Bob {}";
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(source.toCharArray());
CompilationUnit result = (CompilationUnit) parser.createAST(null);
String source2 = "class Bob {public void MyMethod(){}}";
ASTParser parser2 = ASTParser.newParser(AST.JLS3);
parser2.setSource(source2.toCharArray());
CompilationUnit result2 = (CompilationUnit) parser2.createAST(null);
}
}
您如何使用Eclipse Compare API(org.eclipse.compare)來查找AST差異? (這可以在插件之外完成嗎?)
我正在查看以下API
http://kickjava.com/src/org/eclipse/compare/structuremergeviewer/Differencer.java.htm http://kickjava.com/src/org/eclipse/jdt/internal/ui/compare/JavaStructureCreator.java.htm http://kickjava.com/src/org/eclipse/compare/CompareUI.java.htm
任何人都可以指向示例代碼(或API - 但代碼是首選)。
GumTree完成這項工作,免費:)
它還支持其他語言,如javascript。
鑒於Eclipse不進行AST差分,也許OP希望在語言結構方面找到兩個文件之間的差異,忽略空格和注釋。 我們的Smart Differencer工具根據語言結構(變量,表達式,語句,塊,方法......)比較兩個源文件,並描述這些元素的抽象編輯操作方面的差異(刪除,復制,移動,重命名)區域內的標識符,...)
實際上,使用ASTNode的屬性檢查相等性很簡單。 在那之后,由您決定,您希望如何獲得差異。 檢查代碼示例以進行相等性測試:
public class ASTCompare {
@SuppressWarnings("unchecked")
static boolean equals(ASTNode left, ASTNode right) {
// if both are null, they are equal, but if only one, they aren't
if (left == null && right == null) {
return true;
} else if (left == null || right == null) {
return false;
}
// if node types are the same we can assume that they will have the same
// properties
if (left.getNodeType() != right.getNodeType()) {
return false;
}
List<StructuralPropertyDescriptor> props = left
.structuralPropertiesForType();
for (StructuralPropertyDescriptor property : props) {
Object leftVal = left.getStructuralProperty(property);
Object rightVal = right.getStructuralProperty(property);
if (property.isSimpleProperty()) {
// check for simple properties (primitive types, Strings, ...)
// with normal equality
if (!leftVal.equals(rightVal)) {
return false;
}
} else if (property.isChildProperty()) {
// recursively call this function on child nodes
if (!equals((ASTNode) leftVal, (ASTNode) rightVal)) {
return false;
}
} else if (property.isChildListProperty()) {
Iterator<ASTNode> leftValIt = ((Iterable<ASTNode>) leftVal)
.iterator();
Iterator<ASTNode> rightValIt = ((Iterable<ASTNode>) rightVal)
.iterator();
while (leftValIt.hasNext() && rightValIt.hasNext()) {
// recursively call this function on child nodes
if (!equals(leftValIt.next(), rightValIt.next())) {
return false;
}
}
// one of the value lists have additional elements
if (leftValIt.hasNext() || rightValIt.hasNext()) {
return false;
}
}
}
return true;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.