/*
 * Copyright 2000-2017 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 org.jetbrains.plugins.groovy.annotator;

import com.intellij.codeHighlighting.TextEditorHighlightingPass;
import com.intellij.codeHighlighting.TextEditorHighlightingPassFactory;
import com.intellij.codeHighlighting.TextEditorHighlightingPassRegistrar;
import com.intellij.openapi.components.AbstractProjectComponent;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.GroovyLanguage;
import org.jetbrains.plugins.groovy.extensions.GroovyScriptTypeDetector;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFile;
import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase;
import org.jetbrains.plugins.groovy.util.GrFileIndexUtil;

/**
 * @author Max Medvedev
 */
public class GrReferenceHighlighterFactory extends AbstractProjectComponent implements TextEditorHighlightingPassFactory {
  public GrReferenceHighlighterFactory(Project project, TextEditorHighlightingPassRegistrar registrar) {
    super(project);
    registrar.registerTextEditorHighlightingPass(this, null, null, false, -1);
  }

  @Override
  public TextEditorHighlightingPass createHighlightingPass(@NotNull PsiFile file, @NotNull Editor editor) {
    if (!isSpecificScriptFile(file) && !GrFileIndexUtil.isGroovySourceFile(file)) return null;
    PsiFile groovyFile = file.getViewProvider().getPsi(GroovyLanguage.INSTANCE);
    if (!(groovyFile instanceof GroovyFileBase)) return null;
    return new GrReferenceHighlighter(editor.getDocument(), (GroovyFileBase)groovyFile);
  }

  private static boolean isSpecificScriptFile(@NotNull PsiFile file) {
    if (!(file instanceof GroovyFile)) return false;
    if (!((GroovyFile)file).isScript()) return false;

    for (GroovyScriptTypeDetector detector : GroovyScriptTypeDetector.EP_NAME.getExtensions()) {
      if (detector.isSpecificScriptFile((GroovyFile)file)) {
        return true;
      }
    }
    return false;
  }

}

@@ -1082,16 +1082,59 @@
 otNull;%0A
+import org.jetbrains.annotations.Nullable;%0A
 import o
@@ -1919,98 +1919,330 @@
     
-if (!isSpecificScriptFile(file) && !GrFileIndexUtil.isGroovySourceFile(file)) return null;
+GroovyFileBase groovyFile = getAndCheckFile(file);%0A    if (groovyFile == null) return null;%0A    return new GrReferenceHighlighter(editor.getDocument(), groovyFile);%0A  %7D%0A%0A  @Nullable%0A  private static GroovyFileBase getAndCheckFile(@NotNull PsiFile file) %7B%0A    if (isSpecificScriptFile(file)) return ((GroovyFileBase)file);%0A
 %0A   
@@ -2250,17 +2250,20 @@
 PsiFile 
-g
+psiG
 roovyFil
@@ -2332,17 +2332,20 @@
   if (!(
-g
+psiG
 roovyFil
@@ -2391,70 +2391,119 @@
 ll;%0A
+%0A
     
-return new GrReferenceHighlighter(editor.getDocument(), (G
+GroovyFileBase groovyFile = (GroovyFileBase)psiGroovyFile;%0A    return GrFileIndexUtil.isGroovySourceFile(g
 roov
@@ -2507,21 +2507,20 @@
 oovyFile
-Base)
+) ? 
 groovyFi
@@ -2513,33 +2513,39 @@
 le) ? groovyFile
-)
+ : null
 ;%0A  %7D%0A%0A  private

check if file obtained from view provider is from sources instead of checking original file which may not implement GroovyFileBase