use of com.intellij.lang.javascript.psi.JSReferenceExpression in project intellij-plugins by JetBrains.
the class FlexResolveHelper method bindReferenceToElement.
@Override
public JSReferenceExpression bindReferenceToElement(JSReferenceExpression ref, String qName, String newName, boolean justMakeQualified, PsiNamedElement element) {
PsiFile file;
if (qName != null && (element instanceof XmlBackedJSClass || (element instanceof XmlFile && JavaScriptSupportLoader.isFlexMxmFile((PsiFile) element)) || (file = element.getContainingFile()) == null || file.getLanguage().isKindOf(JavaScriptSupportLoader.ECMA_SCRIPT_L4))) {
boolean qualify;
boolean doImport;
if (justMakeQualified || ref.getParent() instanceof JSImportStatement || element instanceof PsiDirectoryContainer || (ref.getParent() instanceof JSReferenceListMember && ref.getContainingFile().getContext() instanceof XmlAttributeValue)) {
qualify = true;
doImport = false;
} else {
doImport = JSImportHandlingUtil.evaluateImportStatus(newName, ref) == JSImportHandlingUtil.ImportStatus.ABSENT && JSImportHandlingUtil.evaluateImportStatus(ref.getReferencedName(), ref) == JSImportHandlingUtil.ImportStatus.ABSENT;
JSQualifiedNamedElement qualifiedElement = null;
if (element instanceof JSQualifiedNamedElement) {
qualifiedElement = (JSQualifiedNamedElement) element;
} else if (element instanceof JSFile) {
qualifiedElement = JSPsiImplUtils.findQualifiedElement((JSFile) element);
} else if (element instanceof XmlFile) {
qualifiedElement = XmlBackedJSClassFactory.getXmlBackedClass(((XmlFile) element));
}
assert qualifiedElement != null : qualifiedElement.getClass();
// at this moment package declaration is out of date so element has it's original qName
qualify = JSResolveUtil.shortReferenceIsAmbiguousOrUnequal(newName, ref, qualifiedElement.getQualifiedName(), null);
}
if (qualify) {
ASTNode newChild = JSChangeUtil.createExpressionFromText(ref.getProject(), qName);
ref.getParent().getNode().replaceChild(ref.getNode(), newChild);
ref = (JSReferenceExpression) newChild.getPsi();
}
if (doImport && qName.indexOf('.') != -1 && !StringUtil.getPackageName(qName).equals(JSResolveUtil.getPackageNameFromPlace(ref))) {
final SmartPsiElementPointer<JSReferenceExpression> refPointer = SmartPointerManager.getInstance(ref.getProject()).createSmartPsiElementPointer(ref);
ImportUtils.doImport(ref, qName, false);
ref = refPointer.getElement();
}
}
return ref;
}
use of com.intellij.lang.javascript.psi.JSReferenceExpression in project intellij-plugins by JetBrains.
the class FlexMoveClassProcessor method detectConflicts.
private MultiMap<PsiElement, String> detectConflicts(UsageInfo[] usages) {
MultiMap<PsiElement, String> conflicts = new MultiMap<>();
final Collection<PsiElement> filesToMove = Arrays.asList(myElementsToMove);
JSVisibilityUtil.Options options = new JSVisibilityUtil.Options();
for (PsiElement file : filesToMove) {
options.overridePackage(file, myTargetPackage);
}
for (UsageInfo usage : usages) {
final PsiElement element = usage.getElement();
if (!(element instanceof JSReferenceExpression)) {
continue;
}
if (CommonRefactoringUtil.isAncestor(element, filesToMove)) {
continue;
}
JSReferenceExpression refExpr = (JSReferenceExpression) element;
final PsiElement resolved = refExpr.resolve();
if (!(resolved instanceof JSQualifiedNamedElement)) {
continue;
}
PsiElement containingClass = null;
if (resolved instanceof JSFunction && ((JSFunction) resolved).isConstructor() && myElements.contains(containingClass = resolved.getParent()) || myElements.contains(resolved)) {
JSRefactoringConflictsUtil.checkAccessibility((JSAttributeListOwner) resolved, (JSClass) containingClass, null, refExpr, conflicts, true, options);
}
}
for (PsiElement fileToMove : filesToMove) {
JSRefactoringConflictsUtil.checkOutgoingReferencesAccessibility(fileToMove, filesToMove, null, true, conflicts, Conditions.alwaysTrue(), options);
}
//JSRefactoringConflictsUtil.analyzeModuleConflicts(myProject, myElements, usages, myTargetDirectory, conflicts);
return conflicts;
}
use of com.intellij.lang.javascript.psi.JSReferenceExpression in project intellij-plugins by JetBrains.
the class FlexMoveInnerClassProcessor method performRefactoring.
@Override
protected void performRefactoring(@NotNull UsageInfo[] usages) {
try {
ActionScriptCreateClassOrInterfaceFix.createClass(myClassName, myPackageName, myTargetDirectory, false);
} catch (Exception e) {
Messages.showErrorDialog(myProject, e.getMessage(), getCommandName());
return;
}
final PsiFile sourceFile = myElement.getContainingFile();
Collection<String> importsInTargetFile = new HashSet<>();
Collection<String> namespacesInTargetFile = new HashSet<>();
List<FormatFixer> formatters = new ArrayList<>();
//JSRefactoringUtil.addRemovalFormatters(mySourceClass, myMembersToMove, Condition.TRUE, Condition.TRUE, postponedFormatters);
JSClass targetClass = myElement instanceof JSClass ? (JSClass) myElement : null;
JSRefactoringUtil.fixOutgoingReferences(myElement, importsInTargetFile, namespacesInTargetFile, Collections.singletonList(((JSAttributeListOwner) myElement)), targetClass, false, false);
myElement.setName(myClassName);
Collection<UsageInfo> usagesToProcess = new ArrayList<>(Arrays.asList(usages));
for (Iterator<UsageInfo> i = usagesToProcess.iterator(); i.hasNext(); ) {
UsageInfo usage = i.next();
PsiElement element;
if (usage instanceof NonCodeUsageInfo || (element = usage.getElement()) == null || !PsiTreeUtil.isAncestor(myElement, element, false)) {
continue;
}
if (element instanceof JSReferenceExpression) {
((JSReferenceExpression) element).bindToElement(myElement);
} else if (element instanceof PsiNamedElement) {
((PsiNamedElement) element).setName(myClassName);
} else {
continue;
}
i.remove();
}
final PsiElement clazz = ActionScriptClassResolver.findClassByQNameStatic(StringUtil.getQualifiedName(myPackageName, myClassName), GlobalSearchScope.projectScope(myProject));
PsiElement toInsert = myElement instanceof JSVariable ? JSRefactoringUtil.getVarStatementCopy((JSVariable) myElement) : myElement.copy();
final PsiElement inserted = clazz.replace(toInsert);
PsiFile insertedContainingFile = inserted.getContainingFile();
JSQualifiedNamedElement newClass = inserted instanceof JSVarStatement ? ((JSVarStatement) inserted).getVariables()[0] : (JSQualifiedNamedElement) inserted;
SmartPsiElementPointer<JSQualifiedNamedElement> newClassPointer = SmartPointerManager.getInstance(myProject).createSmartPsiElementPointer(newClass);
JSRefactoringUtil.handleDocCommentAndFormat(inserted, formatters);
JSRefactoringUtil.deleteWithNoPostponedFormatting(myElement);
if (myPackageName.length() > 0) {
for (UsageInfo usage : usagesToProcess) {
if (usage instanceof NonCodeUsageInfo || usage.getFile() != sourceFile)
continue;
final PsiElement element = usage.getElement();
if (element == null)
continue;
ImportUtils.doImport(element, StringUtil.getQualifiedName(myPackageName, myClassName), true);
}
}
JSRefactoringUtil.postProcess(sourceFile, newClass, Collections.singletonList(sourceFile), importsInTargetFile, namespacesInTargetFile, formatters, true, false);
boolean makePublic = false;
newClass = newClassPointer.getElement();
List<NonCodeUsageInfo> nonCodeUsages = new ArrayList<>();
for (UsageInfo usage : usagesToProcess) {
if (usage instanceof NonCodeUsageInfo) {
nonCodeUsages.add((NonCodeUsageInfo) usage);
} else {
JSReferenceExpression refExpr = (JSReferenceExpression) usage.getElement();
if (refExpr == null) {
continue;
}
makePublic |= JSPsiImplUtils.getQNameForMove(refExpr, newClass) != null;
refExpr.bindToElement(newClass);
}
}
JSChangeVisibilityUtil.setVisibility((JSAttributeListOwner) newClass, makePublic ? JSAttributeList.AccessType.PUBLIC : JSAttributeList.AccessType.PACKAGE_LOCAL);
myNonCodeUsages = nonCodeUsages.toArray(new NonCodeUsageInfo[nonCodeUsages.size()]);
if (myMoveCallback != null) {
myMoveCallback.refactoringCompleted();
}
OpenFileDescriptor descriptor = new OpenFileDescriptor(myProject, insertedContainingFile.getVirtualFile(), newClass.getTextOffset());
FileEditorManager.getInstance(myProject).openTextEditor(descriptor, true);
}
use of com.intellij.lang.javascript.psi.JSReferenceExpression in project intellij-plugins by JetBrains.
the class FlexMoveInnerClassProcessor method findUsages.
@NotNull
@Override
protected UsageInfo[] findUsages() {
final Collection<UsageInfo> result = Collections.synchronizedCollection(new ArrayList<UsageInfo>());
ReferencesSearch.search(myElement, new LocalSearchScope(myElement.getContainingFile())).forEach(reference -> {
final PsiElement element = reference.getElement();
if (!(element instanceof JSReferenceExpression)) {
return true;
}
if (JSResolveUtil.isSelfReference(element)) {
return true;
}
result.add(new UsageInfo(element));
return true;
});
if (myElement instanceof JSClass) {
final JSFunction constructor = ((JSClass) myElement).getConstructor();
if (constructor != null) {
result.add(new UsageInfo(constructor));
JSRefactoringUtil.addConstructorUsages((JSClass) myElement, result);
}
}
TextOccurrencesUtil.findNonCodeUsages(myElement, myElement.getName(), mySearchInComments, mySearchTextOccurences, StringUtil.getQualifiedName(myPackageName, myClassName), result);
return UsageViewUtil.removeDuplicatedUsages(result.toArray(new UsageInfo[result.size()]));
}
Aggregations