1 package com
.intellij
.codeInsight
.template
.macro
;
3 import com
.intellij
.codeInsight
.completion
.proc
.VariablesProcessor
;
4 import com
.intellij
.codeInsight
.template
.ExpressionContext
;
5 import com
.intellij
.codeInsight
.template
.PsiElementResult
;
6 import com
.intellij
.codeInsight
.template
.PsiTypeResult
;
7 import com
.intellij
.codeInsight
.template
.Result
;
8 import com
.intellij
.openapi
.diagnostic
.Logger
;
9 import com
.intellij
.openapi
.project
.Project
;
10 import com
.intellij
.psi
.*;
11 import com
.intellij
.psi
.scope
.util
.PsiScopesUtil
;
12 import com
.intellij
.psi
.util
.PsiTreeUtil
;
13 import com
.intellij
.psi
.util
.PsiUtil
;
14 import com
.intellij
.util
.IncorrectOperationException
;
15 import org
.jetbrains
.annotations
.NotNull
;
16 import org
.jetbrains
.annotations
.Nullable
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
21 public class MacroUtil
{
22 private static final Logger LOG
= Logger
.getInstance("#com.intellij.codeInsight.template.macro.MacroUtil");
24 @Nullable public static PsiType
resultToPsiType(Result result
, ExpressionContext context
){
25 if (result
instanceof PsiTypeResult
) {
26 return ((PsiTypeResult
) result
).getType();
28 Project project
= context
.getProject();
29 String text
= result
.toString();
30 if (text
== null) return null;
31 PsiManager manager
= PsiManager
.getInstance(project
);
32 PsiDocumentManager
.getInstance(project
).commitAllDocuments();
33 PsiFile file
= PsiDocumentManager
.getInstance(project
).getPsiFile(context
.getEditor().getDocument());
34 //-1: Hack to deal with stupid resolve
35 PsiElement place
= file
!= null ? file
.findElementAt(context
.getStartOffset()) : null;
36 PsiDeclarationStatement decl
= file
!= null ? PsiTreeUtil
.getParentOfType(place
, PsiDeclarationStatement
.class) : null;
38 place
= file
.findElementAt(decl
.getTextOffset() -1);
40 PsiElementFactory factory
= manager
.getElementFactory();
42 return factory
.createTypeFromText(text
, place
);
44 catch(IncorrectOperationException e
){
49 @Nullable public static PsiExpression
resultToPsiExpression(Result result
, ExpressionContext context
){
50 if (result
instanceof PsiElementResult
){
51 PsiElement element
= ((PsiElementResult
)result
).getElement();
52 if (element
instanceof PsiExpression
){
53 return (PsiExpression
)element
;
56 Project project
= context
.getProject();
57 String text
= result
.toString();
58 if (text
== null) return null;
59 PsiManager manager
= PsiManager
.getInstance(project
);
60 PsiDocumentManager
.getInstance(project
).commitAllDocuments();
61 PsiFile file
= PsiDocumentManager
.getInstance(project
).getPsiFile(context
.getEditor().getDocument());
62 //-1: Hack to deal with resolve algorithm
63 PsiElement place
= file
!= null ? file
.findElementAt(context
.getStartOffset()) : null;
65 PsiElement parent
= place
.getParent();
67 PsiElement parentOfParent
= parent
.getParent();
68 if (parentOfParent
instanceof PsiDeclarationStatement
) {
69 place
= file
.findElementAt(parentOfParent
.getTextOffset() -1);
73 PsiElementFactory factory
= manager
.getElementFactory();
75 return factory
.createExpressionFromText(text
, place
);
77 catch(IncorrectOperationException e
){
82 @NotNull private static PsiExpression
[] getStandardExpressions(PsiElement place
) {
83 ArrayList
<PsiExpression
> array
= new ArrayList
<PsiExpression
>();
84 PsiElementFactory factory
= place
.getManager().getElementFactory();
86 array
.add(factory
.createExpressionFromText("true", null));
87 array
.add(factory
.createExpressionFromText("false", null));
89 PsiElement scope
= place
;
90 boolean firstClass
= true;
91 boolean static_flag
= false;
92 while (scope
!= null) {
93 if (scope
instanceof PsiModifierListOwner
&& ((PsiModifierListOwner
)scope
).getModifierList() != null){
94 if(((PsiModifierListOwner
)scope
).hasModifierProperty(PsiModifier
.STATIC
)){
98 if (scope
instanceof PsiClass
) {
99 PsiClass aClass
= (PsiClass
)scope
;
101 String name
= aClass
.getName();
102 PsiExpression expr
= null;
105 expr
= factory
.createExpressionFromText("this", place
);
109 expr
= factory
.createExpressionFromText(name
+ ".this", place
);
117 if (aClass
.hasModifierProperty(PsiModifier
.STATIC
)) break;
119 else if (scope
instanceof PsiMember
) {
120 if (((PsiMember
)scope
).hasModifierProperty(PsiModifier
.STATIC
)) break;
122 scope
= scope
.getParent();
125 catch (IncorrectOperationException e
) {
128 return array
.toArray(new PsiExpression
[array
.size()]);
131 @NotNull public static PsiExpression
[] getStandardExpressionsOfType(PsiElement place
, PsiType type
) {
132 List
<PsiExpression
> array
= new ArrayList
<PsiExpression
>();
133 PsiExpression
[] expressions
= getStandardExpressions(place
);
134 for (PsiExpression expr
: expressions
) {
135 PsiType type1
= expr
.getType();
136 if (type
== null || type1
!= null && type
.isAssignableFrom(type1
)) {
140 return array
.toArray(new PsiExpression
[array
.size()]);
143 @NotNull public static PsiVariable
[] getVariablesVisibleAt(final PsiElement place
, String prefix
) {
144 final List
<PsiVariable
> list
= new ArrayList
<PsiVariable
>();
145 VariablesProcessor varproc
= new VariablesProcessor(prefix
, true, list
){
146 public boolean execute(PsiElement pe
, PsiSubstitutor substitutor
) {
147 if (pe
instanceof PsiVariable
) {
148 //exclude variables that are initialized in 'place'
149 final PsiExpression initializer
= ((PsiVariable
)pe
).getInitializer();
150 if (initializer
!= null && PsiTreeUtil
.isAncestor(initializer
, place
, false)) return true;
152 if(!(pe
instanceof PsiField
) || PsiUtil
.isAccessible((PsiField
)pe
, place
, null)) {
153 return super.execute(pe
, substitutor
);
158 PsiScopesUtil
.treeWalkUp(varproc
, place
, null);
159 return varproc
.getResultsAsArray();