Fixed exception when LayeredLexer and tokens with 0 length
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / ui / impl / watch / LocalVariableDescriptorImpl.java
1 /*
2  * Copyright 2000-2015 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.ui.tree.LocalVariableDescriptor;
27 import com.intellij.debugger.ui.tree.NodeDescriptor;
28 import com.intellij.openapi.project.Project;
29 import com.intellij.psi.JavaPsiFacade;
30 import com.intellij.psi.PsiElementFactory;
31 import com.intellij.psi.PsiExpression;
32 import com.intellij.util.IncorrectOperationException;
33 import com.sun.jdi.Value;
34 import org.jetbrains.annotations.NotNull;
35 import org.jetbrains.annotations.Nullable;
36
37 public class LocalVariableDescriptorImpl extends ValueDescriptorImpl implements LocalVariableDescriptor {
38   private final StackFrameProxyImpl myFrameProxy;
39   private final LocalVariableProxyImpl myLocalVariable;
40
41   private String myTypeName = DebuggerBundle.message("label.unknown.value");
42   private boolean myIsPrimitive;
43
44   private boolean myIsNewLocal = true;
45
46   public LocalVariableDescriptorImpl(Project project,
47                                      @NotNull LocalVariableProxyImpl local) {
48     super(project);
49     setLvalue(true);
50     myFrameProxy = local.getFrame();
51     myLocalVariable = local;
52   }
53
54   @Override
55   public LocalVariableProxyImpl getLocalVariable() {
56     return myLocalVariable;
57   }
58
59   public boolean isNewLocal() {
60     return myIsNewLocal;
61   }
62
63   @Override
64   public boolean isPrimitive() {
65     return myIsPrimitive;
66   }
67
68   @Override
69   public Value calcValue(EvaluationContextImpl evaluationContext) throws EvaluateException {
70     boolean isVisible = myFrameProxy.isLocalVariableVisible(getLocalVariable());
71     if (isVisible) {
72       final String typeName = getLocalVariable().typeName();
73       myTypeName = typeName;
74       myIsPrimitive = DebuggerUtils.isPrimitiveType(typeName);
75       return myFrameProxy.getValue(getLocalVariable());
76     }
77
78     return null;
79   }
80
81   public void setNewLocal(boolean aNew) {
82     myIsNewLocal = aNew;
83   }
84
85   @Override
86   public void displayAs(NodeDescriptor descriptor) {
87     super.displayAs(descriptor);
88     if(descriptor instanceof LocalVariableDescriptorImpl) {
89       myIsNewLocal = ((LocalVariableDescriptorImpl)descriptor).myIsNewLocal;
90     }
91   }
92
93   @Override
94   public String getName() {
95     return myLocalVariable.name();
96   }
97
98   @Nullable
99   @Override
100   public String getDeclaredType() {
101     return myLocalVariable.typeName();
102   }
103
104   @Override
105   public PsiExpression getDescriptorEvaluation(DebuggerContext context) throws EvaluateException {
106     PsiElementFactory elementFactory = JavaPsiFacade.getInstance(context.getProject()).getElementFactory();
107     try {
108       return elementFactory.createExpressionFromText(getName(), PositionUtil.getContextElement(context));
109     }
110     catch (IncorrectOperationException e) {
111       throw new EvaluateException(DebuggerBundle.message("error.invalid.local.variable.name", getName()), e);
112     }
113   }
114 }