private ResolvedFile ResolveFile(string/*!*/ path, string/*!*/ extension, bool appendExtensions, string[]/*!*/ knownExtensions) {
Debug.Assert(RubyUtils.GetExtension(path) == extension);
string expandedPath = RubyUtils.ExpandPath(_context.Platform, path);
// MRI doesn't load file w/o .rb extension:
if (IsKnownExtension(extension, knownExtensions)) {
return GetSourceUnit(path, expandedPath, extension, false);
}
if (_LibraryExtensions.IndexOf(extension, DlrConfiguration.FileExtensionComparer) != -1) {
if (Platform.FileExists(expandedPath)) {
return new ResolvedFile(expandedPath, null);
}
} else if (!appendExtensions) {
return GetSourceUnit(path, expandedPath, extension, false);
}
if (appendExtensions) {
List<string> matchingExtensions = GetExtensionsOfExistingFiles(expandedPath, knownExtensions);
if (matchingExtensions.Count == 1) {
return GetSourceUnit(path + matchingExtensions[0], expandedPath + matchingExtensions[0], matchingExtensions[0], true);
} else if (matchingExtensions.Count > 1) {
Exception e = new AmbiguousFileNameException(expandedPath + matchingExtensions[0], expandedPath + matchingExtensions[1]);
throw RubyExceptions.CreateLoadError(e);
}
foreach (string libExtension in _LibraryExtensions) {
if (Platform.FileExists(expandedPath + libExtension)) {
return new ResolvedFile(expandedPath + libExtension, libExtension);
}
}
}
return null;
}