Skip to content

Commit

Permalink
#13, MemberedTypeToClass, index signatures.
Browse files Browse the repository at this point in the history
  • Loading branch information
ajvincent committed Jan 26, 2024
1 parent 01cdb21 commit dd17994
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 3 deletions.
8 changes: 8 additions & 0 deletions stage_1_integration/toolbox/MemberedTypeToClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,15 @@ export default class MemberedTypeToClass {
throw new Error("Index signature found, but no index signature resolver is available");
}
const names: string[] = this.#indexSignatureResolver.resolveIndexSignature(member);
names.forEach(name => {
if (this.#aggregateTypeMembersMap.has(name) || temporaryTypeMembers.has(name)) {
throw new Error(`Index signature resolver requested the name "${name}", but this field already exists.`);
}
});

temporaryTypeMembers.addMembers([member]);
const newMembers: NamedTypeMemberImpl[] = temporaryTypeMembers.resolveIndexSignature(member, names);
newMembers.forEach(newMember => temporaryTypeMembers.delete(TypeMembersMap.keyFromMember(newMember)));
newMembers.forEach(newMember => this.#validateTypeMember(isStatic, newMember, temporaryTypeMembers));
return;
}
Expand Down
15 changes: 15 additions & 0 deletions stage_2_fullset/snapshot/source/toolbox/MemberedTypeToClass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -170,8 +170,23 @@ export default class MemberedTypeToClass {
}
const names: string[] =
this.#indexSignatureResolver.resolveIndexSignature(member);
names.forEach((name) => {
if (
this.#aggregateTypeMembersMap.has(name) ||
temporaryTypeMembers.has(name)
) {
throw new Error(
`Index signature resolver requested the name "${name}", but this field already exists.`,
);
}
});

temporaryTypeMembers.addMembers([member]);
const newMembers: NamedTypeMemberImpl[] =
temporaryTypeMembers.resolveIndexSignature(member, names);
newMembers.forEach((newMember) =>
temporaryTypeMembers.delete(TypeMembersMap.keyFromMember(newMember)),
);
newMembers.forEach((newMember) =>
this.#validateTypeMember(isStatic, newMember, temporaryTypeMembers),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,14 @@ import {
ClassFieldStatementsMap,
ClassMembersMap,
GetAccessorDeclarationImpl,
IndexSignatureDeclarationImpl,
type MemberedStatementsKey,
MemberedStatementsKeyClass,
MemberedTypeToClass,
type MemberedTypeToClass_StatementGetter,
MethodSignatureImpl,
ParameterDeclarationImpl,
PropertySignatureImpl,
//type PropertyDeclarationImpl,
SetAccessorDeclarationImpl,
TypeMembersMap,
type stringOrWriterFunction,
Expand Down Expand Up @@ -396,8 +396,51 @@ describe("MemberedTypeToClass", () => {
//#endregion inspecting the class members map
});

xit("will resolve index signatures when it gets them from adding type members", () => {
throw new Error("not yet implemented");
it("will resolve index signatures when it gets them from adding type members", () => {
const index_C = new IndexSignatureDeclarationImpl;
index_C.keyName = "Key";
index_C.keyTypeStructure = "string";
index_C.returnTypeStructure = "boolean";

statementsGetter.setStatements(
"foo", ClassFieldStatementsMap.GROUP_INITIALIZER_OR_PROPERTY, "first", [`true`]
);
statementsGetter.setStatements(
"bar", ClassFieldStatementsMap.GROUP_INITIALIZER_OR_PROPERTY, "first", [`false`]
);

typeToClass.indexSignatureResolver = {
resolveIndexSignature: function(
signature: IndexSignatureDeclarationImpl
): string[]
{
void(signature);
return ["foo", "bar"];
}
}
typeToClass.addTypeMember(false, index_C);
typeToClass.defineStatementsByPurpose("first", false);

const classMembers: ClassMembersMap = typeToClass.buildClassMembersMap();
expect(classMembers.size).toBe(2);

const foo = classMembers.getAsKind<StructureKind.Property>(
StructureKind.Property, false, "foo"
);
expect(foo).not.toBeUndefined();
if (foo) {
expect(foo.typeStructure).toBe("boolean");
expect(foo.initializer).toBe("true");
}

const bar = classMembers.getAsKind<StructureKind.Property>(
StructureKind.Property, false, "bar"
);
expect(bar).not.toBeUndefined();
if (bar) {
expect(bar.typeStructure).toBe("boolean");
expect(bar.initializer).toBe("false");
}
});

xit("will detect collisions between type members", () => {
Expand Down

0 comments on commit dd17994

Please sign in to comment.