docs: function findSourceFile(fileName, path, isDefaultLib, isReference, refFile, refPos, refEnd) {
              if (filesByName.contains(path)) {
                  var file_1 = filesByName.get(path);
                  // try to check if we've already seen this file but with a different casing in path
                  // NOTE: this only makes sense for case-insensitive file systems
                  if (file_1 && options.forceConsistentCasingInFileNames && ts.getNormalizedAbsolutePath(file_1.fileName, currentDirectory) !== ts.getNormalizedAbsolutePath(fileName, currentDirectory)) {
                      reportFileNamesDifferOnlyInCasingError(fileName, file_1.fileName, refFile, refPos, refEnd);
                  }
                  // If the file was previously found via a node_modules search, but is now being processed as a root file,
                  // then everything it sucks in may also be marked incorrectly, and needs to be checked again.
                  if (file_1 && sourceFilesFoundSearchingNodeModules[file_1.path] && currentNodeModulesDepth == 0) {
                      sourceFilesFoundSearchingNodeModules[file_1.path] = false;
                      if (!options.noResolve) {
                          processReferencedFiles(file_1, ts.getDirectoryPath(fileName), isDefaultLib);
                          processTypeReferenceDirectives(file_1);
                      }
                      modulesWithElidedImports[file_1.path] = false;
                      processImportedModules(file_1, ts.getDirectoryPath(fileName));
                  }
                  else if (file_1 && modulesWithElidedImports[file_1.path]) {
                      if (currentNodeModulesDepth < maxNodeModulesJsDepth) {
                          modulesWithElidedImports[file_1.path] = false;
                          processImportedModules(file_1, ts.getDirectoryPath(fileName));
                      }
                  }
                  return file_1;
              }
              // We haven't looked for this file, do so now and cache result
              var file = host.getSourceFile(fileName, options.target, function (hostErrorMessage) {
                  if (refFile !== undefined && refPos !== undefined && refEnd !== undefined) {
                      fileProcessingDiagnostics.add(ts.createFileDiagnostic(refFile, refPos, refEnd - refPos, ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                  }
                  else {
                      fileProcessingDiagnostics.add(ts.createCompilerDiagnostic(ts.Diagnostics.Cannot_read_file_0_Colon_1, fileName, hostErrorMessage));
                  }
              });
              filesByName.set(path, file);
              if (file) {
                  sourceFilesFoundSearchingNodeModules[path] = (currentNodeModulesDepth > 0);
                  file.path = path;
                  if (host.useCaseSensitiveFileNames()) {
                      // for case-sensitive file systems check if we've already seen some file with similar filename ignoring case
                      var existingFile = filesByNameIgnoreCase.get(path);
                      if (existingFile) {
                          reportFileNamesDifferOnlyInCasingError(fileName, existingFile.fileName, refFile, refPos, refEnd);
                      }
                      else {
                          filesByNameIgnoreCase.set(path, file);
                      }
                  }
                  skipDefaultLib = skipDefaultLib || file.hasNoDefaultLib;
                  var basePath = ts.getDirectoryPath(fileName);
                  if (!options.noResolve) {
                      processReferencedFiles(file, basePath, isDefaultLib);
                      processTypeReferenceDirectives(file);
                  }
                  // always process imported modules to record module name resolutions
                  processImportedModules(file, basePath);
                  if (isDefaultLib) {
                      files.unshift(file);
                  }
                  else {
                      files.push(file);
                  }
              }
              return file;
          }