Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Allow method annotations on compact constructors in stubs * Support automatic transfer from declaration annotations on record components in stubs to the corresponding field, method, and compact canonical constructor parameter. (Outside stubs this is done automatically by javac.)
- Loading branch information
1 parent
8fb6f74
commit e072376
Showing
18 changed files
with
363 additions
and
5 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
checker/src/test/java/org/checkerframework/checker/test/junit/DisbarUseTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package org.checkerframework.checker.test.junit; | ||
|
||
import java.io.File; | ||
import java.util.List; | ||
import org.checkerframework.checker.testchecker.disbaruse.DisbarUseChecker; | ||
import org.checkerframework.framework.test.CheckerFrameworkPerDirectoryTest; | ||
import org.junit.runners.Parameterized.Parameters; | ||
|
||
public class DisbarUseTest extends CheckerFrameworkPerDirectoryTest { | ||
|
||
/** | ||
* Create a DisbarUseTest. | ||
* | ||
* @param testFiles the files containing test code, which will be type-checked | ||
*/ | ||
public DisbarUseTest(List<File> testFiles) { | ||
super( | ||
testFiles, | ||
DisbarUseChecker.class, | ||
"disbaruse-records", | ||
"-Anomsgtext", | ||
"-Astubs=tests/disbaruse-records", | ||
"-AstubWarnIfNotFound"); | ||
} | ||
|
||
@Parameters | ||
public static String[] getTestDirs() { | ||
// Check for JDK 16+ without using a library: | ||
if (System.getProperty("java.version").matches("^(1[6-9]|[2-9][0-9])\\..*")) | ||
return new String[] {"disbaruse-records"}; | ||
else return new String[] {}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
9 changes: 9 additions & 0 deletions
9
...er/src/test/java/org/checkerframework/checker/testchecker/disbaruse/DisbarUseChecker.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse; | ||
|
||
import org.checkerframework.common.basetype.BaseTypeChecker; | ||
|
||
/** | ||
* A checker that issues a "disbar.use" error at any use of fields, methods or parameters whose type | ||
* is {@code @DisbarUse}. | ||
*/ | ||
public class DisbarUseChecker extends BaseTypeChecker {} |
22 changes: 22 additions & 0 deletions
22
...rc/test/java/org/checkerframework/checker/testchecker/disbaruse/DisbarUseTypeFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse; | ||
|
||
import java.lang.annotation.Annotation; | ||
import java.util.Arrays; | ||
import java.util.LinkedHashSet; | ||
import java.util.Set; | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUseBottom; | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUseTop; | ||
import org.checkerframework.common.basetype.BaseAnnotatedTypeFactory; | ||
import org.checkerframework.common.basetype.BaseTypeChecker; | ||
|
||
public class DisbarUseTypeFactory extends BaseAnnotatedTypeFactory { | ||
public DisbarUseTypeFactory(BaseTypeChecker checker) { | ||
super(checker); | ||
postInit(); | ||
} | ||
|
||
@Override | ||
protected Set<Class<? extends Annotation>> createSupportedTypeQualifiers() { | ||
return new LinkedHashSet<>(Arrays.asList(DisbarUseTop.class, DisbarUseBottom.class)); | ||
} | ||
} |
69 changes: 69 additions & 0 deletions
69
...er/src/test/java/org/checkerframework/checker/testchecker/disbaruse/DisbarUseVisitor.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse; | ||
|
||
import com.sun.source.tree.ExpressionTree; | ||
import com.sun.source.tree.IdentifierTree; | ||
import com.sun.source.tree.MemberSelectTree; | ||
import com.sun.source.tree.MethodInvocationTree; | ||
import com.sun.source.tree.NewClassTree; | ||
import javax.lang.model.element.Element; | ||
import javax.lang.model.element.ElementKind; | ||
import javax.lang.model.element.ExecutableElement; | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUse; | ||
import org.checkerframework.common.basetype.BaseTypeChecker; | ||
import org.checkerframework.common.basetype.BaseTypeVisitor; | ||
import org.checkerframework.javacutil.TreeUtils; | ||
|
||
public class DisbarUseVisitor extends BaseTypeVisitor<DisbarUseTypeFactory> { | ||
public DisbarUseVisitor(BaseTypeChecker checker) { | ||
super(checker); | ||
} | ||
|
||
protected DisbarUseVisitor(BaseTypeChecker checker, DisbarUseTypeFactory typeFactory) { | ||
super(checker, typeFactory); | ||
} | ||
|
||
@Override | ||
protected DisbarUseTypeFactory createTypeFactory() { | ||
return new DisbarUseTypeFactory(checker); | ||
} | ||
|
||
@Override | ||
public Void visitMethodInvocation(MethodInvocationTree node, Void p) { | ||
ExecutableElement methodElt = TreeUtils.elementFromUse(node); | ||
if (methodElt != null && atypeFactory.getDeclAnnotation(methodElt, DisbarUse.class) != null) { | ||
checker.reportError(node, "disbar.use"); | ||
} | ||
return super.visitMethodInvocation(node, p); | ||
} | ||
|
||
@Override | ||
public Void visitNewClass(NewClassTree node, Void p) { | ||
ExecutableElement consElt = TreeUtils.elementFromUse(node); | ||
if (consElt != null && atypeFactory.getDeclAnnotation(consElt, DisbarUse.class) != null) { | ||
checker.reportError(node, "disbar.use"); | ||
} | ||
return super.visitNewClass(node, p); | ||
} | ||
|
||
@Override | ||
public Void visitIdentifier(IdentifierTree node, Void p) { | ||
MemberSelectTree enclosingMemberSel = enclosingMemberSelect(); | ||
ExpressionTree[] expressionTrees = | ||
enclosingMemberSel == null | ||
? new ExpressionTree[] {node} | ||
: new ExpressionTree[] {enclosingMemberSel, node}; | ||
|
||
for (ExpressionTree memberSel : expressionTrees) { | ||
final Element elem = TreeUtils.elementFromUse(memberSel); | ||
|
||
// We only issue errors for variables that are fields or parameters: | ||
if (elem != null && (elem.getKind().isField() || elem.getKind() == ElementKind.PARAMETER)) { | ||
if (atypeFactory.getDeclAnnotation(elem, DisbarUse.class) != null) { | ||
checker.reportError(memberSel, "disbar.use"); | ||
} | ||
} | ||
} | ||
|
||
return super.visitIdentifier(node, p); | ||
} | ||
} |
1 change: 1 addition & 0 deletions
1
checker/src/test/java/org/checkerframework/checker/testchecker/disbaruse/messages.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
disbar.use=Use of this element is disbarred |
8 changes: 8 additions & 0 deletions
8
checker/src/test/java/org/checkerframework/checker/testchecker/disbaruse/qual/DisbarUse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse.qual; | ||
|
||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Target; | ||
|
||
/** The Disbar Use Checker isses a warning when an expression of this type is used. */ | ||
@Target({ElementType.METHOD, ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.PARAMETER}) | ||
public @interface DisbarUse {} |
12 changes: 12 additions & 0 deletions
12
...rc/test/java/org/checkerframework/checker/testchecker/disbaruse/qual/DisbarUseBottom.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse.qual; | ||
|
||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Target; | ||
import org.checkerframework.framework.qual.DefaultFor; | ||
import org.checkerframework.framework.qual.SubtypeOf; | ||
import org.checkerframework.framework.qual.TypeUseLocation; | ||
|
||
@DefaultFor(TypeUseLocation.LOWER_BOUND) | ||
@SubtypeOf(DisbarUseTop.class) | ||
@Target({ElementType.TYPE_USE}) | ||
public @interface DisbarUseBottom {} |
11 changes: 11 additions & 0 deletions
11
...r/src/test/java/org/checkerframework/checker/testchecker/disbaruse/qual/DisbarUseTop.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package org.checkerframework.checker.testchecker.disbaruse.qual; | ||
|
||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Target; | ||
import org.checkerframework.framework.qual.DefaultQualifierInHierarchy; | ||
import org.checkerframework.framework.qual.SubtypeOf; | ||
|
||
@Target({ElementType.TYPE_USE}) | ||
@SubtypeOf({}) | ||
@DefaultQualifierInHierarchy | ||
public @interface DisbarUseTop {} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUse; | ||
|
||
class DisbarredClass { | ||
|
||
@DisbarUse String barred; | ||
String fine; | ||
|
||
DisbarredClass() {} | ||
|
||
@DisbarUse | ||
DisbarredClass(String param) {} | ||
|
||
DisbarredClass(@DisbarUse Integer param) {} | ||
|
||
DisbarredClass(@DisbarUse Long param) { | ||
// :: error: (disbar.use) | ||
param = 7L; | ||
// :: error: (disbar.use) | ||
param.toString(); | ||
} | ||
|
||
@DisbarUse | ||
void disbarredMethod() {} | ||
|
||
void invalid() { | ||
// :: error: (disbar.use) | ||
disbarredMethod(); | ||
// :: error: (disbar.use) | ||
new DisbarredClass(""); | ||
// :: error: (disbar.use) | ||
barred = ""; | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void valid() { | ||
new DisbarredClass(); | ||
fine = ""; | ||
int x = fine.length(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUse; | ||
|
||
record DisbarredRecord(@DisbarUse String barred, String fine) { | ||
|
||
DisbarredRecord { | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void invalid() { | ||
// :: error: (disbar.use) | ||
barred(); | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void valid() { | ||
fine(); | ||
int x = fine.length(); | ||
} | ||
} |
19 changes: 19 additions & 0 deletions
19
checker/tests/disbaruse-records/DisbarredRecordByStubs.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
record DisbarredRecordByStubs(String barred, String fine) { | ||
|
||
DisbarredRecordByStubs { | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void invalid() { | ||
// :: error: (disbar.use) | ||
barred(); | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void valid() { | ||
fine(); | ||
int x = fine.length(); | ||
} | ||
} |
22 changes: 22 additions & 0 deletions
22
checker/tests/disbaruse-records/DisbarredRecordByStubs2.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
record DisbarredRecordByStubs2(String barred, String fine) { | ||
|
||
// Annotation isn't copied to explicitly declared constructor parameters: | ||
DisbarredRecordByStubs2(String barred, String fine) { | ||
int x = barred.length(); | ||
// :: error: (disbar.use) | ||
this.barred = ""; | ||
this.fine = fine; | ||
} | ||
|
||
void invalid() { | ||
// :: error: (disbar.use) | ||
barred(); | ||
// :: error: (disbar.use) | ||
int x = barred.length(); | ||
} | ||
|
||
void valid() { | ||
fine(); | ||
int x = fine.length(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import org.checkerframework.checker.testchecker.disbaruse.qual.DisbarUse; | ||
|
||
record DisbarredRecordByStubs(@DisbarUse String barred, String fine) { | ||
} | ||
record DisbarredRecordByStubs2(@DisbarUse String barred, String fine) { | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
import java.util.concurrent.locks.ReentrantLock; | ||
import org.checkerframework.checker.lock.qual.LockingFree; | ||
|
||
public record LockRecord(String s, ReentrantLock lock) { | ||
@LockingFree | ||
// :: error: (method.guarantee.violated) | ||
public LockRecord { | ||
// :: error: (method.guarantee.violated) | ||
lock.lock(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.