Skip to main content


Eclipse Community Forums
Forum Search:

Search      Help    Register    Login    Home
Home » Language IDEs » Java Development Tools (JDT) » Attaching comments to programatically generated AST
Attaching comments to programatically generated AST [message #249900] Fri, 30 November 2007 17:56
Robert Enyedi is currently offline Robert EnyediFriend
Messages: 68
Registered: July 2009
Member
This is a multi-part message in MIME format.
--------------060800010701040103030703
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi,

I am trying to attach comments to specific nodes of a generated Java
AST, based on suggestions found on this newsgroup.

1. If I use an already saved (stringified) source, it works. This is
built by the getAstItemsFromSrc() method.

2. When I programatically build the AST in method getAstItemsFromDom(),
the comment is not attached.

3. I need to keep a reference to specific anchor statements, so adopting
solution 1 (first saving the AST as string and reloading it for rewrite)
is NOT suitable for me.

The complete example is below. I have also attached the
JavaCommentsTest.zip which contains the source bundled as an Eclipse
command line RCP application. Can anybody tell me how to fix solution 2?

getAstItemsFromSrc:
<code>
protected ASTNode[] getAstItemsFromSrc() {
ASTParser parser = ASTParser.newParser(AST.JLS3);
String src="class CommentsTest {\n" +
" void dummy(){\n" +
" return;\n" +
" }\n" +
"}";
parser.setSource(src.toCharArray());
CompilationUnit refCompilationUnit =
(CompilationUnit) parser.createAST(null);
refCompilationUnit.recordModifications();

MethodDeclaration dummyMethod =
(MethodDeclaration)
((TypeDeclaration)refCompilationUnit.types()
.get(0)).bodyDeclarations().get(0);

Block block = dummyMethod.getBody();
Statement dummyStmt = (Statement) block.statements().get(0);

return new ASTNode[]{refCompilationUnit, dummyStmt};
}
</code>

getAstItemsFromDom:
<code>
protected ASTNode[] getAstItemsFromDom() {
ASTParser parser = ASTParser.newParser(AST.JLS3);

String src= "";

parser.setSource(src.toCharArray());
CompilationUnit refCompilationUnit =
(CompilationUnit) parser.createAST(null);
AST ast = refCompilationUnit.getAST();
refCompilationUnit.recordModifications();

TypeDeclaration type = ast.newTypeDeclaration();
type.setName(ast.newSimpleName("CommentsTest"));

MethodDeclaration dummyMethod = ast.newMethodDeclaration();
dummyMethod.setName(ast.newSimpleName("dummy"));

dummyMethod.setReturnType2(
ast.newPrimitiveType(PrimitiveType.VOID));
type.bodyDeclarations().add(dummyMethod);

Block block = ast.newBlock();
Statement dummyStmt = ast.newReturnStatement();
block.statements().add(dummyStmt);
dummyMethod.setBody(block);
refCompilationUnit.types().add(type);

return new ASTNode[]{refCompilationUnit, dummyStmt};
}
</code>

The caller is:
<code>
protected void addComments() throws Exception {
ASTNode[] astItems = getAstItemsFromSrc();// This works
// ASTNode[] astItems = getAstItemsFromDom();// This does NOT work

CompilationUnit refCompilationUnit = (CompilationUnit)
astItems[0];
Statement dummyStmt = (Statement) astItems[1];
System.out.println("WITHOUT COMMENTS: " + refCompilationUnit);

ASTRewrite rewrite= ASTRewrite.create(
refCompilationUnit.getAST());

IDocument idoc= new Document(refCompilationUnit.toString());

// insert block comment as first statement
StringBuffer comment = new StringBuffer();
comment.append("// Line comment");
ASTNode placeHolder=
rewrite.createStringPlaceholder(comment.toString(),
ASTNode.EMPTY_STATEMENT);
ListRewrite list = rewrite.getListRewrite(dummyStmt.getParent(),
Block.STATEMENTS_PROPERTY);
list.insertBefore(placeHolder, dummyStmt,null);

TextEdit edits = rewrite.rewriteAST(idoc, null);
edits.apply(idoc);

System.out.println("WITH COMMENTS: " + idoc.get());
}
</code>

Thanks,
Robert

--------------060800010701040103030703
Content-Type: application/x-zip-compressed;
name="JavaCommentsTest.zip"
Content-Transfer-Encoding: base64
Content-Disposition: inline;
filename="JavaCommentsTest.zip"

UEsDBBQACAAIAK2efjcAAAAAAAAAAAAAAAAbAAAASmF2YUNvbW1lbnRzVGVz dC8uY2xhc3Nw
YXRonY89C8IwFEVnBf9DyG6qm0NrEamgQ5VSZ6nJo43Gl5gP0X9vVYouOri9 ezmcy4vT60mR
C1gnNSZ0zEaUAHItJNYJ3ZaL4YSm00E/5qpyzlS+aUPvnQC9vZGjRJFQZzkl j/J1Rt9JrrEj
ta0ZcCWNA3YQnqkqIG/adbYqst18nZezZZ4Vf9iMAMa1BWbhHKQFsVGhluh+ qXTwJvjOtpf4
hOPo8/s7UEsHCNUcnNKlAAAAMwEAAFBLAwQUAAgACACtnn43AAAAAAAAAAAA AAAAGQAAAEph
dmFDb21tZW50c1Rlc3QvLnByb2plY3S9ksFuAiEQhs+a+A5m70J784Br0jY9 NGljon0AhHGL
WQYCrPHxC8hqNpsmPRhv8/8zwzfAsPVZt/MTOK8Mrqpn8lTNAYWRCptV9b17 XyyrdT2bMuvM
EUR4Ay+csiFWR3fCkGuoP/iJvxqtAYPfgQ+MZjvlxcWuGe2j5JbDfBZ0oPad auXWgkiqyHQ2
R5mdgjSuISBaZT2QowxEGBeDOEduAHcbIXZw13R5uKLp0GB0RPkX10ognxzV IV755bHYrfgB
ze8CLU7/5JEXOgel+iJG+E3bNQq/cjLRc9FfDYPvwVFPHyfidReGa/YLUEsH CPAV52PrAAAA
pQIAAFBLAwQUAAgACACtnn43AAAAAAAAAAAAAAAAIQAAAEphdmFDb21tZW50 c1Rlc3QvYnVp
bGQucHJvcGVydGllcyvOLy1KTtXTU7BVKC5K1uflyi8tKSgtAQskZeYBBYCk XmZeck5pSmox
ULAgpzQdKFKRm6MTw8ulgAp8XUMcdT393PSxyOnxcgEAUEsHCJ2PLjRKAAAA bQAAAFBLAwQU
AAgACACtnn43AAAAAAAAAAAAAAAAGwAAAEphdmFDb21tZW50c1Rlc3QvcGx1 Z2luLnhtbGVQ
SQ7CMAy8I/UPke+kLBcOSSsuvAAeEKVWFZRNSVr1+YQW2iB8sj2eGdusnYwm I4aonOVwpAcg
aKXrlO05PO63/QXaptqxFqVWPuI2e6anBfJ66JXNWbUjhDCcEtr3yFwuoToO wnutpEgZgQLy
TtnEwYWefiyodAFpGGxSBmlBi9B8iaxoN4Uay7SiXEJqESOHpxiFdMagTTFh TPRabPQjUmeV
zar+82L1euR8NqvXH7wAUEsHCDxwX2GzAAAAUQEAAFBLAwQUAAgACACtnn43 AAAAAAAAAAAA
AAAAJQAAAEphdmFDb21tZW50c1Rlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUZt j80OATEQgO/7
FH0AbXCsOCAugogV96qxmU1/aKdiPb1lrb+4zvfNl5mFcniASHwLIaJ3kvVE NxsntzfAF0/4
Yv2WLJUFyWbqrCbeWnAUN7XHViYVHF1r5ZXdeYP6vz1gEV1hgOrykEKCdu3z lPcxI014VuSD
ZGVd0s8S1SXxkb6XX2q2hlPCALxpSOZDIUAbPEYQ2gcQITlCC53sC5V7euCf McGFfs2D0g3I
ps2Iz9W1ykkFkuzx1Q1QSwcIF7wdAboAAABjAQAAUEsDBBQACAAIAK2efjcA AAAAAAAAAAAA
AAA2AAAASmF2YUNvbW1lbnRzVGVzdC9zcmMvamF2YWNvbW1lbnRzdGVzdC9B cHBsaWNhdGlv
bi5qYXZhzVbdb+JGEH82f8WIly65aLn23hrxkA+qo00Cin3Xnq5R5NhL2MT2 urtLAor43zv7
BYa4JHe6h0YEm9n5nt/MTp1mD+kdg/v0Mc1EWbJKK82UPup0eFkLqUHIO8qy gteKUfbPnFdi
QdO6pqPjui54lmouqqNvYT4VlWYL3Spzn2uaCcloLkp68DqLZE+Sa0aP4+TK vb5d5pwrvVdo
mmaMGlfpmcjmJjWv8Y32MloWlnOtaIKvQ3zDNPcPDjpwAMmMK8iKVOE3JkiK QkFaFJCqmmVa
gZiCnjFIN3n8SQFbsGxu3lFDv1PPb/HMK2kkHNCXgtnSQrMQ8NzpRF5ofHuP ZkDpVGrSUi3r
FD576IUUTwqGi4zVXksUabm0zyjN81MPI9I7QsoKUE82A5IYufS2YOh1zzGz Ba0lr3SsEYWJ
xDR6GfzHj2R6Lqstl+nwr1FyM/4DuVbGeSk0us1yQABcipx9vYY7po+VHmlW qt+kKGOZEWcO
WSapVExC7R4DWJNoxZ7cG0Ea/f08/mA9wU+s0cU7UDIbRF2X2xBhgo0Cz39X XXgHJp4o6gI8
Cp5DPi/LJentngG4mI526Kut36uuN+38pIrpWMwlZgedoFqczlJ5LGWKBtBJ 8H/oVM0Lm6VP
FddoabpLGgDZIfV8LmgmWaoZxk6qeVE01L5Ugw2EvZRfiJxPfVlsrYPE+uWC 6ZnIzxD+qXSA
s2lxZOPMC4YeEJIsa9YktTigkQVNUiw1ed/r0VuRLxsim6MWp04KkT3Arf0e NB0yIieoqBkK
AlPbxnGMsS5tEtfknlNEVSDsNe3xjFDbwPX5ZXiHG2Mri/PoTUA/E+UPBPr/ CYJIwjFoZFuw
YLKAIt+FWIzQCEQ7kAODL7SGNk26dk6DqchwmcRcpiUjnje2o9ZSus0p0Q1p 8hZfaw2v7gXb
2ngTuHt8sGzWeLQrcmXRaIL7JUhOJC+55o/MUMnWL/p5PDpzemzcLS2Ho580 bARYbTect2SJ
ZIO8tjbzrM7PNYsTamm7tXkjHjTvxGz728oGhj3TxSg07xvWH9C+9nbYuiRb L1Q7N2wn+2ZP
fadjXtouuKOo33crxJOQD6rT779N2A6NjXAumILLcWK1uKi/s6eDya/vr79l nK7Ffr5uGaDx
EnfTkoq5dntDUZHun6Pk4/hTAqfji4vhZRL/CuYmfellcyDb3PjVD/w6aGek p/lRRPaMG1Tn
qrRe+YDnIhtYeARSmwIt3Jy1KnydzTeWgFc4BrVvFb+MY0ZgyqWyq5nLkuN3 Wk7m0ykO+MDs
zDePSLDiWcw2zqqcdNHeOa9YoHcDn0cN1AWuYx9FkTM5CDnyeXH6J4ZhZhlI UL4J7jAoosOL
SfLlJk6Ok6EpULDT2L6h4H66OyuY48bppqnNAd5ddggcuoucrvXGN5Or8WR4 lXwJFoxW6nJ6
wqa4/ZNGTI0uPfTXTbTGWhTWc7DbesM1/zQQMOU+hKasW+3Nhr60p9sF/i/w 7iDXCNoVItwY
boC4Ld1OD6VF7W96LGIl9Mxc21pg95pxs+r8C1BLBwibjNiphAQAANQNAABQ SwMEFAAIAAgA
rZ5+NwAAAAAAAAAAAAAAAEMAAABKYXZhQ29tbWVudHNUZXN0L3NyYy9qYXZh Y29tbWVudHN0
ZXN0L0phdmFDb21tZW50VGVzdEFjdGl2YXRvci5qYXZhrVNda+MwEHx2IP9h aV+SQO0fYA7a
a46SchylH89FlTeOrrIkpFXaUvrfb2XZbdoSyh33YsN6ZnZmd+2EvBctwm+x FdJ2HRoKhIHq
6WQ6UZ2znsD6tkSplQtYSuux9NGQ6rC80LFVpn4HtKFV5dqLDh+svy+/R9No PLWG8DGLVovF
dAILuN4gCElqK8h6kFqEAJJx3uoAxB8dqx8pA1qtEeST1Jh41XTi4p1WcqCc s/HTbPyafZ+8
KnI/NE2AbBKeU++iqvq+o/RqybVBLpAgfq2VERquyCvTwsXPm7PVr9vVEr7B wU6nkFod1LuS
YSM8NqAM6xiJSdcnJzgK7zXqxikWSS1NpxjGw+MI5KNkVF+s3tzuU5vNU9Li JVsbtGbGmqPE
aKyc59JxQPxqseGQrXuafbXW+UdzW6sayNx3wH6/icD79fYhwI9HiY6U7ddT FCE69GUmjtA0
lyKPiJdAGxXq/5WP41n3z+mY+lfhXjOYqHW9G5eVdtOO2YZwl0jRm/xLfD4y GFDHvoftRVWf
Dn3vPbZIS1yLqGk4pmLQfjvU3iI//gBQSwcI+1QX86YBAAA+BAAAUEsBAhQA FAAIAAgArZ5+
N9UcnNKlAAAAMwEAABsAAAAAAAAAAAAAAAAAAAAAAEphdmFDb21tZW50c1Rl c3QvLmNsYXNz
cGF0aFBLAQIUABQACAAIAK2efjfwFedj6wAAAKUCAAAZAAAAAAAAAAAAAAAA AO4AAABKYXZh
Q29tbWVudHNUZXN0Ly5wcm9qZWN0UEsBAhQAFAAIAAgArZ5+N52PLjRKAAAA bQAAACEAAAAA
AAAAAAAAAAAAIAIAAEphdmFDb21tZW50c1Rlc3QvYnVpbGQucHJvcGVydGll c1BLAQIUABQA
CAAIAK2efjc8cF9hswAAAFEBAAAbAAAAAAAAAAAAAAAAALkCAABKYXZhQ29t bWVudHNUZXN0
L3BsdWdpbi54bWxQSwECFAAUAAgACACtnn43F7wdAboAAABjAQAAJQAAAAAA AAAAAAAAAAC1
AwAASmF2YUNvbW1lbnRzVGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRlBLAQIU ABQACAAIAK2e
fjebjNiphAQAANQNAAA2AAAAAAAAAAAAAAAAAMIEAABKYXZhQ29tbWVudHNU ZXN0L3NyYy9q
YXZhY29tbWVudHN0ZXN0L0FwcGxpY2F0aW9uLmphdmFQSwECFAAUAAgACACt nn43+1QX86YB
AAA+BAAAQwAAAAAAAAAAAAAAAACqCQAASmF2YUNvbW1lbnRzVGVzdC9zcmMv amF2YWNvbW1l
bnRzdGVzdC9KYXZhQ29tbWVudFRlc3RBY3RpdmF0b3IuamF2YVBLBQYAAAAA BwAHAFACAADB
CwAAAAA=
--------------060800010701040103030703--
Previous Topic:How are implicit casts handled in JDT?
Next Topic:JavaCodeFormatter does not do the line wrapping
Goto Forum:
  


Current Time: Thu Apr 25 14:54:23 GMT 2024

Powered by FUDForum. Page generated in 0.03206 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top