Skip to content

Commit 3b0b696

Browse files
committed
broken
1 parent d02eb6c commit 3b0b696

File tree

3 files changed

+95
-8
lines changed

3 files changed

+95
-8
lines changed

src/compiler/checker.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ namespace ts {
8181
getIndexTypeOfType,
8282
getBaseTypes,
8383
getReturnTypeOfSignature,
84+
resolveStructuredTypeMembers,
8485
getNonNullableType,
8586
getSymbolsInScope,
8687
getSymbolAtLocation,
@@ -6586,10 +6587,12 @@ namespace ts {
65866587
}
65876588
}
65886589

6589-
// Compare two types and return
6590-
// Ternary.True if they are related with no assumptions,
6591-
// Ternary.Maybe if they are related with assumptions of other relationships, or
6592-
// Ternary.False if they are not related.
6590+
/**
6591+
* Compare two types and return
6592+
* * Ternary.True if they are related with no assumptions,
6593+
* * Ternary.Maybe if they are related with assumptions of other relationships, or
6594+
* * Ternary.False if they are not related.
6595+
*/
65936596
function isRelatedTo(source: Type, target: Type, reportErrors?: boolean, headMessage?: DiagnosticMessage): Ternary {
65946597
let result: Ternary;
65956598
if (source.flags & TypeFlags.StringOrNumberLiteral && source.flags & TypeFlags.FreshLiteral) {

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2251,6 +2251,7 @@ namespace ts {
22512251
getSignaturesOfType(type: Type, kind: SignatureKind): Signature[];
22522252
getIndexTypeOfType(type: Type, kind: IndexKind): Type;
22532253
getBaseTypes(type: InterfaceType): ObjectType[];
2254+
resolveStructuredTypeMembers(type: StructuredType): ResolvedType;
22542255
getReturnTypeOfSignature(signature: Signature): Type;
22552256
getNonNullableType(type: Type): Type;
22562257

src/services/utilities.ts

Lines changed: 87 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ namespace ts {
372372
export function isThis(node: Node): boolean {
373373
switch (node.kind) {
374374
case SyntaxKind.ThisKeyword:
375-
// case SyntaxKind.ThisType: TODO: GH#9267
375+
// case SyntaxKind.ThisType: TODO: GH#9267
376376
return true;
377377
case SyntaxKind.Identifier:
378378
// 'this' as a parameter
@@ -1359,14 +1359,98 @@ namespace ts {
13591359
};
13601360
}
13611361

1362+
/*
1363+
const classMembers: TypeElement[]; // TODO: this
1364+
const implementedInterfaceMembers: TypeElement[] = [];
1365+
const parentAbstractMembers: TypeElement[] = []
1366+
const missingMembers: TypeElement[] = [];
1367+
// const typeWiththis = checker.getTypeWithThisArgument(classType);
1368+
// const staticType = <ObjectType>checker.getTypeOfSymbol(symbol);
1369+
// const classType = <InterfaceType>checker.getTypeAtLocation(classDecl);
1370+
*/
1371+
1372+
export function getUnimplementedMemberChanges(classDecl: ClassDeclaration, checker: TypeChecker): TextChange[] {
1373+
const baseTypeNode: ExpressionWithTypeArguments = getClassExtendsHeritageClauseElement(classDecl);
1374+
1375+
if (!baseTypeNode)
1376+
{
1377+
return [];
1378+
}
1379+
const classSymbol = checker.getSymbolAtLocation(classDecl);
1380+
const classType = <InterfaceType>checker.getDeclaredTypeOfSymbol(classSymbol);
1381+
1382+
const baseTypes = checker.getBaseTypes(classType);
1383+
Debug.assert(baseTypes.length === 1);
1384+
const baseType = baseTypes[0];
1385+
1386+
const resolvedClassType = checker.resolveStructuredTypeMembers(classType);
1387+
const resolvedBaseType = checker.resolveStructuredTypeMembers(baseType);
1388+
1389+
const missingMembers = filterMissingMembers(resolvedClassType.members, resolvedBaseType.members);
1390+
return insertionsForMembers(missingMembers);
1391+
}
1392+
1393+
// TODO: (arozga) Get changes for interface as well.
1394+
// const implementedTypeNodes = getClassImplementsHeritageClauseElements(classDecl);
1395+
}
1396+
1397+
function insertionsForMembers(symbols: Symbol[]): TextChange[] {
1398+
let changes: TextChange[] = [];
1399+
for (const symbol of symbols) {
1400+
const decl = getdeclaration
1401+
switch (member.kind) {
1402+
case SyntaxKind.PropertySignature:
1403+
case SyntaxKind.PropertyDeclaration:
1404+
break;
1405+
case SyntaxKind.MethodSignature:
1406+
case SyntaxKind.MethodDeclaration:
1407+
break;
1408+
default:
1409+
break;
1410+
}
1411+
}
1412+
return changes;
1413+
}
1414+
1415+
// TODO: (arozga) simplify to quadratic time solution.
1416+
function filterMissingMembers(sourceSymbols: Map<Symbol>, targetSymbols: Map<Symbol>): Symbol[] {
1417+
let missingMembers: Symbol[] = [];
1418+
const sortedSourceKeys = Object.keys(sourceSymbols).sort();
1419+
const sortedTargetKeys = Object.keys(targetSymbols).sort();
1420+
1421+
let i = 0;
1422+
let j = 0;
1423+
while (i < sortedSourceKeys.length && j < sortedTargetKeys.length) {
1424+
// TODO: (arozga) convert switch to if else with inequalities (browser compat?)
1425+
switch (sortedSourceKeys[i].localeCompare(sortedSourceKeys[j])) {
1426+
case 0:
1427+
++i;
1428+
++j;
1429+
break;
1430+
case -1:
1431+
missingMembers.push(sourceSymbols[sortedSourceKeys[i]]);
1432+
++i;
1433+
break;
1434+
case 1:
1435+
++j;
1436+
default:
1437+
}
1438+
}
1439+
1440+
return missingMembers;
1441+
}
1442+
1443+
/**
1444+
* Generates codefix changes to insert
1445+
*/
13621446
export function getCodeFixChanges(interfaceClause: Node, existingMembers: string[], startPos: number, checker: TypeChecker, reference: boolean, trackingAddedMembers: string[], newLineCharacter: string): TextChange[] {
13631447
const type = checker.getTypeAtLocation(interfaceClause);
13641448

13651449
if (!(type && type.symbol && type.symbol.declarations && type.symbol.declarations.length > 0)) {
13661450
return [];
13671451
}
13681452

1369-
const missingMembers = getMissingInterfaceMembers(<InterfaceDeclaration>type.symbol.declarations[0], existingMembers, checker);
1453+
const missingMembers: TypeElement[] = getMissingInterfaceMembers(<InterfaceDeclaration>type.symbol.declarations[0], existingMembers, checker);
13701454
const changesArray: TextChange[] = [];
13711455

13721456
for (const member of missingMembers) {
@@ -1405,7 +1489,7 @@ namespace ts {
14051489
* Gets members in an interface and all its base types.
14061490
*/
14071491
function getInterfaceMembers(declaration: InterfaceDeclaration, checker: TypeChecker): TypeElement[] {
1408-
let result: TypeElement[] = declaration.members
1492+
let result: TypeElement[] = declaration.members
14091493
? declaration.members.filter(member => !(getModifierFlags(member) & ModifierFlags.Private))
14101494
: [];
14111495
const clauses = getInterfaceBaseTypeNodes(declaration);
@@ -1424,7 +1508,6 @@ namespace ts {
14241508
function getMissingInterfaceMembers(declaration: InterfaceDeclaration, existingMembers: string[], checker: TypeChecker): TypeElement[] {
14251509
const interfaceMembers = getInterfaceMembers(declaration, checker);
14261510
return ts.filter(interfaceMembers, member => !member.name || existingMembers.indexOf(member.name.getText()) === -1);
1427-
14281511
}
14291512

14301513
export function getNamedClassMembers(classDeclaration: ClassDeclaration): ClassElement[] {

0 commit comments

Comments
 (0)