Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 32a7254

Browse files
committed
Enable strictNullChecks in tsconfig.json
1 parent 4491019 commit 32a7254

19 files changed

+109
-58
lines changed

lib/adapters/apply-edit-adapter.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ export default class ApplyEditAdapter {
4040
}),
4141
);
4242

43-
const checkpoints = [];
43+
const checkpoints: Array<{ buffer: TextBuffer, checkpoint: number}> = [];
4444
try {
4545
for (let i = 0; i < editors.length; i++) {
4646
const editor = editors[i] as TextEditor;
@@ -52,7 +52,7 @@ export default class ApplyEditAdapter {
5252
const buffer = editor.getBuffer();
5353
const checkpoint = buffer.createCheckpoint();
5454
checkpoints.push({buffer, checkpoint});
55-
let prevEdit = null;
55+
let prevEdit: atomIde.TextEdit | null = null;
5656
for (const edit of edits) {
5757
ApplyEditAdapter.validateEdit(buffer, edit, prevEdit);
5858
buffer.setTextInRange(edit.oldRange, edit.newText);
@@ -74,9 +74,13 @@ export default class ApplyEditAdapter {
7474
}
7575

7676
// Private: Do some basic sanity checking on the edit ranges.
77-
private static validateEdit(buffer: TextBuffer, edit: atomIde.TextEdit, prevEdit: atomIde.TextEdit | null): void {
77+
private static validateEdit(
78+
buffer: TextBuffer,
79+
edit: atomIde.TextEdit,
80+
prevEdit: atomIde.TextEdit | null,
81+
): void {
7882
const path = buffer.getPath() || '';
79-
if (prevEdit != null && edit.oldRange.end.compare(prevEdit.oldRange.start) > 0) {
83+
if (prevEdit && edit.oldRange.end.compare(prevEdit.oldRange.start) > 0) {
8084
throw Error(`Found overlapping edit ranges in ${path}`);
8185
}
8286
const startRow = edit.oldRange.start.row;

lib/adapters/autocomplete-adapter.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -267,11 +267,11 @@ export default class AutocompleteAdapter {
267267
// * `editor` An Atom {TextEditor} used to obtain the necessary text replacement.
268268
// * `suggestion` An {atom$AutocompleteSuggestion} to set the replacementPrefix and text properties of.
269269
public static applyTextEditToSuggestion(
270-
textEdit: TextEdit | null,
270+
textEdit: TextEdit | undefined,
271271
editor: TextEditor,
272272
suggestion: AutocompleteSuggestion,
273273
): void {
274-
if (textEdit != null) {
274+
if (textEdit) {
275275
suggestion.replacementPrefix = editor.getTextInBufferRange(Convert.lsRangeToAtomRange(textEdit.range));
276276
suggestion.text = textEdit.newText;
277277
}
@@ -296,7 +296,7 @@ export default class AutocompleteAdapter {
296296
//
297297
// Returns a {String} containing the AutoComplete+ suggestion type equivalent
298298
// to the given completion kind.
299-
public static completionKindToSuggestionType(kind: number | null): string {
299+
public static completionKindToSuggestionType(kind: number | undefined): string {
300300
switch (kind) {
301301
case CompletionItemKind.Constant:
302302
return 'constant';

lib/adapters/code-action-adapter.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ export default class CodeActionAdapter {
2727
public static async getCodeActions(
2828
connection: LanguageClientConnection,
2929
serverCapabilities: ServerCapabilities,
30-
linterAdapter: LinterPushV2Adapter | null,
30+
linterAdapter: LinterPushV2Adapter | undefined ,
3131
editor: TextEditor,
3232
range: Range,
3333
diagnostics: atomIde.Diagnostic[],

lib/adapters/datatip-adapter.ts

+3
Original file line numberDiff line numberDiff line change
@@ -88,5 +88,8 @@ export default class DatatipAdapter {
8888
value: markedString.value,
8989
};
9090
}
91+
92+
// Catch-all case
93+
return { type: 'markdown', value: markedString.toString() };
9194
}
9295
}

lib/adapters/document-sync-adapter.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ export default class DocumentSyncAdapter {
6464
// indicating whether this adapter should care about the contents of the editor.
6565
constructor(
6666
connection: LanguageClientConnection,
67-
documentSyncKind: TextDocumentSyncOptions | number | null,
67+
documentSyncKind: TextDocumentSyncOptions | number | undefined,
6868
editorSelector: (editor: TextEditor) => boolean,
6969
) {
7070
this._connection = connection;
@@ -129,7 +129,7 @@ export default class DocumentSyncAdapter {
129129
);
130130
}
131131

132-
public getEditorSyncAdapter(editor: TextEditor): TextEditorSyncAdapter | null {
132+
public getEditorSyncAdapter(editor: TextEditor): TextEditorSyncAdapter | undefined {
133133
return this._editors.get(editor);
134134
}
135135
}

lib/adapters/linter-push-v2-adapter.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -113,13 +113,13 @@ export default class LinterPushV2Adapter {
113113
if (path != null) {
114114
const diagnosticCodes = this._diagnosticCodes.get(path);
115115
if (diagnosticCodes != null) {
116-
return diagnosticCodes.get(getCodeKey(range, text));
116+
return diagnosticCodes.get(getCodeKey(range, text)) || null;
117117
}
118118
}
119119
return null;
120120
}
121121
}
122122

123123
function getCodeKey(range: atom.Range, text: string): string {
124-
return [].concat(...range.serialize(), text).join(',');
124+
return ([] as any[]).concat(...range.serialize(), text).join(',');
125125
}

lib/adapters/outline-view-adapter.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -115,24 +115,27 @@ export default class OutlineViewAdapter {
115115
return null;
116116
}
117117

118-
let parent = null;
118+
let parent: atomIde.OutlineTree | undefined;
119119
for (const candidate of candidates) {
120120
if (
121121
candidate !== child &&
122122
candidate.startPosition.isLessThanOrEqual(child.startPosition) &&
123-
(candidate.endPosition == null || candidate.endPosition.isGreaterThanOrEqual(child.endPosition))
123+
(candidate.endPosition === undefined ||
124+
(child.endPosition && candidate.endPosition.isGreaterThanOrEqual(child.endPosition)))
124125
) {
125126
if (
126-
parent == null ||
127+
parent === undefined ||
127128
(parent.startPosition.isLessThanOrEqual(candidate.startPosition) ||
128-
(parent.endPosition != null && parent.endPosition.isGreaterThanOrEqual(candidate.endPosition)))
129+
(parent.endPosition != null &&
130+
candidate.endPosition &&
131+
parent.endPosition.isGreaterThanOrEqual(candidate.endPosition)))
129132
) {
130133
parent = candidate;
131134
}
132135
}
133136
}
134137

135-
return parent;
138+
return parent || null;
136139
}
137140

138141
// Public: Convert an individual {SymbolInformation} from the language server

lib/adapters/signature-help-adapter.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ export default class SignatureHelpAdapter {
3131
const {signatureHelpProvider} = this._capabilities;
3232
assert(signatureHelpProvider != null);
3333

34-
let triggerCharacters = null;
35-
if (Array.isArray(signatureHelpProvider.triggerCharacters)) {
34+
let triggerCharacters: Set<string> | undefined;
35+
if (signatureHelpProvider && Array.isArray(signatureHelpProvider.triggerCharacters)) {
3636
triggerCharacters = new Set(signatureHelpProvider.triggerCharacters);
3737
}
3838

lib/auto-languageclient.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default class AutoLanguageClient {
6262
private _disposable = new CompositeDisposable();
6363
private _serverManager: ServerManager;
6464
private _linterDelegate: linter.V2IndieDelegate;
65-
private _signatureHelpRegistry: atomIde.SignatureHelpRegistry;
65+
private _signatureHelpRegistry: atomIde.SignatureHelpRegistry | null;
6666
private _lastAutocompleteRequest: AutocompleteRequest;
6767
private _isDeactivating: boolean;
6868

lib/convert.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ export default class Convert {
159159
case 'deleted':
160160
return [{uri: Convert.pathToUri(fileEvent.path), type: ls.FileChangeType.Deleted}];
161161
case 'renamed': {
162-
const results = [];
162+
const results: Array<{ uri: string, type: ls.FileChangeType }> = [];
163163
if (fileEvent.oldPath) {
164164
results.push({uri: Convert.pathToUri(fileEvent.oldPath || ''), type: ls.FileChangeType.Deleted});
165165
}

lib/download-file.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ export default (async function downloadFile(
3131
throw Error('No response body');
3232
}
3333

34-
const finalLength = length || parseInt(response.headers.get('Content-Length' || '0'), 10);
34+
const finalLength = length || parseInt(response.headers.get('Content-Length') || '0', 10);
3535
const reader = body.getReader();
3636
const writer = fs.createWriteStream(targetFile);
3737

@@ -72,7 +72,7 @@ async function streamWithProgress(
7272
writer.write(Buffer.from(chunk));
7373
if (progressCallback != null) {
7474
bytesDone += chunk.byteLength;
75-
const percent: number = length === 0 ? null : Math.floor(bytesDone / length * 100);
75+
const percent: number | undefined = length === 0 ? undefined : Math.floor(bytesDone / length * 100);
7676
progressCallback(bytesDone, percent);
7777
}
7878
}

lib/server-manager.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ export class ServerManager {
269269
if (filePath == null) {
270270
return null;
271271
}
272-
return this._normalizedProjectPaths.find((d) => filePath.startsWith(d));
272+
return this._normalizedProjectPaths.find((d) => filePath.startsWith(d)) || null;
273273
}
274274

275275
public updateNormalizedProjectPaths(): void {
@@ -293,7 +293,7 @@ export class ServerManager {
293293
}
294294

295295
for (const activeServer of this._activeServers) {
296-
const changes = [];
296+
const changes: ls.FileEvent[] = [];
297297
for (const fileEvent of fileEvents) {
298298
if (fileEvent.path.startsWith(activeServer.projectPath) && this._changeWatchedFileFilter(fileEvent.path)) {
299299
changes.push(Convert.atomFileEventToLSFileEvents(fileEvent)[0]);

test/adapters/autocomplete-adapter.test.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe('AutoCompleteAdapter', () => {
2020
capabilities: {completionProvider: { }},
2121
connection: new ls.LanguageClientConnection(createSpyConnection()),
2222
disposable: new CompositeDisposable(),
23-
process: undefined,
23+
process: undefined as any,
2424
projectPath: '/',
2525
};
2626
}
@@ -279,7 +279,7 @@ describe('AutoCompleteAdapter', () => {
279279

280280
it('does not do anything if there is no textEdit', () => {
281281
const completionItem: AutocompleteSuggestion = {};
282-
AutoCompleteAdapter.applyTextEditToSuggestion(null, new TextEditor(), completionItem);
282+
AutoCompleteAdapter.applyTextEditToSuggestion(undefined, new TextEditor(), completionItem);
283283
expect(completionItem).deep.equals({});
284284
});
285285

@@ -315,7 +315,7 @@ describe('AutoCompleteAdapter', () => {
315315
});
316316

317317
it('defaults to "value"', () => {
318-
const result = AutoCompleteAdapter.completionKindToSuggestionType(null);
318+
const result = AutoCompleteAdapter.completionKindToSuggestionType(undefined);
319319
expect(result).equals('value');
320320
});
321321
});

test/adapters/code-highlight-adapter.test.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,10 @@ describe('CodeHighlightAdapter', () => {
5050
expect(highlightStub.called).to.be.true;
5151

5252
invariant(result != null);
53-
expect(result.length).to.equal(1);
54-
expect(result[0].isEqual(new Range([0, 1], [0, 2]))).to.be.true;
53+
if (result) {
54+
expect(result.length).to.equal(1);
55+
expect(result[0].isEqual(new Range([0, 1], [0, 2]))).to.be.true;
56+
}
5557
});
5658

5759
it('throws if document highlights are not supported', async () => {

test/adapters/datatip-adapter.test.ts

+14-12
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,23 @@ describe('DatatipAdapter', () => {
4848
expect(datatip).to.be.ok;
4949
invariant(datatip != null);
5050

51-
expect(datatip.range.start.row).equal(0);
52-
expect(datatip.range.start.column).equal(1);
53-
expect(datatip.range.end.row).equal(0);
54-
expect(datatip.range.end.column).equal(2);
51+
if (datatip) {
52+
expect(datatip.range.start.row).equal(0);
53+
expect(datatip.range.start.column).equal(1);
54+
expect(datatip.range.end.row).equal(0);
55+
expect(datatip.range.end.column).equal(2);
5556

56-
expect(datatip.markedStrings).to.have.lengthOf(2);
57-
expect(datatip.markedStrings[0]).eql({type: 'markdown', value: 'test'});
57+
expect(datatip.markedStrings).to.have.lengthOf(2);
58+
expect(datatip.markedStrings[0]).eql({type: 'markdown', value: 'test'});
5859

59-
const snippet = datatip.markedStrings[1];
60-
expect(snippet.type).equal('snippet');
61-
invariant(snippet.type === 'snippet');
62-
expect((snippet as any).grammar.scopeName).equal('text.plain.null-grammar');
63-
expect(snippet.value).equal('test snippet');
60+
const snippet = datatip.markedStrings[1];
61+
expect(snippet.type).equal('snippet');
62+
invariant(snippet.type === 'snippet');
63+
expect((snippet as any).grammar.scopeName).equal('text.plain.null-grammar');
64+
expect(snippet.value).equal('test snippet');
6465

65-
expect(grammarSpy.calledWith('source.testlang')).to.be.true;
66+
expect(grammarSpy.calledWith('source.testlang')).to.be.true;
67+
}
6668
});
6769
});
6870
});

test/adapters/document-sync-adapter.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ describe('DocumentSyncAdapter', () => {
4949

5050
describe('constructor', () => {
5151
function create(textDocumentSync) {
52-
return new DocumentSyncAdapter(null, textDocumentSync, () => false);
52+
return new DocumentSyncAdapter(null as any, textDocumentSync, () => false);
5353
}
5454

5555
it('sets _documentSyncKind correctly Incremental for v2 capabilities', () => {

test/adapters/outline-view-adapter.test.ts

+50-14
Original file line numberDiff line numberDiff line change
@@ -121,11 +121,22 @@ describe('OutlineViewAdapter', () => {
121121
containerName: 'duplicate',
122122
},
123123
];
124+
124125
const result = OutlineViewAdapter.createOutlineTrees(sourceItems);
125126
expect(result.length).to.equal(1);
126-
expect(result[0].endPosition.row).to.equal(10);
127-
expect(result[0].children.length).to.equal(1);
128-
expect(result[0].children[0].endPosition.row).to.equal(7);
127+
128+
const outline = result[0];
129+
expect(outline.endPosition).to.not.be.undefined;
130+
if (outline.endPosition) {
131+
expect(outline.endPosition.row).to.equal(10);
132+
expect(outline.children.length).to.equal(1);
133+
134+
const outlineChild = outline.children[0];
135+
expect(outlineChild.endPosition).to.not.be.undefined;
136+
if (outlineChild.endPosition) {
137+
expect(outlineChild.endPosition.row).to.equal(7);
138+
}
139+
}
129140
});
130141

131142
it('parents to the innnermost named container', () => {
@@ -141,11 +152,29 @@ describe('OutlineViewAdapter', () => {
141152
];
142153
const result = OutlineViewAdapter.createOutlineTrees(sourceItems);
143154
expect(result.length).to.equal(1);
144-
expect(result[0].endPosition.row).to.equal(10);
145-
expect(result[0].children.length).to.equal(1);
146-
expect(result[0].children[0].endPosition.row).to.equal(8);
147-
expect(result[0].children[0].children.length).to.equal(1);
148-
expect(result[0].children[0].children[0].endPosition.row).to.equal(5);
155+
156+
const outline = result[0];
157+
expect(outline).to.not.be.undefined;
158+
if (outline) {
159+
expect(outline.endPosition).to.not.be.undefined;
160+
if (outline.endPosition) {
161+
expect(outline.endPosition.row).to.equal(10);
162+
expect(outline.children.length).to.equal(1);
163+
164+
const outlineChild = outline.children[0];
165+
expect(outlineChild.endPosition).to.not.be.undefined;
166+
if (outlineChild.endPosition) {
167+
expect(outlineChild.endPosition.row).to.equal(8);
168+
expect(outlineChild.children.length).to.equal(1);
169+
170+
const outlineGrandChild = outlineChild.children[0];
171+
expect(outlineGrandChild.endPosition).to.not.be.undefined;
172+
if (outlineGrandChild.endPosition) {
173+
expect(outlineGrandChild.endPosition.row).to.equal(5);
174+
}
175+
}
176+
}
177+
}
149178
});
150179
});
151180

@@ -156,12 +185,19 @@ describe('OutlineViewAdapter', () => {
156185
expect(result.icon).to.equal('type-class');
157186
expect(result.representativeName).to.equal('Program');
158187
expect(result.children).to.deep.equal([]);
159-
expect(result.tokenizedText[0].kind).to.equal('type');
160-
expect(result.tokenizedText[0].value).to.equal('Program');
161-
expect(result.startPosition.row).to.equal(1);
162-
expect(result.startPosition.column).to.equal(2);
163-
expect(result.endPosition.row).to.equal(3);
164-
expect(result.endPosition.column).to.equal(4);
188+
expect(result.tokenizedText).to.not.be.undefined;
189+
if (result.tokenizedText) {
190+
const resultTokenixedText = result.tokenizedText[0];
191+
expect(result.tokenizedText[0].kind).to.equal('type');
192+
expect(result.tokenizedText[0].value).to.equal('Program');
193+
expect(result.startPosition.row).to.equal(1);
194+
expect(result.startPosition.column).to.equal(2);
195+
expect(result.endPosition).to.not.be.undefined;
196+
if (result.endPosition) {
197+
expect(result.endPosition.row).to.equal(3);
198+
expect(result.endPosition.column).to.equal(4);
199+
}
200+
}
165201
});
166202
});
167203
});

tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"declaration": true,
88
"inlineSources": true,
99
"inlineSourceMap": true,
10+
"strictNullChecks": true,
1011
"baseUrl": "./",
1112
"paths": {
1213
"atom-ide": [

typings/atom-ide/index.d.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ export interface CodeActionProvider {
178178
editor: TextEditor,
179179
range: Range,
180180
diagnostics: Diagnostic[],
181-
): Promise<CodeAction[]>;
181+
): Promise<CodeAction[] | null>;
182182
}
183183

184184
export interface BusySignalOptions {

0 commit comments

Comments
 (0)