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.

InlineAccessFieldBinding.java 2.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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 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. * PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler.lookup;
  13. import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration;
  14. import org.aspectj.org.eclipse.jdt.internal.compiler.impl.Constant;
  15. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
  16. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.InvocationSite;
  17. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Scope;
  18. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SyntheticMethodBinding;
  19. import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
  20. import org.aspectj.weaver.AjcMemberMaker;
  21. import org.aspectj.weaver.ResolvedMember;
  22. /**
  23. * Used for field references within the body of an around advice
  24. * to force the use of public access methods. This makes it possible
  25. * for around advice to be inlined into any shadow to which it applies.
  26. *
  27. * ??? this is very similar to PrivilegedFieldBinding and is somewhat related
  28. * to InterTypeFieldBinding. Maybe they have a common supertype?
  29. *
  30. * @author Jim Hugunin
  31. */
  32. public class InlineAccessFieldBinding extends FieldBinding {
  33. public SimpleSyntheticAccessMethodBinding reader;
  34. public SimpleSyntheticAccessMethodBinding writer;
  35. public FieldBinding baseField;
  36. public InlineAccessFieldBinding(AspectDeclaration inAspect, FieldBinding baseField, ResolvedMember resolvedField) {
  37. super(baseField, baseField.declaringClass);
  38. this.reader = new SimpleSyntheticAccessMethodBinding(
  39. inAspect.factory.makeMethodBinding(
  40. AjcMemberMaker.inlineAccessMethodForFieldGet(
  41. inAspect.typeX, resolvedField
  42. )));
  43. this.writer = new SimpleSyntheticAccessMethodBinding(inAspect.factory.makeMethodBinding(
  44. AjcMemberMaker.inlineAccessMethodForFieldSet(
  45. inAspect.typeX, resolvedField
  46. )));
  47. this.constant = Constant.NotAConstant;
  48. this.baseField = baseField;
  49. }
  50. public boolean canBeSeenBy(TypeBinding receiverType, InvocationSite invocationSite, Scope scope) {
  51. return true;
  52. }
  53. public SyntheticMethodBinding getAccessMethod(boolean isReadAccess) {
  54. if (isReadAccess) return reader;
  55. else return writer;
  56. }
  57. public boolean alwaysNeedsAccessMethod(boolean isReadAccess) { return true; }
  58. public FieldBinding getFieldBindingForLookup() { return baseField; }
  59. public String toString() { return "InlineAccess(" + baseField + ")"; }
  60. }