checkstyle checks
java checkstyle
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: initial commit

+913
+110
.checkstyle/checkstyle.xml
··· 1 + <?xml version="1.0"?> 2 + <!DOCTYPE module PUBLIC 3 + "-//Puppy Crawl//DTD Check Configuration 1.3//EN" 4 + "https://checkstyle.org/dtds/configuration_1_3.dtd"> 5 + 6 + <module name="Checker"> 7 + 8 + <property name="charset" value="UTF-8"/> 9 + <property name="fileExtensions" value="java, properties, xml"/> 10 + <property name="severity" value="error"/> 11 + 12 + <!-- https://checkstyle.org/filefilters/beforeexecutionexclusionfilefilter.html --> 13 + <module name="BeforeExecutionExclusionFileFilter"> 14 + <property name="fileNamePattern" value="module\-info\.java$"/> 15 + </module> 16 + 17 + <!-- https://checkstyle.org/checks/whitespace/filetabcharacter.html --> 18 + <module name="FileTabCharacter"> 19 + <property name="eachLine" value="true"/> 20 + </module> 21 + 22 + <!-- https://checkstyle.org/checks/misc/newlineatendoffile.html --> 23 + <module name="NewlineAtEndOfFile"/> 24 + 25 + <!-- https://checkstyle.org/filters/suppressionfilter.html --> 26 + <module name="SuppressionFilter"> 27 + <property name="file" value="${configDirectory}/suppressions.xml"/> 28 + </module> 29 + 30 + <!-- https://checkstyle.org/filters/suppresswarningsfilter.html --> 31 + <module name="SuppressWarningsFilter"/> 32 + 33 + <module name="TreeWalker"> 34 + 35 + <!-- https://checkstyle.org/checks/misc/arraytypestyle.html --> 36 + <module name="ArrayTypeStyle"/> 37 + 38 + <!-- https://checkstyle.org/checks/imports/avoidstarimport.html --> 39 + <module name="AvoidStarImport"/> 40 + 41 + <!-- https://checkstyle.org/checks/design/finalclass.html --> 42 + <module name="FinalClass"/> 43 + 44 + <!-- https://checkstyle.org/checks/coding/finallocalvariable.html --> 45 + <module name="FinalLocalVariable"> 46 + <property name="tokens" value="PARAMETER_DEF, VARIABLE_DEF"/> 47 + <property name="validateEnhancedForLoopVariable" value="true"/> 48 + </module> 49 + 50 + <!-- https://checkstyle.org/checks/imports/illegalimport.html --> 51 + <module name="IllegalImport"> 52 + <property name="illegalPkgs" 53 + value="sun, jdk, com.sun, org.jetbrains.annotations.Nullable, org.jetbrains.annotations.NotNull"/> 54 + </module> 55 + 56 + <!-- https://checkstyle.org/checks/javadoc/invalidjavadocposition.html --> 57 + <module name="InvalidJavadocPosition"/> 58 + 59 + <!-- https://checkstyle.org/checks/javadoc/javadoccontentlocation.html --> 60 + <module name="JavadocContentLocation"/> 61 + 62 + <!-- https://checkstyle.org/checks/javadoc/javadocmethod.html --> 63 + <module name="JavadocMethod"/> 64 + 65 + <!-- https://checkstyle.org/checks/javadoc/javadocmissingwhitespaceafterasterisk.html --> 66 + <module name="JavadocMissingWhitespaceAfterAsterisk"/> 67 + 68 + <!-- https://checkstyle.org/checks/javadoc/javadocparagraph.html --> 69 + <module name="JavadocParagraph"/> 70 + 71 + <!-- https://checkstyle.org/checks/javadoc/javadoctagcontinuationindentation.html --> 72 + <module name="JavadocTagContinuationIndentation"/> 73 + 74 + <!-- https://checkstyle.org/checks/blocks/leftcurly.html --> 75 + <module name="LeftCurly"/> 76 + 77 + <!-- https://checkstyle.org/checks/coding/matchxpath.html --> 78 + <module name="MatchXpath"> 79 + <property name="query" value="//ANNOTATION[./IDENT[@text='NotNull']]"/> 80 + <message key="matchxpath.match" 81 + value="Avoid using @NotNull annotation. Use @NonNull instead."/> 82 + </module> 83 + 84 + <!-- https://checkstyle.org/checks/naming/methodname.html --> 85 + <module name="MethodName"> 86 + <property name="format" 87 + value="^(?:(?:.{1,3})|(?:[gs]et[^A-Z].*)|(?:(?:[^gsA-Z]..|.[^e].|..[^t]).+))$"/> 88 + </module> 89 + 90 + <!-- https://checkstyle.org/checks/javadoc/missingjavadoctype.html --> 91 + <module name="MissingJavadocType"/> 92 + 93 + <!-- https://checkstyle.org/checks/javadoc/missingjavadocmethod.html --> 94 + <module name="MissingJavadocMethod"/> 95 + 96 + <!-- https://checkstyle.org/checks/javadoc/missingjavadocpackage.html --> 97 + <module name="MissingJavadocPackage"/> 98 + 99 + <!-- https://checkstyle.org/checks/coding/requirethis.html --> 100 + <module name="RequireThis"/> 101 + 102 + <!-- https://checkstyle.org/filters/suppresswarningsfilter.html --> 103 + <module name="SuppressWarningsHolder"/> 104 + 105 + <!-- https://checkstyle.org/filters/suppressioncommentfilter.html --> 106 + <module name="SuppressionCommentFilter"/> 107 + 108 + </module> 109 + 110 + </module>
+10
.checkstyle/suppressions.xml
··· 1 + <?xml version="1.0" encoding="UTF-8"?> 2 + <!DOCTYPE suppressions PUBLIC "-//Checkstyle//DTD SuppressionFilter Configuration 1.2//EN" 3 + "http://checkstyle.org/dtds/suppressions_1_2.dtd"> 4 + <suppressions> 5 + 6 + <!-- don't require docs for tests --> 7 + <suppress files="src[\\/]test[\\/]java[\\/].*" 8 + checks="(MissingJavadoc.*)"/> 9 + 10 + </suppressions>
+13
.editorconfig
··· 1 + [*] 2 + charset = utf-8 3 + end_of_line = lf 4 + indent_size = 4 5 + indent_style = space 6 + insert_final_newline = true 7 + max_line_length = 100 8 + tab_width = 4 9 + ij_continuation_indent_size = 4 10 + ij_smart_tabs = false 11 + ij_java_blank_lines_before_class_end = 1 12 + ij_any_blank_lines_after_class_header = 1 13 + ij_any_blank_lines_around_field = 1
+2
.gitattributes
··· 1 + * text=auto 2 + *.java text eol=lf
+6
.gitignore
··· 1 + **/build 2 + **/.gradle 3 + **/.idea 4 + **/.iml 5 + **/run 6 + **/.kotlin
+16
build-logic/build.gradle.kts
··· 1 + plugins { 2 + `kotlin-dsl` 3 + } 4 + 5 + repositories { 6 + gradlePluginPortal() 7 + } 8 + 9 + dependencies { 10 + implementation(libs.shadow) 11 + implementation(libs.indra.common) 12 + implementation(libs.indra.licenseHeader) 13 + 14 + // https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 15 + implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) 16 + }
+7
build-logic/settings.gradle.kts
··· 1 + dependencyResolutionManagement { 2 + versionCatalogs { 3 + create("libs") { 4 + from(files("../gradle/libs.versions.toml")) 5 + } 6 + } 7 + }
+42
build-logic/src/main/kotlin/base-conventions.gradle.kts
··· 1 + plugins { 2 + idea 3 + id("net.kyori.indra") 4 + id("net.kyori.indra.checkstyle") 5 + id("net.kyori.indra.licenser.spotless") 6 + } 7 + 8 + version = rootProject.version 9 + 10 + indra { 11 + mitLicense() 12 + 13 + javaVersions { 14 + target(25) 15 + } 16 + } 17 + 18 + indraSpotlessLicenser { 19 + licenseHeaderFile(rootProject.file("license_header.txt")) 20 + } 21 + 22 + dependencies { 23 + checkstyle(libs.checkstyle) 24 + testImplementation(libs.junit.jupiter) 25 + testRuntimeOnly(libs.junit.platform.launcher) 26 + } 27 + 28 + tasks { 29 + jar { 30 + dependsOn(check) 31 + } 32 + test { 33 + useJUnitPlatform() 34 + } 35 + } 36 + 37 + idea { 38 + module { 39 + isDownloadJavadoc = true 40 + isDownloadSources = true 41 + } 42 + }
+17
build-logic/src/main/kotlin/extensions.kt
··· 1 + import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar 2 + import org.gradle.accessors.dm.LibrariesForLibs 3 + import org.gradle.api.Project 4 + import org.gradle.kotlin.dsl.the 5 + 6 + // https://github.com/gradle/gradle/issues/15383#issuecomment-779893192 7 + val Project.libs: LibrariesForLibs 8 + get() = the() 9 + 10 + /** 11 + * Relocate a package into a project-scoped namespace. 12 + */ 13 + fun ShadowJar.relocateDependency(pkg: String) { 14 + val groupId = project.group.toString().ifBlank { "com.nayrid" } 15 + val projectId = project.name.ifBlank { "checks" } 16 + relocate(pkg, "$groupId.$projectId.libs.$pkg") 17 + }
+29
build-logic/src/main/kotlin/publishing-conventions.gradle.kts
··· 1 + plugins { 2 + id("base-conventions") 3 + `maven-publish` 4 + } 5 + 6 + tasks { 7 + javadoc { 8 + dependsOn(check) 9 + options { 10 + (this as StandardJavadocDocletOptions).apply { 11 + encoding = Charsets.UTF_8.name() 12 + links( 13 + "https://docs.oracle.com/en/java/javase/25/docs/api/", 14 + ) 15 + } 16 + } 17 + } 18 + } 19 + 20 + configure<PublishingExtension> { 21 + publications { 22 + register<MavenPublication>("maven") { 23 + from(components["java"]) 24 + } 25 + } 26 + repositories { 27 + mavenLocal() 28 + } 29 + }
+21
build.gradle.kts
··· 1 + plugins { 2 + id("publishing-conventions") 3 + } 4 + 5 + group = "com.nayrid" 6 + version = "1.0.0" 7 + 8 + dependencies { 9 + api(libs.jspecify) 10 + api(libs.checkstyle) { 11 + exclude("org.checkerframework", "checkstyle.java") 12 + exclude("com.google.code.findbugs", "jsr305") 13 + } 14 + testImplementation( 15 + group = "com.puppycrawl.tools", 16 + name = "checkstyle", 17 + version = libs.versions.checkstyle.get(), 18 + classifier = "tests" 19 + ) 20 + testImplementation(libs.truth) 21 + }
+23
gradle/libs.versions.toml
··· 1 + [versions] 2 + indra = "4.0.0" 3 + checkstyle = "13.2.0" 4 + shadow = "9.3.1" 5 + junit = "6.0.2" 6 + jspecify = "1.0.0" 7 + truth = "1.4.2" 8 + 9 + [libraries] 10 + # build logic 11 + indra-common = { group = "net.kyori", name = "indra-common", version.ref = "indra" } 12 + indra-licenseHeader = { group = "net.kyori", name = "indra-licenser-spotless", version.ref = "indra" } 13 + shadow = { group = "com.gradleup.shadow", name = "shadow-gradle-plugin", version.ref = "shadow" } 14 + 15 + # development tools (code quality, annotations) 16 + checkstyle = { group = "com.puppycrawl.tools", name = "checkstyle", version.ref = "checkstyle" } 17 + jspecify = { group = "org.jspecify", name = "jspecify", version.ref = "jspecify" } 18 + 19 + # testing 20 + junit-jupiter = { group = "org.junit.jupiter", name = "junit-jupiter", version.ref = "junit" } 21 + junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version.ref = "junit" } 22 + truth = { group = "com.google.truth", name = "truth", version.ref = "truth" } 23 +
gradle/wrapper/gradle-wrapper.jar

This is a binary file and will not be displayed.

+7
gradle/wrapper/gradle-wrapper.properties
··· 1 + distributionBase=GRADLE_USER_HOME 2 + distributionPath=wrapper/dists 3 + distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip 4 + networkTimeout=10000 5 + validateDistributionUrl=true 6 + zipStoreBase=GRADLE_USER_HOME 7 + zipStorePath=wrapper/dists
+248
gradlew
··· 1 + #!/bin/sh 2 + 3 + # 4 + # Copyright © 2015 the original authors. 5 + # 6 + # Licensed under the Apache License, Version 2.0 (the "License"); 7 + # you may not use this file except in compliance with the License. 8 + # You may obtain a copy of the License at 9 + # 10 + # https://www.apache.org/licenses/LICENSE-2.0 11 + # 12 + # Unless required by applicable law or agreed to in writing, software 13 + # distributed under the License is distributed on an "AS IS" BASIS, 14 + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 + # See the License for the specific language governing permissions and 16 + # limitations under the License. 17 + # 18 + # SPDX-License-Identifier: Apache-2.0 19 + # 20 + 21 + ############################################################################## 22 + # 23 + # Gradle start up script for POSIX generated by Gradle. 24 + # 25 + # Important for running: 26 + # 27 + # (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is 28 + # noncompliant, but you have some other compliant shell such as ksh or 29 + # bash, then to run this script, type that shell name before the whole 30 + # command line, like: 31 + # 32 + # ksh Gradle 33 + # 34 + # Busybox and similar reduced shells will NOT work, because this script 35 + # requires all of these POSIX shell features: 36 + # * functions; 37 + # * expansions «$var», «${var}», «${var:-default}», «${var+SET}», 38 + # «${var#prefix}», «${var%suffix}», and «$( cmd )»; 39 + # * compound commands having a testable exit status, especially «case»; 40 + # * various built-in commands including «command», «set», and «ulimit». 41 + # 42 + # Important for patching: 43 + # 44 + # (2) This script targets any POSIX shell, so it avoids extensions provided 45 + # by Bash, Ksh, etc; in particular arrays are avoided. 46 + # 47 + # The "traditional" practice of packing multiple parameters into a 48 + # space-separated string is a well documented source of bugs and security 49 + # problems, so this is (mostly) avoided, by progressively accumulating 50 + # options in "$@", and eventually passing that to Java. 51 + # 52 + # Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, 53 + # and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; 54 + # see the in-line comments for details. 55 + # 56 + # There are tweaks for specific operating systems such as AIX, CygWin, 57 + # Darwin, MinGW, and NonStop. 58 + # 59 + # (3) This script is generated from the Groovy template 60 + # https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt 61 + # within the Gradle project. 62 + # 63 + # You can find Gradle at https://github.com/gradle/gradle/. 64 + # 65 + ############################################################################## 66 + 67 + # Attempt to set APP_HOME 68 + 69 + # Resolve links: $0 may be a link 70 + app_path=$0 71 + 72 + # Need this for daisy-chained symlinks. 73 + while 74 + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path 75 + [ -h "$app_path" ] 76 + do 77 + ls=$( ls -ld "$app_path" ) 78 + link=${ls#*' -> '} 79 + case $link in #( 80 + /*) app_path=$link ;; #( 81 + *) app_path=$APP_HOME$link ;; 82 + esac 83 + done 84 + 85 + # This is normally unused 86 + # shellcheck disable=SC2034 87 + APP_BASE_NAME=${0##*/} 88 + # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) 89 + APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit 90 + 91 + # Use the maximum available, or set MAX_FD != -1 to use that value. 92 + MAX_FD=maximum 93 + 94 + warn () { 95 + echo "$*" 96 + } >&2 97 + 98 + die () { 99 + echo 100 + echo "$*" 101 + echo 102 + exit 1 103 + } >&2 104 + 105 + # OS specific support (must be 'true' or 'false'). 106 + cygwin=false 107 + msys=false 108 + darwin=false 109 + nonstop=false 110 + case "$( uname )" in #( 111 + CYGWIN* ) cygwin=true ;; #( 112 + Darwin* ) darwin=true ;; #( 113 + MSYS* | MINGW* ) msys=true ;; #( 114 + NONSTOP* ) nonstop=true ;; 115 + esac 116 + 117 + 118 + 119 + # Determine the Java command to use to start the JVM. 120 + if [ -n "$JAVA_HOME" ] ; then 121 + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 122 + # IBM's JDK on AIX uses strange locations for the executables 123 + JAVACMD=$JAVA_HOME/jre/sh/java 124 + else 125 + JAVACMD=$JAVA_HOME/bin/java 126 + fi 127 + if [ ! -x "$JAVACMD" ] ; then 128 + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 129 + 130 + Please set the JAVA_HOME variable in your environment to match the 131 + location of your Java installation." 132 + fi 133 + else 134 + JAVACMD=java 135 + if ! command -v java >/dev/null 2>&1 136 + then 137 + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 138 + 139 + Please set the JAVA_HOME variable in your environment to match the 140 + location of your Java installation." 141 + fi 142 + fi 143 + 144 + # Increase the maximum file descriptors if we can. 145 + if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then 146 + case $MAX_FD in #( 147 + max*) 148 + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. 149 + # shellcheck disable=SC2039,SC3045 150 + MAX_FD=$( ulimit -H -n ) || 151 + warn "Could not query maximum file descriptor limit" 152 + esac 153 + case $MAX_FD in #( 154 + '' | soft) :;; #( 155 + *) 156 + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. 157 + # shellcheck disable=SC2039,SC3045 158 + ulimit -n "$MAX_FD" || 159 + warn "Could not set maximum file descriptor limit to $MAX_FD" 160 + esac 161 + fi 162 + 163 + # Collect all arguments for the java command, stacking in reverse order: 164 + # * args from the command line 165 + # * the main class name 166 + # * -classpath 167 + # * -D...appname settings 168 + # * --module-path (only if needed) 169 + # * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. 170 + 171 + # For Cygwin or MSYS, switch paths to Windows format before running java 172 + if "$cygwin" || "$msys" ; then 173 + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) 174 + 175 + JAVACMD=$( cygpath --unix "$JAVACMD" ) 176 + 177 + # Now convert the arguments - kludge to limit ourselves to /bin/sh 178 + for arg do 179 + if 180 + case $arg in #( 181 + -*) false ;; # don't mess with options #( 182 + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath 183 + [ -e "$t" ] ;; #( 184 + *) false ;; 185 + esac 186 + then 187 + arg=$( cygpath --path --ignore --mixed "$arg" ) 188 + fi 189 + # Roll the args list around exactly as many times as the number of 190 + # args, so each arg winds up back in the position where it started, but 191 + # possibly modified. 192 + # 193 + # NB: a `for` loop captures its iteration list before it begins, so 194 + # changing the positional parameters here affects neither the number of 195 + # iterations, nor the values presented in `arg`. 196 + shift # remove old arg 197 + set -- "$@" "$arg" # push replacement arg 198 + done 199 + fi 200 + 201 + 202 + # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 203 + DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 204 + 205 + # Collect all arguments for the java command: 206 + # * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, 207 + # and any embedded shellness will be escaped. 208 + # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be 209 + # treated as '${Hostname}' itself on the command line. 210 + 211 + set -- \ 212 + "-Dorg.gradle.appname=$APP_BASE_NAME" \ 213 + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ 214 + "$@" 215 + 216 + # Stop when "xargs" is not available. 217 + if ! command -v xargs >/dev/null 2>&1 218 + then 219 + die "xargs is not available" 220 + fi 221 + 222 + # Use "xargs" to parse quoted args. 223 + # 224 + # With -n1 it outputs one arg per line, with the quotes and backslashes removed. 225 + # 226 + # In Bash we could simply go: 227 + # 228 + # readarray ARGS < <( xargs -n1 <<<"$var" ) && 229 + # set -- "${ARGS[@]}" "$@" 230 + # 231 + # but POSIX shell has neither arrays nor command substitution, so instead we 232 + # post-process each arg (as a line of input to sed) to backslash-escape any 233 + # character that might be a shell metacharacter, then use eval to reverse 234 + # that process (while maintaining the separation between arguments), and wrap 235 + # the whole thing up as a single "set" statement. 236 + # 237 + # This will of course break if any of these variables contains a newline or 238 + # an unmatched quote. 239 + # 240 + 241 + eval "set -- $( 242 + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | 243 + xargs -n1 | 244 + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | 245 + tr '\n' ' ' 246 + )" '"$@"' 247 + 248 + exec "$JAVACMD" "$@"
+93
gradlew.bat
··· 1 + @rem 2 + @rem Copyright 2015 the original author or authors. 3 + @rem 4 + @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 + @rem you may not use this file except in compliance with the License. 6 + @rem You may obtain a copy of the License at 7 + @rem 8 + @rem https://www.apache.org/licenses/LICENSE-2.0 9 + @rem 10 + @rem Unless required by applicable law or agreed to in writing, software 11 + @rem distributed under the License is distributed on an "AS IS" BASIS, 12 + @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 + @rem See the License for the specific language governing permissions and 14 + @rem limitations under the License. 15 + @rem 16 + @rem SPDX-License-Identifier: Apache-2.0 17 + @rem 18 + 19 + @if "%DEBUG%"=="" @echo off 20 + @rem ########################################################################## 21 + @rem 22 + @rem Gradle startup script for Windows 23 + @rem 24 + @rem ########################################################################## 25 + 26 + @rem Set local scope for the variables with windows NT shell 27 + if "%OS%"=="Windows_NT" setlocal 28 + 29 + set DIRNAME=%~dp0 30 + if "%DIRNAME%"=="" set DIRNAME=. 31 + @rem This is normally unused 32 + set APP_BASE_NAME=%~n0 33 + set APP_HOME=%DIRNAME% 34 + 35 + @rem Resolve any "." and ".." in APP_HOME to make it shorter. 36 + for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 37 + 38 + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 39 + set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 40 + 41 + @rem Find java.exe 42 + if defined JAVA_HOME goto findJavaFromJavaHome 43 + 44 + set JAVA_EXE=java.exe 45 + %JAVA_EXE% -version >NUL 2>&1 46 + if %ERRORLEVEL% equ 0 goto execute 47 + 48 + echo. 1>&2 49 + echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 50 + echo. 1>&2 51 + echo Please set the JAVA_HOME variable in your environment to match the 1>&2 52 + echo location of your Java installation. 1>&2 53 + 54 + goto fail 55 + 56 + :findJavaFromJavaHome 57 + set JAVA_HOME=%JAVA_HOME:"=% 58 + set JAVA_EXE=%JAVA_HOME%/bin/java.exe 59 + 60 + if exist "%JAVA_EXE%" goto execute 61 + 62 + echo. 1>&2 63 + echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 64 + echo. 1>&2 65 + echo Please set the JAVA_HOME variable in your environment to match the 1>&2 66 + echo location of your Java installation. 1>&2 67 + 68 + goto fail 69 + 70 + :execute 71 + @rem Setup the command line 72 + 73 + 74 + 75 + @rem Execute Gradle 76 + "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* 77 + 78 + :end 79 + @rem End local scope for the variables with windows NT shell 80 + if %ERRORLEVEL% equ 0 goto mainEnd 81 + 82 + :fail 83 + rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 84 + rem the _cmd.exe /c_ return code! 85 + set EXIT_CODE=%ERRORLEVEL% 86 + if %EXIT_CODE% equ 0 set EXIT_CODE=1 87 + if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% 88 + exit /b %EXIT_CODE% 89 + 90 + :mainEnd 91 + if "%OS%"=="Windows_NT" endlocal 92 + 93 + :omega
+21
license.txt
··· 1 + MIT License 2 + 3 + Copyright (c) 2026 nayrid 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+21
license_header.txt
··· 1 + This file is part of checks, licensed under the MIT License. 2 + 3 + Copyright (c) 2026 nayrid 4 + 5 + Permission is hereby granted, free of charge, to any person obtaining a copy 6 + of this software and associated documentation files (the "Software"), to deal 7 + in the Software without restriction, including without limitation the rights 8 + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 + copies of the Software, and to permit persons to whom the Software is 10 + furnished to do so, subject to the following conditions: 11 + 12 + The above copyright notice and this permission notice shall be included in all 13 + copies or substantial portions of the Software. 14 + 15 + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 + SOFTWARE.
+15
settings.gradle.kts
··· 1 + dependencyResolutionManagement { 2 + @Suppress("UnstableApiUsage") 3 + repositories { 4 + mavenCentral() 5 + } 6 + } 7 + 8 + pluginManagement { 9 + repositories { 10 + gradlePluginPortal() 11 + } 12 + includeBuild("build-logic") 13 + } 14 + 15 + rootProject.name = "checks"
+90
src/main/java/com/nayrid/checks/RequireSinceCheck.java
··· 1 + /* 2 + * This file is part of checks, licensed under the MIT License. 3 + * 4 + * Copyright (c) 2026 nayrid 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a copy 7 + * of this software and associated documentation files (the "Software"), to deal 8 + * in the Software without restriction, including without limitation the rights 9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 + * copies of the Software, and to permit persons to whom the Software is 11 + * furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in all 14 + * copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 + * SOFTWARE. 23 + */ 24 + package com.nayrid.checks; 25 + 26 + import com.puppycrawl.tools.checkstyle.api.DetailNode; 27 + import com.puppycrawl.tools.checkstyle.api.JavadocCommentsTokenTypes; 28 + import com.puppycrawl.tools.checkstyle.checks.javadoc.AbstractJavadocCheck; 29 + import com.puppycrawl.tools.checkstyle.utils.CheckUtil; 30 + 31 + /** 32 + * Requires the presence of the `@since` tag in Javadoc. 33 + * 34 + * @since 1.0.0 35 + */ 36 + public final class RequireSinceCheck extends AbstractJavadocCheck { 37 + 38 + private static final String MSG_KEY = "missingSince"; 39 + 40 + private boolean checkPackage = false; 41 + 42 + /** 43 + * Sets the {@code checkPackage} flag. 44 + * 45 + * @param checkPackage new state 46 + * @since 1.0.0 47 + */ 48 + @SuppressWarnings("MethodName") 49 + public void setCheckPackage(final boolean checkPackage) { 50 + this.checkPackage = checkPackage; 51 + } 52 + 53 + @Override 54 + public int[] getDefaultJavadocTokens() { 55 + return new int[]{JavadocCommentsTokenTypes.JAVADOC_CONTENT}; 56 + } 57 + 58 + @Override 59 + public void visitJavadocToken(final DetailNode ast) { 60 + if (CheckUtil.isPackageInfo(this.getFilePath()) && !checkPackage) { 61 + return; 62 + } 63 + 64 + if (!containsSince(ast)) { 65 + log(ast.getLineNumber(), MSG_KEY); 66 + } 67 + } 68 + 69 + private static boolean containsSince(final DetailNode content) { 70 + for (DetailNode child = content.getFirstChild(); 71 + child != null; 72 + child = child.getNextSibling()) { 73 + 74 + if (child.getType() == JavadocCommentsTokenTypes.JAVADOC_BLOCK_TAG) { 75 + 76 + for (DetailNode tag = child.getFirstChild(); 77 + tag != null; 78 + tag = tag.getNextSibling()) { 79 + 80 + if (tag.getType() 81 + == JavadocCommentsTokenTypes.SINCE_BLOCK_TAG) { 82 + return true; 83 + } 84 + } 85 + } 86 + } 87 + return false; 88 + } 89 + 90 + }
+7
src/main/java/com/nayrid/checks/package-info.java
··· 1 + /** 2 + * Checkstyle checks. 3 + */ 4 + @NullMarked 5 + package com.nayrid.checks; 6 + 7 + import org.jspecify.annotations.NullMarked;
+1
src/main/resources/com/nayrid/checks/messages.properties
··· 1 + missingSince=Javadoc must contain a `@since` tag.
+90
src/test/java/com/nayrid/checks/RequireSinceCheckTest.java
··· 1 + /* 2 + * This file is part of checks, licensed under the MIT License. 3 + * 4 + * Copyright (c) 2026 nayrid 5 + * 6 + * Permission is hereby granted, free of charge, to any person obtaining a copy 7 + * of this software and associated documentation files (the "Software"), to deal 8 + * in the Software without restriction, including without limitation the rights 9 + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 + * copies of the Software, and to permit persons to whom the Software is 11 + * furnished to do so, subject to the following conditions: 12 + * 13 + * The above copyright notice and this permission notice shall be included in all 14 + * copies or substantial portions of the Software. 15 + * 16 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 + * SOFTWARE. 23 + */ 24 + package com.nayrid.checks; 25 + 26 + import com.puppycrawl.tools.checkstyle.AbstractModuleTestSupport; 27 + import com.puppycrawl.tools.checkstyle.DefaultConfiguration; 28 + import org.junit.jupiter.api.Test; 29 + 30 + import static com.puppycrawl.tools.checkstyle.utils.CommonUtil.EMPTY_STRING_ARRAY; 31 + 32 + public class RequireSinceCheckTest extends AbstractModuleTestSupport { 33 + 34 + @Override 35 + public String getPackageLocation() { 36 + return "com/nayrid/checks/requiresince"; 37 + } 38 + 39 + @Test 40 + public void testMissingSince() throws Exception { 41 + final String[] expected = { 42 + "3: Javadoc must contain a `@since` tag.", 43 + }; 44 + 45 + verify( 46 + createModuleConfig(RequireSinceCheck.class), 47 + getPath("MissingSince.java"), 48 + expected 49 + ); 50 + } 51 + 52 + @Test 53 + public void testHasSince() throws Exception { 54 + verify( 55 + createModuleConfig(RequireSinceCheck.class), 56 + getPath("HasSince.java"), 57 + EMPTY_STRING_ARRAY 58 + ); 59 + } 60 + 61 + @Test 62 + public void testPackageIgnoredByDefault() throws Exception { 63 + final DefaultConfiguration config = 64 + createModuleConfig(RequireSinceCheck.class); 65 + 66 + verify( 67 + config, 68 + getPath("package-info.java"), 69 + EMPTY_STRING_ARRAY 70 + ); 71 + } 72 + 73 + @Test 74 + public void testPackageCheckedWhenEnabled() throws Exception { 75 + final DefaultConfiguration config = 76 + createModuleConfig(RequireSinceCheck.class); 77 + 78 + config.addProperty("checkPackage", "true"); 79 + 80 + final String[] expected = { 81 + "1: Javadoc must contain a `@since` tag.", 82 + }; 83 + 84 + verify( 85 + config, 86 + getPath("package-info.java"), 87 + expected 88 + ); 89 + } 90 + }
+4
src/test/java/com/nayrid/checks/package-info.java
··· 1 + @NullMarked 2 + package com.nayrid.checks; 3 + 4 + import org.jspecify.annotations.NullMarked;
+9
src/test/resources/com/nayrid/checks/requiresince/HasSince.java
··· 1 + package com.nayrid.checks.requiresince; 2 + 3 + /** 4 + * A class with a `since` tag. 5 + * 6 + * @since 1.0.0 7 + */ 8 + public class HasSince { 9 + }
+7
src/test/resources/com/nayrid/checks/requiresince/MissingSince.java
··· 1 + package com.nayrid.checks.requiresince; 2 + 3 + /** 4 + * A class without a `since` tag. 5 + */ 6 + public class MissingSince { 7 + }
+4
src/test/resources/com/nayrid/checks/requiresince/package-info.java
··· 1 + /** 2 + * Package without since tag. 3 + */ 4 + package com.nayrid.checks.requiresince;