package com.intellij.javascript.flex.css; import com.intellij.openapi.util.TextRange; import com.intellij.psi.*; import com.intellij.psi.css.CssBundle; import com.intellij.psi.css.CssElementDescriptorProvider; import com.intellij.psi.css.CssPropertyDescriptor; import com.intellij.psi.css.reference.CssReference; import com.intellij.psi.impl.source.resolve.reference.impl.PsiPolyVariantCachingReference; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import static com.intellij.psi.css.impl.util.table.CssDescriptorsUtil.extractDescriptorsIdsAsArray; public class CssPropertyValueReference extends PsiPolyVariantCachingReference implements CssReference { private final PsiElement myElement; private final int myStart; private final int myEnd; public CssPropertyValueReference(@NotNull PsiElement element) { myElement = element; String text = element.getText(); if (FlexCssUtil.inQuotes(text)) { myStart = 1; myEnd = text.length() - 1; } else { myStart = 0; myEnd = 0; } } @NotNull @Override public String getUnresolvedMessagePattern() { return CssBundle.message("invalid.css.property.name.message"); } @NotNull @Override protected ResolveResult[] resolveInner(boolean incompleteCode, @NotNull PsiFile containingFile) { String value = myElement.getText(); if (FlexCssUtil.inQuotes(value)) { FlexCssElementDescriptorProvider provider = CssElementDescriptorProvider.EP_NAME.findExtension(FlexCssElementDescriptorProvider.class); CssPropertyDescriptor descriptor = provider.getPropertyDescriptor(value.substring(1, value.length() - 1), myElement); if (descriptor != null) { return PsiElementResolveResult.createResults(descriptor.getDeclarations(myElement)); } } return ResolveResult.EMPTY_ARRAY; } @Override public PsiElement getElement() { return myElement; } @Override public TextRange getRangeInElement() { return new TextRange(myStart, myEnd); } @Override @NotNull public String getCanonicalText() { String text = myElement.getText(); if (FlexCssUtil.inQuotes(text)) { return text.substring(1, text.length() - 1); } else { return ""; } } @Override public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException { final ElementManipulator<PsiElement> manipulator = ElementManipulators.getManipulator(myElement); assert manipulator != null; return manipulator.handleContentChange(myElement, getRangeInElement(), newElementName); } @Override @Nullable public PsiElement bindToElement(@NotNull PsiElement element) throws IncorrectOperationException { return null; } @Override @NotNull public Object[] getVariants() { FlexCssElementDescriptorProvider flexDescriptorProvider = CssElementDescriptorProvider.EP_NAME.findExtension(FlexCssElementDescriptorProvider.class); return extractDescriptorsIdsAsArray(flexDescriptorProvider.getAllPropertyDescriptors(myElement)); } @Override public boolean isReferenceTo(PsiElement element) { ResolveResult[] results = multiResolve(false); for (ResolveResult result : results) { if (myElement.getManager().areElementsEquivalent(result.getElement(), element)) { return true; } } return false; } @Override public boolean isSoft() { return true; } }