diff options
author | Victor Chang <vichang@google.com> | 2023-06-09 09:51:37 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-06-09 09:51:37 +0000 |
commit | d0cf7f023e0ff4424acd3b25c1e5ce0a2ed57314 (patch) | |
tree | a1a569767f442e842b70624189dcf18611a070da | |
parent | ce6977a80cf00583daff4a54c8cf8e7d1e87ee46 (diff) | |
parent | 8e71fe2ccd8c77c4ea51ccdb5b7bb7963eb38c9c (diff) | |
download | ow2-asm-d0cf7f023e0ff4424acd3b25c1e5ce0a2ed57314.tar.gz |
Import ASM 9.5 am: 09e8c429ce am: 8e71fe2ccd
Original change: https://android-review.googlesource.com/c/platform/external/ow2-asm/+/2617250
Change-Id: I6650d84ba2945611d75930f27fdfb5bd7442cac3
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
18 files changed, 94 insertions, 61 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0cfedfd9..fa32f617 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,4 +1,4 @@ -image: gradle:7.4.1-jdk11 +image: gradle:7.6-jdk11 variables: # Set the location of the dependency cache to a local directory, so that it diff --git a/asm-test/src/main/resources/jdk3/ArtificialStructures.class b/asm-test/src/main/resources/jdk3/ArtificialStructures.class Binary files differindex 0ba4240b..68477215 100644 --- a/asm-test/src/main/resources/jdk3/ArtificialStructures.class +++ b/asm-test/src/main/resources/jdk3/ArtificialStructures.class diff --git a/asm-test/src/resources/java/jdk3/DumpArtificialStructures.java b/asm-test/src/resources/java/jdk3/DumpArtificialStructures.java index 3701472d..b316d1c0 100644 --- a/asm-test/src/resources/java/jdk3/DumpArtificialStructures.java +++ b/asm-test/src/resources/java/jdk3/DumpArtificialStructures.java @@ -47,7 +47,7 @@ import org.objectweb.asm.Opcodes; * <li>non standard class, field, method and code attributes, * <li>the nop and swap instructions, * <li>some variants of the dup_x2 and dup2_x2 instructions, - * <li>several line numbers per bytecode offset. + * <li>several line numbers per bytecode offset, and line numbers equal to 0. * </ul> * * Ideally we should not use ASM to generate this class (which is later used to test ASM), but this @@ -103,7 +103,7 @@ public class DumpArtificialStructures implements Opcodes { Label endIfLabel = new Label(); methodVisitor.visitJumpInsn(GOTO, endIfLabel); methodVisitor.visitLabel(elseLabel); - methodVisitor.visitLineNumber(1, elseLabel); + methodVisitor.visitLineNumber(0, elseLabel); methodVisitor.visitLineNumber(3, elseLabel); methodVisitor.visitLdcInsn("0"); methodVisitor.visitLabel(endIfLabel); diff --git a/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java b/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java index 8bb87124..8c0a1c63 100644 --- a/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java +++ b/asm-tree/src/main/java/org/objectweb/asm/tree/InvokeDynamicInsnNode.java @@ -66,12 +66,12 @@ public class InvokeDynamicInsnNode extends AbstractInsnNode { final String name, final String descriptor, final Handle bootstrapMethodHandle, - final Object... bootstrapMethodArguments) { // NOPMD(ArrayIsStoredDirectly): public field. + final Object... bootstrapMethodArguments) { super(Opcodes.INVOKEDYNAMIC); this.name = name; this.desc = descriptor; this.bsm = bootstrapMethodHandle; - this.bsmArgs = bootstrapMethodArguments; + this.bsmArgs = bootstrapMethodArguments; // NOPMD(ArrayIsStoredDirectly): public field. } @Override diff --git a/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java b/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java index 28f960c0..82e2b15e 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/ASMifier.java @@ -110,6 +110,7 @@ public class ASMifier extends Printer { classVersions.put(Opcodes.V18, "V18"); classVersions.put(Opcodes.V19, "V19"); classVersions.put(Opcodes.V20, "V20"); + classVersions.put(Opcodes.V21, "V21"); CLASS_VERSIONS = Collections.unmodifiableMap(classVersions); } diff --git a/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java b/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java index b6759073..339af5d1 100644 --- a/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java +++ b/asm-util/src/main/java/org/objectweb/asm/util/CheckMethodAdapter.java @@ -1101,9 +1101,13 @@ public class CheckMethodAdapter extends MethodVisitor { * @param method the expected visit method. */ private static void checkOpcodeMethod(final int opcode, final Method method) { - if (opcode < Opcodes.NOP || opcode > Opcodes.IFNONNULL || OPCODE_METHODS[opcode] != method) { + if (opcode < Opcodes.NOP || opcode > Opcodes.IFNONNULL) { throw new IllegalArgumentException("Invalid opcode: " + opcode); } + if (OPCODE_METHODS[opcode] != method) { + throw new IllegalArgumentException( + "Invalid combination of opcode and method: " + opcode + ", " + method); + } } /** diff --git a/asm-util/src/test/java/org/objectweb/asm/util/ASMifierTest.java b/asm-util/src/test/java/org/objectweb/asm/util/ASMifierTest.java index e616042f..252a7b59 100644 --- a/asm-util/src/test/java/org/objectweb/asm/util/ASMifierTest.java +++ b/asm-util/src/test/java/org/objectweb/asm/util/ASMifierTest.java @@ -40,6 +40,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.net.URL; import java.net.URLClassLoader; +import java.util.ArrayList; import org.codehaus.commons.compiler.CompileException; import org.codehaus.janino.ClassLoaderIClassLoader; import org.codehaus.janino.IClassLoader; @@ -108,10 +109,12 @@ class ASMifierTest extends AsmTest { private static byte[] compile(final String name, final String source) throws IOException { Parser parser = new Parser(new Scanner(name, new StringReader(source))); + ArrayList<org.codehaus.janino.util.ClassFile> generatedClassFiles = new ArrayList<>(); try { UnitCompiler unitCompiler = new UnitCompiler(parser.parseAbstractCompilationUnit(), ICLASS_LOADER); - return unitCompiler.compileUnit(true, true, true)[0].toByteArray(); + unitCompiler.compileUnit(true, true, true, generatedClassFiles); + return generatedClassFiles.get(0).toByteArray(); } catch (CompileException e) { throw new AssertionError(source, e); } diff --git a/asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java b/asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java index 6652d29b..817d3d65 100644 --- a/asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java +++ b/asm-util/src/test/java/org/objectweb/asm/util/CheckMethodAdapterTest.java @@ -434,7 +434,8 @@ class CheckMethodAdapterTest extends AsmTest implements Opcodes { Executable visitMethodInsn = () -> checkMethodAdapter.visitMethodInsn(42, "o", "m", "()V"); Exception exception = assertThrows(IllegalArgumentException.class, visitMethodInsn); - assertEquals("Invalid opcode: 42", exception.getMessage()); + assertEquals( + "Invalid combination of opcode and method: 42, VISIT_METHOD_INSN", exception.getMessage()); } @Test @@ -445,7 +446,8 @@ class CheckMethodAdapterTest extends AsmTest implements Opcodes { () -> checkMethodAdapter.visitMethodInsn(42, "o", "m", "()V", false); Exception exception = assertThrows(IllegalArgumentException.class, visitMethodInsn); - assertEquals("Invalid opcode: 42", exception.getMessage()); + assertEquals( + "Invalid combination of opcode and method: 42, VISIT_METHOD_INSN", exception.getMessage()); } @Test diff --git a/asm-util/src/test/resources/jdk3.ArtificialStructures.txt b/asm-util/src/test/resources/jdk3.ArtificialStructures.txt index ae5c1aa9..2f31e255 100644 --- a/asm-util/src/test/resources/jdk3.ArtificialStructures.txt +++ b/asm-util/src/test/resources/jdk3.ArtificialStructures.txt @@ -31,7 +31,7 @@ public class jdk3/ArtificialStructures { LDC "1" GOTO L1 L0 - LINENUMBER 1 L0 + LINENUMBER 0 L0 LINENUMBER 3 L0 FRAME FULL [U I] [U] LDC "0" diff --git a/asm/src/main/java/org/objectweb/asm/ClassReader.java b/asm/src/main/java/org/objectweb/asm/ClassReader.java index 7f0e4e72..2cfef457 100644 --- a/asm/src/main/java/org/objectweb/asm/ClassReader.java +++ b/asm/src/main/java/org/objectweb/asm/ClassReader.java @@ -194,7 +194,7 @@ public class ClassReader { this.b = classFileBuffer; // Check the class' major_version. This field is after the magic and minor_version fields, which // use 4 and 2 bytes respectively. - if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V20) { + if (checkClassVersion && readShort(classFileOffset + 6) > Opcodes.V21) { throw new IllegalArgumentException( "Unsupported class file major version " + readShort(classFileOffset + 6)); } @@ -2050,6 +2050,7 @@ public class ClassReader { currentOffset = bytecodeStartOffset; while (currentOffset < bytecodeEndOffset) { final int currentBytecodeOffset = currentOffset - bytecodeStartOffset; + readBytecodeInstructionOffset(currentBytecodeOffset); // Visit the label and the line number(s) for this bytecode offset, if any. Label currentLabel = labels[currentBytecodeOffset]; @@ -2666,6 +2667,20 @@ public class ClassReader { } /** + * Handles the bytecode offset of the next instruction to be visited in {@link + * #accept(ClassVisitor,int)}. This method is called just before the instruction and before its + * associated label and stack map frame, if any. The default implementation of this method does + * nothing. Subclasses can override this method to store the argument in a mutable field, for + * instance, so that {@link MethodVisitor} instances can get the bytecode offset of each visited + * instruction (if so, the usual concurrency issues related to mutable data should be addressed). + * + * @param bytecodeOffset the bytecode offset of the next instruction to be visited. + */ + protected void readBytecodeInstructionOffset(final int bytecodeOffset) { + // Do nothing by default. + } + + /** * Returns the label corresponding to the given bytecode offset. The default implementation of * this method creates a label for the given offset if it has not been already created. * diff --git a/asm/src/main/java/org/objectweb/asm/Frame.java b/asm/src/main/java/org/objectweb/asm/Frame.java index 07f256e5..89195006 100644 --- a/asm/src/main/java/org/objectweb/asm/Frame.java +++ b/asm/src/main/java/org/objectweb/asm/Frame.java @@ -367,11 +367,12 @@ class Frame { typeValue = REFERENCE_KIND | symbolTable.addType(internalName); break; default: - throw new IllegalArgumentException(); + throw new IllegalArgumentException( + "Invalid descriptor fragment: " + buffer.substring(elementDescriptorOffset)); } return ((elementDescriptorOffset - offset) << DIM_SHIFT) | typeValue; default: - throw new IllegalArgumentException(); + throw new IllegalArgumentException("Invalid descriptor: " + buffer.substring(offset)); } } diff --git a/asm/src/main/java/org/objectweb/asm/Label.java b/asm/src/main/java/org/objectweb/asm/Label.java index 926f719e..4bcf7c56 100644 --- a/asm/src/main/java/org/objectweb/asm/Label.java +++ b/asm/src/main/java/org/objectweb/asm/Label.java @@ -81,6 +81,9 @@ public class Label { /** A flag indicating that the basic block corresponding to a label is the end of a subroutine. */ static final int FLAG_SUBROUTINE_END = 64; + /** A flag indicating that this label has at least one associated line number. */ + static final int FLAG_LINE_NUMBER = 128; + /** * The number of elements to add to the {@link #otherLineNumbers} array when it needs to be * resized to store a new source line number. @@ -145,9 +148,9 @@ public class Label { short flags; /** - * The source line number corresponding to this label, or 0. If there are several source line - * numbers corresponding to this label, the first one is stored in this field, and the remaining - * ones are stored in {@link #otherLineNumbers}. + * The source line number corresponding to this label, if {@link #FLAG_LINE_NUMBER} is set. If + * there are several source line numbers corresponding to this label, the first one is stored in + * this field, and the remaining ones are stored in {@link #otherLineNumbers}. */ private short lineNumber; @@ -332,7 +335,8 @@ public class Label { * @param lineNumber a source line number (which should be strictly positive). */ final void addLineNumber(final int lineNumber) { - if (this.lineNumber == 0) { + if ((flags & FLAG_LINE_NUMBER) == 0) { + flags |= FLAG_LINE_NUMBER; this.lineNumber = (short) lineNumber; } else { if (otherLineNumbers == null) { @@ -356,7 +360,7 @@ public class Label { */ final void accept(final MethodVisitor methodVisitor, final boolean visitLineNumbers) { methodVisitor.visitLabel(this); - if (visitLineNumbers && lineNumber != 0) { + if (visitLineNumbers && (flags & FLAG_LINE_NUMBER) != 0) { methodVisitor.visitLineNumber(lineNumber & 0xFFFF, this); if (otherLineNumbers != null) { for (int i = 1; i <= otherLineNumbers[0]; ++i) { diff --git a/asm/src/main/java/org/objectweb/asm/Opcodes.java b/asm/src/main/java/org/objectweb/asm/Opcodes.java index 4a85a445..7202784f 100644 --- a/asm/src/main/java/org/objectweb/asm/Opcodes.java +++ b/asm/src/main/java/org/objectweb/asm/Opcodes.java @@ -286,6 +286,7 @@ public interface Opcodes { int V18 = 0 << 16 | 62; int V19 = 0 << 16 | 63; int V20 = 0 << 16 | 64; + int V21 = 0 << 16 | 65; /** * Version flag indicating that the class is using 'preview' features. diff --git a/asm/src/test/java/org/objectweb/asm/ConstantsTest.java b/asm/src/test/java/org/objectweb/asm/ConstantsTest.java index f2ca92a2..54955c54 100644 --- a/asm/src/test/java/org/objectweb/asm/ConstantsTest.java +++ b/asm/src/test/java/org/objectweb/asm/ConstantsTest.java @@ -253,6 +253,7 @@ class ConstantsTest { case "V18": case "V19": case "V20": + case "V21": return ConstantType.CLASS_VERSION; case "ACC_PUBLIC": case "ACC_PRIVATE": diff --git a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/Adapter.java b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/Adapter.java index 6b72491c..8a478027 100644 --- a/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/Adapter.java +++ b/benchmarks/src/jmh/java/org/objectweb/asm/benchmarks/Adapter.java @@ -134,14 +134,11 @@ public abstract class Adapter { * @param interfaces the internal names of the class's interfaces */ public ClassInfo( - final int access, - final String name, - final String superClass, - final String[] interfaces) { // NOPMD(ArrayIsStoredDirectly): non public API. + final int access, final String name, final String superClass, final String[] interfaces) { this.access = access; this.name = name; this.superClass = superClass; - this.interfaces = interfaces; + this.interfaces = interfaces; // NOPMD(ArrayIsStoredDirectly): non public API. } } } diff --git a/build.gradle b/build.gradle index 0e67ce83..ec26c104 100644 --- a/build.gradle +++ b/build.gradle @@ -31,10 +31,9 @@ buildscript { dependencies { classpath 'org.netbeans.tools:sigtest-maven-plugin:1.5' } } -plugins { id 'biz.aQute.bnd.builder' version '6.2.0' apply false } plugins { id 'com.github.sherter.google-java-format' version '0.9' apply false } -plugins { id 'me.champeau.jmh' version '0.6.6' apply false } -plugins { id 'org.sonarqube' version '3.3' apply false } +plugins { id 'me.champeau.jmh' version '0.6.8' apply false } +plugins { id 'org.sonarqube' version '3.5.0.2730' apply false } description = 'ASM, a very small and fast Java bytecode manipulation framework' @@ -61,8 +60,12 @@ subprojects { ext.provides = [] // The provided java packages, e.g. ['org.objectweb.asm'] ext.requires = [] // The required Gradle projects, e.g. [':asm-test'] ext.transitiveRequires = { -> - return requires.collect{p -> - project(p).transitiveRequires().plus(project(p).provides[0])}.flatten() + return requires.collect{project(it)} + .collect{it.transitiveRequires().plus(it.provides[0])}.flatten() as Set + } + ext.transitiveImports = { -> + return requires.collect{project(it)} + .collect{it.transitiveImports().plus(it.provides)}.flatten() as Set } ext.depends = [] // The external dependencies, e.g. ['junit:junit:4.12'] // Some external dependencies (such as Jacoco) depend transitively on ASM, and @@ -96,8 +99,8 @@ project(':asm-commons') { project(':asm-test') { description = "Utilities for testing ${parent.description}" provides = ['org.objectweb.asm.test'] - depends = ['org.junit.jupiter:junit-jupiter-api:5.8.2', - 'org.junit.jupiter:junit-jupiter-params:5.8.2'] + depends = ['org.junit.jupiter:junit-jupiter-api:5.9.1', + 'org.junit.jupiter:junit-jupiter-params:5.9.1'] } project(':asm-tree') { @@ -110,7 +113,7 @@ project(':asm-util') { description = "Utilities for ${parent.description}" provides = ['org.objectweb.asm.util'] requires = [':asm', ':asm-tree', ':asm-analysis'] - dependencies { testImplementation 'org.codehaus.janino:janino:3.1.6' } + dependencies { testImplementation 'org.codehaus.janino:janino:3.1.9' } } // Use "gradle benchmarks:jmh [-PjmhInclude='<regex>']" to run the benchmarks. @@ -136,7 +139,7 @@ project(':benchmarks') { dependencies.add("asm${version}", "org.ow2.asm:asm:${version}@jar") dependencies.add("asm${version}", "org.ow2.asm:asm-tree:${version}@jar") task "asm${version}"(type: Copy) { - from configurations."asm${version}".collect { zipTree(it) } + from configurations."asm${version}".collect{zipTree(it)} into "${buildDir}/asm${version}" duplicatesStrategy = DuplicatesStrategy.INCLUDE // module-info.class } @@ -145,7 +148,7 @@ project(':benchmarks') { configurations.create('input-classes-java8') dependencies.add('input-classes-java8', 'io.vavr:vavr:0.10.0@jar') task copyInputClasses(type: Copy) { - from configurations.'input-classes-java8'.collect { zipTree(it) } + from configurations.'input-classes-java8'.collect{zipTree(it)} into "${buildDir}/input-classes-java8" } classes.dependsOn copyInputClasses @@ -154,7 +157,7 @@ project(':benchmarks') { resultFormat = 'CSV' profilers = ['org.objectweb.asm.benchmarks.MemoryProfiler'] if (rootProject.hasProperty('jmhInclude')) { - include = [jmhInclude] + includes = [jmhInclude] } } } @@ -197,9 +200,9 @@ subprojects { dependencies { requires.each { projectName -> api project(projectName) } depends.each { artifactName -> api artifactName } - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2', - 'org.junit.jupiter:junit-jupiter-params:5.8.2' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.2' + testImplementation 'org.junit.jupiter:junit-jupiter-api:5.9.1', + 'org.junit.jupiter:junit-jupiter-params:5.9.1' + testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.9.1' testImplementation project(':asm-test') } @@ -215,7 +218,7 @@ subprojects { // Configure the projects with a non-empty 'provides' property. They must be // checked for code coverage and backward compatibility, retrofited to Java 1.5, // and packaged with generated module-info classes. -configure(subprojects.findAll { it.provides }) { +configure(subprojects.findAll{it.provides}) { // Code coverage configuration. jacoco.toolVersion = '0.8.8' jacocoTestReport { @@ -238,8 +241,9 @@ configure(subprojects.findAll { it.provides }) { def retrofitter = loader.loadClass('org.objectweb.asm.tools.Retrofitter').newInstance() def classes = sourceSets.main.output.classesDirs.singleFile + def requires = transitiveRequires() as List retrofitter.retrofit(classes, "${version}") - retrofitter.verify(classes, "${version}", provides, transitiveRequires()) + retrofitter.verify(classes, "${version}", provides, requires) } } @@ -281,31 +285,31 @@ configure(subprojects.findAll { it.provides }) { } } - // Apply the biz.aQute.bnd plugin to package the project as an OSGi bundle. - // Exclude the asm-test project (the DefaultPackage class prevents it from - // being a proper bundle). + jar.manifest.attributes( + 'Implementation-Title': project.description, + 'Implementation-Version': "${version}") + // Package the project as an OSGi bundle. Exclude the asm-test project (the + // DefaultPackage class prevents it from being a proper bundle). if (name != 'asm-test') { - apply plugin: 'biz.aQute.bnd.builder' + def imports = transitiveImports() jar.manifest.attributes( - '-classpath': sourceSets.main.output.classesDirs.asPath, - '-removeheaders': 'Bnd-LastModified,Build-By,Created-By,Include-Resource,\ - Require-Capability,Tool', - 'Bundle-License': 'BSD-3-Clause;link=https://asm.ow2.io/LICENSE.txt', 'Bundle-DocURL': 'http://asm.ow2.org', + 'Bundle-License': 'BSD-3-Clause;link=https://asm.ow2.io/LICENSE.txt', + 'Bundle-ManifestVersion': 2, + 'Bundle-Name': provides[0], 'Bundle-RequiredExecutionEnvironment': 'J2SE-1.5', 'Bundle-SymbolicName': provides[0], - 'Export-Package': provides.collect{"${it};version=${version}"}.join(','), - 'Implementation-Title': project.description, - 'Implementation-Version': "${version}", - 'Module-Requires': - requires - .collect{"${project(it).provides[0]};transitive=true"} - .join(',') - ) - } else { - jar.manifest.attributes( - 'Implementation-Title': project.description, - 'Implementation-Version': "${version}") + 'Bundle-Version': "${version}", + 'Export-Package': + provides.collect{"${it};version=\"${version}\""}.join(',') + + (imports ? ";uses:=\"${imports.join(',')}\"" : "")) + if (imports) { + jar.manifest.attributes( + 'Import-Package': + imports.collect{"${it};version=\"${version}\""}.join(','), + 'Module-Requires': + transitiveRequires().collect{"${it};transitive=true"}.join(',')) + } } // Apply the SonarQube plugin to monitor the code quality of the project. diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 4462a0e4..565bc3a9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip diff --git a/tools/checkstyle.xml b/tools/checkstyle.xml index 2e7ed7cf..b2648ea5 100644 --- a/tools/checkstyle.xml +++ b/tools/checkstyle.xml @@ -84,7 +84,7 @@ value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF" /> </module> <module name="JavadocMethod"> - <property name="scope" value="public" /> + <property name="accessModifiers" value="public" /> <property name="allowMissingParamTags" value="true" /> <property name="allowMissingReturnTag" value="true" /> <property name="allowedAnnotations" |