package-info.java file
-missing.package.html.problem.descriptor=Package ''{0}'' is missing a package.html file
\ No newline at end of file
+missing.package.html.problem.descriptor=Package ''{0}'' is missing a package.html file
+package.info.java.without.package.display.name='package-info.java' without 'package' statement
+package.info.without.package.problem.descriptor='package-info.java' does not have a package statement
+package.info.without.package.quickfix=add ''package {0};''
+package.info.without.package.family.quickfix=add package statement
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javadoc/PackageInfoWithoutPackageInspection.java b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javadoc/PackageInfoWithoutPackageInspection.java
new file mode 100644
index 000000000000..e3949ef94af7
--- /dev/null
+++ b/plugins/InspectionGadgets/InspectionGadgetsAnalysis/src/com/siyeh/ig/javadoc/PackageInfoWithoutPackageInspection.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2000-2013 JetBrains s.r.o.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.siyeh.ig.javadoc;
+
+import com.intellij.codeInspection.ProblemDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.*;
+import com.siyeh.InspectionGadgetsBundle;
+import com.siyeh.ig.BaseInspection;
+import com.siyeh.ig.BaseInspectionVisitor;
+import com.siyeh.ig.InspectionGadgetsFix;
+import org.jetbrains.annotations.Nls;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * @author Bas Leijdekkers
+ */
+public class PackageInfoWithoutPackageInspection extends BaseInspection {
+ @Nls
+ @NotNull
+ @Override
+ public String getDisplayName() {
+ return InspectionGadgetsBundle.message("package.info.java.without.package.display.name");
+ }
+
+ @NotNull
+ @Override
+ protected String buildErrorString(Object... infos) {
+ return InspectionGadgetsBundle.message("package.info.without.package.problem.descriptor");
+ }
+
+ @Nullable
+ @Override
+ protected InspectionGadgetsFix buildFix(Object... infos) {
+ return new PackageInfoWithoutPackageFix((String)infos[0]);
+ }
+
+ private static class PackageInfoWithoutPackageFix extends InspectionGadgetsFix {
+
+ private final String myPackageName;
+
+ public PackageInfoWithoutPackageFix(String packageName) {
+ myPackageName = packageName;
+ }
+
+ @NotNull
+ @Override
+ public String getName() {
+ return InspectionGadgetsBundle.message("package.info.without.package.quickfix", myPackageName);
+ }
+
+ @NotNull
+ @Override
+ public String getFamilyName() {
+ return InspectionGadgetsBundle.message("package.info.without.package.family.quickfix");
+ }
+
+ @Override
+ protected void doFix(Project project, ProblemDescriptor descriptor) {
+ final PsiElement element = descriptor.getPsiElement();
+ if (!(element instanceof PsiJavaFile)) {
+ return;
+ }
+ final PsiJavaFile file = (PsiJavaFile)element;
+ final PsiElementFactory factory = JavaPsiFacade.getElementFactory(project);
+ final PsiPackageStatement packageStatement = factory.createPackageStatement(myPackageName);
+ file.add(packageStatement);
+ }
+ }
+
+ @Override
+ public BaseInspectionVisitor buildVisitor() {
+ return new PackageInfoWithoutPackageVisitor();
+ }
+
+ private static class PackageInfoWithoutPackageVisitor extends BaseInspectionVisitor {
+
+ @Override
+ public void visitJavaFile(PsiJavaFile file) {
+ final PsiPackageStatement packageStatement = file.getPackageStatement();
+ if (packageStatement != null) {
+ return;
+ }
+ @NonNls final String name = file.getName();
+ if (!PsiPackage.PACKAGE_INFO_FILE.equals(name)) {
+ return;
+ }
+ final JavaDirectoryService directoryService = JavaDirectoryService.getInstance();
+ final PsiDirectory directory = file.getContainingDirectory();
+ final PsiPackage aPackage = directoryService.getPackage(directory);
+ if (aPackage == null) {
+ return;
+ }
+ final String packageName = aPackage.getQualifiedName();
+ if (packageName.isEmpty()) {
+ return;
+ }
+ registerError(file, packageName);
+ }
+ }
+}
diff --git a/plugins/InspectionGadgets/src/inspectionDescriptions/PackageInfoWithoutPackage.html b/plugins/InspectionGadgets/src/inspectionDescriptions/PackageInfoWithoutPackage.html
new file mode 100644
index 000000000000..6290624778ee
--- /dev/null
+++ b/plugins/InspectionGadgets/src/inspectionDescriptions/PackageInfoWithoutPackage.html
@@ -0,0 +1,9 @@
+
+
+Reports package-info.java files without a package statement.
+The Javadoc tool considers such files documentation for the default package even when the file is located somewhere else.
+
+
+New in 13
+
+
\ No newline at end of file
diff --git a/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/package_info_without_package/expected.xml b/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/package_info_without_package/expected.xml
new file mode 100644
index 000000000000..030404f0fdac
--- /dev/null
+++ b/plugins/InspectionGadgets/test/com/siyeh/igtest/javadoc/package_info_without_package/expected.xml
@@ -0,0 +1,9 @@
+
+