package de.espend.idea.shopware.inspection;

import com.intellij.codeInspection.LocalInspectionTool;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ProblemsHolder;
import com.intellij.lang.folding.FoldingDescriptor;
import com.intellij.patterns.PlatformPatterns;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiElementVisitor;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
import com.intellij.psi.util.PsiTreeUtil;
import com.jetbrains.php.lang.lexer.PhpTokenTypes;
import com.jetbrains.php.lang.psi.elements.Method;
import com.jetbrains.php.lang.psi.elements.PhpReturn;
import de.espend.idea.shopware.ShopwareProjectComponent;
import fr.adrienbrault.idea.symfony2plugin.util.PsiElementUtils;
import org.jetbrains.annotations.NotNull;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * @author Daniel Espendiller <daniel@espendiller.net>
 */
public class ShopwareBoostrapInspection extends LocalInspectionTool {

    final private static Set<String> INSTALL_METHODS = new HashSet<>(Arrays.asList("install", "uninstall", "update"));

    @NotNull
    @Override
    public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) {
        PsiFile psiFile = holder.getFile();
        if(!ShopwareProjectComponent.isValidForProject(psiFile)) {
            return super.buildVisitor(holder, isOnTheFly);
        }

        if("Bootstrap.php".equals(psiFile.getName())) {
            psiFile.acceptChildren(new PsiRecursiveElementWalkingVisitor() {
                @Override
                public void visitElement(PsiElement element) {
                    if(element instanceof Method) {

                        String methodName = ((Method) element).getName();
                        if(INSTALL_METHODS.contains(((Method) element).getName())) {
                            if(PsiTreeUtil.collectElementsOfType(element, PhpReturn.class).size() == 0) {
                                PsiElement psiElement = PsiElementUtils.getChildrenOfType(element, PlatformPatterns.psiElement(PhpTokenTypes.IDENTIFIER).withText(methodName));
                                if(psiElement != null) {
                                    holder.registerProblem(psiElement, "Shopware need return statement", ProblemHighlightType.GENERIC_ERROR);
                                }
                            }
                        }

                    }
                    super.visitElement(element);
                }
            });

        }

        return super.buildVisitor(holder, isOnTheFly);
    }

}

@@ -206,60 +206,8 @@
 er;%0A
-import com.intellij.lang.folding.FoldingDescriptor;%0A
 impo
@@ -365,67 +365,8 @@
 le;%0A
-import com.intellij.psi.PsiRecursiveElementWalkingVisitor;%0A
 impo
@@ -1373,16 +1373,17 @@
      if(
+!
 %22Bootstr
@@ -1435,61 +1435,95 @@
     
-psiFile.acceptChildren(new PsiRecursiveElementWalking
+return super.buildVisitor(holder, isOnTheFly);%0A        %7D%0A%0A        return new PsiElement
 Visi
@@ -1542,20 +1542,16 @@
         
-    
 @Overrid
@@ -1552,20 +1552,16 @@
 verride%0A
-    
         
@@ -1627,20 +1627,16 @@
         
-  
-  
 if(eleme
@@ -1659,21 +1659,16 @@
 thod) %7B%0A
-%0A    
         
@@ -1749,20 +1749,16 @@
         
-   
- 
 if(INSTA
@@ -1802,36 +1802,32 @@
 ).getName())) %7B%0A
-    
                 
@@ -1940,20 +1940,16 @@
         
-    
 PsiEleme
@@ -2112,20 +2112,16 @@
         
- 
-   
 if(psiEl
@@ -2133,28 +2133,24 @@
  != null) %7B%0A
-    
             
@@ -2279,42 +2279,8 @@
 R);%0A
-                                %7D%0A
     
@@ -2323,33 +2323,32 @@
               %7D%0A
-%0A
                 
@@ -2345,36 +2345,52 @@
               %7D%0A
+%0A
     
+            %7D%0A%0A
                 
@@ -2426,34 +2426,26 @@
             
-    %7D%0A    
+%7D%0A
         %7D);%0A
@@ -2445,83 +2445,14 @@
    %7D
-)
 ;%0A
-%0A  
     
-  %7D%0A%0A        return super.buildVisitor(holder, isOnTheFly);%0A    %7D%0A
+%7D
 %0A%7D%0A

use PsiElementVisitor for ShopwareBoostrapInspection