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 { +}