package com.intellij.lang.javascript.flex;
import com.intellij.codeInsight.daemon.ReferenceImporter;
import com.intellij.codeInsight.daemon.impl.CollectHighlightsUtil;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.psi.JSFile;
import com.intellij.lang.javascript.psi.JSReferenceExpression;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiPolyVariantReference;
import org.jetbrains.annotations.NotNull;
import java.util.List;
/**
* @author Maxim.Mossienko
* Date: Apr 14, 2008
* Time: 11:43:22 PM
*/
public class FlexReferenceImporter implements ReferenceImporter {
@Override
public boolean autoImportReferenceAtCursor(@NotNull final Editor editor, @NotNull final PsiFile file) {
return doAutoImportReferenceAt(editor, file, editor.getCaretModel().getOffset());
}
@Override
public boolean autoImportReferenceAt(@NotNull final Editor editor, @NotNull final PsiFile file, final int offset) {
return doAutoImportReferenceAt(editor, file, offset);
}
private static boolean doAutoImportReferenceAt(final Editor editor,
final PsiFile file,
final int offset) {
if (!ActionScriptAutoImportOptionsProvider.isAddUnambiguousImportsOnTheFly()) return false;
if (!(file instanceof JSFile) || file.getLanguage() != JavaScriptSupportLoader.ECMA_SCRIPT_L4) return false;
Document document = editor.getDocument();
int lineNumber = document.getLineNumber(offset);
int startOffset = document.getLineStartOffset(lineNumber);
int endOffset = document.getLineEndOffset(lineNumber);
List<PsiElement> elements = CollectHighlightsUtil.getElementsInRange(file, startOffset, endOffset);
for (PsiElement element : elements) {
if (element instanceof JSReferenceExpression && ((JSReferenceExpression)element).getQualifier() == null) {
if (((JSReferenceExpression)element).multiResolve(false).length == 0) {
new AddImportECMAScriptClassOrFunctionAction(editor, (PsiPolyVariantReference)element, true).execute();
return true;
}
}
}
return false;
}
}