Automatic line wrapping in factory.generated.ts

This commit is contained in:
Ron Buckton
2015-07-08 10:38:24 -07:00
parent 66d3060210
commit fc51e4574b
2 changed files with 126 additions and 162 deletions

View File

@@ -785,7 +785,7 @@ function discover() {
}
function generate(outputFile: string) {
writer = createTextWriter(host.getNewLine());
writer = createLineWrappingTextWriter(host.getNewLine(), columnWrap);
writer.write(`// <auto-generated />`);
writer.writeLine();
writer.write(`/// <reference path="parser.ts" />`);
@@ -826,46 +826,26 @@ function writeIsNodeFunctions() {
function writeCreateFunction(syntaxNode: SyntaxNode) {
writer.write(`export function create${syntaxNode.kindText}(`);
let indented = false;
for (let i = 0; i < syntaxNode.members.length; ++i) {
if (i > 0) {
let first = true;
for (let member of syntaxNode.members) {
if (!first) {
writer.write(`, `);
}
let member = syntaxNode.members[i];
let paramText =
member.isNodeArray ? `${member.param}?: Array<${member.elementType}>` :
member.isModifiersArray ? `${member.param}?: Array<Node>` :
`${member.param}?: ${member.type}`;
if (writer.getColumn() >= columnWrap - paramText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
else {
first = false;
}
let type =
member.isNodeArray ? `Array<${member.elementType}>` :
member.isModifiersArray ? `Array<Node>` :
member.type;
writer.write(paramText);
writer.write(`${member.param}?: ${type}`);
}
let returnTypeText = `): ${syntaxNode.typeName} {`;
if (writer.getColumn() >= columnWrap - returnTypeText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(returnTypeText);
writer.write(`): ${syntaxNode.typeName} {`);
writer.writeLine();
if (indented) {
writer.decreaseIndent();
indented = false;
}
writer.increaseIndent();
if (syntaxNode.members.length) {
writer.write(`let node = createNode<${syntaxNode.typeName}>(SyntaxKind.${syntaxNode.kindText});`);
@@ -927,46 +907,22 @@ function writeUpdateFunction(syntaxNode: SyntaxNode) {
writer.write(`export function update${syntaxNode.kindText}(node: ${syntaxNode.typeName}`);
let indented = false;
for (let i = 0; i < syntaxNode.members.length; ++i) {
let member = syntaxNode.members[i];
if (member.isFactoryParam) {
continue;
}
writer.write(`, `);
let type =
member.isNodeArray ? `Array<${member.elementType}>` :
member.isModifiersArray ? `Array<Node>` :
member.type;
let paramText =
member.isNodeArray ? `${member.param}: Array<${member.elementType}>` :
member.isModifiersArray ? `${member.param}: Array<Node>` :
`${member.param}: ${member.type}`;
if (writer.getColumn() >= columnWrap - paramText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(paramText);
writer.write(`, ${member.param}: ${type}`);
}
let returnTypeText = `): ${syntaxNode.typeName} {`;
if (writer.getColumn() >= columnWrap - returnTypeText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(returnTypeText);
writer.write(`): ${syntaxNode.typeName} {`);
writer.writeLine();
if (indented) {
writer.decreaseIndent();
indented = false;
}
writer.increaseIndent();
@@ -984,25 +940,11 @@ function writeUpdateFunction(syntaxNode: SyntaxNode) {
writer.write(` || `);
}
let conditionText = `${member.param} !== node.${member.property}`;
if (writer.getColumn() >= columnWrap - conditionText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(conditionText);
writer.write(`${member.param} !== node.${member.property}`);
}
writer.write(`) {`);
writer.writeLine();
if (indented) {
writer.decreaseIndent();
indented = false;
}
writer.increaseIndent();
writer.write(`let newNode = create${syntaxNode.kindText}(`);
@@ -1109,4 +1051,25 @@ function getCompilerOptions() {
options.noResolve = true;
options.noLib = true;
return options;
}
function createLineWrappingTextWriter(newLine: string, maxWidth: number): EmitTextWriter {
let writer = createTextWriter(newLine);
let noWrap = false;
let baseWrite = writer.write;
writer.write = writeWrap;
return writer;
function writeWrap(text: string) {
let textTrimRight = text.replace(/\s+$/, '');
if (writer.getColumn() + textTrimRight.length > maxWidth) {
writer.writeLine();
writer.increaseIndent();
baseWrite(text.replace(/^\s+/, ''));
writer.decreaseIndent();
}
else {
baseWrite(text);
}
}
}