From e5d04ff19c080eb71176ecddc9bf579892aba0cf Mon Sep 17 00:00:00 2001 From: Christopher Williams Date: Thu, 5 Jun 2014 16:24:44 -0400 Subject: [PATCH] Fix TISTUD-6597 "use strict"; should not reflow immediately after the brace - Fix generic case of directives. keep them on newlines. --- .../js/formatter/JSFormatterNodeBuilder.java | 13 +++- .../formatting/test126.js | 60 ++++++++++++++++++ .../formatting/test127.js | 62 +++++++++++++++++++ .../formatting/test128.js | 56 +++++++++++++++++ 4 files changed, 190 insertions(+), 1 deletion(-) create mode 100644 tests/com.aptana.editor.js.formatter.tests/formatting/test126.js create mode 100644 tests/com.aptana.editor.js.formatter.tests/formatting/test127.js create mode 100644 tests/com.aptana.editor.js.formatter.tests/formatting/test128.js diff --git a/plugins/com.aptana.editor.js.formatter/src/com/aptana/editor/js/formatter/JSFormatterNodeBuilder.java b/plugins/com.aptana.editor.js.formatter/src/com/aptana/editor/js/formatter/JSFormatterNodeBuilder.java index cc2a5d3f2c..3c53ecb83c 100644 --- a/plugins/com.aptana.editor.js.formatter/src/com/aptana/editor/js/formatter/JSFormatterNodeBuilder.java +++ b/plugins/com.aptana.editor.js.formatter/src/com/aptana/editor/js/formatter/JSFormatterNodeBuilder.java @@ -104,6 +104,7 @@ import com.aptana.js.core.parsing.ast.JSWhileNode; import com.aptana.js.core.parsing.ast.JSWithNode; import com.aptana.parsing.ast.IParseNode; +import com.aptana.parsing.ast.IParseRootNode; /** * JS formatter node builder.
@@ -1271,7 +1272,17 @@ public void visit(JSNumberNode node) @Override public void visit(JSStringNode node) { - visitTextNode(node, true, 0); + // We have to handle directives properly! Directives are strings on one line as a full "statement" + // themselves. See http://dmitrysoshnikov.com/ecmascript/es5-chapter-2-strict-mode/ + IParseNode parent = node.getParent(); + if (parent instanceof JSStatementsNode || parent instanceof IParseRootNode) + { + visitTextNode(node.getStartingOffset(), node.getEndingOffset(), true, 0, 0, true); + } + else + { + visitTextNode(node, true, 0); + } } /* diff --git a/tests/com.aptana.editor.js.formatter.tests/formatting/test126.js b/tests/com.aptana.editor.js.formatter.tests/formatting/test126.js new file mode 100644 index 0000000000..7efcff4fac --- /dev/null +++ b/tests/com.aptana.editor.js.formatter.tests/formatting/test126.js @@ -0,0 +1,60 @@ +==PREFS== +js.formatter.spaces.after.commas=1 +js.formatter.spaces.after.assignment.operator=1 +js.formatter.spaces.after.arithmetic.operator=1 +js.formatter.spaces.after.conditional.operator=1 +js.formatter.indent.case.body=true +js.formatter.indent.switch.body=true +js.formatter.spaces.before.for.semicolon.operator=0 +js.formatter.spaces.before.parentheses=0 +js.formatter.spaces.after.semicolon.operator=1 +js.formatter.spaces.before.postfix.operator=0 +js.formatter.spaces.after.postfix.operator=0 +js.formatter.spaces.before.relational.operator=1 +js.formatter.spaces.before.case.colon.operator=1 +js.formatter.spaces.before.unary.operator=0 +js.formatter.wrap.comments=false +js.formatter.indent.group.body=true +js.formatter.line.after.function.declaration=1 +js.formatter.spaces.after.concatenation.operator=1 +js.formatter.wrap.comments.length=80 +js.formatter.spaces.before.conditional.operator=1 +js.formatter.formatter.tabulation.size=4 +js.formatter.spaces.after.relational.operator=1 +js.formatter.spaces.after.case.colon.operator=1 +js.formatter.spaces.before.prefix.operator=0 +js.formatter.indent.blocks=true +js.formatter.spaces.before.concatenation.operator=1 +js.formatter.line.preserve=1 +js.formatter.brace.position.case.block=same.line +js.formatter.brace.position.switch.block=same.line +js.formatter.formatter.tabulation.char=editor +js.formatter.indent.function.body=true +js.formatter.line.after.function.declaration.expression=0 +js.formatter.formatter.indentation.size=4 +js.formatter.newline.before.name.value.pairs=true +js.formatter.spaces.after.parentheses=0 +js.formatter.spaces.after.for.semicolon.operator=1 +js.formatter.newline.before.if.in.elseif=false +js.formatter.spaces.before.key.value.operator=1 +js.formatter.spaces.before.commas=0 +js.formatter.spaces.after.unary.operator=0 +js.formatter.spaces.before.arithmetic.operator=1 +js.formatter.spaces.before.assignment.operator=1 +js.formatter.newline.before.dowhile=false +js.formatter.newline.before.else=false +js.formatter.spaces.before.semicolon.operator=0 +js.formatter.newline.before.finally=false +js.formatter.newline.before.catch=false +js.formatter.spaces.after.prefix.operator=0 +js.formatter.brace.position.function.declaration=same.line +js.formatter.spaces.after.key.value.operator=1 +js.formatter.brace.position.blocks=same.line +==CONTENT== +function exampleFunction() { + "use strict"; +} +==FORMATTED== +function exampleFunction() { + "use strict"; +} \ No newline at end of file diff --git a/tests/com.aptana.editor.js.formatter.tests/formatting/test127.js b/tests/com.aptana.editor.js.formatter.tests/formatting/test127.js new file mode 100644 index 0000000000..2a8cb52d46 --- /dev/null +++ b/tests/com.aptana.editor.js.formatter.tests/formatting/test127.js @@ -0,0 +1,62 @@ +==PREFS== +js.formatter.spaces.after.commas=1 +js.formatter.spaces.after.assignment.operator=1 +js.formatter.spaces.after.arithmetic.operator=1 +js.formatter.spaces.after.conditional.operator=1 +js.formatter.indent.case.body=true +js.formatter.indent.switch.body=true +js.formatter.spaces.before.for.semicolon.operator=0 +js.formatter.spaces.before.parentheses=0 +js.formatter.spaces.after.semicolon.operator=1 +js.formatter.spaces.before.postfix.operator=0 +js.formatter.spaces.after.postfix.operator=0 +js.formatter.spaces.before.relational.operator=1 +js.formatter.spaces.before.case.colon.operator=1 +js.formatter.spaces.before.unary.operator=0 +js.formatter.wrap.comments=false +js.formatter.indent.group.body=true +js.formatter.line.after.function.declaration=1 +js.formatter.spaces.after.concatenation.operator=1 +js.formatter.wrap.comments.length=80 +js.formatter.spaces.before.conditional.operator=1 +js.formatter.formatter.tabulation.size=4 +js.formatter.spaces.after.relational.operator=1 +js.formatter.spaces.after.case.colon.operator=1 +js.formatter.spaces.before.prefix.operator=0 +js.formatter.indent.blocks=true +js.formatter.spaces.before.concatenation.operator=1 +js.formatter.line.preserve=1 +js.formatter.brace.position.case.block=same.line +js.formatter.brace.position.switch.block=same.line +js.formatter.formatter.tabulation.char=editor +js.formatter.indent.function.body=true +js.formatter.line.after.function.declaration.expression=0 +js.formatter.formatter.indentation.size=4 +js.formatter.newline.before.name.value.pairs=true +js.formatter.spaces.after.parentheses=0 +js.formatter.spaces.after.for.semicolon.operator=1 +js.formatter.newline.before.if.in.elseif=false +js.formatter.spaces.before.key.value.operator=1 +js.formatter.spaces.before.commas=0 +js.formatter.spaces.after.unary.operator=0 +js.formatter.spaces.before.arithmetic.operator=1 +js.formatter.spaces.before.assignment.operator=1 +js.formatter.newline.before.dowhile=false +js.formatter.newline.before.else=false +js.formatter.spaces.before.semicolon.operator=0 +js.formatter.newline.before.finally=false +js.formatter.newline.before.catch=false +js.formatter.spaces.after.prefix.operator=0 +js.formatter.brace.position.function.declaration=same.line +js.formatter.spaces.after.key.value.operator=1 +js.formatter.brace.position.blocks=same.line +==CONTENT== +function exampleFunction() { + "first directive"; + 'the second in the single quotes'; +} +==FORMATTED== +function exampleFunction() { + "first directive"; + 'the second in the single quotes'; +} \ No newline at end of file diff --git a/tests/com.aptana.editor.js.formatter.tests/formatting/test128.js b/tests/com.aptana.editor.js.formatter.tests/formatting/test128.js new file mode 100644 index 0000000000..ff95619585 --- /dev/null +++ b/tests/com.aptana.editor.js.formatter.tests/formatting/test128.js @@ -0,0 +1,56 @@ +==PREFS== +js.formatter.spaces.after.commas=1 +js.formatter.spaces.after.assignment.operator=1 +js.formatter.spaces.after.arithmetic.operator=1 +js.formatter.spaces.after.conditional.operator=1 +js.formatter.indent.case.body=true +js.formatter.indent.switch.body=true +js.formatter.spaces.before.for.semicolon.operator=0 +js.formatter.spaces.before.parentheses=0 +js.formatter.spaces.after.semicolon.operator=1 +js.formatter.spaces.before.postfix.operator=0 +js.formatter.spaces.after.postfix.operator=0 +js.formatter.spaces.before.relational.operator=1 +js.formatter.spaces.before.case.colon.operator=1 +js.formatter.spaces.before.unary.operator=0 +js.formatter.wrap.comments=false +js.formatter.indent.group.body=true +js.formatter.line.after.function.declaration=1 +js.formatter.spaces.after.concatenation.operator=1 +js.formatter.wrap.comments.length=80 +js.formatter.spaces.before.conditional.operator=1 +js.formatter.formatter.tabulation.size=4 +js.formatter.spaces.after.relational.operator=1 +js.formatter.spaces.after.case.colon.operator=1 +js.formatter.spaces.before.prefix.operator=0 +js.formatter.indent.blocks=true +js.formatter.spaces.before.concatenation.operator=1 +js.formatter.line.preserve=1 +js.formatter.brace.position.case.block=same.line +js.formatter.brace.position.switch.block=same.line +js.formatter.formatter.tabulation.char=editor +js.formatter.indent.function.body=true +js.formatter.line.after.function.declaration.expression=0 +js.formatter.formatter.indentation.size=4 +js.formatter.newline.before.name.value.pairs=true +js.formatter.spaces.after.parentheses=0 +js.formatter.spaces.after.for.semicolon.operator=1 +js.formatter.newline.before.if.in.elseif=false +js.formatter.spaces.before.key.value.operator=1 +js.formatter.spaces.before.commas=0 +js.formatter.spaces.after.unary.operator=0 +js.formatter.spaces.before.arithmetic.operator=1 +js.formatter.spaces.before.assignment.operator=1 +js.formatter.newline.before.dowhile=false +js.formatter.newline.before.else=false +js.formatter.spaces.before.semicolon.operator=0 +js.formatter.newline.before.finally=false +js.formatter.newline.before.catch=false +js.formatter.spaces.after.prefix.operator=0 +js.formatter.brace.position.function.declaration=same.line +js.formatter.spaces.after.key.value.operator=1 +js.formatter.brace.position.blocks=same.line +==CONTENT== +"use strict"; +==FORMATTED== +"use strict"; \ No newline at end of file