231f3a3e7aeae7261fb8687a81ce75b66adc9b20
[idea/community.git] / plugins / groovy / src / org / jetbrains / plugins / groovy / lang / psi / impl / synthetic / GrImplicitVariableImpl.java
1 /*
2  * Copyright (c) 2008, Your Corporation. All Rights Reserved.
3  */
4
5 package org.jetbrains.plugins.groovy.lang.psi.impl.synthetic;
6
7 import com.intellij.psi.*;
8 import com.intellij.psi.impl.light.LightIdentifier;
9 import com.intellij.psi.impl.light.LightVariableBase;
10 import com.intellij.psi.search.ProjectScope;
11 import com.intellij.util.IncorrectOperationException;
12 import org.jetbrains.annotations.NonNls;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15
16 /**
17  * @author ilyas
18  */
19 public class GrImplicitVariableImpl extends LightVariableBase implements GrImplicitVariable {
20   private PsiModifierList myInnerModifierList;
21
22   public GrImplicitVariableImpl(PsiModifierList modifierList, PsiManager manager, PsiIdentifier nameIdentifier, @NotNull PsiType type, boolean writable, PsiElement scope) {
23     super(manager, nameIdentifier, type, writable, scope);
24         myInnerModifierList = modifierList != null ? modifierList : myModifierList;
25     }
26
27   public GrImplicitVariableImpl(PsiModifierList modifierList, PsiManager manager, @NonNls String name, @NonNls String type, PsiElement referenceExpression) {
28     this(modifierList, manager, null,
29         JavaPsiFacade.getInstance(manager.getProject()).getElementFactory().
30             createTypeByFQClassName(type, ProjectScope.getAllScope(manager.getProject())), false, referenceExpression);
31     myNameIdentifier = new GrLightIdentifier(myManager, name);
32   }
33
34     public void accept(@NotNull PsiElementVisitor visitor) {
35     if (visitor instanceof JavaElementVisitor) {
36       ((JavaElementVisitor) visitor).visitImplicitVariable(this);
37     }
38   }
39
40   public String toString() {
41     return "Specific implicit variable";
42   }
43
44   public void setInitializer(@Nullable PsiExpression initializer) throws IncorrectOperationException {
45     throw new IncorrectOperationException();
46   }
47
48   @Override
49   public PsiModifierList getModifierList() {
50     return myInnerModifierList;
51   }
52
53   @Override
54   public boolean hasModifierProperty(@NotNull String modifier) {
55     return myInnerModifierList.hasModifierProperty(modifier);
56   }
57
58   protected static class GrLightIdentifier extends LightIdentifier {
59     private String myTextInternal;
60
61     public GrLightIdentifier(PsiManager manager, String name) {
62       super(manager, name);
63       myTextInternal = name;
64     }
65
66     public PsiElement replace(@NotNull PsiElement newElement) throws IncorrectOperationException {
67       myTextInternal = newElement.getText();
68       return newElement;
69     }
70
71     public String getText() {
72       return myTextInternal;
73     }
74
75     public PsiElement copy() {
76       return new LightIdentifier(getManager(), myTextInternal);
77     }
78   }
79
80 }