From: aclement Date: Fri, 27 Aug 2004 11:18:01 +0000 (+0000) Subject: Fix for Bugzilla Bug 72699 X-Git-Tag: V1_2_1~81 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=5e0876580b0e95dd06ca4342e233f9a5dceb33a5;p=aspectj.git Fix for Bugzilla Bug 72699 Bogus error message: The abstract method ajc$pointcut$$tracingScope$a2 in type Tracing can only be defined by an abstract class --- diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java index e1c6673b7..1993e6836 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java @@ -76,14 +76,21 @@ public class PointcutDeclaration extends AjMethodDeclaration { selector = CharOperation.concat(mangledPrefix, '$', selector, '$', Integer.toHexString(sourceStart).toCharArray()); - if (Modifier.isAbstract(this.declaredModifiers) && - !(typeDec instanceof AspectDeclaration)) - { - typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, - "The abstract pointcut " + new String(declaredName) + - " can only be defined in an aspect"); - ignoreFurtherInvestigation = true; - return; + if (Modifier.isAbstract(this.declaredModifiers)) { + if (!(typeDec instanceof AspectDeclaration)) { + typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, + "The abstract pointcut " + new String(declaredName) + + " can only be defined in an aspect"); + ignoreFurtherInvestigation = true; + return; + } else if (!Modifier.isAbstract(typeDec.modifiers)) { + typeDec.scope.problemReporter().signalError(sourceStart, sourceEnd, + "The abstract pointcut " + new String(declaredName) + + " can only be defined in an abstract aspect"); + + ignoreFurtherInvestigation = true; + return; + } } if (pointcutDesignator != null) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java index 77457f879..5ac77b4ad 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java @@ -31,6 +31,7 @@ import org.eclipse.jdt.internal.compiler.CompilationResult; import org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy; import org.eclipse.jdt.internal.compiler.IProblemFactory; import org.eclipse.jdt.internal.compiler.ast.ASTNode; +import org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration; import org.eclipse.jdt.internal.compiler.ast.Argument; import org.eclipse.jdt.internal.compiler.impl.CompilerOptions; import org.eclipse.jdt.internal.compiler.impl.ReferenceContext; @@ -41,6 +42,7 @@ import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding; import org.eclipse.jdt.internal.compiler.lookup.TypeBinding; import org.eclipse.jdt.internal.compiler.problem.ProblemReporter; import org.eclipse.jdt.core.compiler.CharOperation; +import org.eclipse.jdt.core.compiler.IProblem; /** * Extends problem reporter to support compiler-side implementation of declare soft. @@ -221,5 +223,22 @@ public class AjProblemReporter extends ProblemReporter { if (reportIt) super.javadocMissingParamTag(arg, modifiers); } + + public void abstractMethodInAbstractClass(SourceTypeBinding type, AbstractMethodDeclaration methodDecl) { + + String abstractMethodName = new String(methodDecl.selector); + if (abstractMethodName.startsWith("ajc$pointcut")) { + // This will already have been reported, see: PointcutDeclaration.postParse() + return; + } + String[] arguments = new String[] {new String(type.sourceName()), abstractMethodName}; + super.handle( + IProblem.AbstractMethodInAbstractClass, + arguments, + arguments, + methodDecl.sourceStart, + methodDecl.sourceEnd,this.referenceContext, + this.referenceContext == null ? null : this.referenceContext.compilationResult()); + } } diff --git a/tests/bugs/BogusMessage.java b/tests/bugs/BogusMessage.java new file mode 100644 index 000000000..d11dd6d68 --- /dev/null +++ b/tests/bugs/BogusMessage.java @@ -0,0 +1,4 @@ +public aspect BogusMessage { + public abstract pointcut tracingScope(); + +} \ No newline at end of file diff --git a/tests/bugs/BogusMessage2.java b/tests/bugs/BogusMessage2.java new file mode 100644 index 000000000..26ccc360c --- /dev/null +++ b/tests/bugs/BogusMessage2.java @@ -0,0 +1,3 @@ +public class BogusMessage2 { + public abstract pointcut tracingScope(); +} \ No newline at end of file diff --git a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java index 7c3e3a261..0ecb6e6dc 100644 --- a/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java +++ b/tests/src/org/aspectj/systemtest/ajc121/Ajc121Tests.java @@ -271,5 +271,13 @@ public class Ajc121Tests extends org.aspectj.testing.XMLBasedAjcTestCase { public void test051_arrayCloningInJava5() { runTest("AJC possible bug with static nested classes"); } + + public void test052_bogusMessage1() { + runTest("Bogus error message: The abstract method ajc$pointcut$$tracingScope$a2 in type Tracing can only be defined by an abstract class (1)"); + } + + public void test053_bogusMessage2() { + runTest("Bogus error message: The abstract method ajc$pointcut$$tracingScope$a2 in type Tracing can only be defined by an abstract class (2)"); + } } diff --git a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml index dd9664295..e4b3a793c 100644 --- a/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml +++ b/tests/src/org/aspectj/systemtest/ajc121/ajc121-tests.xml @@ -418,4 +418,19 @@ + + + + + + + + + + + + + \ No newline at end of file