@@ -2196,25 +2196,6 @@ namespace ts {
21962196
21972197 return createTypeNodeWorker(type);
21982198
2199- // function createTypeDeclaration(type: Type): Declaration {
2200- // if (!type) {
2201- // if (undefinedArgumentIsError) { encounteredError = true; }
2202- // return undefined;
2203- // }
2204- // if (type.flags & TypeFlags.TypeParameter) {
2205- // const constraint = createTypeNodeWorker(getConstraintFromTypeParameter(<TypeParameter>type)) as TypeNode;
2206- // const defaultParameter = createTypeNodeWorker(getDefaultFromTypeParameter(<TypeParameter>type)) as TypeNode;
2207- // if (!type.symbol) {
2208- // encounteredError = true;
2209- // throw new Error("No symbol for type parameter so can't get name");
2210- // }
2211- // const name = getNameOfSymbol(type.symbol);
2212- // return createTypeParameterDeclaration(name, constraint, defaultParameter);
2213- // }
2214-
2215- // throw new Error("type declarations not implemented.");
2216- // }
2217-
22182199 function createTypeNodeWorker(type: Type): TypeNode {
22192200 if (!type) {
22202201 if (undefinedArgumentIsError) { encounteredError = true; }
@@ -2267,6 +2248,9 @@ namespace ts {
22672248 throw new Error("ESSymbol not implemented");
22682249 }
22692250 if (type.flags & TypeFlags.TypeParameter) {
2251+ if ((<TypeParameter>type).isThisType) {
2252+ return createThis();
2253+ }
22702254 throw new Error("Type Parameter declarations only handled in other worker.");
22712255 }
22722256 if (type.flags & TypeFlags.Union) {
@@ -2332,27 +2316,12 @@ namespace ts {
23322316 // return typeSymbolAccessibility === SymbolAccessibility.Accessible
23332317 // && (!constraint || isTypeAccessibleWorker(constraint, inObjectLiteral, /*inTypeAlias*/false));
23342318 // }
2335- // if (typeSymbolAccessibility === SymbolAccessibility.Accessible) {
2336- // return true;
2337- // }
2338- // if (type.flags & (TypeFlags.Intrinsic | TypeFlags.Literal)) {
2339- // return true;
2340- // }
23412319 // const objectFlags = getObjectFlags(type);
23422320 // if (objectFlags & ObjectFlags.ClassOrInterface) {
23432321 // // If type is a class or interface type that wasn't hit by the isSymbolAccessible check above,
23442322 // // type must be an anonymous class or interface.
23452323 // return false;
23462324 // }
2347- // if (objectFlags & ObjectFlags.Reference) {
2348- // // and vice versa.
2349- // // this case includes tuple types
2350- // const typeArguments = (type as TypeReference).typeArguments || emptyArray;
2351- // return allTypesVisible(typeArguments);
2352- // }
2353- // if (type.flags & TypeFlags.UnionOrIntersection) {
2354- // return allTypesVisible((type as UnionOrIntersectionType).types);
2355- // }
23562325
23572326 if (objectFlags & ObjectFlags.Mapped) {
23582327 Debug.assert(!!(type.flags & TypeFlags.Object));
@@ -2370,25 +2339,68 @@ namespace ts {
23702339
23712340
23722341 // mapToTypeDeclarationsArray(type)
2373- throw new Error("object literal types not implemented .");
2342+ throw new Error("unknown case .");
23742343 }
2375- // what case is this?
2376- throw new Error("unknown case.")
2377- // const members = type.symbol.members;
2378- // let allVisible = true;
2379- // members && members.forEach((member) => {
2380- // const memberType = getTypeOfSymbolAtLocation(member, enclosingDeclaration);
2381- // allVisible = allVisible && isTypeAccessibleWorker(memberType, /*inObjectLiteral*/ true, /*inTypeAlias*/false);
2382- // });
2383- // return allVisible;
2344+
2345+ const members = type.symbol.members;
2346+ const newMembers: TypeElement[] = [];
2347+ memberLoop: for(const key in members){
2348+ const oldMember = members.get(key);
2349+ const name = getNameOfSymbol(oldMember);
2350+ const oldDeclaration = oldMember.declarations && oldMember.declarations[0] as TypeElement;
2351+ if(!oldDeclaration) {
2352+ continue memberLoop;
2353+ }
2354+
2355+ const kind = oldDeclaration.kind;
2356+
2357+ switch (kind) {
2358+ case SyntaxKind.PropertySignature:
2359+ const optional = !!oldDeclaration.questionToken;
2360+ newMembers.push(createPropertySignature(
2361+ createIdentifier(name)
2362+ , optional ? createToken(SyntaxKind.QuestionToken) : undefined
2363+ , createTypeNode(getTypeOfSymbol(oldMember))));
2364+ case SyntaxKind.MethodSignature:
2365+ case SyntaxKind.CallSignature:
2366+ case SyntaxKind.ConstructSignature:
2367+ case SyntaxKind.IndexSignature:
2368+ default:
2369+ throw new Error("type literal constituent not implemented.");
2370+ }
2371+ }
2372+ return createTypeLiteralNode(newMembers);
23842373 }
23852374
23862375 Debug.fail("Should be unreachable.");
23872376
2377+ // function createTypeParameterDeclarationFromType(type: Type): TypeParameterDeclaration {
2378+ // if (!type) {
2379+ // if (undefinedArgumentIsError) { encounteredError = true; }
2380+ // return undefined;
2381+ // }
2382+ // if (type.flags & TypeFlags.TypeParameter) {
2383+ // const constraint = createTypeNodeWorker(getConstraintFromTypeParameter(<TypeParameter>type)) as TypeNode;
2384+ // const defaultParameter = createTypeNodeWorker(getDefaultFromTypeParameter(<TypeParameter>type)) as TypeNode;
2385+ // if (!type.symbol) {
2386+ // encounteredError = true;
2387+ // throw new Error("No symbol for type parameter so can't get name");
2388+ // }
2389+ // const name = getNameOfSymbol(type.symbol);
2390+ // return createTypeParameterDeclaration(name, constraint, defaultParameter);
2391+ // }
2392+ // throw new Error("type declarations not implemented.");
2393+ // }
2394+
23882395 /** Note that mapToTypeNodeArray(undefined) === undefined. */
23892396 function mapToTypeNodeArray(types: Type[]): NodeArray<TypeNode> {
23902397 return asNodeArray(types && types.map(createTypeNodeWorker) as TypeNode[]);
23912398 }
2399+
2400+ // /** Note that mapToTypeNodeArray(undefined) === undefined. */
2401+ // function mapToTypeParameterArray(types: Type[]): NodeArray<TypeNode> {
2402+ // return asNodeArray(types && types.map(createTypeParameterDeclarationFromType) as TypeNode[]);
2403+ // }
23922404 }
23932405 }
23942406
0 commit comments