e140c1f5f18f75824599ae5599144d4761df3e8e
[idea/community.git] / platform / script-debugger / debugger-ui / src / org / jetbrains / debugger / frame / CallFrameView.java
1 package org.jetbrains.debugger.frame;
2
3 import com.intellij.ui.ColoredTextContainer;
4 import com.intellij.ui.SimpleTextAttributes;
5 import com.intellij.xdebugger.evaluation.XDebuggerEvaluator;
6 import com.intellij.xdebugger.frame.XCompositeNode;
7 import org.jetbrains.annotations.NotNull;
8 import org.jetbrains.annotations.Nullable;
9 import org.jetbrains.concurrency.Promise;
10 import org.jetbrains.debugger.*;
11
12 import java.util.List;
13
14 public final class CallFrameView extends StackFrameImplBase implements VariableContext {
15   private final DebuggerViewSupport viewSupport;
16   private final CallFrame callFrame;
17
18   private final Script script;
19
20   private final boolean inLibraryContent;
21
22   public CallFrameView(@NotNull CallFrame callFrame, @NotNull DebuggerViewSupport viewSupport, @Nullable Script script) {
23     this(callFrame, viewSupport.getSourceInfo(script, callFrame), viewSupport, script);
24   }
25
26   public CallFrameView(@NotNull CallFrame callFrame,
27                        @Nullable SourceInfo sourceInfo,
28                        @NotNull DebuggerViewSupport viewSupport,
29                        @Nullable Script script) {
30     super(sourceInfo);
31
32     this.viewSupport = viewSupport;
33     this.callFrame = callFrame;
34     this.script = script;
35
36     // isInLibraryContent call could be costly, so we compute it only once (our customizePresentation called on each repaint)
37     inLibraryContent = sourceInfo != null && viewSupport.isInLibraryContent(sourceInfo, script);
38   }
39
40   @Nullable
41   public Script getScript() {
42     return script;
43   }
44
45   @Override
46   protected boolean isInFileScope() {
47     List<Scope> scopes = callFrame.getVariableScopes();
48     return scopes.size() == 1 && scopes.get(0).isGlobal();
49   }
50
51   @Override
52   protected XDebuggerEvaluator createEvaluator() {
53     return viewSupport.createFrameEvaluator(this);
54   }
55
56   @Override
57   public Object getEqualityObject() {
58     return callFrame.getEqualityObject();
59   }
60
61   @Override
62   protected boolean isInLibraryContent() {
63     return inLibraryContent;
64   }
65
66   @Override
67   protected void customizeInvalidFramePresentation(ColoredTextContainer component) {
68     assert sourceInfo == null;
69
70     String scriptName = script == null ? "unknown" : script.getUrl().trimParameters().toDecodedForm();
71     int line = callFrame.getLine();
72     component.append(line != -1 ? scriptName + ':' + line : scriptName, SimpleTextAttributes.ERROR_ATTRIBUTES);
73   }
74
75   @Override
76   public void computeChildren(@NotNull XCompositeNode node) {
77     node.setAlreadySorted(true);
78     ScopeVariablesGroup.createAndAddScopeList(node, callFrame.getVariableScopes(), this, callFrame);
79   }
80
81   @NotNull
82   public CallFrame getCallFrame() {
83     return callFrame;
84   }
85
86   @NotNull
87   @Override
88   public EvaluateContext getEvaluateContext() {
89     return callFrame.getEvaluateContext();
90   }
91
92   @Nullable
93   @Override
94   public String getName() {
95     return null;
96   }
97
98   @Nullable
99   @Override
100   public VariableContext getParent() {
101     return null;
102   }
103
104   @Override
105   public boolean watchableAsEvaluationExpression() {
106     return true;
107   }
108
109   @NotNull
110   @Override
111   public DebuggerViewSupport getViewSupport() {
112     return viewSupport;
113   }
114
115   @NotNull
116   @Override
117   public Promise<MemberFilter> getMemberFilter() {
118     return viewSupport.getMemberFilter(this);
119   }
120
121   @NotNull
122   public Promise<MemberFilter> getMemberFilter(@NotNull Scope scope) {
123     return ScopeVariablesGroup.createVariableContext(scope, this, callFrame).getMemberFilter();
124   }
125
126   @Nullable
127   @Override
128   public Scope getScope() {
129     return null;
130   }
131 }