Skip to content

Commit 6ee06da

Browse files
authored
Merge pull request #466 from OleksiiKovalov/AddRuleName2Profiler
Add rule name to Simple/Expert Profiler Grid, optional build of tree/hierarchy
2 parents 045d615 + dade28a commit 6ee06da

File tree

5 files changed

+77
-27
lines changed

5 files changed

+77
-27
lines changed

contributors.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,5 @@ YYYY/MM/DD, github id, Full name, email
6363
2019/07/10, wojciszek, Wojciech Kruczkowski, [email protected]
6464
2019/11/24, nopeslide, Uffke Drechsler, [email protected]
6565
2020/12/05, roggenbrot, Sascha Dais, [email protected]
66+
2021/11/04, OleksiiKovalov, Oleksii Kovalov, [email protected]
67+

src/main/java/org/antlr/intellij/plugin/preview/PreviewPanel.java

Lines changed: 43 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@ public class PreviewPanel extends JPanel implements ParsingResultSelectionListen
7575

7676
private boolean scrollFromSource = false;
7777
private boolean highlightSource = false;
78+
private boolean buildTree = true;
79+
private boolean buildHierarchy = true;
7880

7981
private ActionToolbar buttonBar;
8082
private final CancelParserAction cancelParserAction = new CancelParserAction();
@@ -145,12 +147,34 @@ public void setSelected(@NotNull AnActionEvent e, boolean state) {
145147
highlightSource = state;
146148
}
147149
};
150+
ToggleAction autoBuildTree = new ToggleAction("Build parse tree after parse",null,AllIcons.Toolwindows.ToolWindowHierarchy) {
151+
@Override
152+
public boolean isSelected(@NotNull AnActionEvent e) {
153+
return buildTree;
154+
}
155+
156+
@Override
157+
public void setSelected(@NotNull AnActionEvent e, boolean state) { buildTree = state; }
158+
};
159+
ToggleAction autoBuildHier = new ToggleAction("Build hierarchy after parse",null,AllIcons.Actions.ShowAsTree) {
160+
@Override
161+
public boolean isSelected(@NotNull AnActionEvent e) {
162+
return buildHierarchy;
163+
}
164+
165+
@Override
166+
public void setSelected(@NotNull AnActionEvent e, boolean state) {
167+
buildHierarchy = state;
168+
}
169+
};
148170

149171
DefaultActionGroup actionGroup = new DefaultActionGroup(
150172
refreshAction,
151173
cancelParserAction,
152174
scrollFromSourceBtn,
153-
scrollToSourceBtn
175+
scrollToSourceBtn,
176+
autoBuildTree,
177+
autoBuildHier
154178
);
155179

156180
return ActionManager.getInstance().createActionToolbar(PREVIEW_WINDOW_ID, actionGroup, false);
@@ -342,22 +366,32 @@ private void clearTabs(@Nullable ParseTree tree) {
342366
}
343367

344368
private void updateTreeViewer(final PreviewState preview, final ParsingResult result) {
369+
345370
ApplicationManager.getApplication().invokeLater(() -> {
346371
if (result.parser instanceof PreviewParser) {
347372
AltLabelTextProvider provider = new AltLabelTextProvider(result.parser, preview.g);
348-
treeViewer.setTreeTextProvider(provider);
349-
treeViewer.setTree(result.tree);
350-
hierarchyViewer.setTreeTextProvider(provider);
351-
hierarchyViewer.setTree(result.tree);
373+
if(buildTree) {
374+
treeViewer.setTreeTextProvider(provider);
375+
treeViewer.setTree(result.tree);
376+
}
377+
if(buildHierarchy) {
378+
hierarchyViewer.setTreeTextProvider(provider);
379+
hierarchyViewer.setTree(result.tree);
380+
}
352381
tokenStreamViewer.setParsingResult(result.parser);
353382
}
354383
else {
355-
treeViewer.setRuleNames(Arrays.asList(preview.g.getRuleNames()));
356-
treeViewer.setTree(result.tree);
357-
hierarchyViewer.setRuleNames(Arrays.asList(preview.g.getRuleNames()));
358-
hierarchyViewer.setTree(result.tree);
384+
if(buildTree) {
385+
treeViewer.setRuleNames(Arrays.asList(preview.g.getRuleNames()));
386+
treeViewer.setTree(result.tree);
387+
}
388+
if(buildHierarchy) {
389+
hierarchyViewer.setRuleNames(Arrays.asList(preview.g.getRuleNames()));
390+
hierarchyViewer.setTree(result.tree);
391+
}
359392
}
360393
});
394+
361395
}
362396

363397

src/main/java/org/antlr/intellij/plugin/profiler/ExpertProfilerTableDataModel.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.antlr.intellij.plugin.profiler;
22

3+
import org.antlr.v4.runtime.Parser;
34
import org.antlr.v4.runtime.atn.DecisionInfo;
45
import org.antlr.v4.runtime.atn.ParseInfo;
56

@@ -38,9 +39,15 @@ public class ExpertProfilerTableDataModel extends ProfilerTableDataModel {
3839

3940
// microsecond decimal precision
4041
private final NumberFormat milliUpToMicroFormatter = new DecimalFormat("#.###");
42+
private final String[] ruleNamesByDecision ;
4143

42-
public ExpertProfilerTableDataModel(ParseInfo parseInfo) {
44+
public ExpertProfilerTableDataModel(ParseInfo parseInfo, Parser parser) {
4345
this.parseInfo = parseInfo;
46+
/*copying rule names to not hold ref to parser object*/
47+
ruleNamesByDecision = new String[parser.getATN().decisionToState.size()];
48+
for(int i = 0; i < ruleNamesByDecision .length; i++) {
49+
ruleNamesByDecision [i] = parser.getRuleNames()[parser.getATN().getDecisionState(i).ruleIndex];
50+
}
4451
for (int i = 0; i < columnNames.length; i++) {
4552
nameToColumnMap.put(columnNames[i], i);
4653
}
@@ -66,7 +73,7 @@ public Object getValueAt(int row, int col) {
6673
DecisionInfo decisionInfo = parseInfo.getDecisionInfo()[decision];
6774
switch (col) { // laborious but more efficient than reflection
6875
case 0:
69-
return decisionInfo.decision;
76+
return String.format("%s (%d)",ruleNamesByDecision [decision],decision);
7077
case 1:
7178
return decisionInfo.invocations;
7279
case 2:

src/main/java/org/antlr/intellij/plugin/profiler/ProfilerPanel.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public void setProfilerData(PreviewState previewState, long parseTime_ns) {
9494
this.previewState = previewState;
9595
Parser parser = previewState.parsingResult.parser;
9696
ParseInfo parseInfo = parser.getParseInfo();
97-
updateTableModelPerExpertCheckBox(parseInfo);
97+
updateTableModelPerExpertCheckBox(parseInfo,parser);
9898
double parseTimeMS = parseTime_ns/(1000.0*1000.0);
9999
// microsecond decimal precision
100100
NumberFormat formatter = new DecimalFormat("#.###");
@@ -133,13 +133,13 @@ public void setProfilerData(PreviewState previewState, long parseTime_ns) {
133133
);
134134
}
135135

136-
public void updateTableModelPerExpertCheckBox(ParseInfo parseInfo) {
136+
public void updateTableModelPerExpertCheckBox(ParseInfo parseInfo,Parser parser) {
137137
AbstractTableModel model;
138138
if ( expertCheckBox.isSelected() ) {
139-
model = new ExpertProfilerTableDataModel(parseInfo);
139+
model = new ExpertProfilerTableDataModel(parseInfo,parser);
140140
}
141141
else {
142-
model = new SimpleProfilerTableDataModel(parseInfo);
142+
model = new SimpleProfilerTableDataModel(parseInfo,parser);
143143
}
144144
profilerDataTable.setModel(model);
145145
profilerDataTable.setRowSorter(new TableRowSorter<>(model));
@@ -326,7 +326,7 @@ private void createUIComponents() {
326326
return;
327327
}
328328
ParseInfo parseInfo = previewState.parsingResult.parser.getParseInfo();
329-
updateTableModelPerExpertCheckBox(parseInfo);
329+
updateTableModelPerExpertCheckBox(parseInfo,previewState.parsingResult.parser);
330330
});
331331
profilerDataTable = new JBTable() {
332332
@Override

src/main/java/org/antlr/intellij/plugin/profiler/SimpleProfilerTableDataModel.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.antlr.intellij.plugin.profiler;
22

3+
import org.antlr.v4.runtime.Parser;
34
import org.antlr.v4.runtime.atn.DecisionInfo;
45
import org.antlr.v4.runtime.atn.ParseInfo;
56

@@ -11,10 +12,11 @@ public class SimpleProfilerTableDataModel extends ProfilerTableDataModel {
1112
public ParseInfo parseInfo;
1213
public LinkedHashMap<String, Integer> nameToColumnMap = new LinkedHashMap<>();
1314
public static final String[] columnNames = {
14-
"Invocations", "Time", "Total k", "Max k", "Ambiguities", "DFA cache miss"
15+
"Rule","Invocations", "Time", "Total k", "Max k", "Ambiguities", "DFA cache miss"
1516
};
1617

1718
public static final String[] columnToolTips = {
19+
"name of rule and decision no",
1820
"# decision invocations",
1921
"Rough estimate of time (ms) spent in prediction",
2022
"Total lookahead symbols examined",
@@ -23,11 +25,14 @@ public class SimpleProfilerTableDataModel extends ProfilerTableDataModel {
2325
"# of non-DFA transitions during prediction (cache miss)"
2426
};
2527

26-
// microsecond decimal precision
27-
private final NumberFormat milliUpToMicroFormatter = new DecimalFormat("#.###");
28-
29-
public SimpleProfilerTableDataModel(ParseInfo parseInfo) {
28+
private final String[] ruleNamesByDecision ;
29+
public SimpleProfilerTableDataModel(ParseInfo parseInfo,Parser parser) {
3030
this.parseInfo = parseInfo;
31+
/*copying rule names to not hold ref to parser object*/
32+
ruleNamesByDecision = new String[parser.getATN().decisionToState.size()];
33+
for(int i = 0; i < ruleNamesByDecision .length; i++) {
34+
ruleNamesByDecision [i] = parser.getRuleNames()[parser.getATN().getDecisionState(i).ruleIndex];
35+
}
3136
for (int i = 0; i < columnNames.length; i++) {
3237
nameToColumnMap.put(columnNames[i], i);
3338
}
@@ -53,17 +58,19 @@ public Object getValueAt(int row, int col) {
5358
int decision = row;
5459
DecisionInfo decisionInfo = parseInfo.getDecisionInfo()[decision];
5560
switch (col) { // laborious but more efficient than reflection
56-
case 0:
61+
case 0:
62+
return String.format("%s (%d)",ruleNamesByDecision [decision],decision);
63+
case 1:
5764
return decisionInfo.invocations;
58-
case 1:
59-
return milliUpToMicroFormatter.format(decisionInfo.timeInPrediction / (1000.0 * 1000.0));
6065
case 2:
61-
return decisionInfo.LL_TotalLook+decisionInfo.SLL_TotalLook;
66+
return decisionInfo.timeInPrediction/(1000.0 * 1000.0);
6267
case 3:
63-
return Math.max(decisionInfo.LL_MaxLook, decisionInfo.SLL_MaxLook);
68+
return decisionInfo.LL_TotalLook+decisionInfo.SLL_TotalLook;
6469
case 4:
65-
return decisionInfo.ambiguities.size();
70+
return Math.max(decisionInfo.LL_MaxLook, decisionInfo.SLL_MaxLook);
6671
case 5:
72+
return decisionInfo.ambiguities.size();
73+
case 6:
6774
return decisionInfo.SLL_ATNTransitions+
6875
decisionInfo.LL_ATNTransitions;
6976
}

0 commit comments

Comments
 (0)