package com.intellij.javascript.flex.mxml.schema;
import com.intellij.codeInsight.intention.IntentionAction;
import com.intellij.lang.javascript.JavaScriptSupportLoader;
import com.intellij.lang.javascript.psi.ecmal4.JSClass;
import com.intellij.lang.javascript.refactoring.util.JSRefactoringUtil;
import com.intellij.lang.javascript.validation.fixes.CreateEventMetadataByMxmlAttributeFix;
import com.intellij.lang.javascript.validation.fixes.CreateFieldByMxmlAttributeFix;
import com.intellij.lang.javascript.validation.fixes.CreateSetterByMxmlAttributeFix;
import com.intellij.lang.javascript.validation.fixes.FixAndIntentionAction;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlFile;
import com.intellij.xml.XmlElementDescriptor;
import com.intellij.xml.XmlUndefinedElementFixProvider;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yole
*/
public class FlexUndefinedElementFixProvider extends XmlUndefinedElementFixProvider {
@Nullable
@Override
public IntentionAction[] createFixes(@NotNull XmlAttribute attribute) {
if (!JavaScriptSupportLoader.isFlexMxmFile(attribute.getContainingFile())) return null;
final String name = attribute.getName();
if (!JSRefactoringUtil.isValidIdentifier(name, attribute.getProject())) {
return IntentionAction.EMPTY_ARRAY;
}
final XmlElementDescriptor descriptor = attribute.getParent().getDescriptor();
final PsiElement declaration = descriptor instanceof ClassBackedElementDescriptor ? descriptor.getDeclaration() : null;
final VirtualFile virtualFile = declaration == null ? null : declaration.getContainingFile().getVirtualFile();
if (virtualFile == null ||
ProjectRootManager.getInstance(declaration.getProject()).getFileIndex().getSourceRootForFile(virtualFile) == null) {
return IntentionAction.EMPTY_ARRAY;
}
if (declaration instanceof JSClass || declaration instanceof XmlFile && JavaScriptSupportLoader.isFlexMxmFile((XmlFile)declaration)) {
final String attributeValue = attribute.getValue();
final FixAndIntentionAction fix1 = new CreateFieldByMxmlAttributeFix(name, attributeValue);
fix1.registerElementRefForFix(attribute, null);
final FixAndIntentionAction fix2 = new CreateSetterByMxmlAttributeFix(name, attributeValue);
fix2.registerElementRefForFix(attribute, null);
final FixAndIntentionAction fix3 = new CreateEventMetadataByMxmlAttributeFix(name);
fix3.registerElementRefForFix(attribute, null);
return new IntentionAction[] { fix1, fix2, fix3 };
}
return IntentionAction.EMPTY_ARRAY;
}
}