public final class JavaParsingAtomicLinkedQueueGenerator
extends com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
Modifier and Type | Field and Description |
---|---|
private static java.lang.String |
GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS |
private static java.lang.String |
GEN_DIRECTIVE_METHOD_IGNORE |
private static java.lang.String |
INDENT_LEVEL |
private static java.lang.String |
MPSC_LINKED_ATOMIC_QUEUE_NAME |
private java.lang.String |
sourceFileName |
Constructor and Description |
---|
JavaParsingAtomicLinkedQueueGenerator(java.lang.String sourceFileName) |
Modifier and Type | Method and Description |
---|---|
private static com.github.javaparser.ast.type.ClassOrInterfaceType |
atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in) |
private static java.lang.String |
capitalise(java.lang.String s) |
private static com.github.javaparser.ast.type.ClassOrInterfaceType |
classType(java.lang.String className) |
private static com.github.javaparser.ast.body.FieldDeclaration |
declareLongFieldUpdater(java.lang.String className,
java.lang.String variableName)
Generates something like
private static final AtomicLongFieldUpdater |
private static com.github.javaparser.ast.body.FieldDeclaration |
declareRefFieldUpdater(java.lang.String className,
java.lang.String variableName)
Generates something like
private static final AtomicReferenceFieldUpdater |
private static com.github.javaparser.ast.stmt.BlockStmt |
fieldAssignment(java.lang.String fieldName,
java.lang.String valueName)
Generates something like
field = newValue |
private static com.github.javaparser.ast.body.FieldDeclaration |
fieldDeclarationWithInitialiser(com.github.javaparser.ast.type.Type type,
java.lang.String name,
com.github.javaparser.ast.expr.Expression initializer,
com.github.javaparser.ast.Modifier... modifiers)
Generates something like
private static final AtomicLongFieldUpdater |
private static com.github.javaparser.ast.stmt.BlockStmt |
fieldUpdaterCompareAndSet(java.lang.String fieldUpdaterFieldName,
java.lang.String expectedValueName,
java.lang.String newValueName)
Generates something like
return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue) |
private static java.lang.String |
fieldUpdaterFieldName(java.lang.String fieldName) |
private static com.github.javaparser.ast.stmt.BlockStmt |
fieldUpdaterGetAndSet(java.lang.String fieldUpdaterFieldName,
java.lang.String newValueName)
Generates something like
return P_INDEX_UPDATER.getAndSet(this, newValue) |
private static com.github.javaparser.ast.stmt.BlockStmt |
fieldUpdaterLazySet(java.lang.String fieldUpdaterFieldName,
java.lang.String newValueName)
Generates something like
P_INDEX_UPDATER.lazySet(this, newValue) |
private static java.lang.String |
formatMultilineJavadoc(int indent,
java.lang.String... lines) |
private static com.github.javaparser.ast.ImportDeclaration |
importDeclaration(java.lang.String name) |
private static boolean |
isCommentPresent(com.github.javaparser.ast.Node node,
java.lang.String wanted) |
private static boolean |
isRefArray(com.github.javaparser.ast.type.Type in,
java.lang.String refClassName) |
private static boolean |
isRefType(com.github.javaparser.ast.type.Type in,
java.lang.String className) |
static void |
main(java.lang.String[] args) |
private static com.github.javaparser.ast.expr.MethodCallExpr |
methodCallExpr(java.lang.String owner,
java.lang.String method,
com.github.javaparser.ast.expr.Expression... args) |
private static com.github.javaparser.ast.expr.MethodCallExpr |
newAtomicLongFieldUpdater(java.lang.String className,
java.lang.String variableName) |
private static com.github.javaparser.ast.expr.MethodCallExpr |
newAtomicRefFieldUpdater(java.lang.String className,
java.lang.String variableName) |
private static void |
organiseImports(com.github.javaparser.ast.CompilationUnit cu) |
private static void |
patchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
For each method accessor to a field, add in the calls necessary to
AtomicFieldUpdaters.
|
private static void |
processSpecialNodeTypes(com.github.javaparser.ast.body.MethodDeclaration node) |
private static void |
processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node,
java.lang.String name)
Given a variable declaration of some sort, check it's name and type and
if it looks like any of the key type changes between unsafe and atomic
queues, perform the conversion to change it's type.
|
private static void |
processSpecialNodeTypes(com.github.javaparser.ast.expr.ObjectCreationExpr node) |
private static void |
processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node) |
private static void |
processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node) |
private static void |
removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node) |
private static void |
replaceParentClassesForAtomics(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
Searches all extended or implemented super classes or interfaces for
special classes that differ with the atomics version and replaces them
with the appropriate class.
|
private static void |
replaceParentClassesForAtomics(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types) |
private static com.github.javaparser.ast.stmt.BlockStmt |
returnField(java.lang.String fieldName)
Generates something like
return field |
private static com.github.javaparser.ast.type.ClassOrInterfaceType |
simpleParametricType(java.lang.String className,
java.lang.String... typeArgs) |
private static com.github.javaparser.ast.ImportDeclaration |
staticImportDeclaration(java.lang.String name) |
private static java.lang.String |
translateQueueName(java.lang.String originalQueueName) |
void |
visit(com.github.javaparser.ast.expr.CastExpr n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.body.ConstructorDeclaration n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.expr.FieldAccessExpr n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.body.MethodDeclaration n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.expr.ObjectCreationExpr n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.PackageDeclaration n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.body.Parameter n,
java.lang.Void arg) |
void |
visit(com.github.javaparser.ast.body.VariableDeclarator n,
java.lang.Void arg) |
visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit, visit
private static final java.lang.String GEN_DIRECTIVE_CLASS_CONTAINS_ORDERED_FIELD_ACCESSORS
private static final java.lang.String GEN_DIRECTIVE_METHOD_IGNORE
private static final java.lang.String MPSC_LINKED_ATOMIC_QUEUE_NAME
private static final java.lang.String INDENT_LEVEL
private final java.lang.String sourceFileName
public JavaParsingAtomicLinkedQueueGenerator(java.lang.String sourceFileName)
public void visit(com.github.javaparser.ast.expr.FieldAccessExpr n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.expr.CastExpr n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.body.ConstructorDeclaration n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.PackageDeclaration n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.body.Parameter n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.body.VariableDeclarator n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.body.MethodDeclaration n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
public void visit(com.github.javaparser.ast.expr.ObjectCreationExpr n, java.lang.Void arg)
visit
in interface com.github.javaparser.ast.visitor.VoidVisitor<java.lang.Void>
visit
in class com.github.javaparser.ast.visitor.VoidVisitorAdapter<java.lang.Void>
private static boolean isCommentPresent(com.github.javaparser.ast.Node node, java.lang.String wanted)
private static void removeStaticFieldsAndInitialisers(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration node)
private static void replaceParentClassesForAtomics(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
n
- private static void replaceParentClassesForAtomics(com.github.javaparser.ast.NodeList<com.github.javaparser.ast.type.ClassOrInterfaceType> types)
private static void patchAtomicFieldUpdaterAccessorMethods(com.github.javaparser.ast.body.ClassOrInterfaceDeclaration n)
lv,
lp and sv are simple field accesses with only
so and cas using the AtomicFieldUpdaters.
n
- the AST node for the containing classprivate static java.lang.String capitalise(java.lang.String s)
private static java.lang.String formatMultilineJavadoc(int indent, java.lang.String... lines)
private static com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterLazySet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)
P_INDEX_UPDATER.lazySet(this, newValue)
fieldUpdaterFieldName
- newValueName
- private static com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterCompareAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String expectedValueName, java.lang.String newValueName)
return P_INDEX_UPDATER.compareAndSet(this, expectedValue, newValue)
fieldUpdaterFieldName
- expectedValueName
- newValueName
- private static com.github.javaparser.ast.stmt.BlockStmt fieldUpdaterGetAndSet(java.lang.String fieldUpdaterFieldName, java.lang.String newValueName)
return P_INDEX_UPDATER.getAndSet(this, newValue)
fieldUpdaterFieldName
- newValueName
- private static com.github.javaparser.ast.stmt.BlockStmt fieldAssignment(java.lang.String fieldName, java.lang.String valueName)
field = newValue
fieldName
- valueName
- private static com.github.javaparser.ast.body.FieldDeclaration fieldDeclarationWithInitialiser(com.github.javaparser.ast.type.Type type, java.lang.String name, com.github.javaparser.ast.expr.Expression initializer, com.github.javaparser.ast.Modifier... modifiers)
private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
type
- name
- initializer
- modifiers
- private static com.github.javaparser.ast.body.FieldDeclaration declareRefFieldUpdater(java.lang.String className, java.lang.String variableName)
private static final AtomicReferenceFieldUpdater P_NODE_UPDATER = AtomicReferenceFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerNodeField.class, "producerNode");
className
- variableName
- private static com.github.javaparser.ast.expr.MethodCallExpr newAtomicRefFieldUpdater(java.lang.String className, java.lang.String variableName)
private static com.github.javaparser.ast.body.FieldDeclaration declareLongFieldUpdater(java.lang.String className, java.lang.String variableName)
private static final AtomicLongFieldUpdater P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");
className
- variableName
- private static com.github.javaparser.ast.expr.MethodCallExpr newAtomicLongFieldUpdater(java.lang.String className, java.lang.String variableName)
private static com.github.javaparser.ast.stmt.BlockStmt returnField(java.lang.String fieldName)
return field
fieldName
- private static boolean isRefArray(com.github.javaparser.ast.type.Type in, java.lang.String refClassName)
private static boolean isRefType(com.github.javaparser.ast.type.Type in, java.lang.String className)
private static com.github.javaparser.ast.type.ClassOrInterfaceType atomicRefArrayType(com.github.javaparser.ast.type.ArrayType in)
private static com.github.javaparser.ast.expr.MethodCallExpr methodCallExpr(java.lang.String owner, java.lang.String method, com.github.javaparser.ast.expr.Expression... args)
private static com.github.javaparser.ast.type.ClassOrInterfaceType simpleParametricType(java.lang.String className, java.lang.String... typeArgs)
private static com.github.javaparser.ast.type.ClassOrInterfaceType classType(java.lang.String className)
private static com.github.javaparser.ast.ImportDeclaration importDeclaration(java.lang.String name)
private static com.github.javaparser.ast.ImportDeclaration staticImportDeclaration(java.lang.String name)
private static java.lang.String translateQueueName(java.lang.String originalQueueName)
private static java.lang.String fieldUpdaterFieldName(java.lang.String fieldName)
private static void organiseImports(com.github.javaparser.ast.CompilationUnit cu)
private static void processSpecialNodeTypes(com.github.javaparser.ast.body.Parameter node)
private static void processSpecialNodeTypes(com.github.javaparser.ast.body.VariableDeclarator node)
private static void processSpecialNodeTypes(com.github.javaparser.ast.body.MethodDeclaration node)
private static void processSpecialNodeTypes(com.github.javaparser.ast.expr.ObjectCreationExpr node)
private static void processSpecialNodeTypes(com.github.javaparser.ast.nodeTypes.NodeWithType<?,com.github.javaparser.ast.type.Type> node, java.lang.String name)
node
- name
- public static void main(java.lang.String[] args) throws java.lang.Exception
java.lang.Exception