diff --git a/IDE/src/Compiler/BfCompiler.bf b/IDE/src/Compiler/BfCompiler.bf index a5576f34..d9aef379 100644 --- a/IDE/src/Compiler/BfCompiler.bf +++ b/IDE/src/Compiler/BfCompiler.bf @@ -10,6 +10,7 @@ using Beefy.utils; using IDE.Util; using IDE.ui; using IDE.util; +using System.IO; namespace IDE.Compiler { @@ -419,6 +420,7 @@ namespace IDE.Compiler var editData = gApp.GetEditData(projectSource, false); using (gApp.mMonitor.Enter()) { + editData.mFileTime = File.GetLastWriteTime(sourceFilePath).GetValueOrDefault(); editData.SetSavedData(data, char8IdData); if (hash case .MD5(let md5Hash)) editData.mMD5Hash = md5Hash; diff --git a/IDE/src/FileEditData.bf b/IDE/src/FileEditData.bf index 9e710624..8f461c23 100644 --- a/IDE/src/FileEditData.bf +++ b/IDE/src/FileEditData.bf @@ -44,6 +44,7 @@ namespace IDE public MD5Hash mRecoveryHash; public MD5Hash mMD5Hash; public SHA256Hash mSHA256Hash; + public DateTime mFileTime; public this() { diff --git a/IDE/src/FileWatcher.bf b/IDE/src/FileWatcher.bf index 201c5d9b..4b1e89b3 100644 --- a/IDE/src/FileWatcher.bf +++ b/IDE/src/FileWatcher.bf @@ -89,7 +89,7 @@ namespace IDE var newPath; if (isDirectory) { - if (newPath.EndsWith(Path.DirectorySeparatorChar)) + if ((newPath != null) && (newPath.EndsWith(Path.DirectorySeparatorChar))) { newPath = scope:: String(); newPath.Append(@newPath, 0, @newPath.Length - 1); @@ -259,9 +259,9 @@ namespace IDE { String fullPath = scope String(); fullPath.Append(fileSystemWatcher.Directory); + fullPath.Append(Path.DirectorySeparatorChar); if (fileName != null) { - fullPath.Append(Path.DirectorySeparatorChar); fullPath.Append(fileName); } diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index 3f901863..b9169f4e 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -1462,6 +1462,8 @@ namespace IDE return false; } + editData.mFileTime = File.GetLastWriteTime(path).GetValueOrDefault(); + editData.mLastFileTextVersion = editData.mEditWidget.Content.mData.mCurTextVersionId; mFileWatcher.OmitFileChange(path, text); if (forcePath == null) @@ -5935,6 +5937,7 @@ namespace IDE editData.BuildHash(text); } ) case .Err) return false; + editData.mFileTime = File.GetLastWriteTime(editData.mFilePath).GetValueOrDefault(); mFileWatcher.FileIsValid(editData.mFilePath); @@ -8383,6 +8386,7 @@ namespace IDE if (*sourceHash case .MD5(let md5Hash)) editData.mMD5Hash = md5Hash; } + editData.mFileTime = File.GetLastWriteTime(fullPath).GetValueOrDefault(); } return isValid; } @@ -12688,6 +12692,46 @@ namespace IDE if (let projectFolder = projectItem as ProjectFolder) mProjectPanel.QueueRehupFolder(projectFolder); } + + // Manually scan project files for changes + mWorkspace.WithProjectItems(scope (projectItem) => + { + var projectSource = projectItem as ProjectSource; + if (projectSource != null) + { + bool changed = false; + var editData = projectSource.mEditData; + if (editData != null) + { + if (File.GetLastWriteTime(editData.mFilePath) case .Ok(let fileTime)) + { + if (fileTime != projectSource.mEditData.mFileTime) + { + if (!projectSource.mEditData.mMD5Hash.IsZero) + { + var text = scope String(); + if (File.ReadAllText(editData.mFilePath, text, true) case .Ok) + { + var hash = MD5.Hash(.((.)text.Ptr, text.Length)); + if (hash != projectSource.mEditData.mMD5Hash) + { + changed = true; + } + } + + } + else + changed = true; + } + + if (changed) + mFileWatcher.FileChanged(editData.mFilePath); + projectSource.mEditData.mFileTime = fileTime; + } + } + } + + }); } } @@ -12797,6 +12841,7 @@ namespace IDE } editData.mFileDeleted = true; } + editData.mFileTime = File.GetLastWriteTime(fileName); using (mMonitor.Enter()) { @@ -13101,7 +13146,7 @@ namespace IDE if ((projectSource.mEditData != null) && (projectSource.mEditData.HasTextChanged())) { var sourceViewPanel = projectSource.mEditData?.mEditWidget.mPanel as SourceViewPanel; - Debug.Assert(sourceViewPanel != null); + Runtime.Assert(sourceViewPanel != null, "Source marked as modified with no SourceViewPanel"); } } @@ -13117,10 +13162,8 @@ namespace IDE }*/ -#if DEBUG if (mUpdateCnt % 120 == 0) VerifyModifiedBuffers(); -#endif if (mWantShowOutput) {