]> source.dussan.org Git - aspectj.git/commitdiff
Fix for Bug 70619
authoraclement <aclement>
Mon, 26 Jul 2004 13:28:20 +0000 (13:28 +0000)
committeraclement <aclement>
Mon, 26 Jul 2004 13:28:20 +0000 (13:28 +0000)
   compiler aborts with "conflicting dominates orders" with circular declare precedences

tests/ajcTests.xml
tests/bugs/bug70619/Conflict.java [new file with mode: 0644]
tests/bugs/bug70619/Order1.aj [new file with mode: 0644]
tests/bugs/bug70619/Order2.aj [new file with mode: 0644]
tests/bugs/bug70619/Precedence.java [new file with mode: 0644]
weaver/src/org/aspectj/weaver/World.java

index e540a046e3461e603f9eca9c74c3c904cccb6fc2..08d856f20b879dad05137399336aa57161c28c0c 100644 (file)
                <message kind="error" line="2" text="if() pointcut designator cannot be used directly in a per clause"/>
         </compile>
     </ajc-test>
+    
+    <ajc-test dir="bugs/bug70619"
+               pr="70619" title="compiler aborts with 'conflicting dominates orders' with circular declare precedences">
+        <compile files="Precedence.java">
+          <message kind="error" line="0" text="conflicting declare precedence"/>
+        </compile>
+        <compile files="Conflict.java,Order2.aj,Order1.aj">        
+          <message kind="error" line="0" text="conflicting declare precedence"/>
+        </compile>
+        <compile files="Conflict.java,Order1.aj,Order2.aj">
+          <message kind="error" line="0" text="conflicting declare precedence"/>
+        </compile>
+    </ajc-test>
  
 </suite>
diff --git a/tests/bugs/bug70619/Conflict.java b/tests/bugs/bug70619/Conflict.java
new file mode 100644 (file)
index 0000000..11364ce
--- /dev/null
@@ -0,0 +1,5 @@
+
+class Conflict { 
+       public static void main(String[] args) { } 
+}
+       
diff --git a/tests/bugs/bug70619/Order1.aj b/tests/bugs/bug70619/Order1.aj
new file mode 100644 (file)
index 0000000..0145956
--- /dev/null
@@ -0,0 +1,8 @@
+aspect Conflict1 {\r
+  \r
+  \r
+  \r
+  declare precedence: Conflict1, Conflict2;\r
+\r
+   before(): execution(* *(..)) { }\r
+}
\ No newline at end of file
diff --git a/tests/bugs/bug70619/Order2.aj b/tests/bugs/bug70619/Order2.aj
new file mode 100644 (file)
index 0000000..9ee9c55
--- /dev/null
@@ -0,0 +1,6 @@
+aspect Conflict2 {\r
+       after(): execution(* *(..)) { }\r
+  declare precedence: Conflict2, Conflict1;\r
+\r
\r
+}
\ No newline at end of file
diff --git a/tests/bugs/bug70619/Precedence.java b/tests/bugs/bug70619/Precedence.java
new file mode 100644 (file)
index 0000000..3068018
--- /dev/null
@@ -0,0 +1,13 @@
+class Conflict { public static void main(String[] args) { } }
+
+aspect Conflict1 {
+  declare precedence: Conflict1,Conflict2;
+
+  before(): execution(* *(..)) { }
+}
+
+aspect Conflict2 {
+  declare precedence: Conflict2, Conflict1;
+
+  after(): execution(* *(..)) { }
+}
\ No newline at end of file
index 0d019fd1c8362ae8753ba62b01d72493a1092582..6da90ebcae09ef8152a3a0b4e2fd2ad5507dacf9 100644 (file)
@@ -300,13 +300,22 @@ public abstract class World {
                //??? number of dominates declares in the whole system.
                //??? This method can be called a large number of times.
                int order = 0;
+               DeclarePrecedence orderer = null; // Records the declare precedence statement that gives the first ordering
                for (Iterator i = crosscuttingMembersSet.getDeclareDominates().iterator(); i.hasNext(); ) {
                        DeclarePrecedence d = (DeclarePrecedence)i.next();
                        int thisOrder = d.compare(aspect1, aspect2);
                        //System.out.println("comparing: " + thisOrder + ": " + d);
                        if (thisOrder != 0) {
+                               if (orderer==null) orderer = d;
                                if (order != 0 && order != thisOrder) {
-                                       throw new BCException("conflicting dominates orders");
+                                       ISourceLocation[] isls = new ISourceLocation[2];
+                                       isls[0]=orderer.getSourceLocation();
+                                       isls[1]=d.getSourceLocation();
+                                       Message m = 
+                                         new Message("conflicting declare precedence orderings for aspects: "+
+                                                     aspect1.getName()+" and "+aspect2.getName(),null,true,isls);
+                                       messageHandler.handleMessage(m);
+                                       // throw new BCException("conflicting dominates orders"+d.getSourceLocation());
                                } else {
                                        order = thisOrder;
                                }