Merge branch 'generateFactoryMethods' into generateTransformMethods

This commit is contained in:
Ron Buckton
2015-07-08 10:57:42 -07:00
2 changed files with 131 additions and 162 deletions

View File

@@ -531,7 +531,7 @@ function discover() {
}
function generateFactory(outputFile: string) {
let writer = createTextWriter(host.getNewLine());
let writer = createLineWrappingTextWriter(host.getNewLine(), columnWrap);
writer.write(`// <auto-generated />`);
writer.writeLine();
writer.write(`/// <reference path="parser.ts" />`);
@@ -581,45 +581,27 @@ function generateFactory(outputFile: string) {
writer.write(`export function create${syntaxNode.kindName}(`);
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.paramName}?: Array<${member.elementTypeName}>` :
member.isModifiersArray ? `${member.paramName}?: Array<Node>` :
`${member.paramName}?: ${member.typeName}`;
if (writer.getColumn() >= columnWrap - paramText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
else {
first = false;
}
let type =
member.isNodeArray ? `Array<${member.elementTypeName}>` :
member.isModifiersArray ? `Array<Node>` :
member.typeName;
writer.write(paramText);
writer.write(`${member.paramName}?: ${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) {
@@ -759,46 +741,23 @@ function generateFactory(outputFile: string) {
writer.write(`export function update${syntaxNode.kindName}(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 paramText =
member.isNodeArray ? `${member.paramName}: Array<${member.elementTypeName}>` :
member.isModifiersArray ? `${member.paramName}: Array<Node>` :
`${member.paramName}: ${member.typeName}`;
if (writer.getColumn() >= columnWrap - paramText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(paramText);
}
let returnTypeText = `): ${syntaxNode.typeName} {`;
if (writer.getColumn() >= columnWrap - returnTypeText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
let type =
member.isNodeArray ? `Array<${member.elementTypeName}>` :
member.isModifiersArray ? `Array<Node>` :
member.typeName;
writer.write(`, ${member.paramName}: ${type}`);
}
writer.write(returnTypeText);
writer.write(`): ${syntaxNode.typeName} {`);
writer.writeLine();
if (indented) {
writer.decreaseIndent();
indented = false;
}
writer.increaseIndent();
@@ -816,25 +775,13 @@ function generateFactory(outputFile: string) {
writer.write(` || `);
}
let conditionText = `${member.paramName} !== node.${member.propertyName}`;
if (writer.getColumn() >= columnWrap - conditionText.length) {
writer.writeLine();
if (!indented) {
indented = true;
writer.increaseIndent();
}
}
writer.write(conditionText);
writer.write(`${member.paramName} !== node.${member.propertyName}`);
}
writer.write(`) {`);
writer.writeLine();
if (indented) {
writer.decreaseIndent();
indented = false;
}
writer.increaseIndent();
writer.write(`let newNode = create${syntaxNode.kindName}(`);
@@ -1342,6 +1289,27 @@ function getCompilerOptions() {
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);
}
}
}
function getSymbol(symbols: SymbolTable, name: string, meaning: SymbolFlags) {
if (symbols && meaning && hasProperty(symbols, name)) {
let symbol = symbols[name];