public void reparseAll() { SwtMateTextLocation startLocation = new SwtMateTextLocation(0, this); SwtMateTextLocation endLocation = new SwtMateTextLocation(0 + document.getLength(), this); if (this.mateText.parser.enabled) { this.mateText.parser.changes.add(startLocation.getLine(), endLocation.getLine()); this.mateText.parser.processChanges(); } }
@Test public void useCase_ex1() { when(stepLocator.findFirstStep(Mockito.anyString())) .thenAnswer( new Answer<StepCandidate>() { @Override public StepCandidate answer(InvocationOnMock invocation) throws Throwable { System.out.println("StepScannerStyledTest.useCase_ex1(" + invocation + ")"); return candidate; } }); String[] expected = { // "step_keyword ~ offset: 0, length: 6", // "step_default ~ offset: 6, length: 18", // "step_parameter_value ~ offset: 24, length: 6", // "step_default ~ offset: 30, length: 33", // "step_example_table_separator ~ offset: 63, length: 1", // "step_example_table_cell ~ offset: 64, length: 3", // "step_example_table_separator ~ offset: 67, length: 1", // "step_example_table_cell ~ offset: 68, length: 5", // "step_example_table_separator ~ offset: 73, length: 1", // "step_default ~ offset: 74, length: 1", // "comment ~ offset: 75, length: 17", // "step_example_table_separator ~ offset: 92, length: 1", // "step_example_table_cell ~ offset: 93, length: 5", // "step_example_table_separator ~ offset: 98, length: 1", // "step_example_table_cell ~ offset: 99, length: 6", // "step_example_table_separator ~ offset: 105, length: 1", // "step_default ~ offset: 106, length: 1", // "step_example_table_separator ~ offset: 107, length: 1", // "step_example_table_cell ~ offset: 108, length: 8", // "step_example_table_separator ~ offset: 116, length: 1", // "step_example_table_cell ~ offset: 117, length: 6", // "step_example_table_separator ~ offset: 123, length: 1", // "step_default ~ offset: 124, length: 1" // }; int index = 0; scanner.setRange(document, 0, document.getLength()); IToken token = scanner.nextToken(); while (!token.isEOF()) { String actual = (token.getData() + " ~ offset: " + scanner.getTokenOffset() + ", length: " + scanner.getTokenLength()); assertThat(actual, equalTo(expected[index++])); token = scanner.nextToken(); } assertThat(index, equalTo(expected.length)); }
public int getLineLength(int line) { try { int startOffset = document.getLineOffset(line); int endOffset; if (line + 1 < getLineCount()) { endOffset = document.getLineOffset(line + 1); } else { endOffset = document.getLength(); } return endOffset - startOffset; } catch (BadLocationException e) { System.out.printf("*** Warning BadLocationException"); e.printStackTrace(); return -1; } }
/** Determine the value type for a give propertyName. */ protected Type getValueType(String propertyName) { try { PropertyInfo prop = getIndex().get(propertyName); if (prop != null) { return TypeParser.parse(prop.getType()); } else { prop = findLongestValidProperty(getIndex(), propertyName); if (prop != null) { Document doc = new Document(propertyName); PropertyNavigator navigator = new PropertyNavigator(doc, null, typeUtil, new Region(0, doc.getLength())); return navigator.navigate(prop.getId().length(), TypeParser.parse(prop.getType())); } } } catch (Exception e) { BootActivator.log(e); } return null; }
private int getPeerPosition(IDocument document, DocumentCommand command) { if (document.getLength() == 0) return 0; /* * Search for scope closers in the pasted text and find their opening peers * in the document. */ Document pasted = new Document(command.text); installJavaStuff(pasted); int firstPeer = command.offset; JavaHeuristicScanner pScanner = new JavaHeuristicScanner(pasted); JavaHeuristicScanner dScanner = new JavaHeuristicScanner(document); // add scope relevant after context to peer search int afterToken = dScanner.nextToken(command.offset + command.length, JavaHeuristicScanner.UNBOUND); try { switch (afterToken) { case Symbols.TokenRBRACE: pasted.replace(pasted.getLength(), 0, "}"); // $NON-NLS-1$ break; case Symbols.TokenRPAREN: pasted.replace(pasted.getLength(), 0, ")"); // $NON-NLS-1$ break; case Symbols.TokenRBRACKET: pasted.replace(pasted.getLength(), 0, "]"); // $NON-NLS-1$ break; } } catch (BadLocationException e) { // cannot happen Assert.isTrue(false); } int pPos = 0; // paste text position (increasing from 0) int dPos = Math.max(0, command.offset - 1); // document position (decreasing from paste offset) while (true) { int token = pScanner.nextToken(pPos, JavaHeuristicScanner.UNBOUND); pPos = pScanner.getPosition(); switch (token) { case Symbols.TokenLBRACE: case Symbols.TokenLBRACKET: case Symbols.TokenLPAREN: pPos = skipScope(pScanner, pPos, token); if (pPos == JavaHeuristicScanner.NOT_FOUND) return firstPeer; break; // closed scope -> keep searching case Symbols.TokenRBRACE: int peer = dScanner.findOpeningPeer(dPos, '{', '}'); dPos = peer - 1; if (peer == JavaHeuristicScanner.NOT_FOUND) return firstPeer; firstPeer = peer; break; // keep searching case Symbols.TokenRBRACKET: peer = dScanner.findOpeningPeer(dPos, '[', ']'); dPos = peer - 1; if (peer == JavaHeuristicScanner.NOT_FOUND) return firstPeer; firstPeer = peer; break; // keep searching case Symbols.TokenRPAREN: peer = dScanner.findOpeningPeer(dPos, '(', ')'); dPos = peer - 1; if (peer == JavaHeuristicScanner.NOT_FOUND) return firstPeer; firstPeer = peer; break; // keep searching case Symbols.TokenCASE: case Symbols.TokenDEFAULT: JavaIndenter indenter = new JavaIndenter(document, dScanner, fProject); peer = indenter.findReferencePosition(dPos, false, false, false, true); if (peer == JavaHeuristicScanner.NOT_FOUND) return firstPeer; firstPeer = peer; break; // keep searching case Symbols.TokenEOF: return firstPeer; default: // keep searching } } }
private void smartPaste(IDocument document, DocumentCommand command) { int newOffset = command.offset; int newLength = command.length; String newText = command.text; try { JavaHeuristicScanner scanner = new JavaHeuristicScanner(document); JavaIndenter indenter = new JavaIndenter(document, scanner, fProject); int offset = newOffset; // reference position to get the indent from int refOffset = indenter.findReferencePosition(offset); if (refOffset == JavaHeuristicScanner.NOT_FOUND) return; int peerOffset = getPeerPosition(document, command); peerOffset = indenter.findReferencePosition(peerOffset); if (peerOffset != JavaHeuristicScanner.NOT_FOUND) refOffset = Math.min(refOffset, peerOffset); // eat any WS before the insertion to the beginning of the line int firstLine = 1; // don't format the first line per default, as it has other content before it IRegion line = document.getLineInformationOfOffset(offset); String notSelected = document.get(line.getOffset(), offset - line.getOffset()); if (notSelected.trim().length() == 0) { newLength += notSelected.length(); newOffset = line.getOffset(); firstLine = 0; } // prefix: the part we need for formatting but won't paste IRegion refLine = document.getLineInformationOfOffset(refOffset); String prefix = document.get(refLine.getOffset(), newOffset - refLine.getOffset()); // handle the indentation computation inside a temporary document Document temp = new Document(prefix + newText); DocumentRewriteSession session = temp.startRewriteSession(DocumentRewriteSessionType.STRICTLY_SEQUENTIAL); scanner = new JavaHeuristicScanner(temp); indenter = new JavaIndenter(temp, scanner, fProject); installJavaStuff(temp); // indent the first and second line // compute the relative indentation difference from the second line // (as the first might be partially selected) and use the value to // indent all other lines. boolean isIndentDetected = false; StringBuffer addition = new StringBuffer(); int insertLength = 0; int firstLineInsertLength = 0; int firstLineIndent = 0; int first = document.computeNumberOfLines(prefix) + firstLine; // don't format first line int lines = temp.getNumberOfLines(); int tabLength = getVisualTabLengthPreference(); boolean changed = false; for (int l = first; l < lines; l++) { // we don't change the number of lines while adding indents IRegion r = temp.getLineInformation(l); int lineOffset = r.getOffset(); int lineLength = r.getLength(); if (lineLength == 0) // don't modify empty lines continue; if (!isIndentDetected) { // indent the first pasted line String current = getCurrentIndent(temp, l); StringBuffer correct = indenter.computeIndentation(lineOffset); if (correct == null) return; // bail out insertLength = subtractIndent(correct, current, addition, tabLength); if (l == first) { firstLineInsertLength = insertLength; firstLineIndent = current.length(); } if (l != first && temp.get(lineOffset, lineLength).trim().length() != 0) { isIndentDetected = true; if (firstLineIndent >= current.length()) insertLength = firstLineInsertLength; if (insertLength == 0) { // no adjustment needed, bail out if (firstLine == 0) { // but we still need to adjust the first line command.offset = newOffset; command.length = newLength; if (changed) break; // still need to get the leading indent of the first line } return; } } else { changed = insertLength != 0; } } // relatively indent all pasted lines if (insertLength > 0) addIndent(temp, l, addition, tabLength); else if (insertLength < 0) cutIndent(temp, l, -insertLength, tabLength); } removeJavaStuff(temp); temp.stopRewriteSession(session); newText = temp.get(prefix.length(), temp.getLength() - prefix.length()); command.offset = newOffset; command.length = newLength; command.text = newText; } catch (BadLocationException e) { JavaPlugin.log(e); } }