Skip to content

Commit

Permalink
feat: Add ClassMemberStructures, InterfaceMemberStructures, and Struc…
Browse files Browse the repository at this point in the history
…tures type aliases.
  • Loading branch information
dsherret committed Apr 17, 2019
1 parent 5e82044 commit 3af3d32
Show file tree
Hide file tree
Showing 10 changed files with 77 additions and 57 deletions.
58 changes: 31 additions & 27 deletions lib/ts-morph.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5172,24 +5172,24 @@ export declare class EnumDeclaration extends EnumDeclarationBase<ts.EnumDeclarat
* Adds a member to the enum.
* @param structure - Structure of the enum.
*/
addMember(structure: EnumMemberStructure): EnumMember;
addMember(structure: OptionalKind<EnumMemberStructure>): EnumMember;
/**
* Adds members to the enum.
* @param structures - Structures of the enums.
*/
addMembers(structures: ReadonlyArray<EnumMemberStructure>): EnumMember[];
addMembers(structures: ReadonlyArray<OptionalKind<EnumMemberStructure>>): EnumMember[];
/**
* Inserts a member to the enum.
* @param index - Child index to insert at.
* @param structure - Structure of the enum.
*/
insertMember(index: number, structure: EnumMemberStructure): EnumMember;
insertMember(index: number, structure: OptionalKind<EnumMemberStructure>): EnumMember;
/**
* Inserts members to an enum.
* @param index - Child index to insert at.
* @param structures - Structures of the enums.
*/
insertMembers(index: number, structures: ReadonlyArray<EnumMemberStructure>): EnumMember[];
insertMembers(index: number, structures: ReadonlyArray<OptionalKind<EnumMemberStructure>>): EnumMember[];
/**
* Gets an enum member.
* @param name - Name of the member.
Expand Down Expand Up @@ -10291,6 +10291,9 @@ export declare abstract class SettingsContainer<T extends object> {
}

export declare type StatementStructures = ClassDeclarationStructure | EnumDeclarationStructure | FunctionDeclarationStructure | InterfaceDeclarationStructure | NamespaceDeclarationStructure | TypeAliasDeclarationStructure | ImportDeclarationStructure | ExportDeclarationStructure | ExportAssignmentStructure | VariableStatementStructure;
export declare type ClassMemberStructures = ConstructorDeclarationStructure | GetAccessorDeclarationStructure | SetAccessorDeclarationStructure | MethodDeclarationStructure | PropertyDeclarationStructure;
export declare type InterfaceMemberStructures = CallSignatureDeclarationStructure | ConstructSignatureDeclarationStructure | IndexSignatureDeclarationStructure | MethodSignatureStructure | PropertySignatureStructure;
export declare type Structures = StatementStructures | ClassMemberStructures | EnumMemberStructure | InterfaceMemberStructures;

export interface AbstractableNodeStructure {
isAbstract?: boolean;
Expand Down Expand Up @@ -10517,13 +10520,13 @@ export interface EnumDeclarationStructure extends Structure, NamedNodeStructure,

interface EnumDeclarationSpecificStructure extends KindedStructure<StructureKind.Enum> {
isConst?: boolean;
members?: EnumMemberStructure[];
members?: OptionalKind<EnumMemberStructure>[];
}

export interface EnumMemberStructure extends Structure, EnumMemberSpecificStructure, PropertyNamedNodeStructure, JSDocableNodeStructure, InitializerExpressionableNodeStructure {
}

interface EnumMemberSpecificStructure {
interface EnumMemberSpecificStructure extends KindedStructure<StructureKind.EnumMember> {
/**
* Convenience property for setting the initializer.
*/
Expand Down Expand Up @@ -10754,27 +10757,28 @@ export declare enum StructureKind {
SetAccessor = 3,
Property = 4,
Enum = 5,
Function = 6,
CallSignature = 7,
ConstructSignature = 8,
IndexSignature = 9,
Interface = 10,
Method = 11,
MethodSignature = 12,
PropertySignature = 13,
ExportAssignment = 14,
ExportDeclaration = 15,
ImportDeclaration = 16,
Namespace = 17,
VariableStatement = 18,
TypeAlias = 19,
PropertyAssignment = 20,
ShorthandPropertyAssignment = 21,
SpreadAssignment = 22,
JsxAttribute = 23,
JsxSpreadAttribute = 24,
JsxElement = 25,
JsxSelfClosingElement = 26
EnumMember = 6,
Function = 7,
CallSignature = 8,
ConstructSignature = 9,
IndexSignature = 10,
Interface = 11,
Method = 12,
MethodSignature = 13,
PropertySignature = 14,
ExportAssignment = 15,
ExportDeclaration = 16,
ImportDeclaration = 17,
Namespace = 18,
VariableStatement = 19,
TypeAlias = 20,
PropertyAssignment = 21,
ShorthandPropertyAssignment = 22,
SpreadAssignment = 23,
JsxAttribute = 24,
JsxSpreadAttribute = 25,
JsxElement = 26,
JsxSelfClosingElement = 27
}

export { ts, SyntaxKind, CompilerOptions, EmitHint, ScriptKind, NewLineKind, LanguageVariant, ScriptTarget, TypeFlags, ObjectFlags, SymbolFlags, TypeFormatFlags, DiagnosticCategory, EditorSettings, ModuleResolutionKind };
Expand Down
10 changes: 5 additions & 5 deletions src/compiler/ast/enum/EnumDeclaration.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as errors from "../../../errors";
import { getNodesToReturn, insertIntoCommaSeparatedNodes, verifyAndGetIndex } from "../../../manipulation";
import { EnumDeclarationStructure, EnumMemberStructure, EnumDeclarationSpecificStructure, StructureKind } from "../../../structures";
import { EnumDeclarationStructure, EnumMemberStructure, EnumDeclarationSpecificStructure, StructureKind, OptionalKind } from "../../../structures";
import { SyntaxKind, ts } from "../../../typescript";
import { getNodeByNameOrFindFunction, getNotFoundErrorMessageForNameOrFindFunction } from "../../../utils";
import { AmbientableNode, ExportableNode, JSDocableNode, ModifierableNode, NamedNode, TextInsertableNode } from "../base";
Expand Down Expand Up @@ -37,15 +37,15 @@ export class EnumDeclaration extends EnumDeclarationBase<ts.EnumDeclaration> {
* Adds a member to the enum.
* @param structure - Structure of the enum.
*/
addMember(structure: EnumMemberStructure) {
addMember(structure: OptionalKind<EnumMemberStructure>) {
return this.addMembers([structure])[0];
}

/**
* Adds members to the enum.
* @param structures - Structures of the enums.
*/
addMembers(structures: ReadonlyArray<EnumMemberStructure>) {
addMembers(structures: ReadonlyArray<OptionalKind<EnumMemberStructure>>) {
return this.insertMembers(this.getMembers().length, structures);
}

Expand All @@ -54,7 +54,7 @@ export class EnumDeclaration extends EnumDeclarationBase<ts.EnumDeclaration> {
* @param index - Child index to insert at.
* @param structure - Structure of the enum.
*/
insertMember(index: number, structure: EnumMemberStructure) {
insertMember(index: number, structure: OptionalKind<EnumMemberStructure>) {
return this.insertMembers(index, [structure])[0];
}

Expand All @@ -63,7 +63,7 @@ export class EnumDeclaration extends EnumDeclarationBase<ts.EnumDeclaration> {
* @param index - Child index to insert at.
* @param structures - Structures of the enums.
*/
insertMembers(index: number, structures: ReadonlyArray<EnumMemberStructure>) {
insertMembers(index: number, structures: ReadonlyArray<OptionalKind<EnumMemberStructure>>) {
const members = this.getMembers();
index = verifyAndGetIndex(index, members.length);

Expand Down
3 changes: 2 additions & 1 deletion src/compiler/ast/enum/EnumMember.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { FormattingKind, removeChildrenWithFormatting } from "../../../manipulation";
import { EnumMemberStructure, EnumMemberSpecificStructure } from "../../../structures";
import { EnumMemberStructure, EnumMemberSpecificStructure, StructureKind } from "../../../structures";
import { SyntaxKind, ts } from "../../../typescript";
import { StringUtils } from "../../../utils";
import { InitializerExpressionableNode, JSDocableNode, PropertyNamedNode } from "../base";
Expand Down Expand Up @@ -68,6 +68,7 @@ export class EnumMember extends EnumMemberBase<ts.EnumMember> {
*/
getStructure() {
return callBaseGetStructure<EnumMemberSpecificStructure>(EnumMemberBase.prototype, this, {
kind: StructureKind.EnumMember,
// never return the value, only return the initializer
value: undefined
}) as EnumMemberStructure;
Expand Down
8 changes: 4 additions & 4 deletions src/structurePrinters/enum/EnumMemberStructurePrinter.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { CodeBlockWriter } from "../../codeBlockWriter";
import { EnumMemberStructure } from "../../structures";
import { EnumMemberStructure, OptionalKind } from "../../structures";
import { NodePrinter } from "../NodePrinter";
import { CommaNewLineSeparatedStructuresPrinter } from "../formatting";

export class EnumMemberStructurePrinter extends NodePrinter<EnumMemberStructure> {
export class EnumMemberStructurePrinter extends NodePrinter<OptionalKind<EnumMemberStructure>> {
private readonly multipleWriter = new CommaNewLineSeparatedStructuresPrinter(this);

printTexts(writer: CodeBlockWriter, structures: ReadonlyArray<EnumMemberStructure> | undefined) {
printTexts(writer: CodeBlockWriter, structures: ReadonlyArray<OptionalKind<EnumMemberStructure>> | undefined) {
this.multipleWriter.printText(writer, structures);
}

protected printTextInternal(writer: CodeBlockWriter, structure: EnumMemberStructure) {
protected printTextInternal(writer: CodeBlockWriter, structure: OptionalKind<EnumMemberStructure>) {
this.factory.forJSDoc().printDocs(writer, structure.docs);
writer.write(structure.name);
if (typeof structure.value === "string")
Expand Down
2 changes: 2 additions & 0 deletions src/structures/StructureKind.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export enum StructureKind {
SetAccessor,
Property,
Enum,
EnumMember,
Function,
CallSignature,
ConstructSignature,
Expand Down Expand Up @@ -44,6 +45,7 @@ export interface StructureKindToSyntaxKind {
[StructureKind.SetAccessor]: SyntaxKind.SetAccessor;
[StructureKind.Property]: SyntaxKind.PropertyDeclaration;
[StructureKind.Enum]: SyntaxKind.EnumDeclaration;
[StructureKind.EnumMember]: SyntaxKind.EnumMember;
[StructureKind.Function]: SyntaxKind.FunctionDeclaration;
[StructureKind.CallSignature]: SyntaxKind.CallSignature;
[StructureKind.ConstructSignature]: SyntaxKind.ConstructSignature;
Expand Down
16 changes: 13 additions & 3 deletions src/structures/aliases.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { ClassDeclarationStructure } from "./class";
import { EnumDeclarationStructure } from "./enum";
import { ClassDeclarationStructure, ConstructorDeclarationStructure, GetAccessorDeclarationStructure, SetAccessorDeclarationStructure, MethodDeclarationStructure,
PropertyDeclarationStructure } from "./class";
import { EnumDeclarationStructure, EnumMemberStructure } from "./enum";
import { FunctionDeclarationStructure } from "./function";
import { InterfaceDeclarationStructure } from "./interface";
import { InterfaceDeclarationStructure, CallSignatureDeclarationStructure, ConstructSignatureDeclarationStructure, IndexSignatureDeclarationStructure,
MethodSignatureStructure, PropertySignatureStructure } from "./interface";
import { NamespaceDeclarationStructure } from "./module";
import { TypeAliasDeclarationStructure } from "./type";
import { ImportDeclarationStructure, ExportDeclarationStructure, ExportAssignmentStructure } from "./module";
Expand All @@ -10,3 +12,11 @@ import { VariableStatementStructure } from "./statement";
export type StatementStructures = ClassDeclarationStructure | EnumDeclarationStructure | FunctionDeclarationStructure
| InterfaceDeclarationStructure | NamespaceDeclarationStructure | TypeAliasDeclarationStructure
| ImportDeclarationStructure | ExportDeclarationStructure | ExportAssignmentStructure | VariableStatementStructure;

export type ClassMemberStructures = ConstructorDeclarationStructure | GetAccessorDeclarationStructure | SetAccessorDeclarationStructure | MethodDeclarationStructure
| PropertyDeclarationStructure;

export type InterfaceMemberStructures = CallSignatureDeclarationStructure | ConstructSignatureDeclarationStructure | IndexSignatureDeclarationStructure
| MethodSignatureStructure | PropertySignatureStructure;

export type Structures = StatementStructures | ClassMemberStructures | EnumMemberStructure | InterfaceMemberStructures;
3 changes: 2 additions & 1 deletion src/structures/enum/EnumDeclarationStructure.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { AmbientableNodeStructure, ExportableNodeStructure, JSDocableNodeStructure, NamedNodeStructure } from "../base";
import { Structure, KindedStructure } from "../Structure";
import { OptionalKind } from "../types";
import { StructureKind } from "../StructureKind";
import { EnumMemberStructure } from "./EnumMemberStructure";

Expand All @@ -10,5 +11,5 @@ export interface EnumDeclarationStructure

export interface EnumDeclarationSpecificStructure extends KindedStructure<StructureKind.Enum> {
isConst?: boolean;
members?: EnumMemberStructure[];
members?: OptionalKind<EnumMemberStructure>[];
}
5 changes: 3 additions & 2 deletions src/structures/enum/EnumMemberStructure.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { InitializerExpressionableNodeStructure, JSDocableNodeStructure, PropertyNamedNodeStructure } from "../base";
import { Structure } from "../Structure";
import { Structure, KindedStructure } from "../Structure";
import { StructureKind } from "../StructureKind";

export interface EnumMemberStructure
extends Structure, EnumMemberSpecificStructure, PropertyNamedNodeStructure, JSDocableNodeStructure, InitializerExpressionableNodeStructure
{
}

export interface EnumMemberSpecificStructure {
export interface EnumMemberSpecificStructure extends KindedStructure<StructureKind.EnumMember> {
/** Convenience property for setting the initializer. */
value?: number | string;
}
10 changes: 5 additions & 5 deletions src/tests/compiler/ast/enum/enumDeclarationTests.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect } from "chai";
import { EnumDeclaration, EnumMember } from "../../../../compiler";
import { EnumDeclarationSpecificStructure, EnumMemberStructure, EnumDeclarationStructure, StructureKind } from "../../../../structures";
import { EnumDeclarationSpecificStructure, EnumMemberStructure, EnumDeclarationStructure, StructureKind, OptionalKind } from "../../../../structures";
import { getInfoFromText, OptionalKindAndTrivia, OptionalTrivia } from "../../testHelpers";

describe(nameof(EnumDeclaration), () => {
Expand Down Expand Up @@ -54,7 +54,7 @@ describe(nameof(EnumDeclaration), () => {
});

describe(nameof<EnumDeclaration>(d => d.insertMembers), () => {
function doTest(startCode: string, index: number, structures: EnumMemberStructure[], expectedCode: string) {
function doTest(startCode: string, index: number, structures: OptionalKind<EnumMemberStructure>[], expectedCode: string) {
const { firstChild, sourceFile } = getInfoFromText<EnumDeclaration>(startCode);
const result = firstChild.insertMembers(index, structures);
expect(sourceFile.getFullText()).to.equal(expectedCode);
Expand Down Expand Up @@ -108,7 +108,7 @@ describe(nameof(EnumDeclaration), () => {
});

describe(nameof<EnumDeclaration>(d => d.insertMember), () => {
function doTest(startCode: string, index: number, structure: EnumMemberStructure, expectedCode: string) {
function doTest(startCode: string, index: number, structure: OptionalKind<EnumMemberStructure>, expectedCode: string) {
const { firstChild, sourceFile } = getInfoFromText<EnumDeclaration>(startCode);
const result = firstChild.insertMember(index, structure);
expect(sourceFile.getFullText()).to.equal(expectedCode);
Expand All @@ -121,7 +121,7 @@ describe(nameof(EnumDeclaration), () => {
});

describe(nameof<EnumDeclaration>(d => d.addMember), () => {
function doTest(startCode: string, structure: EnumMemberStructure, expectedCode: string) {
function doTest(startCode: string, structure: OptionalKind<EnumMemberStructure>, expectedCode: string) {
const { firstChild, sourceFile } = getInfoFromText<EnumDeclaration>(startCode);
const result = firstChild.addMember(structure);
expect(sourceFile.getFullText()).to.equal(expectedCode);
Expand All @@ -134,7 +134,7 @@ describe(nameof(EnumDeclaration), () => {
});

describe(nameof<EnumDeclaration>(d => d.addMembers), () => {
function doTest(startCode: string, structures: EnumMemberStructure[], expectedCode: string) {
function doTest(startCode: string, structures: OptionalKind<EnumMemberStructure>[], expectedCode: string) {
const { firstChild, sourceFile } = getInfoFromText<EnumDeclaration>(startCode);
const result = firstChild.addMembers(structures);
expect(sourceFile.getFullText()).to.equal(expectedCode);
Expand Down
19 changes: 10 additions & 9 deletions src/tests/compiler/ast/enum/enumMemberTests.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { expect } from "chai";
import { EnumDeclaration, EnumMember } from "../../../../compiler";
import { EnumMemberSpecificStructure, EnumMemberStructure } from "../../../../structures";
import { EnumMemberSpecificStructure, EnumMemberStructure, OptionalKind, StructureKind } from "../../../../structures";
import { getInfoFromText, OptionalTrivia } from "../../testHelpers";

function getInfoFromTextWithFirstMember(text: string) {
Expand Down Expand Up @@ -103,7 +103,7 @@ describe(nameof(EnumMember), () => {
});

it("should change when specifying", () => {
const structure: MakeRequired<EnumMemberSpecificStructure> = {
const structure: OptionalKind<MakeRequired<EnumMemberSpecificStructure>> = {
value: 5
};
doTest("enum Identifier { member }", structure, "enum Identifier { member = 5 }");
Expand All @@ -120,6 +120,7 @@ describe(nameof(EnumMember), () => {
// to enum members (ex. `enum Enum { member = myValue }`).
it("should get structure from an empty enum member", () => {
doTest("enum a { member }", {
kind: StructureKind.EnumMember,
name: "member",
initializer: undefined,
docs: [],
Expand All @@ -133,13 +134,13 @@ enum b {
/** Test */
'str' = 3.14
}`;
doTest(code,
{
name: "\'str\'",
initializer: "3.14",
docs: [{ description: "Test" }],
value: undefined
});
doTest(code, {
kind: StructureKind.EnumMember,
name: "\'str\'",
initializer: "3.14",
docs: [{ description: "Test" }],
value: undefined
});
});
});
});

0 comments on commit 3af3d32

Please sign in to comment.