Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

CommonPrinter.java 41KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252
  1. /* *******************************************************************
  2. * Copyright (c) 2010 Contributors
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Eclipse Public License v 2.0
  6. * which accompanies this distribution and is available at
  7. * https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt
  8. *
  9. * Contributors:
  10. * Andy Clement - SpringSource
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler;
  13. import org.aspectj.asm.internal.CharOperation;
  14. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
  15. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
  16. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractVariableDeclaration;
  17. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AllocationExpression;
  18. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
  19. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
  20. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayAllocationExpression;
  21. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayInitializer;
  22. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ArrayReference;
  23. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AssertStatement;
  24. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Assignment;
  25. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.BinaryExpression;
  26. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Block;
  27. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.BreakStatement;
  28. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CaseStatement;
  29. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CastExpression;
  30. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.CharLiteral;
  31. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ClassLiteralAccess;
  32. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConditionalExpression;
  33. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
  34. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.DoubleLiteral;
  35. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
  36. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FalseLiteral;
  37. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldDeclaration;
  38. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FieldReference;
  39. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.FloatLiteral;
  40. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ForStatement;
  41. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ForeachStatement;
  42. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.IfStatement;
  43. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.InstanceOfExpression;
  44. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.IntLiteral;
  45. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
  46. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.LongLiteral;
  47. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MemberValuePair;
  48. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MessageSend;
  49. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.MethodDeclaration;
  50. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.NullLiteral;
  51. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ParameterizedQualifiedTypeReference;
  52. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ParameterizedSingleTypeReference;
  53. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.PostfixExpression;
  54. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.PrefixExpression;
  55. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedAllocationExpression;
  56. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedNameReference;
  57. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.QualifiedTypeReference;
  58. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
  59. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleNameReference;
  60. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SingleTypeReference;
  61. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Statement;
  62. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.StringLiteral;
  63. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SwitchExpression;
  64. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.SwitchStatement;
  65. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ThisReference;
  66. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ThrowStatement;
  67. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TrueLiteral;
  68. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TryStatement;
  69. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeDeclaration;
  70. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeParameter;
  71. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.TypeReference;
  72. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.UnaryExpression;
  73. import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Wildcard;
  74. import org.aspectj.org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
  75. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
  76. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.LocalVariableBinding;
  77. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodScope;
  78. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ParameterizedFieldBinding;
  79. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
  80. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
  81. public class CommonPrinter {
  82. StringBuilder output;
  83. private int tab = 0;
  84. MethodScope mscope;
  85. AbstractMethodDeclaration declaration;
  86. protected int expressionLevel = 0;
  87. public CommonPrinter(MethodScope mscope) {
  88. output = new StringBuilder();
  89. this.mscope = mscope;
  90. }
  91. protected StringBuilder printTypeReference(TypeReference tr) {
  92. if (tr instanceof Wildcard) {
  93. Wildcard w = (Wildcard) tr;
  94. output.append('?');
  95. if (w.bound != null) {
  96. if (w.kind == Wildcard.EXTENDS) {
  97. output.append(" extends ");
  98. } else if (w.kind == Wildcard.SUPER) {
  99. output.append(" super ");
  100. }
  101. printTypeReference(w.bound);
  102. }
  103. return output;
  104. } else if (tr instanceof ParameterizedSingleTypeReference) {
  105. ParameterizedSingleTypeReference pstr = (ParameterizedSingleTypeReference) tr;
  106. ReferenceBinding tb = (ReferenceBinding) mscope.getType(pstr.token);
  107. output.append(CharOperation.concatWith(tb.compoundName, '.'));
  108. output.append('<');
  109. TypeReference[] typeArguments = pstr.typeArguments;
  110. for (int i = 0; i < typeArguments.length; i++) {
  111. if (i > 0) {
  112. output.append(',');
  113. }
  114. printTypeReference(typeArguments[i]);
  115. }
  116. output.append('>');
  117. for (int i = 0; i < pstr.dimensions; i++) {
  118. output.append("[]"); //$NON-NLS-1$
  119. }
  120. return output;
  121. } else if (tr instanceof ParameterizedQualifiedTypeReference) {
  122. ParameterizedQualifiedTypeReference pqtr = (ParameterizedQualifiedTypeReference) tr;
  123. output.append(CharOperation.concatWith(pqtr.tokens, '.'));
  124. output.append('<');
  125. TypeReference[][] typeArguments = pqtr.typeArguments;
  126. // TODO don't support parameterized interim name components
  127. TypeReference[] ofInterest = typeArguments[typeArguments.length - 1];
  128. for (int i = 0; i < ofInterest.length; i++) {
  129. if (i > 0) {
  130. output.append(',');
  131. }
  132. printTypeReference(ofInterest[i]);
  133. }
  134. output.append('>');
  135. for (int i = 0; i < pqtr.dimensions(); i++) {
  136. output.append("[]"); //$NON-NLS-1$
  137. }
  138. return output;
  139. } else if (tr instanceof SingleTypeReference) {
  140. SingleTypeReference str = (SingleTypeReference) tr;
  141. TypeBinding tb = mscope.getType(str.token);
  142. output.append(tb.debugName()); // fq name
  143. for (int i = 0; i < str.dimensions(); i++) {
  144. output.append("[]"); //$NON-NLS-1$
  145. }
  146. return output;
  147. } else if (tr instanceof QualifiedTypeReference) {
  148. QualifiedTypeReference qtr = (QualifiedTypeReference) tr;
  149. output.append(CharOperation.concatWith(qtr.tokens, '.'));
  150. for (int i = 0; i < qtr.dimensions(); i++) {
  151. output.append("[]"); //$NON-NLS-1$
  152. }
  153. return output;
  154. }
  155. throwit(tr);
  156. return output;
  157. }
  158. protected StringBuilder printMemberValuePair(MemberValuePair mvp) {
  159. output.append(mvp.name).append(" = "); //$NON-NLS-1$
  160. printExpression(mvp.value);
  161. return output;
  162. }
  163. protected StringBuilder printAnnotations(Annotation[] annotations) {
  164. int length = annotations.length;
  165. for (Annotation annotation : annotations) {
  166. printAnnotation(annotation);
  167. output.append(" "); //$NON-NLS-1$
  168. }
  169. return output;
  170. }
  171. public StringBuilder printAnnotation(Annotation annotation) {
  172. output.append('@');
  173. printExpression(annotation.type);
  174. MemberValuePair[] mvps = annotation.memberValuePairs();
  175. if (mvps != null && mvps.length > 0) {
  176. output.append('(');
  177. for (int m = 0; m < mvps.length; m++) {
  178. if (m > 0) {
  179. output.append(',');
  180. }
  181. printMemberValuePair(mvps[m]);
  182. }
  183. output.append(')');
  184. }
  185. return output;
  186. }
  187. public String toString() {
  188. return output.toString();
  189. }
  190. protected StringBuilder printBody(int indent) {
  191. if (declaration.isAbstract()) { // || (md.modifiers & ExtraCompilerModifiers.AccSemicolonBody) != 0) {
  192. return output.append(';');
  193. }
  194. output.append(" {"); //$NON-NLS-1$
  195. if (declaration.statements != null) {
  196. for (int i = 0; i < declaration.statements.length; i++) {
  197. output.append('\n');
  198. printStatement(declaration.statements[i], indent);
  199. }
  200. }
  201. output.append('\n');
  202. printIndent(indent == 0 ? 0 : indent - 1).append('}');
  203. return output;
  204. }
  205. protected StringBuilder printBody(AbstractMethodDeclaration amd, int indent) {
  206. if (amd.isAbstract()) { // || (md.modifiers & ExtraCompilerModifiers.AccSemicolonBody) != 0) {
  207. return output.append(';');
  208. }
  209. output.append(" {"); //$NON-NLS-1$
  210. if (amd.statements != null) {
  211. for (int i = 0; i < amd.statements.length; i++) {
  212. output.append('\n');
  213. printStatement(amd.statements[i], indent);
  214. }
  215. }
  216. output.append('\n');
  217. printIndent(indent == 0 ? 0 : indent - 1).append('}');
  218. return output;
  219. }
  220. protected StringBuilder printArgument(Argument argument) {
  221. // printIndent(indent, output);
  222. printModifiers(argument.modifiers);
  223. if (argument.annotations != null) {
  224. printAnnotations(argument.annotations);
  225. }
  226. printTypeReference(argument.type).append(' ');
  227. return output.append(argument.name);
  228. }
  229. void throwit(Object o) {
  230. if (true) {
  231. System.out.println("so far:" + output.toString());
  232. throw new IllegalStateException(o == null ? "" : o.getClass().getName() + ":" + o);
  233. }
  234. }
  235. void throwit() {
  236. if (true) {
  237. throw new IllegalStateException();
  238. }
  239. }
  240. public StringBuilder printIndent(int indent) {
  241. for (int i = indent; i > 0; i--) {
  242. output.append(" "); //$NON-NLS-1$
  243. }
  244. return output;
  245. }
  246. public StringBuilder printModifiers(int modifiers) {
  247. if ((modifiers & ClassFileConstants.AccPublic) != 0) {
  248. output.append("public "); //$NON-NLS-1$
  249. }
  250. if ((modifiers & ClassFileConstants.AccPrivate) != 0) {
  251. output.append("private "); //$NON-NLS-1$
  252. }
  253. if ((modifiers & ClassFileConstants.AccProtected) != 0) {
  254. output.append("protected "); //$NON-NLS-1$
  255. }
  256. if ((modifiers & ClassFileConstants.AccStatic) != 0) {
  257. output.append("static "); //$NON-NLS-1$
  258. }
  259. if ((modifiers & ClassFileConstants.AccFinal) != 0) {
  260. output.append("final "); //$NON-NLS-1$
  261. }
  262. if ((modifiers & ClassFileConstants.AccSynchronized) != 0) {
  263. output.append("synchronized "); //$NON-NLS-1$
  264. }
  265. if ((modifiers & ClassFileConstants.AccVolatile) != 0) {
  266. output.append("volatile "); //$NON-NLS-1$
  267. }
  268. if ((modifiers & ClassFileConstants.AccTransient) != 0) {
  269. output.append("transient "); //$NON-NLS-1$
  270. }
  271. if ((modifiers & ClassFileConstants.AccNative) != 0) {
  272. output.append("native "); //$NON-NLS-1$
  273. }
  274. if ((modifiers & ClassFileConstants.AccAbstract) != 0) {
  275. output.append("abstract "); //$NON-NLS-1$
  276. }
  277. return output;
  278. }
  279. public StringBuilder printExpression(Expression e) {
  280. // TODO other literals
  281. try {
  282. expressionLevel++;
  283. if (e instanceof TypeReference) {
  284. return printTypeReference((TypeReference) e);
  285. } else if (e instanceof IntLiteral) {
  286. return output.append(((IntLiteral) e).value);
  287. } else if (e instanceof CharLiteral) {
  288. return output.append(((CharLiteral) e).source());
  289. } else if (e instanceof DoubleLiteral) {
  290. return output.append(((DoubleLiteral) e).source());
  291. } else if (e instanceof LongLiteral) {
  292. return output.append(((LongLiteral) e).source());
  293. } else if (e instanceof FloatLiteral) {
  294. return output.append(((FloatLiteral) e).source());
  295. } else if (e instanceof TrueLiteral) {
  296. return output.append(((TrueLiteral) e).source());
  297. } else if (e instanceof FalseLiteral) {
  298. return output.append(((FalseLiteral) e).source());
  299. } else if (e instanceof ClassLiteralAccess) {
  300. printTypeReference(((ClassLiteralAccess) e).type);
  301. return output.append(".class");
  302. } else if (e instanceof StringLiteral) {
  303. return printStringLiteral((StringLiteral) e);
  304. } else if (e instanceof SingleNameReference) {
  305. SingleNameReference snr = (SingleNameReference) e;
  306. if (snr.binding instanceof ReferenceBinding) {
  307. output.append(CharOperation.concatWith(((ReferenceBinding) snr.binding).compoundName, '.'));
  308. } else if (snr.binding instanceof ParameterizedFieldBinding) {
  309. ParameterizedFieldBinding pfb = (ParameterizedFieldBinding) snr.binding;
  310. output.append(pfb.name);
  311. } else if (snr.binding instanceof LocalVariableBinding) {
  312. LocalVariableBinding lvb = (LocalVariableBinding) snr.binding;
  313. output.append(lvb.name);
  314. } else if (snr.binding instanceof FieldBinding) {
  315. FieldBinding fb = (FieldBinding) snr.binding;
  316. ReferenceBinding rb = fb.declaringClass;
  317. if (fb.isStatic()) {
  318. // qualify it
  319. output.append(CharOperation.concatWith(rb.compoundName, '.'));
  320. output.append('.');
  321. output.append(fb.name);
  322. } else {
  323. output.append(snr.token);
  324. }
  325. int stop = 1;
  326. } else {
  327. throwit(snr.binding);
  328. }
  329. return output;
  330. } else if (e instanceof QualifiedNameReference) {
  331. QualifiedNameReference qnr = (QualifiedNameReference) e;
  332. if (qnr.binding instanceof FieldBinding) {
  333. FieldBinding fb = (FieldBinding) qnr.binding;
  334. ReferenceBinding rb = fb.declaringClass;
  335. if (fb.isStatic()) {
  336. output.append(CharOperation.concatWith(rb.compoundName, '.'));
  337. output.append('.');
  338. output.append(fb.name);
  339. } else {
  340. output.append(CharOperation.concatWith(qnr.tokens, '.'));// ((ReferenceBinding) qnr.binding).compoundName,
  341. }
  342. } else if (qnr.binding instanceof ReferenceBinding) {
  343. output.append(CharOperation.concatWith(qnr.tokens, '.'));// ((ReferenceBinding) qnr.binding).compoundName,
  344. // '.'));
  345. } else if (qnr.binding instanceof LocalVariableBinding) {
  346. output.append(CharOperation.concatWith(qnr.tokens, '.'));// oncatWith(((LocalVariableBinding)
  347. // qnr.binding).compoundName, '.'));
  348. // LocalVariableBinding lvb = (LocalVariableBinding) qnr.binding;
  349. // output.append(lvb.name);
  350. } else {
  351. throwit(qnr.binding);
  352. }
  353. // output.append(qnr.actualReceiverType.debugName());
  354. // output.append('.');
  355. // output.append(qnr.tokens[qnr.tokens.length - 1]);
  356. return output;
  357. } else if (e instanceof ArrayReference) {
  358. ArrayReference ar = (ArrayReference) e;
  359. printExpression(ar.receiver).append('[');
  360. return printExpression(ar.position).append(']');
  361. } else if (e instanceof MessageSend) {
  362. return printMessageSendStatement((MessageSend) e);
  363. } else if (e instanceof ThisReference) {
  364. ThisReference tr = (ThisReference) e;
  365. if (tr.isImplicitThis()) {
  366. return output;
  367. }
  368. return output.append("this"); //$NON-NLS-1$
  369. } else if (e instanceof CastExpression) {
  370. return printCastExpression((CastExpression) e);
  371. } else if (e instanceof BinaryExpression) {
  372. if (expressionLevel != 0) {
  373. output.append('(');
  374. }
  375. expressionLevel++;
  376. BinaryExpression be = (BinaryExpression) e;
  377. printExpression(be.left).append(' ').append(be.operatorToString()).append(' ');
  378. printExpression(be.right);
  379. expressionLevel--;
  380. if (expressionLevel != 0) {
  381. output.append(')');
  382. }
  383. return output;
  384. } else if (e instanceof NullLiteral) {
  385. return output.append("null");
  386. } else if (e instanceof QualifiedAllocationExpression) {
  387. return printQualifiedAllocationExpression((QualifiedAllocationExpression) e, 0);
  388. } else if (e instanceof AllocationExpression) {
  389. return printAllocationExpression((AllocationExpression) e);
  390. } else if (e instanceof ArrayInitializer) {
  391. return printArrayInitialized((ArrayInitializer) e);
  392. } else if (e instanceof FieldReference) {
  393. return printFieldReference((FieldReference) e);
  394. } else if (e instanceof UnaryExpression) {
  395. return printUnaryExpression((UnaryExpression) e);
  396. } else if (e instanceof InstanceOfExpression) {
  397. return printInstanceOfExpression((InstanceOfExpression) e);
  398. } else if (e instanceof Assignment) {
  399. return printAssignment((Assignment) e, false);
  400. } else if (e instanceof ArrayAllocationExpression) {
  401. return printArrayAllocationExpression((ArrayAllocationExpression) e);
  402. } else if (e instanceof ConditionalExpression) {
  403. return printConditionalExpression((ConditionalExpression) e);
  404. }
  405. throwit(e);
  406. return output;
  407. } finally {
  408. expressionLevel--;
  409. }
  410. }
  411. private StringBuilder printConditionalExpression(ConditionalExpression e) {
  412. if (expressionLevel != 0) {
  413. output.append('(');
  414. }
  415. expressionLevel++;
  416. printExpression(e.condition).append(" ? ");
  417. printExpression(e.valueIfTrue).append(" : ");
  418. printExpression(e.valueIfFalse);
  419. expressionLevel--;
  420. if (expressionLevel != 0) {
  421. output.append(')');
  422. }
  423. return output;
  424. }
  425. private StringBuilder printArrayAllocationExpression(ArrayAllocationExpression aae) {
  426. output.append("new "); //$NON-NLS-1$
  427. printTypeReference(aae.type);
  428. for (int i = 0; i < aae.dimensions.length; i++) {
  429. if (aae.dimensions[i] == null) {
  430. output.append("[]"); //$NON-NLS-1$
  431. } else {
  432. output.append('[');
  433. printExpression(aae.dimensions[i]);
  434. output.append(']');
  435. }
  436. }
  437. if (aae.initializer != null) {
  438. printExpression(aae.initializer);
  439. }
  440. return output;
  441. }
  442. private StringBuilder printInstanceOfExpression(InstanceOfExpression e) {
  443. if (expressionLevel != 0) {
  444. output.append('(');
  445. }
  446. expressionLevel++;
  447. printExpression(e.expression).append(" instanceof "); //$NON-NLS-1$
  448. printTypeReference(e.type);
  449. expressionLevel--;
  450. if (expressionLevel != 0) {
  451. output.append(')');
  452. }
  453. return output;
  454. }
  455. private StringBuilder printUnaryExpression(UnaryExpression e) {
  456. if (expressionLevel != 0) {
  457. output.append('(');
  458. }
  459. expressionLevel++;
  460. output.append(e.operatorToString()).append(' ');
  461. printExpression(e.expression);
  462. expressionLevel--;
  463. if (expressionLevel != 0) {
  464. output.append(')');
  465. }
  466. return output;
  467. }
  468. private StringBuilder printFieldReference(FieldReference fr) {
  469. printExpression(fr.receiver).append('.').append(fr.token);
  470. return output;
  471. }
  472. private StringBuilder printArrayInitialized(ArrayInitializer e) {
  473. output.append('{');
  474. if (e.expressions != null) {
  475. // int j = 20;
  476. for (int i = 0; i < e.expressions.length; i++) {
  477. if (i > 0) {
  478. output.append(", "); //$NON-NLS-1$
  479. }
  480. printExpression(e.expressions[i]);
  481. // expressions[i].printExpression(0, output);
  482. // j--;
  483. // if (j == 0) {
  484. // output.append('\n');
  485. // printIndent(indent + 1, output);
  486. // j = 20;
  487. // }
  488. }
  489. }
  490. return output.append('}');
  491. }
  492. private StringBuilder printCastExpression(CastExpression e) {
  493. output.append('(');
  494. output.append('(');
  495. printExpression(e.type).append(") "); //$NON-NLS-1$
  496. printExpression(e.expression);
  497. output.append(')');
  498. return output;
  499. }
  500. private StringBuilder printStringLiteral(StringLiteral e) {
  501. output.append('\"');
  502. for (int i = 0; i < e.source().length; i++) {
  503. switch (e.source()[i]) {
  504. case '\b':
  505. output.append("\\b"); //$NON-NLS-1$
  506. break;
  507. case '\t':
  508. output.append("\\t"); //$NON-NLS-1$
  509. break;
  510. case '\n':
  511. output.append("\\n"); //$NON-NLS-1$
  512. break;
  513. case '\f':
  514. output.append("\\f"); //$NON-NLS-1$
  515. break;
  516. case '\r':
  517. output.append("\\r"); //$NON-NLS-1$
  518. break;
  519. case '\"':
  520. output.append("\\\""); //$NON-NLS-1$
  521. break;
  522. case '\'':
  523. output.append("\\'"); //$NON-NLS-1$
  524. break;
  525. case '\\': // take care not to display the escape as a potential real char
  526. output.append("\\\\"); //$NON-NLS-1$
  527. break;
  528. default:
  529. output.append(e.source()[i]);
  530. }
  531. }
  532. output.append('\"');
  533. return output;
  534. }
  535. public StringBuilder printExpression(SingleTypeReference str) {
  536. output.append(str.token);
  537. return output;
  538. }
  539. protected StringBuilder printStatement(Statement statement, int indent) {
  540. return printStatement(statement, indent, true);
  541. }
  542. protected StringBuilder printStatement(Statement statement, int indent, boolean applyIndent) {
  543. if (statement instanceof ReturnStatement) {
  544. printIndent(indent).append("return "); //$NON-NLS-1$
  545. if (((ReturnStatement) statement).expression != null) {
  546. printExpression(((ReturnStatement) statement).expression);
  547. }
  548. return output.append(';');
  549. } else if (statement instanceof PostfixExpression) {
  550. return printPostfixExpression((PostfixExpression) statement);
  551. } else if (statement instanceof PrefixExpression) {
  552. return printPrefixExpression((PrefixExpression) statement);
  553. } else if (statement instanceof MessageSend) {
  554. printIndent(indent);
  555. MessageSend ms = (MessageSend) statement;
  556. printMessageSendStatement(ms);
  557. return output.append(';');
  558. } else if (statement instanceof QualifiedAllocationExpression) {
  559. printIndent(indent);
  560. printQualifiedAllocationExpression((QualifiedAllocationExpression) statement, indent);
  561. return output.append(';');
  562. } else if (statement instanceof Assignment) {
  563. printIndent(indent);
  564. printAssignment((Assignment) statement);
  565. return output.append(';');
  566. } else if (statement instanceof TryStatement) {
  567. printTryStatement((TryStatement) statement, indent);
  568. return output;
  569. } else if (statement instanceof IfStatement) {
  570. printIndent(indent);
  571. IfStatement is = (IfStatement) statement;
  572. printIndent(indent).append("if ("); //$NON-NLS-1$
  573. printExpression(is.condition).append(")\n"); //$NON-NLS-1$
  574. printStatement(is.thenStatement, indent + 2);
  575. if (is.elseStatement != null) {
  576. output.append('\n');
  577. printIndent(indent);
  578. output.append("else\n"); //$NON-NLS-1$
  579. printStatement(is.elseStatement, indent + 2);
  580. }
  581. return output;
  582. } else if (statement instanceof Block) {
  583. printBlock((Block) statement, indent, applyIndent);
  584. return output;
  585. } else if (statement instanceof LocalDeclaration) {
  586. return printLocalDeclaration((LocalDeclaration) statement, indent);
  587. } else if (statement instanceof SwitchExpression) {
  588. return printSwitchExpression((SwitchExpression) statement, indent);
  589. } else if (statement instanceof SwitchStatement) {
  590. return printSwitchStatement((SwitchStatement) statement, indent);
  591. } else if (statement instanceof CaseStatement) {
  592. return printCaseStatement((CaseStatement) statement, indent);
  593. } else if (statement instanceof BreakStatement) {
  594. return printBreakStatement((BreakStatement) statement, indent);
  595. } else if (statement instanceof ThrowStatement) {
  596. return printThrowStatement((ThrowStatement) statement, indent);
  597. } else if (statement instanceof TypeDeclaration) {
  598. return printTypeDeclaration((TypeDeclaration) statement, indent, false).append(';');
  599. } else if (statement instanceof AssertStatement) {
  600. return printAssertStatement((AssertStatement) statement, indent);
  601. } else if (statement instanceof ForStatement) {
  602. return printForStatement((ForStatement) statement, indent);
  603. } else if (statement instanceof ForeachStatement) {
  604. return printForeachStatement((ForeachStatement) statement, indent);
  605. }
  606. System.err.println(statement);
  607. System.err.println(statement.getClass().getName());
  608. throwit(statement);
  609. return output;
  610. }
  611. private StringBuilder printPostfixExpression(PostfixExpression pe) {
  612. printExpression(pe.lhs);
  613. output.append(' ');
  614. output.append(pe.operatorToString());
  615. return output;
  616. }
  617. private StringBuilder printPrefixExpression(PrefixExpression pe) {
  618. output.append(pe.operatorToString());
  619. output.append(' ');
  620. printExpression(pe.lhs);
  621. return output;
  622. }
  623. public StringBuilder printAsExpression(LocalDeclaration ld, int indent) {
  624. // printIndent(indent);
  625. printModifiers(ld.modifiers);
  626. if (ld.annotations != null) {
  627. printAnnotations(ld.annotations);
  628. }
  629. if (ld.type != null) {
  630. printTypeReference(ld.type).append(' ');
  631. }
  632. output.append(ld.name);
  633. switch (ld.getKind()) {
  634. case AbstractVariableDeclaration.ENUM_CONSTANT:
  635. if (ld.initialization != null) {
  636. printExpression(ld.initialization);
  637. }
  638. break;
  639. default:
  640. if (ld.initialization != null) {
  641. output.append(" = "); //$NON-NLS-1$
  642. printExpression(ld.initialization);
  643. }
  644. }
  645. return output;
  646. }
  647. private StringBuilder printForeachStatement(ForeachStatement statement, int indent) {
  648. printIndent(indent).append("for ("); //$NON-NLS-1$
  649. printAsExpression(statement.elementVariable, indent);
  650. output.append(" : ");//$NON-NLS-1$
  651. printExpression(statement.collection).append(") "); //$NON-NLS-1$
  652. // block
  653. if (statement.action == null) {
  654. output.append(';');
  655. } else {
  656. printStatement(statement.action, indent + 1);
  657. }
  658. return output;
  659. }
  660. private StringBuilder printForStatement(ForStatement fs, int indent) {
  661. printIndent(indent).append("for ("); //$NON-NLS-1$
  662. // inits
  663. if (fs.initializations != null) {
  664. for (int i = 0; i < fs.initializations.length; i++) {
  665. // nice only with expressions
  666. if (i > 0) {
  667. output.append(", "); //$NON-NLS-1$
  668. }
  669. printStatement(fs.initializations[i], 0);
  670. }
  671. }
  672. if (!output.toString().endsWith(";")) {
  673. output.append("; "); //$NON-NLS-1$
  674. }
  675. // cond
  676. if (fs.condition != null) {
  677. printExpression(fs.condition);
  678. }
  679. output.append("; "); //$NON-NLS-1$
  680. // updates
  681. if (fs.increments != null) {
  682. for (int i = 0; i < fs.increments.length; i++) {
  683. if (i > 0) {
  684. output.append(", "); //$NON-NLS-1$
  685. }
  686. printStatement(fs.increments[i], 0);
  687. }
  688. }
  689. output.append(") "); //$NON-NLS-1$
  690. // block
  691. if (fs.action == null) {
  692. output.append(';');
  693. } else {
  694. // output.append('\n');
  695. printStatement(fs.action, indent + 1, false);
  696. }
  697. return output;
  698. }
  699. private StringBuilder printAssertStatement(AssertStatement as, int indent) {
  700. printIndent(indent);
  701. output.append("assert "); //$NON-NLS-1$
  702. printExpression(as.assertExpression);
  703. if (as.exceptionArgument != null) {
  704. output.append(": "); //$NON-NLS-1$
  705. printExpression(as.exceptionArgument);
  706. }
  707. return output.append(';');
  708. }
  709. private StringBuilder printThrowStatement(ThrowStatement ts, int indent) {
  710. printIndent(indent).append("throw "); //$NON-NLS-1$
  711. printExpression(ts.exception);
  712. return output.append(';');
  713. }
  714. private StringBuilder printBreakStatement(BreakStatement statement, int indent) {
  715. printIndent(indent).append("break"); //$NON-NLS-1$
  716. if (statement.label != null) {
  717. output.append(' ').append(statement.label);
  718. }
  719. return output.append(';');
  720. }
  721. private StringBuilder printCaseStatement(CaseStatement statement, int indent) {
  722. printIndent(indent);
  723. if (statement.constantExpressions == null) {
  724. output.append("default "); //$NON-NLS-1$
  725. output.append(statement.isExpr ? "->" : ":"); //$NON-NLS-1$ //$NON-NLS-2$
  726. } else {
  727. output.append("case "); //$NON-NLS-1$
  728. for (int i = 0, l = statement.constantExpressions.length; i < l; ++i) {
  729. printExpression(statement.constantExpressions[i]);
  730. if (i < l -1) output.append(',');
  731. }
  732. output.append(statement.isExpr ? " ->" : " :"); //$NON-NLS-1$ //$NON-NLS-2$
  733. }
  734. return output;
  735. }
  736. private StringBuilder printSwitchExpression(SwitchExpression statement, int indent) {
  737. printIndent(indent).append("switch ("); //$NON-NLS-1$
  738. printExpression(statement.expression).append(") {"); //$NON-NLS-1$
  739. if (statement.statements != null) {
  740. for (int i = 0; i < statement.statements.length; i++) {
  741. output.append('\n');
  742. if (statement.statements[i] instanceof CaseStatement) {
  743. printCaseStatement((CaseStatement) statement.statements[i], indent);
  744. } else {
  745. printStatement(statement.statements[i], indent + 2);
  746. }
  747. }
  748. }
  749. output.append("\n"); //$NON-NLS-1$
  750. return printIndent(indent).append('}');
  751. }
  752. private StringBuilder printSwitchStatement(SwitchStatement statement, int indent) {
  753. printIndent(indent).append("switch ("); //$NON-NLS-1$
  754. printExpression(statement.expression).append(") {"); //$NON-NLS-1$
  755. if (statement.statements != null) {
  756. for (int i = 0; i < statement.statements.length; i++) {
  757. output.append('\n');
  758. if (statement.statements[i] instanceof CaseStatement) {
  759. printCaseStatement((CaseStatement) statement.statements[i], indent);
  760. } else {
  761. printStatement(statement.statements[i], indent + 2);
  762. }
  763. }
  764. }
  765. output.append("\n"); //$NON-NLS-1$
  766. return printIndent(indent).append('}');
  767. }
  768. private StringBuilder printLocalDeclaration(LocalDeclaration statement, int indent) {
  769. printAbstractVariableDeclarationAsExpression(statement, indent);
  770. switch (statement.getKind()) {
  771. case AbstractVariableDeclaration.ENUM_CONSTANT:
  772. return output.append(',');
  773. default:
  774. return output.append(';');
  775. }
  776. }
  777. private StringBuilder printAbstractVariableDeclarationAsExpression(AbstractVariableDeclaration avd, int indent) {
  778. printIndent(indent);
  779. printModifiers(avd.modifiers);
  780. if (avd.annotations != null) {
  781. printAnnotations(avd.annotations);
  782. }
  783. if (avd.type != null) {
  784. printTypeReference(avd.type).append(' ');
  785. }
  786. output.append(avd.name);
  787. switch (avd.getKind()) {
  788. case AbstractVariableDeclaration.ENUM_CONSTANT:
  789. if (avd.initialization != null) {
  790. printExpression(avd.initialization);
  791. }
  792. break;
  793. default:
  794. if (avd.initialization != null) {
  795. output.append(" = "); //$NON-NLS-1$
  796. printExpression(avd.initialization);
  797. }
  798. }
  799. return output;
  800. }
  801. private StringBuilder printBlock(Block b, int indent, boolean applyIndent) {
  802. if (applyIndent) {
  803. printIndent(indent);
  804. }
  805. output.append("{\n"); //$NON-NLS-1$
  806. printBody(b, indent);
  807. printIndent(indent);
  808. return output.append('}');
  809. }
  810. public StringBuilder printBody(Block b, int indent) {
  811. if (b.statements == null) {
  812. return output;
  813. }
  814. for (int i = 0; i < b.statements.length; i++) {
  815. printStatement(b.statements[i], indent + 1);
  816. output.append('\n');
  817. }
  818. return output;
  819. }
  820. private StringBuilder printTryStatement(TryStatement statement, int indent) {
  821. printIndent(indent).append("try "); //$NON-NLS-1$
  822. printBlock(statement.tryBlock, indent, false);
  823. // catches
  824. if (statement.catchBlocks != null) {
  825. for (int i = 0; i < statement.catchBlocks.length; i++) {
  826. // output.append('\n');
  827. // printIndent(indent).
  828. output.append(" catch ("); //$NON-NLS-1$
  829. printArgument(statement.catchArguments[i]).append(") "); //$NON-NLS-1$
  830. printBlock(statement.catchBlocks[i], indent, false);
  831. // statement.catchBlocks[i].printStatement(indent + 1, output);
  832. }
  833. }
  834. // finally
  835. if (statement.finallyBlock != null) {
  836. // output.append('\n');
  837. // printIndent(indent).
  838. output.append(" finally "); //$NON-NLS-1$
  839. printBlock(statement.finallyBlock, indent, false);// .printStatement(indent + 1, output);
  840. }
  841. return output;
  842. }
  843. private StringBuilder printAssignment(Assignment statement) {
  844. return printAssignment(statement, expressionLevel != 0);
  845. }
  846. private StringBuilder printAssignment(Assignment statement, boolean parens) {
  847. if (parens) {
  848. output.append('(');
  849. }
  850. printExpression(statement.lhs).append(" = ");
  851. printExpression(statement.expression);
  852. if (parens) {
  853. output.append(')');
  854. }
  855. return output;
  856. }
  857. private StringBuilder printMessageSendStatement(MessageSend ms) {
  858. if (!ms.receiver.isImplicitThis()) {
  859. printExpression(ms.receiver).append('.');
  860. }
  861. if (ms.typeArguments != null) {
  862. output.append('<');
  863. int max = ms.typeArguments.length - 1;
  864. for (int j = 0; j < max; j++) {
  865. printTypeReference(ms.typeArguments[j]);
  866. // ms.typeArguments[j].print(0, output);
  867. output.append(", ");//$NON-NLS-1$
  868. }
  869. printTypeReference(ms.typeArguments[max]);
  870. // ms.typeArguments[max].print(0, output);
  871. output.append('>');
  872. }
  873. output.append(ms.selector).append('(');
  874. if (ms.arguments != null) {
  875. for (int i = 0; i < ms.arguments.length; i++) {
  876. if (i > 0) {
  877. output.append(", "); //$NON-NLS-1$
  878. }
  879. printExpression(ms.arguments[i]);
  880. }
  881. }
  882. return output.append(')');
  883. }
  884. protected StringBuilder printQualifiedAllocationExpression(QualifiedAllocationExpression qae, int indent) {
  885. if (qae.enclosingInstance != null) {
  886. printExpression(qae.enclosingInstance).append('.');
  887. }
  888. printAllocationExpression(qae);
  889. if (qae.anonymousType != null) {
  890. printTypeDeclaration(qae.anonymousType, indent, true);
  891. }
  892. return output;
  893. }
  894. protected StringBuilder printTypeDeclaration(TypeDeclaration td, int indent, boolean isAnonymous) {
  895. if (td.javadoc != null) {
  896. throwit(td);
  897. // td.javadoc.print(indent, output);
  898. }
  899. if ((td.bits & ASTNode.IsAnonymousType) == 0) {
  900. printIndent(tab);
  901. printTypeDeclarationHeader(td);
  902. }
  903. printTypeDeclarationBody(td, indent, isAnonymous);
  904. return output;
  905. }
  906. public StringBuilder printTypeDeclarationBody(TypeDeclaration td, int indent, boolean isAnonymous) {
  907. output.append(" {"); //$NON-NLS-1$
  908. if (td.memberTypes != null) {
  909. for (int i = 0; i < td.memberTypes.length; i++) {
  910. if (td.memberTypes[i] != null) {
  911. output.append('\n');
  912. printTypeDeclaration(td.memberTypes[i], indent + 1, false);
  913. }
  914. }
  915. }
  916. if (td.fields != null) {
  917. for (int fieldI = 0; fieldI < td.fields.length; fieldI++) {
  918. if (td.fields[fieldI] != null) {
  919. output.append('\n');
  920. printFieldDeclaration(td.fields[fieldI], indent + 1);
  921. }
  922. }
  923. }
  924. if (td.methods != null) {
  925. for (int i = 0; i < td.methods.length; i++) {
  926. if (td.methods[i] != null) {
  927. AbstractMethodDeclaration amd = td.methods[i];
  928. if (amd instanceof MethodDeclaration) {
  929. output.append('\n');
  930. printMethodDeclaration(((MethodDeclaration) amd), indent + 1);
  931. } else if (amd instanceof ConstructorDeclaration) {
  932. if (!isAnonymous) {
  933. output.append('\n');
  934. // likely to be just a ctor with name 'x' as set in TypeDeclaration.createDefaultConstructorWithBinding
  935. printConstructorDeclaration(((ConstructorDeclaration) amd), indent + 1);
  936. }
  937. } else {
  938. throwit(amd);
  939. }
  940. }
  941. }
  942. }
  943. output.append('\n');
  944. return printIndent(indent).append('}');
  945. }
  946. protected StringBuilder printFieldDeclaration(FieldDeclaration fd, int indent) {
  947. printIndent(indent);
  948. printModifiers(fd.modifiers);
  949. if (fd.annotations != null) {
  950. printAnnotations(fd.annotations);
  951. }
  952. if (fd.type != null) {
  953. printTypeReference(fd.type).append(' ');
  954. }
  955. output.append(fd.name);
  956. switch (fd.getKind()) {
  957. case AbstractVariableDeclaration.ENUM_CONSTANT:
  958. if (fd.initialization != null) {
  959. printExpression(fd.initialization);
  960. }
  961. break;
  962. default:
  963. if (fd.initialization != null) {
  964. output.append(" = "); //$NON-NLS-1$
  965. printExpression(fd.initialization);
  966. }
  967. }
  968. output.append(';');
  969. return output;
  970. }
  971. protected StringBuilder printConstructorDeclaration(ConstructorDeclaration amd, int tab) {
  972. if (amd.javadoc != null) {
  973. throwit();
  974. // amd.javadoc.print(tab, output);
  975. }
  976. printIndent(tab);
  977. if (amd.annotations != null) {
  978. printAnnotations(amd.annotations);
  979. }
  980. printModifiers(amd.modifiers);
  981. TypeParameter[] typeParams = amd.typeParameters();
  982. if (typeParams != null) {
  983. output.append('<');
  984. int max = typeParams.length - 1;
  985. for (int j = 0; j < max; j++) {
  986. printTypeParameter(typeParams[j]);
  987. // typeParams[j].print(0, output);
  988. output.append(", ");//$NON-NLS-1$
  989. }
  990. printTypeParameter(typeParams[max]);
  991. output.append('>');
  992. }
  993. // TODO confirm selector is right name
  994. output.append(amd.selector).append('(');
  995. if (amd.arguments != null) {
  996. for (int i = 0; i < amd.arguments.length; i++) {
  997. if (i > 0) {
  998. output.append(", "); //$NON-NLS-1$
  999. }
  1000. printArgument(amd.arguments[i]);
  1001. }
  1002. }
  1003. output.append(')');
  1004. if (amd.thrownExceptions != null) {
  1005. output.append(" throws "); //$NON-NLS-1$
  1006. for (int i = 0; i < amd.thrownExceptions.length; i++) {
  1007. if (i > 0) {
  1008. output.append(", "); //$NON-NLS-1$
  1009. }
  1010. throwit();
  1011. // this.thrownExceptions[i].print(0, output);
  1012. }
  1013. }
  1014. printBody(amd, tab + 1);
  1015. return output;
  1016. }
  1017. private StringBuilder printMethodDeclaration(MethodDeclaration amd, int tab) {
  1018. if (amd.javadoc != null) {
  1019. throwit();
  1020. // amd.javadoc.print(tab, output);
  1021. }
  1022. printIndent(tab);
  1023. if (amd.annotations != null) {
  1024. printAnnotations(amd.annotations);
  1025. }
  1026. printModifiers(amd.modifiers);
  1027. TypeParameter[] typeParams = amd.typeParameters();
  1028. if (typeParams != null) {
  1029. output.append('<');
  1030. int max = typeParams.length - 1;
  1031. for (int j = 0; j < max; j++) {
  1032. printTypeParameter(typeParams[j]);
  1033. // typeParams[j].print(0, output);
  1034. output.append(", ");//$NON-NLS-1$
  1035. }
  1036. printTypeParameter(typeParams[max]);
  1037. output.append('>');
  1038. }
  1039. printReturnType(amd.returnType).append(amd.selector).append('(');
  1040. if (amd.arguments != null) {
  1041. for (int i = 0; i < amd.arguments.length; i++) {
  1042. if (i > 0) {
  1043. output.append(", "); //$NON-NLS-1$
  1044. }
  1045. printArgument(amd.arguments[i]);
  1046. }
  1047. }
  1048. output.append(')');
  1049. if (amd.thrownExceptions != null) {
  1050. output.append(" throws "); //$NON-NLS-1$
  1051. for (int i = 0; i < amd.thrownExceptions.length; i++) {
  1052. if (i > 0) {
  1053. output.append(", "); //$NON-NLS-1$
  1054. }
  1055. throwit();
  1056. // this.thrownExceptions[i].print(0, output);
  1057. }
  1058. }
  1059. printBody(amd, tab + 1);
  1060. return output;
  1061. }
  1062. public StringBuilder printReturnType(TypeReference tr) {
  1063. if (tr == null) {
  1064. return output;
  1065. }
  1066. return printExpression(tr).append(' ');
  1067. }
  1068. public final static int kind(int flags) {
  1069. switch (flags & (ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation | ClassFileConstants.AccEnum)) {
  1070. case ClassFileConstants.AccInterface:
  1071. return TypeDeclaration.INTERFACE_DECL;
  1072. case ClassFileConstants.AccInterface | ClassFileConstants.AccAnnotation:
  1073. return TypeDeclaration.ANNOTATION_TYPE_DECL;
  1074. case ClassFileConstants.AccEnum:
  1075. return TypeDeclaration.ENUM_DECL;
  1076. default:
  1077. return TypeDeclaration.CLASS_DECL;
  1078. }
  1079. }
  1080. protected StringBuilder printTypeDeclarationHeader(TypeDeclaration td) {
  1081. printModifiers(td.modifiers);
  1082. if (td.annotations != null) {
  1083. printAnnotations(td.annotations);
  1084. }
  1085. switch (kind(td.modifiers)) {
  1086. case TypeDeclaration.CLASS_DECL:
  1087. output.append("class "); //$NON-NLS-1$
  1088. break;
  1089. case TypeDeclaration.INTERFACE_DECL:
  1090. output.append("interface "); //$NON-NLS-1$
  1091. break;
  1092. case TypeDeclaration.ENUM_DECL:
  1093. output.append("enum "); //$NON-NLS-1$
  1094. break;
  1095. case TypeDeclaration.ANNOTATION_TYPE_DECL:
  1096. output.append("@interface "); //$NON-NLS-1$
  1097. break;
  1098. }
  1099. output.append(td.name);
  1100. if (td.typeParameters != null) {
  1101. output.append("<");//$NON-NLS-1$
  1102. for (int i = 0; i < td.typeParameters.length; i++) {
  1103. if (i > 0) {
  1104. output.append(", "); //$NON-NLS-1$
  1105. }
  1106. printTypeParameter(td.typeParameters[i]);
  1107. // this.typeParameters[i].print(0, output);
  1108. }
  1109. output.append(">");//$NON-NLS-1$
  1110. }
  1111. if (td.superclass != null) {
  1112. output.append(" extends "); //$NON-NLS-1$
  1113. printTypeReference(td.superclass);
  1114. }
  1115. if (td.superInterfaces != null && td.superInterfaces.length > 0) {
  1116. switch (kind(td.modifiers)) {
  1117. case TypeDeclaration.CLASS_DECL:
  1118. case TypeDeclaration.ENUM_DECL:
  1119. output.append(" implements "); //$NON-NLS-1$
  1120. break;
  1121. case TypeDeclaration.INTERFACE_DECL:
  1122. case TypeDeclaration.ANNOTATION_TYPE_DECL:
  1123. output.append(" extends "); //$NON-NLS-1$
  1124. break;
  1125. }
  1126. for (int i = 0; i < td.superInterfaces.length; i++) {
  1127. if (i > 0) {
  1128. output.append(", "); //$NON-NLS-1$
  1129. }
  1130. printTypeReference(td.superInterfaces[i]);
  1131. }
  1132. }
  1133. return output;
  1134. }
  1135. protected StringBuilder printTypeParameter(TypeParameter tp) {
  1136. output.append(tp.name);
  1137. if (tp.type != null) {
  1138. output.append(" extends "); //$NON-NLS-1$
  1139. printTypeReference(tp.type);
  1140. }
  1141. if (tp.bounds != null) {
  1142. for (int i = 0; i < tp.bounds.length; i++) {
  1143. output.append(" & "); //$NON-NLS-1$
  1144. printTypeReference(tp.bounds[i]);
  1145. }
  1146. }
  1147. return output;
  1148. }
  1149. protected StringBuilder printAllocationExpression(AllocationExpression ae) {
  1150. if (ae.type != null) { // type null for enum constant initializations
  1151. output.append("new "); //$NON-NLS-1$
  1152. }
  1153. if (ae.typeArguments != null) {
  1154. output.append('<');
  1155. int max = ae.typeArguments.length - 1;
  1156. for (int j = 0; j < max; j++) {
  1157. printTypeReference(ae.typeArguments[j]);
  1158. output.append(", ");//$NON-NLS-1$
  1159. }
  1160. printTypeReference(ae.typeArguments[max]);
  1161. output.append('>');
  1162. }
  1163. if (ae.type != null) { // type null for enum constant initializations
  1164. printExpression(ae.type);
  1165. }
  1166. output.append('(');
  1167. if (ae.arguments != null) {
  1168. for (int i = 0; i < ae.arguments.length; i++) {
  1169. if (i > 0) {
  1170. output.append(", "); //$NON-NLS-1$
  1171. }
  1172. printExpression(ae.arguments[i]);
  1173. }
  1174. }
  1175. return output.append(')');
  1176. }
  1177. }