private TypeDeclaration getOuterClass (CompilationUnit unit) { for (TypeDeclaration type : unit.getTypes()) { if (type instanceof ClassOrInterfaceDeclaration || type instanceof EnumDeclaration) return type; } throw new RuntimeException("Couldn't find class, is your java file empty?"); }
private static ImportDeclaration importDeclaration(String name) { return new ImportDeclaration(new Name(name), false, false); }
String className = n.getNameAsString(); for (FieldDeclaration field : n.getFields()) { if (field.getModifiers().contains(Modifier.STATIC)) { for (VariableDeclarator variable : field.getVariables()) { String variableName = variable.getNameAsString(); for (MethodDeclaration method : n.getMethods()) { String methodName = method.getNameAsString(); if (!methodName.endsWith(methodNameSuffix)) { method.setBody(fieldUpdaterLazySet(fieldUpdaterFieldName, newValueName)); } else if (methodName.startsWith("cas")) { usesFieldUpdater = true; String fieldUpdaterFieldName = fieldUpdaterFieldName(variableName); String expectedValueName = "expect"; method.setBody( fieldUpdaterCompareAndSet(fieldUpdaterFieldName, expectedValueName, newValueName)); } else if (methodName.startsWith("sv")) { method.setBody(fieldAssignment(variableName, newValueName)); } else if (methodName.startsWith("lv") || methodName.startsWith("lp")) { method.setBody(returnField(variableName)); } else { throw new IllegalStateException("Unhandled method: " + methodName); n.getMembers().add(0, declareLongFieldUpdater(className, variableName)); field.addModifier(Modifier.VOLATILE);
@Override public void visit(BlockStmt n, Void arg) { out.println("BlockStmt: " + (extended ? n : n.getStatements().size() + " statements")); super.visit(n, arg); }
/** * Generates something like * <code>private static final AtomicLongFieldUpdater<MpmcAtomicArrayQueueProducerIndexField> P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");</code> * * @param type * @param name * @param initializer * @param modifiers * @return */ private static FieldDeclaration fieldDeclarationWithInitialiser(Type type, String name, Expression initializer, Modifier... modifiers) { FieldDeclaration fieldDeclaration = new FieldDeclaration(); VariableDeclarator variable = new VariableDeclarator(type, name, initializer); fieldDeclaration.getVariables().add(variable); EnumSet<Modifier> modifierSet = EnumSet.copyOf(Arrays.asList(modifiers)); fieldDeclaration.setModifiers(modifierSet); return fieldDeclaration; }
private static void organiseImports(CompilationUnit cu) { List<ImportDeclaration> importDecls = new ArrayList<>(); for (ImportDeclaration importDeclaration : cu.getImports()) { if (importDeclaration.getNameAsString().startsWith("org.jctools.util.Unsafe")) { continue; } importDecls.add(importDeclaration); } cu.getImports().clear(); for (ImportDeclaration importDecl : importDecls) { cu.addImport(importDecl); } cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicLongFieldUpdater")); cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicReferenceArray")); cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicLongArray")); }
@Override public void visit(ImportDeclaration n, Void arg) { out.println("ImportDeclaration: " + (extended ? n : n.getNameAsString())); super.visit(n, arg); }
private static ClassOrInterfaceType simpleParametricType(String className, String... typeArgs) { NodeList<Type> typeArguments = new NodeList<Type>(); for (String typeArg : typeArgs) { typeArguments.add(classType(typeArg)); } return new ClassOrInterfaceType(null, new SimpleName(className), typeArguments); }
private static boolean isCommentPresent(Node node, String wanted) { Optional<Comment> maybeComment = node.getComment(); if (maybeComment.isPresent()) { Comment comment = maybeComment.get(); String content = comment.getContent().trim(); if (wanted.equals(content)) { return true; } } return false; }
public static void main(String[] args) throws Exception { if (args.length < 2) { throw new IllegalArgumentException("Usage: outputDirectory inputSourceFiles"); } File outputDirectory = new File(args[0]); for (int i = 1; i < args.length; i++) { File file = new File(args[i]); System.out.println("Processing " + file); CompilationUnit cu = JavaParser.parse(file); new JavaParsingAtomicArrayQueueGenerator(file.getName()).visit(cu, null); organiseImports(cu); FileWriter writer = null; String outputFileName = file.getName(); if (outputFileName.endsWith(".java")) { outputFileName = translateQueueName(outputFileName.replace(".java", "")); } else { outputFileName = translateQueueName(outputFileName); } outputFileName += ".java"; try { writer = new FileWriter(new File(outputDirectory, outputFileName)); writer.write(cu.toString()); } finally { if (writer != null) { writer.close(); } } } }
/** * Generates something like * <code>private static final AtomicLongFieldUpdater<MpmcAtomicArrayQueueProducerIndexField> P_INDEX_UPDATER = AtomicLongFieldUpdater.newUpdater(MpmcAtomicArrayQueueProducerIndexField.class, "producerIndex");</code> * * @param type * @param name * @param initializer * @param modifiers * @return */ private static FieldDeclaration fieldDeclarationWithInitialiser(Type type, String name, Expression initializer, Modifier... modifiers) { FieldDeclaration fieldDeclaration = new FieldDeclaration(); VariableDeclarator variable = new VariableDeclarator(type, name, initializer); fieldDeclaration.getVariables().add(variable); EnumSet<Modifier> modifierSet = EnumSet.copyOf(Arrays.asList(modifiers)); fieldDeclaration.setModifiers(modifierSet); return fieldDeclaration; }
private static void organiseImports(CompilationUnit cu) { List<ImportDeclaration> importDecls = new ArrayList<>(); for (ImportDeclaration importDeclaration : cu.getImports()) { String name = importDeclaration.getNameAsString(); if (name.startsWith("org.jctools.util.Unsafe")) { continue; importDeclaration.setName(name.replace("org.jctools.queues.LinkedArrayQueueUtil", "org.jctools.queues.atomic.LinkedAtomicArrayQueueUtil")); cu.getImports().clear(); for (ImportDeclaration importDecl : importDecls) { cu.addImport(importDecl); cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicReferenceFieldUpdater")); cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicLongFieldUpdater")); cu.addImport(importDeclaration("org.jctools.queues.MessagePassingQueue")); cu.addImport(importDeclaration("org.jctools.queues.MessagePassingQueue.Supplier")); cu.addImport(importDeclaration("org.jctools.queues.MessagePassingQueueUtil")); cu.addImport(importDeclaration("org.jctools.queues.QueueProgressIndicators")); cu.addImport(importDeclaration("org.jctools.queues.IndexedQueueSizeUtil")); cu.addImport(staticImportDeclaration("org.jctools.queues.atomic.LinkedAtomicArrayQueueUtil.*")); cu.addImport(importDeclaration("java.util.concurrent.atomic.AtomicReferenceArray")); cu.addImport(importDeclaration("org.jctools.queues.MpmcArrayQueue"));
private TypeDeclaration getOuterClass (CompilationUnit unit) { for (TypeDeclaration type : unit.getTypes()) { if (type instanceof ClassOrInterfaceDeclaration || type instanceof EnumDeclaration) return type; } throw new RuntimeException("Couldn't find class, is your java file empty?"); }
private static ClassOrInterfaceType simpleParametricType(String className, String... typeArgs) { NodeList<Type> typeArguments = new NodeList<Type>(); for (String typeArg : typeArgs) { typeArguments.add(classType(typeArg)); } return new ClassOrInterfaceType(null, new SimpleName(className), typeArguments); }
private static ImportDeclaration staticImportDeclaration(String name) { return new ImportDeclaration(new Name(name), true, false); }
private static boolean isCommentPresent(Node node, String wanted) { Optional<Comment> maybeComment = node.getComment(); if (maybeComment.isPresent()) { Comment comment = maybeComment.get(); String content = comment.getContent().trim(); if (wanted.equals(content)) { return true; } } return false; }
try { writer = new FileWriter(outputFile); writer.write(cu.toString()); } finally { if (writer != null) {
private static ImportDeclaration importDeclaration(String name) { return new ImportDeclaration(new Name(name), false, false); }