diff --git a/action_basics/.gitignore b/action_basics/.gitignore deleted file mode 100644 index 8388aebc6..000000000 --- a/action_basics/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# Created by .ignore support plugin (hsz.mobi) -### Gradle template -.gradle -build/ - -# Ignore Gradle GUI config -gradle-app.setting - -# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored) -!gradle-wrapper.jar - diff --git a/action_basics/build.gradle b/action_basics/build.gradle deleted file mode 100644 index dfc17ec9e..000000000 --- a/action_basics/build.gradle +++ /dev/null @@ -1,30 +0,0 @@ -plugins { - id 'java' - id 'org.jetbrains.intellij' version '0.4.8' -} - -sourceCompatibility = 1.8 - -repositories { - mavenCentral() -} - -dependencies { - testCompile group: 'junit', name: 'junit', version: '4.12' -} - -// See https://github.com/JetBrains/gradle-intellij-plugin/ -intellij { - - // Define IntelliJ Platform API version to use for building this plugin - version '2019.1' - -// Prevents patching attributes in plugin.xml - updateSinceUntilBuild = false -// Define a shared sandbox directory for running code sample plugins within an IDE. - sandboxDirectory = file("${project.projectDir}/../_idea-sandbox") - -} - -// Force javadoc rebuild before jar is built -jar.dependsOn javadoc diff --git a/action_basics/gradle/wrapper/gradle-wrapper.jar b/action_basics/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 94336fcae..000000000 Binary files a/action_basics/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/action_basics/gradle/wrapper/gradle-wrapper.properties b/action_basics/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index 290541c73..000000000 --- a/action_basics/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.3-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/action_basics/gradlew b/action_basics/gradlew deleted file mode 100755 index cccdd3d51..000000000 --- a/action_basics/gradlew +++ /dev/null @@ -1,172 +0,0 @@ -#!/usr/bin/env sh - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=$((i+1)) - done - case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=$(save "$@") - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - -exec "$JAVACMD" "$@" diff --git a/action_basics/gradlew.bat b/action_basics/gradlew.bat deleted file mode 100644 index f9553162f..000000000 --- a/action_basics/gradlew.bat +++ /dev/null @@ -1,84 +0,0 @@ -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto init - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/action_basics/settings.gradle b/action_basics/settings.gradle deleted file mode 100644 index 45b6826e6..000000000 --- a/action_basics/settings.gradle +++ /dev/null @@ -1,2 +0,0 @@ -rootProject.name = 'action_basics' - diff --git a/action_basics/src/main/java/icons/ActionBasicsIcons.java b/action_basics/src/main/java/icons/ActionBasicsIcons.java deleted file mode 100644 index 931f270a4..000000000 --- a/action_basics/src/main/java/icons/ActionBasicsIcons.java +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package icons; - -import com.intellij.openapi.util.IconLoader; -import javax.swing.*; - -public class ActionBasicsIcons { - public static final Icon Sdk_default_icon = IconLoader.getIcon("/icons/sdk_16.svg"); -} diff --git a/action_basics/src/main/java/org/intellij/sdk/action/CustomDefaultActionGroup.java b/action_basics/src/main/java/org/intellij/sdk/action/CustomDefaultActionGroup.java deleted file mode 100644 index 1badc6da8..000000000 --- a/action_basics/src/main/java/org/intellij/sdk/action/CustomDefaultActionGroup.java +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.intellij.sdk.action; - -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.actionSystem.DefaultActionGroup; -import com.intellij.openapi.editor.Editor; -import icons.ActionBasicsIcons; - -/** - * Creates an action group to contain menu actions. See plugin.xml declarations. - * @author Anna Bulenkova - * @author jhake - */ -public class CustomDefaultActionGroup extends DefaultActionGroup { - - /** - * Given CustomDefaultActionGroup is derived from ActionGroup, in this context - * update() determines whether the action group itself should be enabled or disabled. - * Requires an editor to be active in order to enable the group functionality. - * @see com.intellij.openapi.actionSystem.AnAction#update(AnActionEvent) - * @param event Event received when the associated group-id menu is chosen. - */ - @Override - public void update(AnActionEvent event) { - // Enable/disable depending on whether user is editing - Editor editor = event.getData(CommonDataKeys.EDITOR); - event.getPresentation().setEnabled(editor != null); - // Take this opportunity to set an icon for the menu entry. - event.getPresentation().setIcon(ActionBasicsIcons.Sdk_default_icon); - } -} diff --git a/action_basics/src/main/java/org/intellij/sdk/action/DynamicActionGroup.java b/action_basics/src/main/java/org/intellij/sdk/action/DynamicActionGroup.java deleted file mode 100644 index d48c948e1..000000000 --- a/action_basics/src/main/java/org/intellij/sdk/action/DynamicActionGroup.java +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.intellij.sdk.action; - -import com.intellij.openapi.actionSystem.ActionGroup; -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import icons.ActionBasicsIcons; -import org.jetbrains.annotations.NotNull; - -/** - * Demonstrates adding an action group to a menu statically in plugin.xml, and then creating a menu item - * within the group at runtime. See plugin.xml for the declaration of DynamicActionGroup, - * and note the group declaration does not contain an action. - * DynamicActionGroup is based on ActionGroup because menu children are determined - * on rules other than just positional constraints. - * - * @author Anna Bulenkova - * @see ActionGroup - */ -public class DynamicActionGroup extends ActionGroup { - - /** - * Returns an array of menu actions for the group. - * - * @param e Event received when the associated group-id menu is chosen. - * @return AnAction[] An instance of AnAction, in this case containing a single instance of the - * PopupDialogAction class. - */ - @NotNull - @Override - public AnAction[] getChildren(AnActionEvent e) { - return new AnAction[]{ new PopupDialogAction("Action Added at Runtime", - "Dynamic Action Demo", - ActionBasicsIcons.Sdk_default_icon) - }; - } - -} diff --git a/action_basics/src/main/java/org/intellij/sdk/action/PopupDialogAction.java b/action_basics/src/main/java/org/intellij/sdk/action/PopupDialogAction.java deleted file mode 100644 index c51e0c434..000000000 --- a/action_basics/src/main/java/org/intellij/sdk/action/PopupDialogAction.java +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - -package org.intellij.sdk.action; - -import com.intellij.openapi.actionSystem.AnAction; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.CommonDataKeys; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.ui.Messages; -import com.intellij.pom.Navigatable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import javax.swing.*; - -/** - * Action class to demonstrate how to interact with the IntelliJ Platform. - * The only action this class performs is to provide the user with a popup dialog as feedback. - * Typically this class is instantiated by the IntelliJ Platform framework based on declarations - * in the plugin.xml file. But when added at runtime this class is instantiated by an action group. - */ -public class PopupDialogAction extends AnAction { - - /** - * This default constructor is used by the IntelliJ Platform framework to - * instantiate this class based on plugin.xml declarations. Only needed in PopupDialogAction - * class because a second constructor is overridden. - * @see AnAction#AnAction() - */ - public PopupDialogAction() { - super(); - } - - /** - * This constructor is used to support dynamically added menu actions. - * It sets the text, description to be displayed for the menu item. - * Otherwise, the default AnAction constructor is used by the IntelliJ Platform. - * @param text The text to be displayed as a menu item. - * @param description The description of the menu item. - * @param icon The icon to be used with the menu item. - */ - public PopupDialogAction(@Nullable String text, @Nullable String description, @Nullable Icon icon) { - super(text, description, icon); - } - - /** - * Gives the user feedback when the dynamic action menu is chosen. - * Pops a simple message dialog. See the psi_demo plugin for an - * example of how to use AnActionEvent to access data. - * @param event Event received when the associated menu item is chosen. - */ - @Override - public void actionPerformed(@NotNull AnActionEvent event) { - // Using the event, create and show a dialog - Project currentProject = event.getProject(); - StringBuffer dlgMsg = new StringBuffer(event.getPresentation().getText() + " Selected!"); - String dlgTitle = event.getPresentation().getDescription(); - // If an element is selected in the editor, add info about it. - Navigatable nav = event.getData(CommonDataKeys.NAVIGATABLE); - if (nav != null) { - dlgMsg.append(String.format("\nSelected Element: %s", nav.toString())); - } - Messages.showMessageDialog(currentProject, dlgMsg.toString(), dlgTitle, Messages.getInformationIcon()); - } - - /** - * Determines whether this menu item is available for the current context. - * Requires a project to be open. - * @param e Event received when the associated group-id menu is chosen. - */ - @Override - public void update(AnActionEvent e) { - // Set the availability based on whether a project is open - Project project = e.getProject(); - e.getPresentation().setEnabledAndVisible(project != null); - } - -} diff --git a/action_basics/src/main/resources/META-INF/plugin.xml b/action_basics/src/main/resources/META-INF/plugin.xml deleted file mode 100644 index 6aea96a73..000000000 --- a/action_basics/src/main/resources/META-INF/plugin.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - - org.intellij.sdk.action - - - SDK: Action Sample Project - - - 2.0.0 - - - - - - com.intellij.modules.platform - - - - Adds entries to the Tools menu. - ]]> - - - -
  • 2.0.0 Renamed from register_actions and converted to Gradle project.
  • -
  • 1.1 Refactor to give users feedback when menu items are selected.
  • -
  • 1.0 Release 2018.3 and earlier.
  • - - ]]> -
    - - - IntelliJ Platform SDK - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    \ No newline at end of file diff --git a/action_basics/src/main/resources/META-INF/pluginIcon.svg b/action_basics/src/main/resources/META-INF/pluginIcon.svg deleted file mode 100644 index 613290897..000000000 --- a/action_basics/src/main/resources/META-INF/pluginIcon.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/action_basics/src/main/resources/icons/sdk_16.svg b/action_basics/src/main/resources/icons/sdk_16.svg deleted file mode 100644 index 011462b8a..000000000 --- a/action_basics/src/main/resources/icons/sdk_16.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/comparing_references_inspection/comparing_references_inspection.iml b/comparing_references_inspection/comparing_references_inspection.iml index 3b8cfcf82..5d66bce80 100644 --- a/comparing_references_inspection/comparing_references_inspection.iml +++ b/comparing_references_inspection/comparing_references_inspection.iml @@ -1,11 +1,13 @@ - + + + diff --git a/comparing_references_inspection/resources/META-INF/plugin.xml b/comparing_references_inspection/resources/META-INF/plugin.xml new file mode 100644 index 000000000..6823355cb --- /dev/null +++ b/comparing_references_inspection/resources/META-INF/plugin.xml @@ -0,0 +1,70 @@ + + + + + org.intelliJ.sdk.codeInspection + + + SDK Comparing References Inspection Sample + + + 1.1.0 + + + + + + + Adds entries to Preferences | Editor | Inspections | Java | Probable Bugs. + ]]> + + + +
  • 1.1.0 Refactor resources, register this inspection.
  • +
  • 1.0.0 Release 2018.3 and earlier.
  • + + ]]> +
    + + + IntelliJ Platform SDK + + + + + + + + +
    diff --git a/comparing_references_inspection/resources/inspectionDescriptions/ComparingReferences.html b/comparing_references_inspection/resources/inspectionDescriptions/ComparingReferences.html new file mode 100644 index 000000000..e6eb316ea --- /dev/null +++ b/comparing_references_inspection/resources/inspectionDescriptions/ComparingReferences.html @@ -0,0 +1,7 @@ + + +SDK: This inspection reports when the '==' or '!=' operator was used between expressions of +reference types.
    +Classes to be inspected are controlled by a semi-colon separated Options list in the preferences panel for this inspection. + + diff --git a/comparing_references_inspection/source/META-INF/plugin.xml b/comparing_references_inspection/source/META-INF/plugin.xml deleted file mode 100644 index 83c40f850..000000000 --- a/comparing_references_inspection/source/META-INF/plugin.xml +++ /dev/null @@ -1,14 +0,0 @@ - - Comparing References Inspection - Inspection for (probably) inappropriate use of equality relation operation. - 1.0 - JetBrains - - - - - - - diff --git a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java index b7330bb8c..907ca82f6 100644 --- a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java +++ b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesInspection.java @@ -1,105 +1,167 @@ package com.intellij.codeInspection; -import com.intellij.codeInsight.daemon.GroupNames; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.tree.IElementType; import com.intellij.ui.DocumentAdapter; import com.intellij.util.IncorrectOperationException; -import org.jetbrains.annotations.*; +import org.jetbrains.annotations.NonNls; +import org.jetbrains.annotations.NotNull; import javax.swing.*; import javax.swing.event.DocumentEvent; import java.awt.*; import java.util.StringTokenizer; +import static com.siyeh.ig.psiutils.ExpressionUtils.isNullLiteral; + /** * @author max + * @author jhake */ public class ComparingReferencesInspection extends AbstractBaseJavaLocalInspectionTool { private static final Logger LOG = Logger.getInstance("#com.intellij.codeInspection.ComparingReferencesInspection"); - - private final LocalQuickFix myQuickFix = new MyQuickFix(); - + private final CriQuickFix myQuickFix = new CriQuickFix(); + + // Defines the text of the quick fix intention + public static final String QUICK_FIX_NAME = "SDK: " + InspectionsBundle.message("inspection.comparing.references.use.quickfix"); + + // This string holds a list of classes relevant to this inspection. @SuppressWarnings({"WeakerAccess"}) @NonNls public String CHECKED_CLASSES = "java.lang.String;java.util.Date"; - @NonNls - private static final String DESCRIPTION_TEMPLATE = - InspectionsBundle.message("inspection.comparing.references.problem.descriptor"); - - @NotNull - public String getDisplayName() { - - return "'==' or '!=' instead of 'equals()'"; + + /** + * This method is called to get the panel describing the inspection. + * It is called every time the user selects the inspection in preferences. + * The user has the option to edit the list of CHECKED_CLASSES. + * Adds a document listener to see if + * + * @return panel to display inspection information. + */ + @Override + public JComponent createOptionsPanel() { + JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); + final JTextField checkedClasses = new JTextField(CHECKED_CLASSES); + checkedClasses.getDocument().addDocumentListener(new DocumentAdapter() { + public void textChanged(DocumentEvent event) { + CHECKED_CLASSES = checkedClasses.getText(); + } + }); + panel.add(checkedClasses); + return panel; } - - @NotNull - public String getGroupDisplayName() { - return GroupNames.BUGS_GROUP_NAME; - } - - @NotNull - public String getShortName() { - return "ComparingReferences"; - } - - private boolean isCheckedType(PsiType type) { - if (!(type instanceof PsiClassType)) return false; - - StringTokenizer tokenizer = new StringTokenizer(CHECKED_CLASSES, ";"); - while (tokenizer.hasMoreTokens()) { - String className = tokenizer.nextToken(); - if (type.equalsToText(className)) return true; - } - - return false; - } - + + /** + * This method is overridden to provide a custom visitor + * that inspects expressions with relational operators '==' and '!=' + * The visitor must not be recursive and must be thread-safe. + * + * @param holder object for visitor to register problems found. + * @param isOnTheFly true if inspection was run in non-batch mode + * @return non-null visitor for this inspection. + * @see JavaElementVisitor + */ @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, boolean isOnTheFly) { return new JavaElementVisitor() { - + + /** + * This string defines the short message shown to a user signaling the inspection + * found a problem. It reuses a string from the inspections bundle. + */ + @NonNls + private final String DESCRIPTION_TEMPLATE = "SDK " + InspectionsBundle.message("inspection.comparing.references.problem.descriptor"); + + /** + * Avoid defining visitors for both Reference and Binary expressions. + * + * @param psiReferenceExpression The expression to be evaluated. + */ @Override public void visitReferenceExpression(PsiReferenceExpression psiReferenceExpression) { } - - + + /** + * Evaluate binary psi expressions to see if they contain + * relational operators '==' and '!=', AND they contain + * classes contained in CHECKED_CLASSES. The evaluation + * ignores expressions comparing an object to null. + * IF this criteria is met, add the expression to the + * problems list. + * + * @param expression The binary expression to be evaluated. + */ @Override public void visitBinaryExpression(PsiBinaryExpression expression) { super.visitBinaryExpression(expression); IElementType opSign = expression.getOperationTokenType(); if (opSign == JavaTokenType.EQEQ || opSign == JavaTokenType.NE) { + // The binary expression is the correct type for this inspection PsiExpression lOperand = expression.getLOperand(); PsiExpression rOperand = expression.getROperand(); - if (rOperand == null || isNullLiteral(lOperand) || isNullLiteral(rOperand)) return; - + if (rOperand == null || isNullLiteral(lOperand) || isNullLiteral(rOperand)) + return; + // Nothing is compared to null, now check the types being compared PsiType lType = lOperand.getType(); PsiType rType = rOperand.getType(); - if (isCheckedType(lType) || isCheckedType(rType)) { + // Identified an expression with potential problems, add to list with fix object. holder.registerProblem(expression, DESCRIPTION_TEMPLATE, myQuickFix); } } } + + /** + * Verifies the input is the correct {@code PsiType} for this inspection. + * + * @param type The {@code PsiType} to be examined for a match + * @return {@code true} if input is {@code PsiClassType} and matches + * one of the classes in the CHECKED_CLASSES list. + */ + private boolean isCheckedType(PsiType type) { + if (!(type instanceof PsiClassType)) + return false; + StringTokenizer tokenizer = new StringTokenizer(CHECKED_CLASSES, ";"); + while (tokenizer.hasMoreTokens()) { + String className = tokenizer.nextToken(); + if (type.equalsToText(className)) + return true; + } + return false; + } + }; } - - private static boolean isNullLiteral(PsiExpression expr) { - return expr instanceof PsiLiteralExpression && "null".equals(expr.getText()); - } - - private static class MyQuickFix implements LocalQuickFix { + + /** + * This class provides a solution to inspection problem expressions by manipulating + * the PSI tree to use a.equals(b) instead of '==' or '!=' + */ + private static class CriQuickFix implements LocalQuickFix { + + /** + * Returns a partially localized string for the quick fix intention. + * Used by the test code for this plugin. + * + * @return Quick fix short name. + */ @NotNull + @Override public String getName() { - // The test (see the TestThisPlugin class) uses this string to identify the quick fix action. - return InspectionsBundle.message("inspection.comparing.references.use.quickfix"); + return QUICK_FIX_NAME; } - - + + /** + * This method manipulates the PSI tree to replace 'a==b' with 'a.equals(b) + * or 'a!=b' with '!a.equals(b)' + * + * @param project The project that contains the file being edited. + * @param descriptor A problem found by this inspection. + */ public void applyFix(@NotNull Project project, @NotNull ProblemDescriptor descriptor) { try { PsiBinaryExpression binaryExpression = (PsiBinaryExpression) descriptor.getPsiElement(); @@ -108,16 +170,16 @@ public class ComparingReferencesInspection extends AbstractBaseJavaLocalInspecti PsiExpression rExpr = binaryExpression.getROperand(); if (rExpr == null) return; - + PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory(); PsiMethodCallExpression equalsCall = - (PsiMethodCallExpression) factory.createExpressionFromText("a.equals(b)", null); - + (PsiMethodCallExpression) factory.createExpressionFromText("a.equals(b)", null); + equalsCall.getMethodExpression().getQualifierExpression().replace(lExpr); equalsCall.getArgumentList().getExpressions()[0].replace(rExpr); - + PsiExpression result = (PsiExpression) binaryExpression.replace(equalsCall); - + if (opSign == JavaTokenType.NE) { PsiPrefixExpression negation = (PsiPrefixExpression) factory.createExpressionFromText("!a", null); negation.getOperand().replace(result); @@ -127,27 +189,11 @@ public class ComparingReferencesInspection extends AbstractBaseJavaLocalInspecti LOG.error(e); } } - + @NotNull public String getFamilyName() { return getName(); } } - - public JComponent createOptionsPanel() { - JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT)); - final JTextField checkedClasses = new JTextField(CHECKED_CLASSES); - checkedClasses.getDocument().addDocumentListener(new DocumentAdapter() { - public void textChanged(DocumentEvent event) { - CHECKED_CLASSES = checkedClasses.getText(); - } - }); - - panel.add(checkedClasses); - return panel; - } - - public boolean isEnabledByDefault() { - return true; - } + } diff --git a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java b/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java deleted file mode 100644 index 980777846..000000000 --- a/comparing_references_inspection/source/com/intellij/codeInspection/ComparingReferencesProvider.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.intellij.codeInspection; - -/** - * @author max - */ -public class ComparingReferencesProvider implements InspectionToolProvider { - public Class[] getInspectionClasses() { - return new Class[]{ComparingReferencesInspection.class}; - } -} diff --git a/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html b/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html deleted file mode 100644 index ca5f9d5ee..000000000 --- a/comparing_references_inspection/source/inspectionDescriptions/ComparingReferences.html +++ /dev/null @@ -1,7 +0,0 @@ - - -This inspection reports when the '==' or '!=' operator was used between expressions of -reference types.
    -In the text field below, specify the semicolon separated list of classes to be considered as suspicious. - - diff --git a/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java b/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java index 818494431..4a1092467 100644 --- a/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java +++ b/comparing_references_inspection/testSource/testPlugin/TestThisPlugin.java @@ -4,73 +4,84 @@ package testPlugin; import com.intellij.codeInsight.daemon.impl.HighlightInfo; import com.intellij.codeInsight.intention.IntentionAction; import com.intellij.codeInspection.ComparingReferencesInspection; -import com.intellij.codeInspection.InspectionToolProvider; -import com.intellij.testFramework.TestDataPath; +import com.intellij.openapi.application.PathManager; import com.intellij.testFramework.UsefulTestCase; import com.intellij.testFramework.builders.JavaModuleFixtureBuilder; import com.intellij.testFramework.fixtures.*; +import org.junit.After; import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** * @see JavaCodeInsightFixtureTestCase * @see LightCodeInsightFixtureTestCase */ -@TestDataPath("$CONTENT_ROOT/../testData") public class TestThisPlugin extends UsefulTestCase { - + protected CodeInsightTestFixture myFixture; - // TODO: Get path to module root, then add path to testData - // Specify path to your test data directory - // e.g. final String dataPath = "c:\\users\\john.doe\\idea\\community\\samples\\ComparingReferences/testData"; - final String dataPath = "c:\\users\\John.Doe\\idea\\community\\samples\\comparingReferences/testData"; - + // Specify the path to the test data directory + final String dataPath = PathManager.getResourceRoot(TestThisPlugin.class, "/testPlugin/TestThisPlugin.class"); + + @Before public void setUp() throws Exception { - + final IdeaTestFixtureFactory fixtureFactory = IdeaTestFixtureFactory.getFixtureFactory(); final TestFixtureBuilder testFixtureBuilder = - fixtureFactory.createFixtureBuilder(getName()); + fixtureFactory.createFixtureBuilder(getName()); myFixture = JavaTestFixtureFactory.getFixtureFactory().createCodeInsightFixture(testFixtureBuilder.getFixture()); myFixture.setTestDataPath(dataPath); final JavaModuleFixtureBuilder builder = testFixtureBuilder.addModule(JavaModuleFixtureBuilder.class); - + builder.addContentRoot(myFixture.getTempDirPath()).addSourceRoot(""); builder.setMockJdkLevel(JavaModuleFixtureBuilder.MockJdkLevel.jdk15); myFixture.setUp(); } - + + @After public void tearDown() throws Exception { myFixture.tearDown(); myFixture = null; } - + protected void doTest(String testName, String hint) throws Throwable { myFixture.configureByFile(testName + ".java"); - + myFixture.enableInspections(ComparingReferencesInspection.class); List highlightInfos = myFixture.doHighlighting(); Assert.assertTrue(!highlightInfos.isEmpty()); - + final IntentionAction action = myFixture.findSingleIntention(hint); - + Assert.assertNotNull(action); myFixture.launchAction(action); myFixture.checkResultByFile(testName + ".after.java"); } - - // Test the "==" case + + /** + * Test the "==" case + * Note the hint must match CriQuickFix#getName + * + * @throws Throwable + */ + @Test public void test() throws Throwable { - doTest("before", "Use equals()"); +// doTest("before", "Use equals()"); + doTest("before", ComparingReferencesInspection.QUICK_FIX_NAME); } - - // Test the "!=" case + + /** + * Test the "!=" case + * Note the hint must match CriQuickFix#getName + * @throws Throwable + */ + @Test public void test1() throws Throwable { - doTest("before1", "Use equals()"); + doTest("before1", ComparingReferencesInspection.QUICK_FIX_NAME); } - + } diff --git a/conditional_operator_intention/META-INF/plugin.xml b/conditional_operator_intention/META-INF/plugin.xml deleted file mode 100644 index c2d00efb4..000000000 --- a/conditional_operator_intention/META-INF/plugin.xml +++ /dev/null @@ -1,27 +0,0 @@ - - Conditional Operator Converter - ConditionalOperatorConverter - Intention action that suggests to convert a conditional operator into - 'if' block. - - 1.3 - JetBrains - - - - - com.intellij.codeInsight.intention.ConditionalOperatorConvertor - Conditional Operator - ConditionalOperatorConvertor - - - - - - - com.intellij.codeInsight.intention.ConditionalOperatorConvertor - - - diff --git a/conditional_operator_intention/conditional_operator_intention.iml b/conditional_operator_intention/conditional_operator_intention.iml index 636ca6e47..bf37e0852 100644 --- a/conditional_operator_intention/conditional_operator_intention.iml +++ b/conditional_operator_intention/conditional_operator_intention.iml @@ -1,12 +1,13 @@ - + + diff --git a/conditional_operator_intention/resources/META-INF/plugin.xml b/conditional_operator_intention/resources/META-INF/plugin.xml new file mode 100644 index 000000000..bc2b465b8 --- /dev/null +++ b/conditional_operator_intention/resources/META-INF/plugin.xml @@ -0,0 +1,46 @@ + + + + + ConditionalOperatorConverter + + + SDK Conditional Operator Converter + + + 1.4.0 + + + + + + + Adds entry to Preferences | Editor | Intentions | SDK Intentions. + ]]> + + + +
  • 1.4.0 Refactor resources, general cleanup.
  • +
  • 1.3.0 Release 2018.3 and earlier.
  • + + ]]> +
    + + + IntelliJ Platform SDK + + + + com.intellij.codeInsight.intention.ConditionalOperatorConvertor + SDK Intentions + + + + + + com.intellij.codeInsight.intention.ConditionalOperatorConvertor + + +
    diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template b/conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/after.java.template similarity index 100% rename from conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/after.java.template rename to conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/after.java.template diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template b/conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/before.java.template similarity index 100% rename from conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/before.java.template rename to conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/before.java.template diff --git a/conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/description.html b/conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/description.html new file mode 100644 index 000000000..13d00196c --- /dev/null +++ b/conditional_operator_intention/resources/intentionDescriptions/ConditionalOperatorIntention/description.html @@ -0,0 +1,7 @@ + + + + +SDK: This intention converts a ternary operator to a corresponding if statement.
    + + \ No newline at end of file diff --git a/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java b/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java index 6c8865f87..2addade75 100644 --- a/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java +++ b/conditional_operator_intention/source/com/intellij/codeInsight/intention/ConditionalOperatorConvertor.java @@ -1,6 +1,5 @@ -/* - * Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. - */ + +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.codeInsight.intention; @@ -26,21 +25,21 @@ public class ConditionalOperatorConvertor extends PsiElementBaseIntentionAction */ @NotNull public String getText() { - return "Convert ternary operator to if statement"; + return "SDK Convert ternary operator to if statement"; } /** * Returns text for name of this family of intentions. It is used to externalize - * "auto-show" state of intentions. Only one intention action is being provided, - * so the family name is the same text as the intention action list entry. + * "auto-show" state of intentions. + * It is also the directory name for the descriptions. * - * @return the intention family name. - * @see ConditionalOperatorConvertor#getText() + * @see com.intellij.codeInsight.intention.IntentionManager#registerIntentionAndMetaData(IntentionAction, String...) + * @return the intention family name. */ @NotNull public String getFamilyName() { - return getText(); + return "ConditionalOperatorIntention"; } diff --git a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html b/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html deleted file mode 100644 index 6ae92607a..000000000 --- a/conditional_operator_intention/source/intentionDescriptions/ConditionalOperatorConvertor/description.html +++ /dev/null @@ -1,5 +0,0 @@ - - -This intention converts a ternary operator to a corresponding if statement.
    - - \ No newline at end of file diff --git a/conditional_operator_intention/testSource/testPlugin/YourTest.java b/conditional_operator_intention/testSource/testPlugin/YourTest.java index 5738e1d08..18ddc8ebf 100644 --- a/conditional_operator_intention/testSource/testPlugin/YourTest.java +++ b/conditional_operator_intention/testSource/testPlugin/YourTest.java @@ -1,3 +1,5 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + package testPlugin; import com.intellij.codeInsight.intention.IntentionAction; @@ -52,7 +54,7 @@ public class YourTest extends UsefulTestCase { @Test public void test() { - doTest("before.template", "Convert ternary operator to if statement"); + doTest("before.template", "SDK Convert ternary operator to if statement"); } } diff --git a/editor_basics/resources/META-INF/plugin.xml b/editor_basics/resources/META-INF/plugin.xml index 42fc7b342..54a8229dd 100644 --- a/editor_basics/resources/META-INF/plugin.xml +++ b/editor_basics/resources/META-INF/plugin.xml @@ -2,7 +2,7 @@ org.jetbrains.plugins.sample.EditorBasics Editor basics 1.0 - JetBrains + JetBrains Illustration of various basic Editor APIs diff --git a/gradle_plugin_demo/build.gradle b/gradle_plugin_demo/build.gradle index 05433faea..07d203504 100644 --- a/gradle_plugin_demo/build.gradle +++ b/gradle_plugin_demo/build.gradle @@ -1,7 +1,3 @@ plugins { - id "org.jetbrains.intellij" version "0.4.7" + id "org.jetbrains.intellij" version "0.4.8" } - - -sourceCompatibility = 1.8 - diff --git a/inspection/resources/META-INF/plugin.xml b/inspection/resources/META-INF/plugin.xml index 5bcfd22fc..43062a08a 100644 --- a/inspection/resources/META-INF/plugin.xml +++ b/inspection/resources/META-INF/plugin.xml @@ -1,15 +1,65 @@ + + + com.intellij.tutorials.inspection - Inspection Demo - 1.0 - JetBrains - Basic example of working with code inspections + + SDK Inspection Demo - + + 1.1.0 + + + + + + + Preferences | Editor | Inspections | SDK | Example Tools
    . + ]]> + + + +
  • 1.1.0 Refactor resources, add "SDK" to description.
  • +
  • 1.0.0 Release 2018.3 and earlier.
  • + + ]]> +
    + + + IntelliJ Platform SDK - + + + \ No newline at end of file diff --git a/inspection/resources/inspectionDescriptions/DemoCode.html b/inspection/resources/inspectionDescriptions/DemoCode.html new file mode 100644 index 000000000..a0f233f09 --- /dev/null +++ b/inspection/resources/inspectionDescriptions/DemoCode.html @@ -0,0 +1,9 @@ + + + + +SDK: Write your description here.
    + +Text after this comment will not be shown in tooltips. + + \ No newline at end of file diff --git a/inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java b/inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java index def683732..68c29dab7 100644 --- a/inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java +++ b/inspection/src/com/intellij/tutorials/inspection/DemoCodeInspection.java @@ -1,19 +1,24 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + package com.intellij.tutorials.inspection; -import com.intellij.codeInspection.*; -import org.jetbrains.annotations.*; +import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.ProblemsHolder; +import org.jetbrains.annotations.NotNull; /** * @author Anna Bulenkova */ public class DemoCodeInspection extends LocalInspectionTool { - @Nls - @NotNull - @Override - public String getDisplayName() { - return "Demo Inspection"; - } - + + /** + * This method is overridden to provide a custom visitor + * The visitor must not be recursive and must be thread-safe. + * + * @param holder object for visitor to register problems found. + * @param isOnTheFly true if inspection was run in non-batch mode + * @return DemoInspectionVisitor. + */ @NotNull @Override public DemoInspectionVisitor buildVisitor(@NotNull ProblemsHolder holder, boolean isOnTheFly) { diff --git a/inspection/src/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java b/inspection/src/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java deleted file mode 100644 index 342f2c42a..000000000 --- a/inspection/src/com/intellij/tutorials/inspection/DemoInspectionToolProvider.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.intellij.tutorials.inspection; - -import com.intellij.codeInspection.InspectionToolProvider; - -/** - * @author Anna Bulenkova - */ -public class DemoInspectionToolProvider implements InspectionToolProvider { - public Class[] getInspectionClasses() { - return new Class[]{DemoCodeInspection.class}; - } -} diff --git a/inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java b/inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java index 1dc8bf73b..aa93038b1 100644 --- a/inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java +++ b/inspection/src/com/intellij/tutorials/inspection/DemoInspectionVisitor.java @@ -1,3 +1,5 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. + package com.intellij.tutorials.inspection; import com.intellij.psi.*; diff --git a/inspection/src/inspectionDescriptions/DemoCode.html b/inspection/src/inspectionDescriptions/DemoCode.html deleted file mode 100644 index 942f318aa..000000000 --- a/inspection/src/inspectionDescriptions/DemoCode.html +++ /dev/null @@ -1,7 +0,0 @@ - - -Write your description here. - -Text after this comment will not be shown in tooltips. - - \ No newline at end of file diff --git a/plugin_sample/resources/META-INF/plugin.xml b/plugin_sample/resources/META-INF/plugin.xml index c5a4a39d9..3e5c5b65e 100644 --- a/plugin_sample/resources/META-INF/plugin.xml +++ b/plugin_sample/resources/META-INF/plugin.xml @@ -2,7 +2,7 @@ org.jetbrains.plugins.sample.PluginSample Basic plugin example 1.0 - JetBrains + JetBrains Samples @@ -21,10 +21,6 @@ - - -