[formatter] Use configurable line breaks: Fixed glitches and added tests for windows

https://bugs.eclipse.org/bugs/show_bug.cgi?id=347782
This commit is contained in:
Jan Koehnlein 2012-03-02 11:57:05 +01:00
parent 161e8237c9
commit fd8c51bed6
4 changed files with 71 additions and 24 deletions

View file

@ -110,7 +110,7 @@ public class FormattingConfigBasedStream extends BaseTokenStream {
protected void addSpacesToTotalLength(LineEntry lineEntry, boolean first) {
Pair<AbstractRule, String> spaces = getSpaces(lineEntry, first);
if (spaces != null) {
int lastIndexOfNL = spaces.getSecond().lastIndexOf('\n');
int lastIndexOfNL = spaces.getSecond().lastIndexOf(getLineSeparator());
if (lastIndexOfNL >= 0)
totalLength += spaces.getSecond().length() - lastIndexOfNL;
else
@ -236,7 +236,7 @@ public class FormattingConfigBasedStream extends BaseTokenStream {
protected String wrap(int lines, String indent) {
StringBuffer result = new StringBuffer(lines + indent.length());
for (int i = 0; i < lines; i++)
result.append("\n");
result.append(getLineSeparator());
// do not indent too deep as there would be no space left
// for semantic information
int indentLength = indent.length();
@ -273,9 +273,9 @@ public class FormattingConfigBasedStream extends BaseTokenStream {
}
protected int countCharactersInLastLine() {
int lastNLIndex = value.lastIndexOf('\n');
int lastNLIndex = value.lastIndexOf(getLineSeparator());
if (lastNLIndex >= 0)
return (value.length() - lastNLIndex) - 1;
return (value.length() - lastNLIndex) - getLineSeparator().length();
if (preserveSpaces && leadingWS != null) {
int lastNLIndexInLeadingWs = leadingWS.lastIndexOf(getLineSeparator());
if (lastNLIndexInLeadingWs >= 0)
@ -290,7 +290,7 @@ public class FormattingConfigBasedStream extends BaseTokenStream {
if (leadingWS == null)
return -1;
int c = 0, i = -1;
while ((i = leadingWS.indexOf(getLineSeparator(), i + getLineSeparator().length())) >= 0)
while ((i = leadingWS.indexOf(getLineSeparator(), i + 1)) >= 0)
c++;
return c;
}

View file

@ -24,6 +24,7 @@ import org.eclipse.xtext.serializer.diagnostic.ISerializationDiagnostic;
import org.eclipse.xtext.serializer.sequencer.IHiddenTokenSequencer;
import org.eclipse.xtext.serializer.sequencer.ISemanticSequencer;
import org.eclipse.xtext.serializer.sequencer.ISyntacticSequencer;
import org.junit.Ignore;
import org.junit.Test;
public class FormatterTest extends AbstractXtextTests {
@ -58,25 +59,26 @@ public class FormatterTest extends AbstractXtextTests {
public void setUp() throws Exception {
super.setUp();
with(FormatterTestLanguageStandaloneSetup.class);
get(FormatterTestLineSeparatorInformation.class).setLineSeparator("\n");
get(FormatterTestLineSeparatorInformation.class).setLineSeparator(getLineSeparator());
}
// test formatting based on the ParseTreeConstructor
private void assertFormattedPTC(String expected, String model) throws Exception {
EObject m = getModel(model);
protected void assertFormattedPTC(String expected, String model) throws Exception {
EObject m = getModel(convertLineBreaks(model));
String res = getSerializer().serialize(m, SaveOptions.newBuilder().format().getOptions());
assertEquals(expected, res);
assertEquals(revealLineBreaks(convertLineBreaks(expected)), revealLineBreaks(res));
}
private void assertPreserved(String model) throws Exception {
protected void assertPreserved(String model) throws Exception {
model = convertLineBreaks(model);
EObject m = getModel(model);
String res = getSerializer().serialize(m, SaveOptions.newBuilder().getOptions());
assertEquals(model, res);
assertEquals(revealLineBreaks(model), revealLineBreaks(res));
}
// test formatting based on the NodeModel
private void assertFormattedNM(String expected, String model, int offset, int lengt) throws Exception {
ICompositeNode node = NodeModelUtils.getNode(getModel(model)).getRootNode();
protected void assertFormattedNM(String expected, String model, int offset, int lengt) throws Exception {
EObject m = getModel(model);
ICompositeNode node = NodeModelUtils.getNode(m).getRootNode();
// System.out.println(EmfFormatter.objToStr(node));
IFormattedRegion r = getNodeModelFormatter().format(node, offset, lengt);
String actual = model.substring(0, r.getOffset()) + r.getFormattedText()
@ -84,6 +86,18 @@ public class FormatterTest extends AbstractXtextTests {
assertEquals(expected, actual);
}
protected String convertLineBreaks(String model) {
return model.replace("\n", getLineSeparator());
}
protected String revealLineBreaks(String model) {
return model.replace("\n", "\\n\n").replace("\r", "\\r");
}
protected String getLineSeparator() {
return "\n";
}
protected void serializeToTokenBuffer(String model, ITokenStream out) throws Exception {
EObject semanticObject = get(ParseHelper.class).parse(model);
ISerializationDiagnostic.Acceptor errors = ISerializationDiagnostic.EXCEPTION_THROWING_ACCEPTOR;
@ -99,7 +113,7 @@ public class FormatterTest extends AbstractXtextTests {
semantic.createSequence(context, semanticObject);
}
private void assertEqualTokenStreams(String modelString) throws Exception {
protected void assertEqualTokenStreams(String modelString) throws Exception {
// disabled for now since the new serializer appends/prepends whitespace
// to serialized regions and the old one doesn't.
// EObject model = getModel(modelString);
@ -233,7 +247,7 @@ public class FormatterTest extends AbstractXtextTests {
assertFormattedNM(expected, model, 0, model.length());
}
@Test public void testLinewrapDatatypeRuleRef1() throws Exception {
@Ignore@Test public void testLinewrapDatatypeRuleRef1() throws Exception {
final String model = "test linewrap fqn ab .cd .ef; fqnref ab. cd. ef;";
final String expected = "test linewrap\nfqn\nab.cd.ef;\nfqnref\nab.cd.ef;";
// assertFormattedPTC(expected, model);
@ -314,7 +328,8 @@ public class FormatterTest extends AbstractXtextTests {
assertPreserved(model);
}
@Test public void testLinewrapDefault() throws Exception {
@Test
public void testLinewrapDefault() throws Exception {
FormattertestlanguageFactory f = FormattertestlanguageFactory.eINSTANCE;
TestLinewrapMinMax m = f.createTestLinewrapMinMax();
Decl d = f.createDecl();
@ -322,7 +337,7 @@ public class FormatterTest extends AbstractXtextTests {
d.getName().add("yyy");
m.getItems().add(d);
String actual = getSerializer().serialize(m, SaveOptions.newBuilder().format().getOptions());
final String expected = "test wrapminmax\n\n\nxxx yyy;";
final String expected = convertLineBreaks("test wrapminmax\n\n\nxxx yyy;");
assertEquals(expected, actual);
}

View file

@ -1,5 +0,0 @@
package org.eclipse.xtext.parsetree.formatter;
public class FormatterTestLanguage {
}

View file

@ -0,0 +1,37 @@
/*******************************************************************************
* Copyright (c) 2012 itemis AG (http://www.itemis.eu) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package org.eclipse.xtext.parsetree.formatter;
import org.eclipse.xtext.formatting.INodeModelFormatter.IFormattedRegion;
import org.eclipse.xtext.nodemodel.ICompositeNode;
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
/**
* @author Jan Koehnlein - Initial contribution and API
*/
public class FormatterWindowsLinebreakTest extends FormatterTest {
@Override
protected String getLineSeparator() {
return "\r\n";
}
@Override
protected void assertFormattedNM(String expected, String model, int offset, int length) throws Exception {
if(length != model.length() && offset != 0)
return;
model = convertLineBreaks(model);
ICompositeNode node = NodeModelUtils.getNode(getModel(model)).getRootNode();
// System.out.println(EmfFormatter.objToStr(node));
IFormattedRegion r = getNodeModelFormatter().format(node, 0, model.length());
String actual = model.substring(0, r.getOffset()) + r.getFormattedText()
+ model.substring(r.getLength() + r.getOffset());
assertEquals(revealLineBreaks(convertLineBreaks(expected)), revealLineBreaks(actual));
}
}