You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

NewFieldTypeMunger.java 6.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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 Eclipse Public License v1.0
  6. * which accompanies this distribution and is available at
  7. * http://www.eclipse.org/legal/epl-v10.html
  8. *
  9. * Contributors:
  10. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.weaver;
  13. import java.io.IOException;
  14. import java.util.List;
  15. import java.util.Map;
  16. import java.util.Set;
  17. import org.aspectj.bridge.ISourceLocation;
  18. import org.aspectj.weaver.AjAttribute.WeaverVersionInfo;
  19. /**
  20. * Code that created version one style ITD type mungers will be using direct field access from the dispatchers
  21. *
  22. * @author Andy
  23. *
  24. */
  25. public class NewFieldTypeMunger extends ResolvedTypeMunger {
  26. public static final int VersionOne = 1;
  27. public static final int VersionTwo = 2; // new style ITDs
  28. public int version = VersionOne;
  29. public NewFieldTypeMunger(ResolvedMember signature, Set superMethodsCalled, List typeVariableAliases) {
  30. super(Field, signature);
  31. this.version = VersionTwo;
  32. this.typeVariableAliases = typeVariableAliases;
  33. signature.setAnnotatedElsewhere(true);
  34. this.setSuperMethodsCalled(superMethodsCalled);
  35. }
  36. public ResolvedMember getInitMethod(UnresolvedType aspectType) {
  37. return AjcMemberMaker.interFieldInitializer(signature, aspectType);
  38. }
  39. public void write(CompressingDataOutputStream s) throws IOException {
  40. kind.write(s);
  41. signature.write(s);
  42. writeSuperMethodsCalled(s);
  43. writeSourceLocation(s);
  44. writeOutTypeAliases(s);
  45. s.writeInt(version);
  46. }
  47. public static ResolvedTypeMunger readField(VersionedDataInputStream s, ISourceContext context) throws IOException {
  48. ISourceLocation sloc = null;
  49. ResolvedMember fieldSignature = ResolvedMemberImpl.readResolvedMember(s, context);
  50. Set superMethodsCalled = readSuperMethodsCalled(s);
  51. sloc = readSourceLocation(s);
  52. List aliases = readInTypeAliases(s);
  53. NewFieldTypeMunger munger = new NewFieldTypeMunger(fieldSignature, superMethodsCalled, aliases);
  54. if (sloc != null) {
  55. munger.setSourceLocation(sloc);
  56. }
  57. if (s.getMajorVersion() >= WeaverVersionInfo.WEAVER_VERSION_AJ169) {
  58. // there is a version int
  59. munger.version = s.readInt();
  60. } else {
  61. munger.version = VersionOne;
  62. }
  63. return munger;
  64. }
  65. public ResolvedMember getMatchingSyntheticMember(Member member, ResolvedType aspectType) {
  66. // ??? might give a field where a method is expected
  67. ResolvedType onType = aspectType.getWorld().resolve(getSignature().getDeclaringType());
  68. if (onType.isRawType()) {
  69. onType = onType.getGenericType();
  70. }
  71. ResolvedMember ret = AjcMemberMaker.interFieldGetDispatcher(getSignature(), aspectType);
  72. if (ResolvedType.matches(ret, member)) {
  73. return getSignature();
  74. }
  75. ret = AjcMemberMaker.interFieldSetDispatcher(getSignature(), aspectType);
  76. if (ResolvedType.matches(ret, member)) {
  77. return getSignature();
  78. }
  79. ret = AjcMemberMaker.interFieldInterfaceGetter(getSignature(), onType, aspectType);
  80. if (ResolvedType.matches(ret, member)) {
  81. return getSignature();
  82. }
  83. ret = AjcMemberMaker.interFieldInterfaceSetter(getSignature(), onType, aspectType);
  84. if (ResolvedType.matches(ret, member)) {
  85. return getSignature();
  86. }
  87. return super.getMatchingSyntheticMember(member, aspectType);
  88. }
  89. /**
  90. * see ResolvedTypeMunger.parameterizedFor(ResolvedType)
  91. */
  92. public ResolvedTypeMunger parameterizedFor(ResolvedType target) {
  93. ResolvedType genericType = target;
  94. if (target.isRawType() || target.isParameterizedType()) {
  95. genericType = genericType.getGenericType();
  96. }
  97. ResolvedMember parameterizedSignature = null;
  98. // If we are parameterizing it for a generic type, we just need to 'swap the letters' from the ones used
  99. // in the original ITD declaration to the ones used in the actual target type declaration.
  100. if (target.isGenericType()) {
  101. TypeVariable vars[] = target.getTypeVariables();
  102. UnresolvedTypeVariableReferenceType[] varRefs = new UnresolvedTypeVariableReferenceType[vars.length];
  103. for (int i = 0; i < vars.length; i++) {
  104. varRefs[i] = new UnresolvedTypeVariableReferenceType(vars[i]);
  105. }
  106. parameterizedSignature = getSignature().parameterizedWith(varRefs, genericType, true, typeVariableAliases);
  107. } else {
  108. // For raw and 'normal' parameterized targets (e.g. Interface, Interface<String>)
  109. parameterizedSignature = getSignature().parameterizedWith(target.getTypeParameters(), genericType,
  110. target.isParameterizedType(), typeVariableAliases);
  111. }
  112. NewFieldTypeMunger nftm = new NewFieldTypeMunger(parameterizedSignature, getSuperMethodsCalled(), typeVariableAliases);
  113. nftm.setDeclaredSignature(getSignature());
  114. nftm.setSourceLocation(getSourceLocation());
  115. return nftm;
  116. }
  117. public ResolvedTypeMunger parameterizeWith(Map<String, UnresolvedType> m, World w) {
  118. ResolvedMember parameterizedSignature = getSignature().parameterizedWith(m, w);
  119. NewFieldTypeMunger nftm = new NewFieldTypeMunger(parameterizedSignature, getSuperMethodsCalled(), typeVariableAliases);
  120. nftm.setDeclaredSignature(getSignature());
  121. nftm.setSourceLocation(getSourceLocation());
  122. return nftm;
  123. }
  124. public boolean equals(Object other) {
  125. if (!(other instanceof NewFieldTypeMunger)) {
  126. return false;
  127. }
  128. NewFieldTypeMunger o = (NewFieldTypeMunger) other;
  129. return ((kind == null) ? (o.kind == null) : kind.equals(o.kind))
  130. && ((signature == null) ? (o.signature == null) : signature.equals(o.signature))
  131. && ((declaredSignature == null) ? (o.declaredSignature == null) : declaredSignature.equals(o.declaredSignature))
  132. && ((typeVariableAliases == null) ? (o.typeVariableAliases == null) : typeVariableAliases
  133. .equals(o.typeVariableAliases));
  134. }
  135. public int hashCode() {
  136. int result = 17;
  137. result = 37 * result + kind.hashCode();
  138. result = 37 * result + ((signature == null) ? 0 : signature.hashCode());
  139. result = 37 * result + ((declaredSignature == null) ? 0 : declaredSignature.hashCode());
  140. result = 37 * result + ((typeVariableAliases == null) ? 0 : typeVariableAliases.hashCode());
  141. return result;
  142. }
  143. }