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.

EclipseFactory.java 10.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  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.lookup;
  13. import java.util.*;
  14. import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration;
  15. import org.aspectj.ajdt.internal.compiler.ast.AstUtil;
  16. import org.aspectj.ajdt.internal.core.builder.AjBuildManager;
  17. import org.aspectj.ajdt.internal.core.builder.AsmBuilder;
  18. import org.aspectj.bridge.ISourceLocation;
  19. import org.aspectj.bridge.IMessage.Kind;
  20. import org.aspectj.weaver.*;
  21. import org.eclipse.jdt.internal.compiler.ast.*;
  22. import org.eclipse.jdt.internal.compiler.impl.Constant;
  23. import org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
  24. import org.eclipse.jdt.internal.compiler.lookup.*;
  25. import org.eclipse.jdt.internal.compiler.util.CharOperation;
  26. /**
  27. *
  28. * @author Jim Hugunin
  29. */
  30. public class EclipseFactory {
  31. public static boolean DEBUG = false;
  32. public AjBuildManager buildManager;
  33. private LookupEnvironment lookupEnvironment;
  34. private Map/*TypeX, TypeBinding*/ typexToBinding = new HashMap();
  35. //XXX currently unused
  36. private Map/*TypeBinding, ResolvedTypeX*/ bindingToResolvedTypeX = new HashMap();
  37. public static EclipseFactory fromLookupEnvironment(LookupEnvironment env) {
  38. AjLookupEnvironment aenv = (AjLookupEnvironment)env;
  39. return aenv.factory;
  40. }
  41. public static EclipseFactory fromScopeLookupEnvironment(Scope scope) {
  42. return fromLookupEnvironment(AstUtil.getCompilationUnitScope(scope).environment);
  43. }
  44. public EclipseFactory(LookupEnvironment lookupEnvironment) {
  45. this.lookupEnvironment = lookupEnvironment;
  46. }
  47. public World getWorld() {
  48. return buildManager.getWorld();
  49. }
  50. public void showMessage(
  51. Kind kind,
  52. String message,
  53. ISourceLocation loc1,
  54. ISourceLocation loc2)
  55. {
  56. getWorld().showMessage(kind, message, loc1, loc2);
  57. }
  58. public ResolvedTypeX fromEclipse(ReferenceBinding binding) {
  59. if (binding == null) return ResolvedTypeX.MISSING;
  60. //??? this seems terribly inefficient
  61. //System.err.println("resolving: " + binding.getClass() + ", name = " + getName(binding));
  62. ResolvedTypeX ret = getWorld().resolve(fromBinding(binding));
  63. //System.err.println(" got: " + ret);
  64. return ret;
  65. }
  66. public ResolvedTypeX[] fromEclipse(ReferenceBinding[] bindings) {
  67. if (bindings == null) {
  68. return ResolvedTypeX.NONE;
  69. }
  70. int len = bindings.length;
  71. ResolvedTypeX[] ret = new ResolvedTypeX[len];
  72. for (int i=0; i < len; i++) {
  73. ret[i] = fromEclipse(bindings[i]);
  74. }
  75. return ret;
  76. }
  77. private static String getName(TypeBinding binding) {
  78. String packageName = new String(binding.qualifiedPackageName());
  79. String className = new String(binding.qualifiedSourceName()).replace('.', '$');
  80. if (packageName.length() > 0) {
  81. className = packageName + "." + className;
  82. }
  83. //XXX doesn't handle arrays correctly (or primitives?)
  84. return new String(className);
  85. }
  86. //??? going back and forth between strings and bindings is a waste of cycles
  87. public static TypeX fromBinding(TypeBinding binding) {
  88. if (binding instanceof HelperInterfaceBinding) {
  89. return ((HelperInterfaceBinding) binding).getTypeX();
  90. }
  91. if (binding == null || binding.qualifiedSourceName() == null) {
  92. return ResolvedTypeX.MISSING;
  93. }
  94. return TypeX.forName(getName(binding));
  95. }
  96. public static TypeX[] fromBindings(TypeBinding[] bindings) {
  97. if (bindings == null) return TypeX.NONE;
  98. int len = bindings.length;
  99. TypeX[] ret = new TypeX[len];
  100. for (int i=0; i<len; i++) {
  101. ret[i] = fromBinding(bindings[i]);
  102. }
  103. return ret;
  104. }
  105. public static AstNode astForLocation(IHasPosition location) {
  106. return new EmptyStatement(location.getStart(), location.getEnd());
  107. }
  108. public Collection getDeclareParents() {
  109. return getWorld().getDeclareParents();
  110. }
  111. public Collection finishedTypeMungers = null;
  112. public boolean areTypeMungersFinished() {
  113. return finishedTypeMungers != null;
  114. }
  115. public void finishTypeMungers() {
  116. // make sure that type mungers are
  117. finishedTypeMungers = new ArrayList();
  118. Collection baseTypeMungers =
  119. getWorld().getCrosscuttingMembersSet().getTypeMungers();
  120. for (Iterator i = baseTypeMungers.iterator(); i.hasNext(); ) {
  121. ConcreteTypeMunger munger = (ConcreteTypeMunger) i.next();
  122. EclipseTypeMunger etm = makeEclipseTypeMunger(munger);
  123. if (etm != null) finishedTypeMungers.add(etm);
  124. }
  125. }
  126. public EclipseTypeMunger makeEclipseTypeMunger(ConcreteTypeMunger concrete) {
  127. if (concrete instanceof EclipseTypeMunger) return (EclipseTypeMunger)concrete;
  128. if (EclipseTypeMunger.supportsKind(concrete.getMunger().getKind())) {
  129. return new EclipseTypeMunger(this, concrete.getMunger(), concrete.getAspectType(), null);
  130. } else {
  131. return null;
  132. }
  133. }
  134. public Collection getTypeMungers() {
  135. //??? assert finishedTypeMungers != null
  136. return finishedTypeMungers;
  137. }
  138. public static ResolvedMember makeResolvedMember(MethodBinding binding) {
  139. //System.err.println("member for: " + binding + ", " + new String(binding.declaringClass.sourceName));
  140. ResolvedMember ret = new ResolvedMember(
  141. binding.isConstructor() ? Member.CONSTRUCTOR : Member.METHOD,
  142. fromBinding(binding.declaringClass),
  143. binding.modifiers,
  144. fromBinding(binding.returnType),
  145. new String(binding.selector),
  146. fromBindings(binding.parameters));
  147. ret.setCheckedExceptions(fromBindings(binding.thrownExceptions));
  148. return ret;
  149. }
  150. public static ResolvedMember makeResolvedMember(FieldBinding binding) {
  151. return new ResolvedMember(
  152. Member.FIELD,
  153. fromBinding(binding.declaringClass),
  154. binding.modifiers,
  155. fromBinding(binding.type),
  156. new String(binding.name),
  157. TypeX.NONE);
  158. }
  159. public TypeBinding makeTypeBinding(TypeX typeX) {
  160. TypeBinding ret = (TypeBinding)typexToBinding.get(typeX);
  161. if (ret == null) {
  162. ret = makeTypeBinding1(typeX);
  163. typexToBinding.put(typeX, ret);
  164. }
  165. return ret;
  166. }
  167. private TypeBinding makeTypeBinding1(TypeX typeX) {
  168. if (typeX.isPrimitive()) {
  169. if (typeX == ResolvedTypeX.BOOLEAN) return BaseTypes.BooleanBinding;
  170. if (typeX == ResolvedTypeX.BYTE) return BaseTypes.ByteBinding;
  171. if (typeX == ResolvedTypeX.CHAR) return BaseTypes.CharBinding;
  172. if (typeX == ResolvedTypeX.DOUBLE) return BaseTypes.DoubleBinding;
  173. if (typeX == ResolvedTypeX.FLOAT) return BaseTypes.FloatBinding;
  174. if (typeX == ResolvedTypeX.INT) return BaseTypes.IntBinding;
  175. if (typeX == ResolvedTypeX.LONG) return BaseTypes.LongBinding;
  176. if (typeX == ResolvedTypeX.SHORT) return BaseTypes.ShortBinding;
  177. if (typeX == ResolvedTypeX.VOID) return BaseTypes.VoidBinding;
  178. throw new RuntimeException("weird primitive type " + typeX);
  179. } else if (typeX.isArray()) {
  180. int dim = 0;
  181. while (typeX.isArray()) {
  182. dim++;
  183. typeX = typeX.getComponentType();
  184. }
  185. return lookupEnvironment.createArrayType(makeTypeBinding(typeX), dim);
  186. } else {
  187. String n = typeX.getName();
  188. char[][] name = CharOperation.splitOn('.', n.toCharArray());
  189. return lookupEnvironment.getType(name);
  190. }
  191. }
  192. public TypeBinding[] makeTypeBindings(TypeX[] types) {
  193. int len = types.length;
  194. TypeBinding[] ret = new TypeBinding[len];
  195. for (int i = 0; i < len; i++) {
  196. ret[i] = makeTypeBinding(types[i]);
  197. }
  198. return ret;
  199. }
  200. // just like the code above except it returns an array of ReferenceBindings
  201. private ReferenceBinding[] makeReferenceBindings(TypeX[] types) {
  202. int len = types.length;
  203. ReferenceBinding[] ret = new ReferenceBinding[len];
  204. for (int i = 0; i < len; i++) {
  205. ret[i] = (ReferenceBinding)makeTypeBinding(types[i]);
  206. }
  207. return ret;
  208. }
  209. public FieldBinding makeFieldBinding(ResolvedMember member) {
  210. return new FieldBinding(member.getName().toCharArray(),
  211. makeTypeBinding(member.getReturnType()),
  212. member.getModifiers(),
  213. (ReferenceBinding)makeTypeBinding(member.getDeclaringType()),
  214. Constant.NotAConstant);
  215. }
  216. public MethodBinding makeMethodBinding(ResolvedMember member) {
  217. return new MethodBinding(member.getModifiers(),
  218. member.getName().toCharArray(),
  219. makeTypeBinding(member.getReturnType()),
  220. makeTypeBindings(member.getParameterTypes()),
  221. makeReferenceBindings(member.getExceptions()),
  222. (ReferenceBinding)makeTypeBinding(member.getDeclaringType()));
  223. }
  224. public MethodBinding makeMethodBindingForCall(Member member) {
  225. return new MethodBinding(member.getCallsiteModifiers(),
  226. member.getName().toCharArray(),
  227. makeTypeBinding(member.getReturnType()),
  228. makeTypeBindings(member.getParameterTypes()),
  229. new ReferenceBinding[0],
  230. (ReferenceBinding)makeTypeBinding(member.getDeclaringType()));
  231. }
  232. public void finishedCompilationUnit(CompilationUnitDeclaration unit) {
  233. if (buildManager.doGenerateModel()) {
  234. AsmBuilder.build(unit, buildManager.getStructureModel());
  235. }
  236. }
  237. public void addTypeBinding(TypeBinding binding) {
  238. typexToBinding.put(fromBinding(binding), binding);
  239. }
  240. public Shadow makeShadow(AstNode location, ReferenceContext context) {
  241. return EclipseShadow.makeShadow(this, location, context);
  242. }
  243. public Shadow makeShadow(ReferenceContext context) {
  244. return EclipseShadow.makeShadow(this, (AstNode) context, context);
  245. }
  246. public void addSourceTypeBinding(SourceTypeBinding binding) {
  247. TypeDeclaration decl = binding.scope.referenceContext;
  248. ResolvedTypeX.Name name = getWorld().lookupOrCreateName(TypeX.forName(getName(binding)));
  249. EclipseSourceType t = new EclipseSourceType(name, this, binding, decl);
  250. name.setDelegate(t);
  251. if (decl instanceof AspectDeclaration) {
  252. ((AspectDeclaration)decl).typeX = name;
  253. ((AspectDeclaration)decl).concreteName = t;
  254. }
  255. ReferenceBinding[] memberTypes = binding.memberTypes;
  256. for (int i = 0, length = memberTypes.length; i < length; i++) {
  257. addSourceTypeBinding((SourceTypeBinding) memberTypes[i]);
  258. }
  259. }
  260. }