| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent acb2671 commit 4254acb
4 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -305,8 +305,15 @@ protected void paintErrorLine(Graphics gfx, int line, int x) { | |||
| 305 | 305 | int rightTrimmedLength = trimRight(badCode).length(); | |
| 306 | 306 | int leftTrimLength = rightTrimmedLength - trimmedLength; | |
| 307 | 307 | ||
| 308 | + // Fix offsets when bad code is just whitespace | ||
| 309 | + if (trimmedLength == 0) { | ||
| 310 | + leftTrimLength = 0; | ||
| 311 | + rightTrimmedLength = badCode.length(); | ||
| 312 | + } | ||
| 313 | + | ||
| 308 | 314 | int x1 = textArea.offsetToX(line, goodCode.length() + leftTrimLength); | |
| 309 | 315 | int x2 = textArea.offsetToX(line, goodCode.length() + rightTrimmedLength); | |
| 316 | + if (x1 == x2) x2 += fm.stringWidth(" "); | ||
| 310 | 317 | int y1 = y + fm.getHeight() - 2; | |
| 311 | 318 | ||
| 312 | 319 | if (line != problem.getLineNumber()) { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -188,6 +188,7 @@ private void handleCtrlClick(PreprocessedSketch ps, int tabIndex, int offset) { | |||
| 188 | 188 | } else { | |
| 189 | 189 | Messages.log("found declaration, offset " + decl.getStartPosition() + ", name: " + declName); | |
| 190 | 190 | SketchInterval si = ps.mapJavaToSketch(declName); | |
| 191 | + if (!ps.inRange(si)) return; | ||
| 191 | 192 | EventQueue.invokeLater(() -> { | |
| 192 | 193 | editor.highlight(si.tabIndex, si.startTabOffset, si.stopTabOffset); | |
| 193 | 194 | }); | |
@@ -315,59 +316,59 @@ void findUsageAndUpdateTree(PreprocessedSketch ps, IBinding binding) { | |||
| 315 | 316 | break; | |
| 316 | 317 | } | |
| 317 | 318 | ||
| 318 | - String elementName = binding.getName(); | ||
| 319 | + // Find usages, map to tree nodes, add to root node | ||
| 320 | + String bindingKey = binding.getKey(); | ||
| 321 | + List<SketchInterval> intervals = | ||
| 322 | + findAllOccurrences(ps.compilationUnit, bindingKey).stream() | ||
| 323 | + .map(ps::mapJavaToSketch) | ||
| 324 | + // remove occurrences which fall into generated header | ||
| 325 | + .filter(ps::inRange) | ||
| 326 | + .collect(Collectors.toList()); | ||
| 327 | + | ||
| 328 | + int usageCount = intervals.size(); | ||
| 329 | + | ||
| 330 | + // Get element name from PDE code if possible, otherwise use one from Java | ||
| 331 | + String elementName = intervals.stream() | ||
| 332 | + .findAny() | ||
| 333 | + .map(si -> ps.pdeCode.substring(si.startPdeOffset, si.stopPdeOffset)) | ||
| 334 | + .orElseGet(binding::getName); | ||
| 319 | 335 | ||
| 320 | 336 | // Create root node | |
| 321 | 337 | DefaultMutableTreeNode rootNode = | |
| 322 | 338 | new DefaultMutableTreeNode(bindingType + ": " + elementName); | |
| 323 | 339 | ||
| 324 | - int usageCount; | ||
| 325 | - | ||
| 326 | - { // Find usages, map to tree nodes, add to root node | ||
| 327 | - String bindingKey = binding.getKey(); | ||
| 328 | - List<SketchInterval> intervals = | ||
| 329 | - findAllOccurrences(ps.compilationUnit, bindingKey).stream() | ||
| 330 | - .map(ps::mapJavaToSketch) | ||
| 331 | - // TODO: this has to be fixed with better token mapping | ||
| 332 | - // remove occurrences which fall into generated header | ||
| 333 | - .filter(in -> in.tabIndex != 0 || | ||
| 334 | - (in.startTabOffset >= 0 && in.stopTabOffset > 0)) | ||
| 335 | - .collect(Collectors.toList()); | ||
| 336 | - | ||
| 337 | - usageCount = intervals.size(); | ||
| 338 | - | ||
| 339 | - Map<Integer, List<ShowUsageTreeNode>> tabGroupedTreeNodes = intervals.stream() | ||
| 340 | - // Convert to TreeNodes | ||
| 341 | - .map(in -> ShowUsageTreeNode.fromSketchInterval(ps, in)) | ||
| 342 | - // Group by tab | ||
| 343 | - .collect(Collectors.groupingBy(node -> node.tabIndex)); | ||
| 344 | - | ||
| 345 | - tabGroupedTreeNodes.entrySet().stream() | ||
| 346 | - // Sort by tab index | ||
| 347 | - .sorted(Comparator.comparing(Map.Entry::getKey)) | ||
| 348 | - .map(entry -> { | ||
| 349 | - Integer tabIndex = entry.getKey(); | ||
| 350 | - List<ShowUsageTreeNode> nodes = entry.getValue(); | ||
| 351 | - | ||
| 352 | - int count = nodes.size(); | ||
| 353 | - String usageLabel = count == 1 ? "usage" : "usages"; | ||
| 354 | - | ||
| 355 | - // Create new DefaultMutableTreeNode for this tab | ||
| 356 | - String tabLabel = "<html><font color=#222222>" + | ||
| 357 | - ps.sketch.getCode(tabIndex).getPrettyName() + | ||
| 358 | - "</font> <font color=#999999>" + count + " " + usageLabel + "</font></html>"; | ||
| 359 | - DefaultMutableTreeNode tabNode = new DefaultMutableTreeNode(tabLabel); | ||
| 360 | - | ||
| 361 | - nodes.stream() | ||
| 362 | - // Convert TreeNodes to DefaultMutableTreeNodes | ||
| 363 | - .map(DefaultMutableTreeNode::new) | ||
| 364 | - // Add all as children of tab node | ||
| 365 | - .forEach(tabNode::add); | ||
| 366 | - return tabNode; | ||
| 367 | - }) | ||
| 368 | - // Add all tab nodes as children of root node | ||
| 369 | - .forEach(rootNode::add); | ||
| 370 | - } | ||
| 340 | + intervals.stream() | ||
| 341 | + // Convert to TreeNodes | ||
| 342 | + .map(in -> ShowUsageTreeNode.fromSketchInterval(ps, in)) | ||
| 343 | + // Group by tab index | ||
| 344 | + .collect(Collectors.groupingBy(node -> node.tabIndex)) | ||
| 345 | + // Stream Map Entries of (tab index) <-> (List<ShowUsageTreeNode>) | ||
| 346 | + .entrySet().stream() | ||
| 347 | + // Sort by tab index | ||
| 348 | + .sorted(Comparator.comparing(Map.Entry::getKey)) | ||
| 349 | + .map(entry -> { | ||
| 350 | + Integer tabIndex = entry.getKey(); | ||
| 351 | + List<ShowUsageTreeNode> nodes = entry.getValue(); | ||
| 352 | + | ||
| 353 | + int count = nodes.size(); | ||
| 354 | + String usageLabel = count == 1 ? "usage" : "usages"; | ||
| 355 | + | ||
| 356 | + // Create new DefaultMutableTreeNode for this tab | ||
| 357 | + String tabLabel = "<html><font color=#222222>" + | ||
| 358 | + ps.sketch.getCode(tabIndex).getPrettyName() + | ||
| 359 | + "</font> <font color=#999999>" + count + " " + usageLabel + "</font></html>"; | ||
| 360 | + DefaultMutableTreeNode tabNode = new DefaultMutableTreeNode(tabLabel); | ||
| 361 | + | ||
| 362 | + // Stream nodes belonging to this tab | ||
| 363 | + nodes.stream() | ||
| 364 | + // Convert TreeNodes to DefaultMutableTreeNodes | ||
| 365 | + .map(DefaultMutableTreeNode::new) | ||
| 366 | + // Add all as children of tab node | ||
| 367 | + .forEach(tabNode::add); | ||
| 368 | + return tabNode; | ||
| 369 | + }) | ||
| 370 | + // Add all tab nodes as children of root node | ||
| 371 | + .forEach(rootNode::add); | ||
| 371 | 372 | ||
| 372 | 373 | TreeModel treeModel = new DefaultTreeModel(rootNode); | |
| 373 | 374 | ||
@@ -654,6 +655,7 @@ void rename(PreprocessedSketch ps, IBinding binding, String newName) { | |||
| 654 | 655 | ||
| 655 | 656 | Map<Integer, List<SketchInterval>> mappedNodes = occurrences.stream() | |
| 656 | 657 | .map(ps::mapJavaToSketch) | |
| 658 | + .filter(ps::inRange) | ||
| 657 | 659 | .collect(Collectors.groupingBy(interval -> interval.tabIndex)); | |
| 658 | 660 | ||
| 659 | 661 | Sketch sketch = ps.sketch; | |
@@ -774,6 +776,7 @@ public void componentHidden(ComponentEvent e) { | |||
| 774 | 776 | ASTNode node = (ASTNode) tnode.getUserObject(); | |
| 775 | 777 | pps.whenDone(ps -> { | |
| 776 | 778 | SketchInterval si = ps.mapJavaToSketch(node); | |
| 779 | + if (!ps.inRange(si)) return; | ||
| 777 | 780 | EventQueue.invokeLater(() -> { | |
| 778 | 781 | editor.highlight(si.tabIndex, si.startTabOffset, si.stopTabOffset); | |
| 779 | 782 | }); | |
@@ -886,11 +889,13 @@ private void handleSketchProblems(PreprocessedSketch ps) { | |||
| 886 | 889 | int start = iproblem.getSourceStart(); | |
| 887 | 890 | int stop = iproblem.getSourceEnd() + 1; // make it exclusive | |
| 888 | 891 | SketchInterval in = ps.mapJavaToSketch(start, stop); | |
| 892 | + if (in == SketchInterval.BEFORE_START) return null; | ||
| 889 | 893 | int line = ps.tabOffsetToTabLine(in.tabIndex, in.startTabOffset); | |
| 890 | 894 | Problem p = new Problem(iproblem, in.tabIndex, line); | |
| 891 | 895 | p.setPDEOffsets(in.startTabOffset, in.stopTabOffset); | |
| 892 | 896 | return p; | |
| 893 | 897 | }) | |
| 898 | + .filter(p -> p != null) | ||
| 894 | 899 | .collect(Collectors.toList()); | |
| 895 | 900 | ||
| 896 | 901 | // Handle import suggestions | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -50,6 +50,9 @@ public class PreprocessedSketch { | |||
| 50 | 50 | ||
| 51 | 51 | ||
| 52 | 52 | public static class SketchInterval { | |
| 53 | + | ||
| 54 | + public static final SketchInterval BEFORE_START = new SketchInterval(-1, -1, -1, -1, -1); | ||
| 55 | + | ||
| 53 | 56 | private SketchInterval(int tabIndex, | |
| 54 | 57 | int startTabOffset, int stopTabOffset, | |
| 55 | 58 | int startPdeOffset, int stopPdeOffset) { | |
@@ -69,20 +72,42 @@ private SketchInterval(int tabIndex, | |||
| 69 | 72 | } | |
| 70 | 73 | ||
| 71 | 74 | ||
| 75 | + public boolean inRange(SketchInterval interval) { | ||
| 76 | + return interval != SketchInterval.BEFORE_START && | ||
| 77 | + interval.stopPdeOffset < pdeCode.length(); | ||
| 78 | + } | ||
| 79 | + | ||
| 80 | + | ||
| 72 | 81 | public SketchInterval mapJavaToSketch(ASTNode node) { | |
| 73 | 82 | return mapJavaToSketch(node.getStartPosition(), | |
| 74 | 83 | node.getStartPosition() + node.getLength()); | |
| 75 | 84 | } | |
| 76 | 85 | ||
| 77 | 86 | ||
| 78 | 87 | public SketchInterval mapJavaToSketch(int startJavaOffset, int stopJavaOffset) { | |
| 79 | - boolean zeroLength = stopJavaOffset == startJavaOffset; | ||
| 88 | + int length = stopJavaOffset - startJavaOffset; | ||
| 80 | 89 | int startPdeOffset = javaOffsetToPdeOffset(startJavaOffset); | |
| 81 | - int stopPdeOffset = zeroLength ? | ||
| 82 | - javaOffsetToPdeOffset(stopJavaOffset) : | ||
| 83 | - javaOffsetToPdeOffset(stopJavaOffset-1)+1; | ||
| 90 | + int stopPdeOffset; | ||
| 91 | + if (length == 0) { | ||
| 92 | + stopPdeOffset = startPdeOffset; | ||
| 93 | + } else { | ||
| 94 | + stopPdeOffset = javaOffsetToPdeOffset(stopJavaOffset-1); | ||
| 95 | + if (stopPdeOffset >= 0 && (stopPdeOffset > startPdeOffset || length == 1)) { | ||
| 96 | + stopPdeOffset += 1; | ||
| 97 | + } | ||
| 98 | + } | ||
| 99 | + | ||
| 100 | + if (startPdeOffset < 0 || stopPdeOffset < 0) { | ||
| 101 | + return SketchInterval.BEFORE_START; | ||
| 102 | + } | ||
| 103 | + | ||
| 84 | 104 | int tabIndex = pdeOffsetToTabIndex(startPdeOffset); | |
| 85 | 105 | ||
| 106 | + if (startPdeOffset >= pdeCode.length()) { | ||
| 107 | + startPdeOffset = pdeCode.length() - 1; | ||
| 108 | + stopPdeOffset = startPdeOffset + 1; | ||
| 109 | + } | ||
| 110 | + | ||
| 86 | 111 | return new SketchInterval(tabIndex, | |
| 87 | 112 | pdeOffsetToTabOffset(tabIndex, startPdeOffset), | |
| 88 | 113 | pdeOffsetToTabOffset(tabIndex, stopPdeOffset), | |
@@ -96,6 +121,7 @@ private int javaOffsetToPdeOffset(int javaOffset) { | |||
| 96 | 121 | ||
| 97 | 122 | ||
| 98 | 123 | private int pdeOffsetToTabIndex(int pdeOffset) { | |
| 124 | + pdeOffset = Math.max(0, pdeOffset); | ||
| 99 | 125 | int tab = Arrays.binarySearch(tabStartOffsets, pdeOffset); | |
| 100 | 126 | if (tab < 0) { | |
| 101 | 127 | tab = -(tab + 1) - 1; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -132,15 +132,15 @@ private void buildIfNeeded(int inLength) { | |||
| 132 | 132 | // Process encountered input edits | |
| 133 | 133 | while (inEdit != null && inOffset >= inEditOff) { | |
| 134 | 134 | inOffset += inEdit.fromLength; | |
| 135 | - inMap.add(inEdit); | ||
| 135 | + if (inEdit.fromLength > 0) inMap.add(inEdit); | ||
| 136 | 136 | inEdit = inIt.hasNext() ? inIt.next() : null; | |
| 137 | 137 | inEditOff = inEdit != null ? inEdit.fromOffset : inLength; | |
| 138 | 138 | } | |
| 139 | 139 | ||
| 140 | 140 | // Process encountered output edits | |
| 141 | 141 | while (outEdit != null && inOffset >= outEditOff) { | |
| 142 | 142 | outEdit.toOffset = outOffset; | |
| 143 | - outMap.add(outEdit); | ||
| 143 | + if (outEdit.toLength > 0) outMap.add(outEdit); | ||
| 144 | 144 | outOffset += outEdit.toLength; | |
| 145 | 145 | outEdit = outIt.hasNext() ? outIt.next() : null; | |
| 146 | 146 | outEditOff = outEdit != null ? outEdit.toOffset : inLength; | |
@@ -225,13 +225,31 @@ private static class SimpleOffsetMapper implements OffsetMapper { | |||
| 225 | 225 | private List<Edit> inMap = new ArrayList<>(); | |
| 226 | 226 | private List<Edit> outMap = new ArrayList<>(); | |
| 227 | 227 | ||
| 228 | + private int outputOffsetOfInputStart; | ||
| 229 | + private int inputOffsetOfOutputStart; | ||
| 230 | + | ||
| 228 | 231 | private SimpleOffsetMapper(List<Edit> inMap, List<Edit> outMap) { | |
| 229 | 232 | this.inMap.addAll(inMap); | |
| 230 | 233 | this.outMap.addAll(outMap); | |
| 234 | + | ||
| 235 | + Edit inStart = null; | ||
| 236 | + for (Edit in : this.inMap) { | ||
| 237 | + inStart = in; | ||
| 238 | + if (in.fromLength > 0) break; | ||
| 239 | + } | ||
| 240 | + outputOffsetOfInputStart = inStart == null ? 0 : inStart.toOffset; | ||
| 241 | + | ||
| 242 | + Edit outStart = null; | ||
| 243 | + for (Edit out : this.inMap) { | ||
| 244 | + outStart = out; | ||
| 245 | + if (out.toLength > 0) break; | ||
| 246 | + } | ||
| 247 | + inputOffsetOfOutputStart = outStart == null ? 0 : outStart.fromOffset; | ||
| 231 | 248 | } | |
| 232 | 249 | ||
| 233 | 250 | @Override | |
| 234 | 251 | public int getInputOffset(int outputOffset) { | |
| 252 | + if (outputOffset < outputOffsetOfInputStart) return -1; | ||
| 235 | 253 | Edit searchKey = new Edit(0, 0, outputOffset, Integer.MAX_VALUE, null); | |
| 236 | 254 | int i = Collections.binarySearch(outMap, searchKey, OUTPUT_OFFSET_COMP); | |
| 237 | 255 | if (i < 0) { | |
@@ -246,6 +264,7 @@ public int getInputOffset(int outputOffset) { | |||
| 246 | 264 | ||
| 247 | 265 | @Override | |
| 248 | 266 | public int getOutputOffset(int inputOffset) { | |
| 267 | + if (inputOffset < inputOffsetOfOutputStart) return -1; | ||
| 249 | 268 | Edit searchKey = new Edit(inputOffset, Integer.MAX_VALUE, 0, 0, null); | |
| 250 | 269 | int i = Collections.binarySearch(inMap, searchKey, INPUT_OFFSET_COMP); | |
| 251 | 270 | if (i < 0) { | |
| Back | FazBrowse Home | New Git URL |
0 commit comments