public void setMirror(@NotNull TreeElement element) { setMirrorCheckingType(element, null); PsiAnnotation mirror = (PsiAnnotation) SourceTreeToPsiMap.treeElementToPsi(element); ((ClsElementImpl) getParameterList()) .setMirror((TreeElement) SourceTreeToPsiMap.psiElementToTree(mirror.getParameterList())); ((ClsElementImpl) getNameReferenceElement()) .setMirror( (TreeElement) SourceTreeToPsiMap.psiElementToTree(mirror.getNameReferenceElement())); }
private void checkDuplicateAttribute(XmlTag tag, final XmlAttribute attribute) { if (skipValidation(tag)) { return; } final XmlAttribute[] attributes = tag.getAttributes(); final PsiFile containingFile = tag.getContainingFile(); final XmlExtension extension = containingFile instanceof XmlFile ? XmlExtension.getExtension(containingFile) : XmlExtension.DEFAULT_EXTENSION; for (XmlAttribute tagAttribute : attributes) { ProgressManager.checkCanceled(); if (attribute != tagAttribute && Comparing.strEqual(attribute.getName(), tagAttribute.getName())) { final String localName = attribute.getLocalName(); if (extension.canBeDuplicated(tagAttribute)) continue; // multiple import attributes are allowed in jsp directive HighlightInfo highlightInfo = HighlightInfo.createHighlightInfo( getTagProblemInfoType(tag), XmlChildRole.ATTRIBUTE_NAME_FINDER.findChild( SourceTreeToPsiMap.psiElementToTree(attribute)), XmlErrorMessages.message("duplicate.attribute", localName)); addToResults(highlightInfo); IntentionAction intentionAction = new RemoveAttributeIntentionFix(localName, attribute); QuickFixAction.registerQuickFixAction(highlightInfo, intentionAction); } } }
@Nullable private HighlightInfo reportAttributeProblem( final XmlTag tag, final String localName, final XmlAttribute attribute, final String localizedMessage) { final RemoveAttributeIntentionFix removeAttributeIntention = new RemoveAttributeIntentionFix(localName, attribute); if (!(tag instanceof HtmlTag)) { final HighlightInfoType tagProblemInfoType = HighlightInfoType.WRONG_REF; final ASTNode node = SourceTreeToPsiMap.psiElementToTree(attribute); assert node != null; final ASTNode child = XmlChildRole.ATTRIBUTE_NAME_FINDER.findChild(node); assert child != null; final HighlightInfo highlightInfo = HighlightInfo.createHighlightInfo(tagProblemInfoType, child, localizedMessage); addToResults(highlightInfo); QuickFixAction.registerQuickFixAction(highlightInfo, removeAttributeIntention); return highlightInfo; } return null; }
public ASTNode getDefaultAnchor( @NotNull PsiImportList list, @NotNull PsiImportStatementBase statement) { PsiJavaCodeReferenceElement ref = statement.getImportReference(); if (ref == null) return null; int entryIndex = findEntryIndex(statement); PsiImportStatementBase[] allStatements = list.getAllImportStatements(); int[] entries = ArrayUtil.newIntArray(allStatements.length); List<PsiImportStatementBase> statements = new ArrayList<PsiImportStatementBase>(); for (int i = 0; i < allStatements.length; i++) { PsiImportStatementBase statement1 = allStatements[i]; int entryIndex1 = findEntryIndex(statement1); entries[i] = entryIndex1; if (entryIndex1 == entryIndex) { statements.add(statement1); } } if (statements.isEmpty()) { int index; for (index = entries.length - 1; index >= 0; index--) { if (entries[index] < entryIndex) break; } index++; return index < entries.length ? SourceTreeToPsiMap.psiElementToTree(allStatements[index]) : null; } else { String refText = ref.getCanonicalText(); if (statement.isOnDemand()) { refText += "."; } PsiImportStatementBase insertBefore = null; PsiImportStatementBase insertAfter = null; for (PsiImportStatementBase statement1 : statements) { PsiJavaCodeReferenceElement ref1 = statement1.getImportReference(); if (ref1 == null) { continue; } String refTextThis = ref1.getCanonicalText(); if (statement1.isOnDemand()) { refTextThis += "."; } int comp = Comparing.compare(refText, refTextThis); if (comp < 0 && insertBefore == null) { insertBefore = statement1; } if (comp > 0) { insertAfter = statement1; } } if (insertBefore != null) return insertBefore.getNode(); if (insertAfter != null) return insertAfter.getNode().getTreeNext(); return null; } }
@Override public void setMirror(@NotNull TreeElement element) { setMirrorCheckingType(element, null); PsiTypeElement[] typeElements = getTypeParameterElements(); PsiTypeElement[] typeMirrors = ((PsiReferenceParameterList) SourceTreeToPsiMap.treeElementToPsi(element)) .getTypeParameterElements(); LOG.assertTrue(typeElements.length == typeMirrors.length); if (typeElements.length == typeMirrors.length) { for (int i = 0; i < typeElements.length; i++) { ((ClsElementImpl) typeElements[i]) .setMirror((TreeElement) SourceTreeToPsiMap.psiElementToTree(typeMirrors[i])); } } }
@NotNull static PsiModifierListOwner getAnnotationOwner(@NotNull PsiElement element) { PsiModifierListOwner annotationOwner = element.getOriginalElement() instanceof PsiModifierListOwner ? (PsiModifierListOwner) element.getOriginalElement() : (PsiModifierListOwner) element; if (!annotationOwner.isPhysical()) { // this is fake PsiFile which is mirror for ClsFile without sources ASTNode node = SourceTreeToPsiMap.psiElementToTree(element); if (node != null) { PsiCompiledElement compiledElement = node.getUserData(ClsElementImpl.COMPILED_ELEMENT); if (compiledElement instanceof PsiModifierListOwner) { return (PsiModifierListOwner) compiledElement; } } } return annotationOwner; }
public TreeElement process(TreeElement element, boolean addImports, boolean uncompleteCode) { IElementType elementType = element.getElementType(); if (elementType == JavaElementType.JAVA_CODE_REFERENCE || elementType == JavaElementType.REFERENCE_EXPRESSION) { final IElementType parentElementType = element.getTreeParent().getElementType(); if (elementType == JavaElementType.JAVA_CODE_REFERENCE || parentElementType == JavaElementType.REFERENCE_EXPRESSION || parentElementType == JavaElementType.METHOD_REF_EXPRESSION || uncompleteCode) { final PsiJavaCodeReferenceElement ref = (PsiJavaCodeReferenceElement) SourceTreeToPsiMap.treeElementToPsi(element); final PsiReferenceParameterList parameterList = ref.getParameterList(); if (parameterList != null) { final PsiTypeElement[] typeParameters = parameterList.getTypeParameterElements(); for (PsiTypeElement typeParameter : typeParameters) { process( (TreeElement) SourceTreeToPsiMap.psiElementToTree(typeParameter), addImports, uncompleteCode); } } boolean rightKind = true; if (elementType == JavaElementType.JAVA_CODE_REFERENCE) { int kind = ((PsiJavaCodeReferenceElementImpl) element).getKind(); rightKind = kind == PsiJavaCodeReferenceElementImpl.CLASS_NAME_KIND || kind == PsiJavaCodeReferenceElementImpl.CLASS_OR_PACKAGE_NAME_KIND; } if (rightKind) { boolean isInsideDocComment = TreeUtil.findParent(element, JavaDocElementType.DOC_COMMENT) != null; boolean isShort = !((SourceJavaCodeReference) element).isQualified(); if (!makeFQ(isInsideDocComment)) { if (isShort) return element; // short name already, no need to change } PsiElement refElement; if (!uncompleteCode) { refElement = ref.resolve(); } else { PsiResolveHelper helper = JavaPsiFacade.getInstance(element.getManager().getProject()).getResolveHelper(); refElement = helper.resolveReferencedClass( ((SourceJavaCodeReference) element).getClassNameText(), SourceTreeToPsiMap.treeElementToPsi(element)); } if (refElement instanceof PsiClass) { if (makeFQ(isInsideDocComment)) { String qName = ((PsiClass) refElement).getQualifiedName(); if (qName == null) return element; PsiImportHolder file = (PsiImportHolder) SourceTreeToPsiMap.treeElementToPsi(element).getContainingFile(); if (file instanceof PsiJavaFile && ImportHelper.isImplicitlyImported(qName, (PsiJavaFile) file)) { if (isShort) return element; return (TreeElement) makeShortReference( (CompositeElement) element, (PsiClass) refElement, addImports); } if (file instanceof PsiJavaFile) { String thisPackageName = ((PsiJavaFile) file).getPackageName(); if (ImportHelper.hasPackage(qName, thisPackageName)) { if (!isShort) { return (TreeElement) makeShortReference( (CompositeElement) element, (PsiClass) refElement, addImports); } } } return (TreeElement) replaceReferenceWithFQ(element, (PsiClass) refElement); } else { int oldLength = element.getTextLength(); TreeElement treeElement = (TreeElement) makeShortReference( (CompositeElement) element, (PsiClass) refElement, addImports); if (treeElement.getTextLength() == oldLength && ((PsiClass) refElement).getContainingClass() != null) { PsiElement qualifier = ref.getQualifier(); if (qualifier instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement) qualifier).resolve() instanceof PsiClass) { process((TreeElement) qualifier.getNode(), addImports, uncompleteCode); } } return treeElement; } } } } } for (TreeElement child = element.getFirstChildNode(); child != null; child = child.getTreeNext()) { child = process(child, addImports, uncompleteCode); } return element; }
public String getPackageName() { PsiJavaCodeReferenceElement ref = getPackageReference(); return ref == null ? null : SourceUtil.getTextSkipWhiteSpaceAndComments(SourceTreeToPsiMap.psiElementToTree(ref)); }