From 323e29f070bfdfd65327d53db2d13ca85077c214 Mon Sep 17 00:00:00 2001
From: Andrew Kuchev <0coming.soon@gmail.com>
Date: Fri, 4 Aug 2017 18:45:37 +0500
Subject: [PATCH] Issue #4883: Add MT check markers
---
config/import-control.xml | 5 ++
config/intellij-idea-inspections.xml | 6 +++
.../tools/checkstyle/FileStatefulCheck.java | 52 +++++++++++++++++++
.../tools/checkstyle/GlobalStatefulCheck.java | 47 +++++++++++++++++
.../tools/checkstyle/StatelessCheck.java | 45 ++++++++++++++++
5 files changed, 155 insertions(+)
create mode 100644 src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
create mode 100644 src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
create mode 100644 src/main/java/com/puppycrawl/tools/checkstyle/StatelessCheck.java
diff --git a/config/import-control.xml b/config/import-control.xml
index cab9f3d31dec..1da7db31bb64 100644
--- a/config/import-control.xml
+++ b/config/import-control.xml
@@ -40,6 +40,11 @@
+
+
+
+
+
diff --git a/config/intellij-idea-inspections.xml b/config/intellij-idea-inspections.xml
index 79394bf2a73c..7891e48f142b 100644
--- a/config/intellij-idea-inspections.xml
+++ b/config/intellij-idea-inspections.xml
@@ -2144,6 +2144,12 @@ isolated classes and we cannot put them to separate package as it will affect us
+
+
+
+
+
+
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
new file mode 100644
index 000000000000..2ad02344346c
--- /dev/null
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/FileStatefulCheck.java
@@ -0,0 +1,52 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation means that the check contains file-related context and therefore
+ * cannot be used from the others threads at the same time.
+ * This annotation should be used when the check holds a thread-unsafe state.
+ * Checker guarantees that the whole file processed inside the same thread.
+ * Checker guarantees that the whole file processed with the same check instance.
+ * Checker guarantees that each check instance processes only one file at the same time.
+ * Checker guarantees that all check instances have equal (but not the same) configuration.
+ * It means, that if a check holds a property of type "array of strings",
+ * the property value will not be shared accross check instances.
+ * Instead, each check instance will hold its own array instance.
+ * Checker does not guarantee that each file will have it's own thread -
+ * there might be a list of files, which will be executed on the same thread.
+ * Checker does not guarantee that each file will have it's own check instance -
+ * there might be a list of files, which will be checked by the same instance.
+ * Note: Checks with such annotation will be executed in mode how all Checks worked
+ * before MT mode is introduced.
+ * @author Andrew Kuchev
+ * @noinspection ClassIndependentOfModule, unused, AnnotationClass
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface FileStatefulCheck {
+}
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
new file mode 100644
index 000000000000..2a99084727d4
--- /dev/null
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/GlobalStatefulCheck.java
@@ -0,0 +1,47 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation means that the check contains global context,
+ * which will be updated while Checkstyle processes files. This also means,
+ * that all files will be processed by the same check instance.
+ * This annotation should be used, if a check accumulates some information during the audit,
+ * and processed only once at the end of the audit (however, the check still
+ * can produce some messages, while collecting information).
+ * The check methods and fields should be thread safe, because they may be accessed from others
+ * threads at the same time.
+ * Checker guarantees that there will be exactly one check instance
+ * This is simular to multi-file validation, which checkstyle does not support fully yet.
+ * Please refer to https://github.com/checkstyle/checkstyle/issues/3540 for details.
+ * @author Andrew Kuchev
+ * @noinspection ClassIndependentOfModule, unused, AnnotationClass
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface GlobalStatefulCheck {
+}
diff --git a/src/main/java/com/puppycrawl/tools/checkstyle/StatelessCheck.java b/src/main/java/com/puppycrawl/tools/checkstyle/StatelessCheck.java
new file mode 100644
index 000000000000..efc18037a513
--- /dev/null
+++ b/src/main/java/com/puppycrawl/tools/checkstyle/StatelessCheck.java
@@ -0,0 +1,45 @@
+////////////////////////////////////////////////////////////////////////////////
+// checkstyle: Checks Java source code for adherence to a set of rules.
+// Copyright (C) 2001-2017 the original author or authors.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+////////////////////////////////////////////////////////////////////////////////
+
+package com.puppycrawl.tools.checkstyle;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Inherited;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation means that the check does not contain mutable state and
+ * may be safely used from others threads at the same time.
+ * The check does not contain mutable state, if it does not change any field values at the
+ * execution stage (but it still can set properties at the initialization stage).
+ * Note: The best practice is to use final fields where possible and carefully review
+ * all mutable fields. A final list is still mutable, therefore each mutable container
+ * must also be carefully reviewed.
+ * Checker guarantees that there will be exactly one check instance during the audit.
+ * This also means, that all files will be processed by the same check instance.
+ * @author Andrew Kuchev
+ * @noinspection ClassIndependentOfModule, unused, AnnotationClass
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@Inherited
+public @interface StatelessCheck {
+}