<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog @ SIB Visions &#187; AST</title>
	<atom:link href="http://blog.sibvisions.com/tag/ast/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sibvisions.com</link>
	<description>Blog @ SIB Visions</description>
	<lastBuildDate>Mon, 30 Mar 2026 11:14:36 +0000</lastBuildDate>
		<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Source Code modification with Eclipse AST</title>
		<link>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/</link>
		<comments>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/#comments</comments>
		<pubDate>Mon, 03 Dec 2012 13:00:32 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[AST]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JDT]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=1840</guid>
		<description><![CDATA[We heavily use Eclipse AST and JDT. The problem with both APIs is that you don't find a lot of documentation or examples. The best documentation was and is the source code. It shows all secrets.
Last friday at Eclipse DemoCamp Vienna, I discussed with CodeCop about AST and JDT and the missing documentation  
I [...]]]></description>
			<content:encoded><![CDATA[<p>We heavily use Eclipse AST and JDT. The problem with both APIs is that you don't find a lot of documentation or examples. The best documentation was and is the source code. It shows all secrets.</p>
<p>Last friday at Eclipse DemoCamp Vienna, I discussed with <a href="http://blog.code-cop.org/">CodeCop</a> about AST and JDT and the missing documentation <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>I wrote a simple class for class/superclass/package/javadoc manipulation some months ago. It is included in VisionX and is not free, but no matter. Here is the source code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="coMULTI">/* <br />
(c) SIB Visions 2012 </p>
<p>http://www.sibvisions.com<br />
*/</span><br />
<span class="kw1">public</span> <span class="kw1">class</span> SimpleSourceFile <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// Class members</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the source parser. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> ASTParser parser<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the parsed tokens of the source file. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> CompilationUnit cuSource<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the original document. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">Document</span> docOrig<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the class type info. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> TypeDeclaration tdClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the javadoc of the class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> JavadocInfo jdoc<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sClassName<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the super class after loading. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sLoadedSuperClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** the full qualified name of the parent class. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw3">String</span> sSuperClass<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/** whether the source is changed. */</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">boolean</span> bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// Initialization</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; without source<br />
&nbsp; &nbsp; &nbsp;* information.<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source file.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pFile the java source file<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the file<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pFile.<span class="me1">exists</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; JavaSource source <span class="sy0">=</span> JavaSource.<span class="me1">get</span><span class="br0">&#40;</span>pFile.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>source <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span><span class="br0">&#40;</span>source<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pFile<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pFile<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source stream. The stream is closed after reading<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pStream the java source stream<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the stream<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">InputStream</span> pStream<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">this</span><span class="br0">&#40;</span>pStream, <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Creates a new instance of &lt;code&gt;SimpleSourceFile&lt;/code&gt; with a given <br />
&nbsp; &nbsp; &nbsp;* source stream.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @param pStream the java source stream<br />
&nbsp; &nbsp; &nbsp;* @param pAutoClose whether the stream should be closed after reading<br />
&nbsp; &nbsp; &nbsp;* @throws IOException if an error occurs during reading the stream<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> SimpleSourceFile<span class="br0">&#40;</span><span class="kw3">InputStream</span> pStream, <span class="kw4">boolean</span> pAutoClose<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">String</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><span class="br0">&#40;</span>pStream, pAutoClose<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span><br />
&nbsp; &nbsp; <span class="co1">// User-defined methods</span><br />
&nbsp; &nbsp; <span class="co1">//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Loads the properties from the source file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pSource the java source<br />
&nbsp; &nbsp; &nbsp;*/</span>@SuppressWarnings<span class="br0">&#40;</span><span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&quot;unchecked&quot;</span>, <span class="st0">&quot;rawtypes&quot;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">private</span> <span class="kw4">void</span> load<span class="br0">&#40;</span><span class="kw3">String</span> pSource<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; jdoc <span class="sy0">=</span> <span class="kw1">new</span> JavadocInfo<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>parser <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; parser <span class="sy0">=</span> ASTUtil.<span class="me1">createParser</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="me1">setSource</span><span class="br0">&#40;</span>pSource.<span class="me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cuSource <span class="sy0">=</span> <span class="br0">&#40;</span>CompilationUnit<span class="br0">&#41;</span> parser.<span class="me1">createAST</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>docOrig <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig.<span class="me1">set</span><span class="br0">&#40;</span>pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Document</span><span class="br0">&#40;</span>pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we support only one class per file</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> types <span class="sy0">=</span> cuSource.<span class="me1">types</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>types.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0 <span class="sy0">&amp;&amp;</span> types.<span class="me1">get</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span> <span class="kw1">instanceof</span> TypeDeclaration<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> <span class="br0">&#40;</span>TypeDeclaration<span class="br0">&#41;</span> types.<span class="me1">get</span><span class="br0">&#40;</span>0<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sPackage<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we have to use the current package, if set</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPackage <span class="sy0">=</span> cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;.&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sPackage <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sClassName <span class="sy0">=</span> sPackage <span class="sy0">+</span> tdClass.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>tdClass.<span class="me1">getSuperclassType</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sSuperName <span class="sy0">=</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>SimpleType<span class="br0">&#41;</span><span class="br0">&#40;</span>tdClass.<span class="me1">getSuperclassType</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperName.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">'.'</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//try to detect the full qualified name of the super class through the imports</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> ImportDeclaration <span class="sy0">&gt;</span> liImports <span class="sy0">=</span> cuSource.<span class="me1">imports</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sTempName <span class="sy0">=</span> <span class="st0">&quot;.&quot;</span> <span class="sy0">+</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sImport<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> 0, anz <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&lt;</span> anz<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sImport <span class="sy0">=</span> liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sImport.<span class="me1">endsWith</span><span class="br0">&#40;</span>sTempName<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//we use the current package</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;sSuperClass</span> <span class="sy0">=</span> sPackage <span class="sy0">+</span> sSuperName<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//cache for optimizing imports in apply</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sLoadedSuperClass <span class="sy0">=</span> sSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jdoc <span class="sy0">=</span> <span class="kw1">new</span> JavadocInfo<span class="br0">&#40;</span>tdClass.<span class="me1">getJavadoc</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, pSource<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//currently loaded file can not be changed!</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the comment for the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pText the comment<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setClassComment<span class="br0">&#40;</span><span class="kw3">String</span> pText<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pText, jdoc.<span class="me1">getDescription</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; jdoc.<span class="me1">setDescription</span><span class="br0">&#40;</span>pText<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the comment for the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the comment<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getClassComment<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> jdoc.<span class="me1">getDescription</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the full qualified name of the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pName the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setClassName<span class="br0">&#40;</span><span class="kw3">String</span> pName<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>pName <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">IllegalArgumentException</span><span class="br0">&#40;</span><span class="st0">&quot;It is not allowed to remove the class definition (class name = null)!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pName, sClassName<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; sClassName <span class="sy0">=</span> pName<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the full qualified name of the class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getClassName<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sClassName<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Sets the full qualified class name of the parent class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pSuperClass the full qualified class name of the parent class<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> setSuperClass<span class="br0">&#40;</span><span class="kw3">String</span> pSuperClass<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">|=</span> <span class="sy0">!</span>CommonUtil.<span class="me1">equals</span><span class="br0">&#40;</span>pSuperClass, sSuperClass<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; sSuperClass <span class="sy0">=</span> pSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Gets the full qualified class name of the parent class.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @return the class name<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">String</span> getSuperClass<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> sSuperClass<span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Replaces the relevant information with the specific values<br />
&nbsp; &nbsp; &nbsp;* and saves the source file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @throws Exception if the source modification fails<br />
&nbsp; &nbsp; &nbsp;*/</span>@SuppressWarnings<span class="br0">&#40;</span><span class="st0">&quot;unchecked&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw4">void</span> apply<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bChanged<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; AST ast <span class="sy0">=</span> cuSource.<span class="me1">getAST</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; ASTRewrite arw <span class="sy0">=</span> ASTRewrite.<span class="me1">create</span><span class="br0">&#40;</span>ast<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Change Package, Classname and Constructor</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sCurrentPackage<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//set package</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> sClassInfo <span class="sy0">=</span> ClassUtil.<span class="me1">splitName</span><span class="br0">&#40;</span>sClassName<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource.<span class="me1">getPackage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, PackageDeclaration.<span class="me1">NAME_PROPERTY</span>, ast.<span class="me1">newName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; PackageDeclaration pdcl <span class="sy0">=</span> ast.<span class="me1">newPackageDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pdcl.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">PACKAGE_PROPERTY</span>, pdcl, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">PACKAGE_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sCurrentPackage <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>tdClass <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//new class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass <span class="sy0">=</span> ast.<span class="me1">newTypeDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; tdClass.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newSimpleName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListRewrite lrwImp <span class="sy0">=</span> arw.<span class="me1">getListRewrite</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">TYPES_PROPERTY</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lrwImp.<span class="me1">insertFirst</span><span class="br0">&#40;</span>tdClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//change class name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SimpleName snClass <span class="sy0">=</span> ast.<span class="me1">newSimpleName</span><span class="br0">&#40;</span>sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">NAME_PROPERTY</span>, snClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//chage constructors</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MethodDeclaration<span class="br0">&#91;</span><span class="br0">&#93;</span> methods <span class="sy0">=</span> tdClass.<span class="me1">getMethods</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>methods <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>MethodDeclaration method<span class="sy0">:</span> methods<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>method.<span class="me1">isConstructor</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>method, MethodDeclaration.<span class="me1">NAME_PROPERTY</span>, snClass, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//change Superclass</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> ImportDeclaration <span class="sy0">&gt;</span> liImports <span class="sy0">=</span> cuSource.<span class="me1">imports</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//remove &quot;old&quot; import</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp;if</span> <span class="br0">&#40;</span>sLoadedSuperClass <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">--</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sLoadedSuperClass.<span class="me1">equals</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">remove</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; liImports.<span class="me1">remove</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperClass <span class="sy0">==</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">SUPERCLASS_TYPE_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//check new super class import</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> sSuperClassInfo <span class="sy0">=</span> ClassUtil.<span class="me1">splitName</span><span class="br0">&#40;</span>sSuperClass<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sSuperClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">boolean</span> bFound <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sCurrentPackage <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> sSuperClassInfo<span class="br0">&#91;</span>0<span class="br0">&#93;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>sCurrentPackage<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liImports <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span><span class="kw4">int</span> i <span class="sy0">=</span> 0, anz <span class="sy0">=</span> liImports.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> <span class="sy0">!</span>bFound <span class="sy0">&amp;&amp;</span> i <span class="sy0">&lt;</span> anz<span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; bFound <span class="sy0">=</span> sSuperClass.<span class="me1">equals</span><span class="br0">&#40;</span>liImports.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//class not already importet -&gt; add import</span><br />
<span class="co2"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if</span> <span class="br0">&#40;</span><span class="sy0">!</span>bFound<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ImportDeclaration idSuper <span class="sy0">=</span> ast.<span class="me1">newImportDeclaration</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; idSuper.<span class="me1">setName</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sSuperClass<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ListRewrite lrwImp <span class="sy0">=</span> arw.<span class="me1">getListRewrite</span><span class="br0">&#40;</span>cuSource, CompilationUnit.<span class="me1">IMPORTS_PROPERTY</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lrwImp.<span class="me1">insertLast</span><span class="br0">&#40;</span>idSuper, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">SUPERCLASS_TYPE_PROPERTY</span>, ast.<span class="me1">newSimpleType</span><span class="br0">&#40;</span>ast.<span class="me1">newName</span><span class="br0">&#40;</span>sSuperClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Change Javadoc of the class</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="st0">&quot;&quot;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>jdoc.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//no javadoc</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">JAVADOC_PROPERTY</span>, <span class="kw2">null</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; arw.<span class="me1">set</span><span class="br0">&#40;</span>tdClass, TypeDeclaration.<span class="me1">JAVADOC_PROPERTY</span>, jdoc.<span class="me1">createJavadoc</span><span class="br0">&#40;</span>tdClass.<span class="me1">getAST</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Modify AST</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; TextEdit edit <span class="sy0">=</span> arw.<span class="me1">rewriteAST</span><span class="br0">&#40;</span>docOrig, <span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; edit.<span class="me1">apply</span><span class="br0">&#40;</span>docOrig<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; ASTUtil.<span class="me1">applyFormat</span><span class="br0">&#40;</span>docOrig<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//simple reparse (important for the comments)</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; parser.<span class="me1">setSource</span><span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toCharArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; cuSource <span class="sy0">=</span> <span class="br0">&#40;</span>CompilationUnit<span class="br0">&#41;</span> parser.<span class="me1">createAST</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Modify comments</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//Class comment after the last bracket</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iCorr <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">List</span> <span class="sy0">&lt;</span> Comment <span class="sy0">&gt;</span> liComments <span class="sy0">=</span> cuSource.<span class="me1">getCommentList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>liComments <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sOldName <span class="sy0">=</span> tdClass.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getFullyQualifiedName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">String</span> sText<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>Comment com<span class="sy0">:</span> liComments<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sText <span class="sy0">=</span> docOrig.<span class="me1">get</span><span class="br0">&#40;</span>com.<span class="me1">getStartPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> iCorr, com.<span class="me1">getLength</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iPos <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iClassLen <span class="sy0">=</span> sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span>.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iLenDiff <span class="sy0">=</span> sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> iClassLen<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw4">int</span> iNextPos<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharacterType ctypePrev<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CharacterType ctypeNext<span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>iPos <span class="sy0">=</span> sText.<span class="me1">indexOf</span><span class="br0">&#40;</span>sOldName, iPos<span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> 0<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>iPos <span class="sy0">&gt;</span> <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypePrev <span class="sy0">=</span> StringUtil.<span class="me1">getCharacterType</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span> <span class="sy0">+</span> sText.<span class="me1">charAt</span><span class="br0">&#40;</span>iPos <span class="sy0">-</span> 1<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypePrev <span class="sy0">=</span> CharacterType.<span class="me1">OnlySpecial</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iNextPos <span class="sy0">=</span> iPos <span class="sy0">+</span> sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>iNextPos <span class="sy0">&lt;=</span> sText.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypeNext <span class="sy0">=</span> StringUtil.<span class="me1">getCharacterType</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span> <span class="sy0">+</span> sText.<span class="me1">charAt</span><span class="br0">&#40;</span>iNextPos<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ctypeNext <span class="sy0">=</span> CharacterType.<span class="me1">OnlySpecial</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//don't replace word parts e.g. ContactsWorkScreen should not be replaced with Contacts</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="br0">&#40;</span>ctypePrev <span class="sy0">==</span> CharacterType.<span class="me1">OnlySpecial</span> <span class="sy0">||</span> ctypePrev <span class="sy0">==</span> CharacterType.<span class="me1">OnlyWhitespace</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> <span class="br0">&#40;</span>ctypeNext <span class="sy0">==</span> CharacterType.<span class="me1">OnlySpecial</span> <span class="sy0">||</span> ctypeNext <span class="sy0">==</span> CharacterType.<span class="me1">OnlyWhitespace</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; docOrig.<span class="me1">replace</span><span class="br0">&#40;</span>com.<span class="me1">getStartPosition</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> iPos <span class="sy0">-</span> iCorr, sOldName.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, sClassInfo<span class="br0">&#91;</span>1<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iCorr <span class="sy0">+=</span> iLenDiff<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iPos <span class="sy0">+=</span> iClassLen<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; iPos <span class="sy0">=</span> iNextPos<span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// Update</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//----------------------------------------------------</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; load<span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; bChanged <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Stores the changed source into the given file.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pFile the target file for the source<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if an error occurs during saving<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> saveAs<span class="br0">&#40;</span><span class="kw3">File</span> pFile<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; JavaSource source <span class="sy0">=</span> JavaSource.<span class="me1">get</span><span class="br0">&#40;</span>pFile.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>source <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span><span class="br0">&#40;</span>source<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileUtil.<span class="me1">save</span><span class="br0">&#40;</span>pFile, docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; source.<span class="me1">reload</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; FileUtil.<span class="me1">save</span><span class="br0">&#40;</span>pFile, docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Stores the changed source into the given stream.<br />
&nbsp; &nbsp; &nbsp;* <br />
&nbsp; &nbsp; &nbsp;* @param pStream the target stream for the source<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if an error occurs during saving<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> saveAs<span class="br0">&#40;</span><span class="kw3">OutputStream</span> pStream<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; pStream.<span class="me1">write</span><span class="br0">&#40;</span>docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; pStream.<span class="me1">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; <span class="co3">/**<br />
&nbsp; &nbsp; &nbsp;* Returns the modified source code.<br />
&nbsp; &nbsp; &nbsp;* &nbsp;<br />
&nbsp; &nbsp; &nbsp;* @return the modified source code<br />
&nbsp; &nbsp; &nbsp;* @throws Exception if the source modification fails<br />
&nbsp; &nbsp; &nbsp;*/</span><br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw3">String</span> getSource<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">Exception</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; apply<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> docOrig.<span class="me1">get</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p><span class="br0">&#125;</span> <span class="co1">// SimpleSourceFile</span></div>
</div>
<p>Important imports:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.AST</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.ASTParser</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.Comment</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.CompilationUnit</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.ImportDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.MethodDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.PackageDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.SimpleName</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.SimpleType</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.TypeDeclaration</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.rewrite.ASTRewrite</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jdt.core.dom.rewrite.ListRewrite</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.jface.text.Document</span><span class="sy0">;</span><br />
<span class="kw1">import</span> <span class="co2">org.eclipse.text.edits.TextEdit</span><span class="sy0">;</span></div>
</div>
<p>The class contains references to other classes like CommonUtil, FileUtil, StringUtil. These classes are included in <a href="http://sourceforge.net/projects/jvx/">JVx</a>. There are two classes (JavaSource, ClassUtil) that are not free, but you should find out how it works without these classes.</p>
<p>If you'll set a new superclass, the superclass and its import, if available, will be updated. If you'll set a new classname, all constructors will be updated.</p>
<p>And once again: The best documentation is the source code <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2012/12/03/source-code-modification-with-eclipse-ast/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
