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.

EclipseObjectType.java 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. * Xerox/PARC initial implementation
  11. * ******************************************************************/
  12. package org.aspectj.ajdt.internal.compiler.lookup;
  13. import java.util.*;
  14. import org.aspectj.ajdt.internal.compiler.ast.*;
  15. import org.aspectj.ajdt.internal.compiler.ast.PointcutDeclaration;
  16. import org.aspectj.bridge.MessageUtil;
  17. import org.aspectj.weaver.*;
  18. import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
  19. import org.eclipse.jdt.internal.compiler.lookup.*;
  20. public class EclipseObjectType extends ResolvedTypeX.Name {
  21. private ReferenceBinding binding;
  22. private ResolvedMember[] declaredPointcuts = null;
  23. private ResolvedMember[] declaredMethods = null;
  24. private ResolvedMember[] declaredFields = null;
  25. public EclipseObjectType(String signature, EclipseWorld world, ReferenceBinding binding) {
  26. super(signature, world);
  27. this.binding = binding;
  28. }
  29. private EclipseWorld eclipseWorld() {
  30. return (EclipseWorld)world;
  31. }
  32. public boolean isAspect() {
  33. if (!(binding instanceof SourceTypeBinding)) return false;
  34. //XXX assume SourceBinding throughout
  35. return ((SourceTypeBinding)binding).scope.referenceContext instanceof AspectDeclaration;
  36. }
  37. public ResolvedTypeX getSuperclass() {
  38. //XXX what about java.lang.Object
  39. return eclipseWorld().fromEclipse(binding.superclass());
  40. }
  41. public ResolvedTypeX[] getDeclaredInterfaces() {
  42. return eclipseWorld().fromEclipse(binding.superInterfaces());
  43. }
  44. public ResolvedMember[] getDeclaredFields() {
  45. if (declaredFields == null) fillDeclaredMembers();
  46. return declaredFields;
  47. }
  48. public ResolvedMember[] getDeclaredMethods() {
  49. if (declaredMethods == null) fillDeclaredMembers();
  50. return declaredMethods;
  51. }
  52. public ResolvedMember[] getDeclaredPointcuts() {
  53. if (declaredPointcuts == null) fillDeclaredMembers();
  54. return declaredPointcuts;
  55. }
  56. private void fillDeclaredMembers() {
  57. List declaredPointcuts = new ArrayList();
  58. List declaredMethods = new ArrayList();
  59. List declaredFields = new ArrayList();
  60. MethodBinding[] methods = binding.methods();
  61. for (int i=0, len=methods.length; i < len; i++) {
  62. MethodBinding m = methods[i];
  63. AbstractMethodDeclaration amd = m.sourceMethod();
  64. if (amd == null) continue; //???
  65. if (amd instanceof PointcutDeclaration) {
  66. PointcutDeclaration d = (PointcutDeclaration)amd;
  67. ResolvedPointcutDefinition df = d.makeResolvedPointcutDefinition();
  68. declaredPointcuts.add(df);
  69. } else {
  70. //XXX this doesn't handle advice quite right
  71. declaredMethods.add(eclipseWorld().makeResolvedMember(m));
  72. }
  73. }
  74. FieldBinding[] fields = binding.fields();
  75. for (int i=0, len=fields.length; i < len; i++) {
  76. FieldBinding f = fields[i];
  77. declaredFields.add(eclipseWorld().makeResolvedMember(f));
  78. }
  79. this.declaredPointcuts = (ResolvedMember[])
  80. declaredPointcuts.toArray(new ResolvedMember[declaredPointcuts.size()]);
  81. this.declaredMethods = (ResolvedMember[])
  82. declaredMethods.toArray(new ResolvedMember[declaredMethods.size()]);
  83. this.declaredFields = (ResolvedMember[])
  84. declaredFields.toArray(new ResolvedMember[declaredFields.size()]);
  85. }
  86. public int getModifiers() {
  87. // only return the real Java modifiers, not the extra eclipse ones
  88. return binding.modifiers & CompilerModifiers.AccJustFlag;
  89. }
  90. ReferenceBinding getBinding() {
  91. return binding;
  92. }
  93. public String toString() {
  94. return "EclipseObjectType(" + getClassName() + ")";
  95. }
  96. public CrosscuttingMembers collectCrosscuttingMembers() {
  97. return crosscuttingMembers;
  98. }
  99. //XXX make sure this is applied to classes and interfaces
  100. public void checkPointcutDeclarations() {
  101. ResolvedMember[] pointcuts = getDeclaredPointcuts();
  102. for (int i=0, len=pointcuts.length; i < len; i++) {
  103. if (pointcuts[i].isAbstract()) {
  104. if (!this.isAspect()) {
  105. MessageUtil.error(
  106. "abstract pointcut only allowed in aspect" + pointcuts[i].getName(),
  107. pointcuts[i].getSourceLocation());
  108. } else if (!this.isAbstract()) {
  109. MessageUtil.error(
  110. "abstract pointcut in concrete aspect" + pointcuts[i].getName(),
  111. pointcuts[i].getSourceLocation());
  112. }
  113. }
  114. for (int j=i+1; j < len; j++) {
  115. if (pointcuts[i].getName().equals(pointcuts[j].getName())) {
  116. eclipseWorld().getMessageHandler().handleMessage(
  117. MessageUtil.error(
  118. "duplicate pointcut name: " + pointcuts[j].getName(),
  119. pointcuts[j].getSourceLocation()));
  120. }
  121. }
  122. }
  123. //XXX now check all inherited pointcuts to be sure that they're handled reasonably
  124. }
  125. }