Skip to content

Commit b111493

Browse files
author
Andy
authored
Remove unnecessary *OrUndefined calls (#18889)
* Remove unnecessary *OrUndefined calls * Add 'first'
1 parent b21d8a4 commit b111493

File tree

2 files changed

+16
-6
lines changed

2 files changed

+16
-6
lines changed

src/compiler/core.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -866,13 +866,23 @@ namespace ts {
866866
return elementAt(array, 0);
867867
}
868868

869+
export function first<T>(array: ReadonlyArray<T>): T {
870+
Debug.assert(array.length !== 0);
871+
return array[0];
872+
}
873+
869874
/**
870875
* Returns the last element of an array if non-empty, `undefined` otherwise.
871876
*/
872877
export function lastOrUndefined<T>(array: ReadonlyArray<T>): T | undefined {
873878
return elementAt(array, -1);
874879
}
875880

881+
export function last<T>(array: ReadonlyArray<T>): T {
882+
Debug.assert(array.length !== 0);
883+
return array[array.length - 1];
884+
}
885+
876886
/**
877887
* Returns the only element of an array if it contains only one element, `undefined` otherwise.
878888
*/

src/services/refactors/extractSymbol.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ namespace ts.refactor.extractSymbol {
469469
* depending on what's in the extracted body.
470470
*/
471471
function collectEnclosingScopes(range: TargetRange): Scope[] | undefined {
472-
let current: Node = isReadonlyArray(range.range) ? firstOrUndefined(range.range) : range.range;
472+
let current: Node = isReadonlyArray(range.range) ? first(range.range) : range.range;
473473
if (range.facts & RangeFacts.UsesThis) {
474474
// if range uses this as keyword or as type inside the class then it can only be extracted to a method of the containing class
475475
const containingClass = getContainingClass(current);
@@ -746,7 +746,7 @@ namespace ts.refactor.extractSymbol {
746746
}
747747

748748
const changeTracker = textChanges.ChangeTracker.fromContext(context);
749-
const minInsertionPos = (isReadonlyArray(range.range) ? lastOrUndefined(range.range) : range.range).end;
749+
const minInsertionPos = (isReadonlyArray(range.range) ? last(range.range) : range.range).end;
750750
const nodeToInsertBefore = getNodeToInsertFunctionBefore(minInsertionPos, scope);
751751
if (nodeToInsertBefore) {
752752
changeTracker.insertNodeBefore(context.file, nodeToInsertBefore, newFunction, { suffix: context.newLineCharacter + context.newLineCharacter });
@@ -830,7 +830,7 @@ namespace ts.refactor.extractSymbol {
830830
}
831831

832832
const edits = changeTracker.getChanges();
833-
const renameRange = isReadonlyArray(range.range) ? range.range[0] : range.range;
833+
const renameRange = isReadonlyArray(range.range) ? first(range.range) : range.range;
834834

835835
const renameFilename = renameRange.getSourceFile().fileName;
836836
const renameLocation = getRenameLocation(edits, renameFilename, functionNameText, /*isDeclaredBeforeUse*/ false);
@@ -1226,7 +1226,7 @@ namespace ts.refactor.extractSymbol {
12261226
*/
12271227
function getEnclosingTextRange(targetRange: TargetRange, sourceFile: SourceFile): TextRange {
12281228
return isReadonlyArray(targetRange.range)
1229-
? { pos: targetRange.range[0].getStart(sourceFile), end: targetRange.range[targetRange.range.length - 1].getEnd() }
1229+
? { pos: first(targetRange.range).getStart(sourceFile), end: last(targetRange.range).getEnd() }
12301230
: targetRange.range;
12311231
}
12321232

@@ -1272,7 +1272,7 @@ namespace ts.refactor.extractSymbol {
12721272

12731273
const expressionDiagnostic =
12741274
isReadonlyArray(targetRange.range) && !(targetRange.range.length === 1 && isExpressionStatement(targetRange.range[0]))
1275-
? ((start, end) => createFileDiagnostic(sourceFile, start, end - start, Messages.ExpressionExpected))(firstOrUndefined(targetRange.range).getStart(), lastOrUndefined(targetRange.range).end)
1275+
? ((start, end) => createFileDiagnostic(sourceFile, start, end - start, Messages.ExpressionExpected))(first(targetRange.range).getStart(), last(targetRange.range).end)
12761276
: undefined;
12771277

12781278
// initialize results
@@ -1299,7 +1299,7 @@ namespace ts.refactor.extractSymbol {
12991299
const target = isReadonlyArray(targetRange.range) ? createBlock(<Statement[]>targetRange.range) : targetRange.range;
13001300
const containingLexicalScopeOfExtraction = isBlockScope(scopes[0], scopes[0].parent) ? scopes[0] : getEnclosingBlockScopeContainer(scopes[0]);
13011301

1302-
const unmodifiedNode = isReadonlyArray(targetRange.range) ? targetRange.range[0] : targetRange.range;
1302+
const unmodifiedNode = isReadonlyArray(targetRange.range) ? first(targetRange.range) : targetRange.range;
13031303
const inGenericContext = isInGenericContext(unmodifiedNode);
13041304

13051305
collectUsages(target);

0 commit comments

Comments
 (0)