extension for node descriptor names
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / ui / impl / watch / LocalVariableDescriptorImpl.java
1 /*
2  * Copyright 2000-2014 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.debugger.ui.impl.watch;
17
18 import com.intellij.debugger.DebuggerBundle;
19 import com.intellij.debugger.DebuggerContext;
20 import com.intellij.debugger.engine.DebuggerUtils;
21 import com.intellij.debugger.engine.evaluation.EvaluateException;
22 import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
23 import com.intellij.debugger.impl.PositionUtil;
24 import com.intellij.debugger.jdi.LocalVariableProxyImpl;
25 import com.intellij.debugger.jdi.StackFrameProxyImpl;
26 import com.intellij.debugger.settings.NodeRendererSettings;
27 import com.intellij.debugger.ui.tree.LocalVariableDescriptor;
28 import com.intellij.debugger.ui.tree.NodeDescriptor;
29 import com.intellij.debugger.ui.tree.NodeDescriptorNameAdjuster;
30 import com.intellij.openapi.project.Project;
31 import com.intellij.psi.JavaPsiFacade;
32 import com.intellij.psi.PsiElementFactory;
33 import com.intellij.psi.PsiExpression;
34 import com.intellij.util.IncorrectOperationException;
35 import com.sun.jdi.Value;
36 import org.jetbrains.annotations.NotNull;
37
38 public class LocalVariableDescriptorImpl extends ValueDescriptorImpl implements LocalVariableDescriptor {
39   private final StackFrameProxyImpl myFrameProxy;
40   private final LocalVariableProxyImpl myLocalVariable;
41
42   private String myTypeName = DebuggerBundle.message("label.unknown.value");
43   private boolean myIsPrimitive;
44
45   private boolean myIsNewLocal = true;
46
47   public LocalVariableDescriptorImpl(Project project,
48                                      @NotNull LocalVariableProxyImpl local) {
49     super(project);
50     setLvalue(true);
51     myFrameProxy = local.getFrame();
52     myLocalVariable = local;
53   }
54
55   @Override
56   public LocalVariableProxyImpl getLocalVariable() {
57     return myLocalVariable;
58   }
59
60   public boolean isNewLocal() {
61     return myIsNewLocal;
62   }
63
64   @Override
65   public boolean isPrimitive() {
66     return myIsPrimitive;
67   }
68
69   @Override
70   public Value calcValue(EvaluationContextImpl evaluationContext) throws EvaluateException {
71     boolean isVisible = myFrameProxy.isLocalVariableVisible(getLocalVariable());
72     if (isVisible) {
73       final String typeName = getLocalVariable().typeName();
74       myTypeName = typeName;
75       myIsPrimitive = DebuggerUtils.isPrimitiveType(typeName);
76       return myFrameProxy.getValue(getLocalVariable());
77     }
78
79     return null;
80   }
81
82   public void setNewLocal(boolean aNew) {
83     myIsNewLocal = aNew;
84   }
85
86   @Override
87   public void displayAs(NodeDescriptor descriptor) {
88     super.displayAs(descriptor);
89     if(descriptor instanceof LocalVariableDescriptorImpl) {
90       myIsNewLocal = ((LocalVariableDescriptorImpl)descriptor).myIsNewLocal;
91     }
92   }
93
94   @Override
95   public String getName() {
96     String varName = myLocalVariable.name();
97     NodeDescriptorNameAdjuster nameAdjuster = NodeDescriptorNameAdjuster.findFor(this);
98     if (nameAdjuster != null) {
99       return nameAdjuster.fixName(varName, this);
100     }
101     return varName;
102   }
103
104   @Override
105   public String calcValueName() {
106     if (NodeRendererSettings.getInstance().getClassRenderer().SHOW_DECLARED_TYPE) {
107       return addDeclaredType(myTypeName);
108     }
109     return super.calcValueName();
110   }
111
112   @Override
113   public PsiExpression getDescriptorEvaluation(DebuggerContext context) throws EvaluateException {
114     PsiElementFactory elementFactory = JavaPsiFacade.getInstance(context.getProject()).getElementFactory();
115     try {
116       return elementFactory.createExpressionFromText(getName(), PositionUtil.getContextElement(context));
117     }
118     catch (IncorrectOperationException e) {
119       throw new EvaluateException(DebuggerBundle.message("error.invalid.local.variable.name", getName()), e);
120     }
121   }
122 }