org.checkerframework.dataflow.expression.ViewpointAdaptJavaExpression Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of checker Show documentation
Show all versions of checker Show documentation
The Checker Framework enhances Java's type system to
make it more powerful and useful. This lets software developers
detect and prevent errors in their Java programs.
The Checker Framework includes compiler plug-ins ("checkers")
that find bugs or verify their absence. It also permits you to
write your own compiler plug-ins.
package org.checkerframework.dataflow.expression;
import java.util.List;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* This class has methods to viewpoint-adapt {@link JavaExpression} by replacing {@link
* ThisReference} and {@link FormalParameter} expressions with the given {@link JavaExpression}s.
*/
public class ViewpointAdaptJavaExpression extends JavaExpressionConverter {
// Public static methods
/**
* Replace {@link FormalParameter}s by {@code args} in {@code javaExpr}. ({@link ThisReference}s
* are not converted.)
*
* @param javaExpr the expression to viewpoint-adapt
* @param args the expressions that replace {@link FormalParameter}s; if null, {@link
* FormalParameter}s are not replaced
* @return the viewpoint-adapted expression
*/
public static JavaExpression viewpointAdapt(
JavaExpression javaExpr, @Nullable List args) {
return viewpointAdapt(javaExpr, null, args);
}
/**
* Replace {@link ThisReference} with {@code thisReference} in {@code javaExpr}. ({@link
* FormalParameter} are not replaced.
*
* @param javaExpr the expression to viewpoint-adapt
* @param thisReference the expression that replaces occurrences of {@link ThisReference}; if
* null, {@link ThisReference}s are not replaced
* @return the viewpoint-adapted expression
*/
public static JavaExpression viewpointAdapt(
JavaExpression javaExpr, @Nullable JavaExpression thisReference) {
return viewpointAdapt(javaExpr, thisReference, null);
}
/**
* Replace {@link FormalParameter}s with {@code args} and {@link ThisReference} with {@code
* thisReference} in {@code javaExpr}.
*
* @param javaExpr the expression to viewpoint-adapt
* @param thisReference the expression that replaces occurrences of {@link ThisReference}; if
* null, {@link ThisReference}s are not replaced
* @param args the expressions that replaces {@link FormalParameter}s; if null, {@link
* FormalParameter}s are not replaced
* @return the viewpoint-adapted expression
*/
public static JavaExpression viewpointAdapt(
JavaExpression javaExpr,
@Nullable JavaExpression thisReference,
@Nullable List args) {
return new ViewpointAdaptJavaExpression(thisReference, args).convert(javaExpr);
}
// Fields
/** List of arguments used to replace occurrences {@link FormalParameter}s. */
private final @Nullable List args;
/** The expression to replace occurrences of {@link ThisReference}s. */
private final @Nullable JavaExpression thisReference;
// Instance methods
/**
* Creates a {@link JavaExpressionConverter} that viewpoint-adapts using the given {@code
* thisReference} and {@code args}.
*
* @param thisReference the expression that replaces occurrences of {@link ThisReference}; {@code
* null} means don't replace
* @param args list of arguments that replaces occurrences {@link FormalParameter}s; {@code null}
* means don't replace
*/
private ViewpointAdaptJavaExpression(
@Nullable JavaExpression thisReference, @Nullable List args) {
this.args = args;
this.thisReference = thisReference;
}
@Override
protected JavaExpression visitThisReference(ThisReference thisExpr, Void unused) {
if (thisReference != null) {
return thisReference;
}
return super.visitThisReference(thisExpr, unused);
}
@Override
protected JavaExpression visitFormalParameter(FormalParameter parameterExpr, Void unused) {
if (args != null) {
int index = parameterExpr.getIndex() - 1;
if (index < args.size()) {
return args.get(index);
}
}
return super.visitFormalParameter(parameterExpr, unused);
}
}