Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

AstUtil.java 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. /* *******************************************************************
  2. * Copyright (c) 2002 Palo Alto Research Center, Incorporated (PARC).
  3. * All rights reserved.
  4. * This program and the accompanying materials are made available
  5. * under the terms of the Common Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/cpl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler.ast;
  13. import java.lang.reflect.Modifier;
  14. import java.util.*;
  15. import java.util.List;
  16. import org.aspectj.weaver.*;
  17. import org.aspectj.weaver.AjAttribute.AjSynthetic;
  18. import org.aspectj.weaver.ast.ASTNode;
  19. import org.aspectj.weaver.patterns.WildTypePattern;
  20. import org.eclipse.jdt.internal.compiler.ClassFile;
  21. import org.eclipse.jdt.internal.compiler.ast.*;
  22. import org.eclipse.jdt.internal.compiler.ast.ReturnStatement;
  23. import org.eclipse.jdt.internal.compiler.codegen.CodeStream;
  24. import org.eclipse.jdt.internal.compiler.env.IConstants;
  25. import org.eclipse.jdt.internal.compiler.impl.Constant;
  26. import org.eclipse.jdt.internal.compiler.lookup.*;
  27. import org.eclipse.jdt.internal.compiler.util.CharOperation;
  28. public class AstUtil {
  29. private AstUtil() {}
  30. public static void addMethodBinding(SourceTypeBinding sourceType, MethodBinding method) {
  31. int len = sourceType.methods.length;
  32. MethodBinding[] temp = new MethodBinding[len + 1];
  33. System.arraycopy(sourceType.methods, 0, temp, 0, len);
  34. temp[len] = method;
  35. sourceType.methods = temp;
  36. }
  37. public static void addMethodDeclaration(TypeDeclaration typeDec, AbstractMethodDeclaration dec) {
  38. AbstractMethodDeclaration[] methods = typeDec.methods;
  39. int len = methods.length;
  40. AbstractMethodDeclaration[] newMethods = new AbstractMethodDeclaration[len+1];
  41. System.arraycopy(methods, 0, newMethods, 0, len);
  42. newMethods[len] = dec;
  43. typeDec.methods = newMethods;
  44. }
  45. public static Argument makeFinalArgument(char[] name, TypeBinding typeBinding) {
  46. long pos = 0; //XXX encode start and end location
  47. LocalVariableBinding binding =
  48. new LocalVariableBinding(name, typeBinding, Modifier.FINAL, true);
  49. Argument ret = new Argument(name, pos, makeTypeReference(typeBinding), Modifier.FINAL);
  50. ret.binding = binding;
  51. return ret;
  52. }
  53. public static TypeReference makeTypeReference(TypeBinding binding) {
  54. // ??? does this work for primitives
  55. QualifiedTypeReference ref =
  56. new QualifiedTypeReference(new char[][] {binding.sourceName()}, binding, new long[] {0}); //???
  57. ref.constant = Constant.NotAConstant;
  58. return ref;
  59. }
  60. public static NameReference makeNameReference(TypeBinding binding) {
  61. QualifiedNameReference ref =
  62. new QualifiedNameReference(new char[][] {binding.sourceName()}, 0, 0);
  63. ref.binding = binding; ref.constant = Constant.NotAConstant;
  64. return ref;
  65. }
  66. public static ReturnStatement makeReturnStatement(Expression expr) {
  67. return new ReturnStatement(expr, 0, 0);
  68. }
  69. public static MethodDeclaration makeMethodDeclaration(
  70. MethodBinding binding)
  71. {
  72. MethodDeclaration ret = new MethodDeclaration(null);
  73. ret.binding = binding;
  74. int nargs = binding.parameters.length;
  75. ret.arguments = new Argument[nargs];
  76. for (int i=0; i < nargs; i++) {
  77. ret.arguments[i] = makeFinalArgument(("arg"+i).toCharArray(),
  78. binding.parameters[i]);
  79. }
  80. return ret;
  81. }
  82. public static void setStatements(
  83. MethodDeclaration ret, List statements)
  84. {
  85. ret.statements =
  86. (Statement[])statements.toArray(new Statement[statements.size()]);
  87. }
  88. public static SingleNameReference makeLocalVariableReference(
  89. LocalVariableBinding binding)
  90. {
  91. SingleNameReference ret = new SingleNameReference(binding.name, 0);
  92. ret.binding = binding;
  93. ret.codegenBinding = binding;
  94. ret.constant = AstNode.NotAConstant;
  95. ret.bits &= ~AstNode.RestrictiveFlagMASK; // clear bits
  96. ret.bits |= BindingIds.VARIABLE;
  97. return ret;
  98. }
  99. public static SingleNameReference makeResolvedLocalVariableReference(
  100. LocalVariableBinding binding)
  101. {
  102. SingleNameReference ret = new SingleNameReference(binding.name, 0);
  103. ret.binding = binding;
  104. ret.codegenBinding = binding;
  105. ret.constant = AstNode.NotAConstant;
  106. ret.bits &= ~AstNode.RestrictiveFlagMASK; // clear bits
  107. ret.bits |= BindingIds.LOCAL;
  108. return ret;
  109. }
  110. public static int makePublic(int modifiers) {
  111. return makePackageVisible(modifiers) | IConstants.AccPublic;
  112. }
  113. public static int makePackageVisible(int modifiers) {
  114. modifiers &= ~(IConstants.AccPublic | IConstants.AccPrivate | IConstants.AccProtected);
  115. return modifiers;
  116. }
  117. public static CompilationUnitScope getCompilationUnitScope(Scope scope) {
  118. if (scope instanceof CompilationUnitScope) {
  119. return (CompilationUnitScope)scope;
  120. }
  121. return getCompilationUnitScope(scope.parent);
  122. }
  123. public static void generateParameterLoads(TypeBinding[] parameters, CodeStream codeStream) {
  124. int paramIndex = 0;
  125. int varIndex = 0;
  126. while (paramIndex < parameters.length) {
  127. TypeBinding param = parameters[paramIndex++];
  128. codeStream.load(param, varIndex);
  129. varIndex += slotsNeeded(param);
  130. }
  131. }
  132. public static void generateReturn(TypeBinding returnType, CodeStream codeStream) {
  133. if (returnType.id == TypeIds.T_void) {
  134. codeStream.return_();
  135. } else if (returnType.isBaseType()) {
  136. switch (returnType.id) {
  137. case TypeBinding.T_boolean :
  138. case TypeBinding.T_int :
  139. case TypeBinding.T_byte :
  140. case TypeBinding.T_short :
  141. case TypeBinding.T_char :
  142. codeStream.ireturn();
  143. break;
  144. case TypeBinding.T_float :
  145. codeStream.freturn();
  146. break;
  147. case TypeBinding.T_long :
  148. codeStream.lreturn();
  149. break;
  150. case TypeBinding.T_double :
  151. codeStream.dreturn();
  152. break;
  153. default :
  154. throw new RuntimeException("huh");
  155. }
  156. } else {
  157. codeStream.areturn();
  158. }
  159. }
  160. //XXX this could be inconsistent for wierd case, i.e. a class named "java_lang_String"
  161. public static char[] makeMangledName(ReferenceBinding type) {
  162. return CharOperation.concatWith(type.compoundName, '_');
  163. }
  164. public static final char[] PREFIX = "ajc".toCharArray();
  165. //XXX not efficient
  166. public static char[] makeAjcMangledName(char[] kind, ReferenceBinding type, char[] name) {
  167. return CharOperation.concat(
  168. CharOperation.concat(PREFIX, new char[] {'$'}, kind), '$', makeMangledName(type), '$', name);
  169. }
  170. public static char[] makeAjcMangledName(char[] kind, char[] p, char[] name) {
  171. return CharOperation.concat(
  172. CharOperation.concat(PREFIX, new char[] {'$'}, kind), '$', p, '$', name);
  173. }
  174. public static List getAjSyntheticAttribute() {
  175. ArrayList ret = new ArrayList(1);
  176. ret.add(new EclipseAttributeAdapter(new AjAttribute.AjSynthetic()));
  177. return ret;
  178. }
  179. public static long makeLongPos(int start, int end) {
  180. return (long)end | ((long)start << 32);
  181. }
  182. public static char[][] getCompoundName(String string) {
  183. return WildTypePattern.splitNames(string);
  184. }
  185. public static TypeBinding[] insert(
  186. TypeBinding first,
  187. TypeBinding[] rest) {
  188. if (rest == null) {
  189. return new TypeBinding[] {first};
  190. }
  191. int len = rest.length;
  192. TypeBinding[] ret = new TypeBinding[len+1];
  193. ret[0] = first;
  194. System.arraycopy(rest, 0, ret, 1, len);
  195. return ret;
  196. }
  197. public static Argument[] insert(
  198. Argument first,
  199. Argument[] rest) {
  200. if (rest == null) {
  201. return new Argument[] {first};
  202. }
  203. int len = rest.length;
  204. Argument[] ret = new Argument[len+1];
  205. ret[0] = first;
  206. System.arraycopy(rest, 0, ret, 1, len);
  207. return ret;
  208. }
  209. public static Argument[] copyArguments(Argument[] inArgs) {
  210. if (inArgs == null) return new Argument[] {};
  211. int len = inArgs.length;
  212. Argument[] outArgs = new Argument[len];
  213. //??? we're not sure whether or not copying these is okay
  214. System.arraycopy(inArgs, 0, outArgs, 0, len);
  215. return outArgs;
  216. }
  217. public static Statement[] remove(int i, Statement[] statements) {
  218. int len = statements.length;
  219. Statement[] ret = new Statement[len-1];
  220. System.arraycopy(statements, 0, ret, 0, i);
  221. System.arraycopy(statements, i+1, ret, i, len-i-1);
  222. return ret;
  223. }
  224. public static int slotsNeeded(TypeBinding type) {
  225. if (type == BaseTypes.DoubleBinding || type == BaseTypes.LongBinding) return 2;
  226. else return 1;
  227. }
  228. }