2016-10-17 9 views
2

Я использую механизм проверки нуль IntelliJ для предотвращения сбоев в nullpointer. Я успешно настроил все параметры метода Java как @NonNull по умолчанию, используя this ответ.IntelliJ IDEA @ParametersAreNonnullByDefault для всех подпакетов

После создания package-info.java, который используется для определения package annotations в Java. Все java-файлы, являющиеся прямыми потомками этого пакета, имеют методы с параметрами по умолчанию @NonNull в моем проекте Android Studio.

enter image description here

Очевидная проблема в том, что мне нужно определить @ParametersAreNonnullByDefault для всех классов Java в этом пакете есть включая все подпакеты.

Как я могу определить @ParametersAreNonnullByDefault, чтобы он распространялся на все java-файлы subpackage? Я хочу, чтобы по умолчанию был добавлен весь метод моего внутреннего кода с @NonNull.

enter image description here

/** 
    * File: package-info.java 
    * Make all method parameters @NonNull by default 
    */ 
    @ParametersAreNonnullByDefault 
    package com.intive.nearbyplaces.main; 

    import javax.annotation.ParametersAreNonnullByDefault; 

ответ

7

Проблема заключалась в том, что я не мог заставить Android Studio уважать @ParametersAreNonnullByDefault во всех подпакетов (т.е. рекурсивно для всех файлов Java в com.company.name)

Я написал aсценарий градации, однако, чтобы проверить, package-info.java файлы генерируются внутри ea ch папок подпакета и создать его, если необходимо. Скрипт выполняется непосредственно перед assembleDebug задача.

Таким образом, получается, что можно направить @ParametersAreNonnullByDefault аннотация на все классы java в вашем проекте.

Загрузить источник here. Не забудьте заменить строку 19 на ваше имя пакета.

Использование:

apply plugin: 'com.android.application' 
apply from: 'nonnull.gradle' 

android { 
    compileSdkVersion 24 
    buildToolsVersion "24.0.2" 

    [...] 
} 

Не забудьте включить package-info.java файлы в .gitignore

//File: .gitignore 

package-info.java 

Checkstyle правило:

<module name="JavadocPackage"/> 

проверяет, является ли пакет- info.java включен в каждый подпакет.

Источник:

/** 
* File: nonnull.gradle 
* 
* Generates package-info.java for appropriate packages 
* inside src/main/java folder. 
* 
* This is a workaround to define @ParametersAreNonnullByDefault for all Java classes in a package 
* i.e. including all subpackages (note: edit package name in line no. 19). 
*/ 
task generateNonNullJavaFiles(dependsOn: "assembleDebug", type: Copy) { 
    group = "Copying" 
    description = "Generate package-info.java classes" 

    def infoFileContentHeader = getFileContentHeader(); 
    def infoFileContentFooter = getFileContentFooter(); 

    def sourceDir = file("${projectDir}" + File.separatorChar + "src" + File.separatorChar + 
      "main" + File.separatorChar + "java" + File.separatorChar + 
      "com" + File.separatorChar + "company" + File.separatorChar + "name") 
    sourceDir.eachDirRecurse { dir -> 
     def infoFilePath = dir.getAbsolutePath() + File.separatorChar + "package-info.java" 

     if (!file(infoFilePath).exists()) { 
      def infoFileContentPackage = getFileContentPackage(dir.getAbsolutePath()); 
      new File(infoFilePath).write(infoFileContentHeader + 
        infoFileContentPackage + infoFileContentFooter) 
      println "[dir] " + infoFilePath + " created"; 
     } 
    } 
    println "[SUCCESS] NonNull generator: package-info.java files checked" 
} 

def getFileContentPackage(path) { 
    def mainSrcPhrase = "src" + File.separatorChar + "main" + File.separatorChar + 
      "java" + File.separatorChar 
    def mainSrcPhraseIndex = path.indexOf(mainSrcPhrase) 
    def output = path.substring(mainSrcPhraseIndex) 

    // Win hotfix 
    if (System.properties['os.name'].toLowerCase().contains('windows')) { 
     output = output.replace("\\", "/") 
     mainSrcPhrase = mainSrcPhrase.replace("\\", "/") 
    } 

    return "package " + output.replaceAll(mainSrcPhrase, "").replaceAll(
      "/", ".") + ";\n" 
} 

def getFileContentHeader() { 
    return "/** javadoc goes here \n */\n" + 
      "@ParametersAreNonnullByDefault\n" + 
      "@ReturnValuesAreNonnullByDefault\n" 
} 

def getFileContentFooter() { 
    return "\n" + 
      "import javax.annotation.ParametersAreNonnullByDefault;\n" + 
      "\n" + 
      "import edu.umd.cs.findbugs.annotations.ReturnValuesAreNonnullByDefault;" 
} 

Расширенная версия, которая генерирует пакет информационных файлов для Src магистралью, тест & androidTest папки могут быть найдены here.

FindBugs & Lint:

Это работает с FindBugs & пуха.