@@ -372,7 +372,7 @@ namespace ts {
372
372
export function isThis ( node : Node ) : boolean {
373
373
switch ( node . kind ) {
374
374
case SyntaxKind . ThisKeyword :
375
- // case SyntaxKind.ThisType: TODO: GH#9267
375
+ // case SyntaxKind.ThisType: TODO: GH#9267
376
376
return true ;
377
377
case SyntaxKind . Identifier :
378
378
// 'this' as a parameter
@@ -1359,14 +1359,98 @@ namespace ts {
1359
1359
} ;
1360
1360
}
1361
1361
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
+ */
1362
1446
export function getCodeFixChanges ( interfaceClause : Node , existingMembers : string [ ] , startPos : number , checker : TypeChecker , reference : boolean , trackingAddedMembers : string [ ] , newLineCharacter : string ) : TextChange [ ] {
1363
1447
const type = checker . getTypeAtLocation ( interfaceClause ) ;
1364
1448
1365
1449
if ( ! ( type && type . symbol && type . symbol . declarations && type . symbol . declarations . length > 0 ) ) {
1366
1450
return [ ] ;
1367
1451
}
1368
1452
1369
- const missingMembers = getMissingInterfaceMembers ( < InterfaceDeclaration > type . symbol . declarations [ 0 ] , existingMembers , checker ) ;
1453
+ const missingMembers : TypeElement [ ] = getMissingInterfaceMembers ( < InterfaceDeclaration > type . symbol . declarations [ 0 ] , existingMembers , checker ) ;
1370
1454
const changesArray : TextChange [ ] = [ ] ;
1371
1455
1372
1456
for ( const member of missingMembers ) {
@@ -1405,7 +1489,7 @@ namespace ts {
1405
1489
* Gets members in an interface and all its base types.
1406
1490
*/
1407
1491
function getInterfaceMembers ( declaration : InterfaceDeclaration , checker : TypeChecker ) : TypeElement [ ] {
1408
- let result : TypeElement [ ] = declaration . members
1492
+ let result : TypeElement [ ] = declaration . members
1409
1493
? declaration . members . filter ( member => ! ( getModifierFlags ( member ) & ModifierFlags . Private ) )
1410
1494
: [ ] ;
1411
1495
const clauses = getInterfaceBaseTypeNodes ( declaration ) ;
@@ -1424,7 +1508,6 @@ namespace ts {
1424
1508
function getMissingInterfaceMembers ( declaration : InterfaceDeclaration , existingMembers : string [ ] , checker : TypeChecker ) : TypeElement [ ] {
1425
1509
const interfaceMembers = getInterfaceMembers ( declaration , checker ) ;
1426
1510
return ts . filter ( interfaceMembers , member => ! member . name || existingMembers . indexOf ( member . name . getText ( ) ) === - 1 ) ;
1427
-
1428
1511
}
1429
1512
1430
1513
export function getNamedClassMembers ( classDeclaration : ClassDeclaration ) : ClassElement [ ] {
0 commit comments