下面列出了com.intellij.psi.util.PsiTreeUtil#findElementOfClassAtRange ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
private static DotNetExpression findExpressionInRange(PsiFile file, int startOffset, int endOffset)
{
PsiElement element1 = file.findElementAt(startOffset);
PsiElement element2 = file.findElementAt(endOffset - 1);
if(element1 instanceof PsiWhiteSpace)
{
startOffset = element1.getTextRange().getEndOffset();
}
if(element2 instanceof PsiWhiteSpace)
{
endOffset = element2.getTextRange().getStartOffset();
}
DotNetExpression expression = PsiTreeUtil.findElementOfClassAtRange(file, startOffset, endOffset, DotNetExpression.class);
if(expression == null || expression.getTextRange().getEndOffset() != endOffset)
{
return null;
}
return expression;
}
@Nullable
public static DotNetExpression findExpressionInRange(PsiFile file, int startOffset, int endOffset)
{
PsiElement element1 = file.findElementAt(startOffset);
PsiElement element2 = file.findElementAt(endOffset - 1);
if(element1 instanceof PsiWhiteSpace)
{
startOffset = element1.getTextRange().getEndOffset();
}
if(element2 instanceof PsiWhiteSpace)
{
endOffset = element2.getTextRange().getStartOffset();
}
DotNetExpression expression = PsiTreeUtil.findElementOfClassAtRange(file, startOffset, endOffset, DotNetExpression.class);
if(expression == null || expression.getTextRange().getEndOffset() != endOffset)
{
return null;
}
if(expression instanceof CSharpReferenceExpression && expression.getParent() instanceof CSharpMethodCallExpressionImpl)
{
return null;
}
return expression;
}
@Nullable
protected PsiNamedElement getVariable() {
// todo we can use more specific class, shouldn't we?
//Class clazz = myElementToRename != null? myElementToRename.getClass() : PsiNameIdentifierOwner.class;
if (myElementToRename != null && myElementToRename.isValid()) {
if (Comparing.strEqual(myOldName, myElementToRename.getName())) return myElementToRename;
if (myRenameOffset != null) return PsiTreeUtil.findElementOfClassAtRange(
myElementToRename.getContainingFile(), myRenameOffset.getStartOffset(), myRenameOffset.getEndOffset(), PsiNameIdentifierOwner.class);
}
if (myRenameOffset != null) {
final PsiFile psiFile = PsiDocumentManager.getInstance(myProject).getPsiFile(myEditor.getDocument());
if (psiFile != null) {
return PsiTreeUtil.findElementOfClassAtRange(psiFile, myRenameOffset.getStartOffset(), myRenameOffset.getEndOffset(), PsiNameIdentifierOwner.class);
}
}
return myElementToRename;
}
public static <T extends PsiElement> T getOriginalElement(@Nonnull T psi, PsiFile containingFile) {
if (containingFile != null && containingFile != containingFile.getOriginalFile() && psi.getTextRange() != null) {
TextRange range = psi.getTextRange();
Integer start = range.getStartOffset();
Integer end = range.getEndOffset();
final Document document = containingFile.getViewProvider().getDocument();
if (document != null) {
Document hostDocument = document instanceof DocumentWindow ? ((DocumentWindow)document).getDelegate() : document;
OffsetTranslator translator = hostDocument.getUserData(OffsetTranslator.RANGE_TRANSLATION);
if (translator != null) {
if (document instanceof DocumentWindow) {
TextRange translated = ((DocumentWindow)document).injectedToHost(new TextRange(start, end));
start = translated.getStartOffset();
end = translated.getEndOffset();
}
start = translator.translateOffset(start);
end = translator.translateOffset(end);
if (start == null || end == null) {
return null;
}
if (document instanceof DocumentWindow) {
start = ((DocumentWindow)document).hostToInjected(start);
end = ((DocumentWindow)document).hostToInjected(end);
}
}
}
//noinspection unchecked
return (T)PsiTreeUtil.findElementOfClassAtRange(containingFile.getOriginalFile(), start, end, psi.getClass());
}
return psi;
}
@Nullable
protected T getElementFromSelection(@Nonnull PsiFile file, @Nonnull SelectionModel selectionModel) {
final int selectionStart = selectionModel.getSelectionStart();
final int selectionEnd = selectionModel.getSelectionEnd();
return PsiTreeUtil.findElementOfClassAtRange(file, selectionStart, selectionEnd, myClass);
}