From 807b71d4331c6478f9348c62be2d53bb9effd11c Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 14 Apr 2020 11:37:27 -0700 Subject: [PATCH] Fixed issue of file hashing causing too much rebuilding --- IDE/src/Compiler/BfCompiler.bf | 2 +- IDE/src/Compiler/BfResolveHelper.bf | 2 +- IDE/src/Compiler/CompilerBase.bf | 8 ++++++- IDE/src/IDEApp.bf | 37 ++++++++++++++++++++--------- IDE/src/Workspace.bf | 5 +++- IDE/src/ui/FindResultsPanel.bf | 2 +- IDE/src/ui/ProjectPanel.bf | 2 +- IDE/src/ui/RenameSymbolDialog.bf | 2 +- IDE/src/util/GlobalUndoManager.bf | 4 ++-- IDEHelper/Compiler/BfDefBuilder.cpp | 11 +++++++-- 10 files changed, 53 insertions(+), 22 deletions(-) diff --git a/IDE/src/Compiler/BfCompiler.bf b/IDE/src/Compiler/BfCompiler.bf index 23ddc7c2..da016b6d 100644 --- a/IDE/src/Compiler/BfCompiler.bf +++ b/IDE/src/Compiler/BfCompiler.bf @@ -419,7 +419,7 @@ namespace IDE.Compiler projectSourceCommand.mProjectSource.mLoadFailed = data == null; if ((!mIsResolveOnly) && (data != null)) - IDEApp.sApp.mWorkspace.ProjectSourceCompiled(projectSource, data, char8IdData, canMoveSourceString); + IDEApp.sApp.mWorkspace.ProjectSourceCompiled(projectSource, data, hash, char8IdData, canMoveSourceString); var bfParser = mBfSystem.CreateParser(projectSourceCommand.mProjectSource); if (data != null) diff --git a/IDE/src/Compiler/BfResolveHelper.bf b/IDE/src/Compiler/BfResolveHelper.bf index 597542a3..51c21b0d 100644 --- a/IDE/src/Compiler/BfResolveHelper.bf +++ b/IDE/src/Compiler/BfResolveHelper.bf @@ -112,7 +112,7 @@ namespace IDE.Compiler projectSource.GetFullImportPath(fullPath); if (Path.Equals(fullPath, entry.mFilePath)) { - app.mBfResolveCompiler.QueueProjectSource(projectSource, false); + app.mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); needsResolveAll = true; DeferRefreshVisibleViews(entry.mExludeSourceViewPanel); } diff --git a/IDE/src/Compiler/CompilerBase.bf b/IDE/src/Compiler/CompilerBase.bf index 1a55947b..24cba0bd 100644 --- a/IDE/src/Compiler/CompilerBase.bf +++ b/IDE/src/Compiler/CompilerBase.bf @@ -57,12 +57,18 @@ namespace IDE.Compiler mResolveAllWait = 2; } - public virtual void QueueProjectSource(ProjectSource projectSource, bool wantsHash) + public virtual void QueueProjectSource(ProjectSource projectSource, SourceHash sourceHash, bool wantsHash) { ProjectSourceCommand command = new ProjectSourceCommand(); command.mProjectSource = projectSource; command.mSourceString = new String(); + command.mSourceHash = sourceHash; + + var wantsHash; + if (!(sourceHash case .None)) + wantsHash = false; IDEApp.sApp.FindProjectSourceContent(projectSource, out command.mSourceCharIdData, false, command.mSourceString, wantsHash ? &command.mSourceHash : null); + if (gApp.mBfBuildCompiler == this) { if (gApp.mDbgVersionedCompileDir != null) diff --git a/IDE/src/IDEApp.bf b/IDE/src/IDEApp.bf index bdc82e4d..abf97c5e 100644 --- a/IDE/src/IDEApp.bf +++ b/IDE/src/IDEApp.bf @@ -3170,6 +3170,13 @@ namespace IDE public Dialog Fail(String text, Widget addWidget = null, WidgetWindow parentWindow = null) { + var text; + if (text.Contains('\t')) + { + text = scope:: String()..Append(text); + text.Replace("\t", " "); + } + // Always write to STDOUT even if we're running as a GUI, allowing cases like RunAndWait to pass us a stdout handle Console.Error.WriteLine("ERROR: {0}", text); @@ -7946,7 +7953,7 @@ namespace IDE return hadBeef; } - public bool QueueParseBeefFiles(BfCompiler bfCompiler, bool forceQueue, ProjectFolder projectFolder) + public bool QueueParseBeefFiles(BfCompiler bfCompiler, bool forceQueue, ProjectFolder projectFolder, Project hotProject) { bool hadBeef = false; @@ -7970,7 +7977,7 @@ namespace IDE if (bfCompiler != null) { // Process change in resolve compiler - bfCompiler.QueueProjectSource(projectSource, !bfCompiler.mIsResolveOnly); + bfCompiler.QueueProjectSource(projectSource, .None, !bfCompiler.mIsResolveOnly); } } else // Actual build @@ -7980,7 +7987,15 @@ namespace IDE // mHasChangedSinceLastCompile is safe to set 'false' here since it just determines whether or not // we rebuild the TypeDefs from the sources. It isn't affected by any compilation errors. projectSource.mHasChangedSinceLastCompile = false; - bfCompiler.QueueProjectSource(projectSource, !bfCompiler.mIsResolveOnly); + + SourceHash sourceHash = .None; + if ((hotProject != null) && (!mWorkspace.mCompileInstanceList.IsEmpty)) + { + let compileInstance = mWorkspace.GetProjectSourceCompileInstance(projectSource, 0); + sourceHash = compileInstance.mSourceHash; + } + + bfCompiler.QueueProjectSource(projectSource, sourceHash, !bfCompiler.mIsResolveOnly); hadBeef = true; } } @@ -7990,7 +8005,7 @@ namespace IDE if (item is ProjectFolder) { var innerProjectFolder = (ProjectFolder)item; - hadBeef |= QueueParseBeefFiles(bfCompiler, forceQueue, innerProjectFolder); + hadBeef |= QueueParseBeefFiles(bfCompiler, forceQueue, innerProjectFolder, hotProject); } } @@ -8255,7 +8270,7 @@ namespace IDE if (IsProjectEnabled(project)) { if (reparseFiles) - QueueParseBeefFiles(mBfResolveCompiler, false, project.mRootFolder); + QueueParseBeefFiles(mBfResolveCompiler, false, project.mRootFolder, null); mBfResolveCompiler.QueueDeferredResolveAll(); mBfResolveCompiler.QueueRefreshViewCommand(); } @@ -8263,7 +8278,7 @@ namespace IDE else { if (reparseFiles) - QueueParseBeefFiles(mBfResolveCompiler, false, project.mRootFolder); + QueueParseBeefFiles(mBfResolveCompiler, false, project.mRootFolder, null); } } @@ -8423,7 +8438,7 @@ namespace IDE { if (SetupBeefProjectSettings(bfSystem, bfCompiler, project)) { - doCompile |= QueueParseBeefFiles(bfCompiler, !workspaceOptions.mIncrementalBuild, project.mRootFolder); + doCompile |= QueueParseBeefFiles(bfCompiler, !workspaceOptions.mIncrementalBuild, project.mRootFolder, hotProject); } else if (IsProjectEnabled(project)) success = false; @@ -10932,7 +10947,7 @@ namespace IDE return; var resolveCompiler = GetProjectCompilerForFile(projectSource.mPath); if (resolveCompiler == mBfResolveCompiler) - resolveCompiler.QueueProjectSource(projectSource, false); + resolveCompiler.QueueProjectSource(projectSource, .None, false); projectSource.mHasChangedSinceLastCompile = true; } }); @@ -11835,8 +11850,8 @@ namespace IDE { if (IsBeefFile(newPath)) { - mBfResolveCompiler.QueueProjectSource(projectSource, false); - mBfBuildCompiler.QueueProjectSource(projectSource, true); + mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); + mBfBuildCompiler.QueueProjectSource(projectSource, .None, true); } else { @@ -12115,7 +12130,7 @@ namespace IDE { if (mBfResolveCompiler != null) { - mBfResolveCompiler.QueueProjectSource(projectSource, false); + mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); mBfResolveCompiler.QueueDeferredResolveAll(); mBfResolveCompiler.QueueRefreshViewCommand(); } diff --git a/IDE/src/Workspace.bf b/IDE/src/Workspace.bf index a26e9526..df7da57f 100644 --- a/IDE/src/Workspace.bf +++ b/IDE/src/Workspace.bf @@ -7,6 +7,7 @@ using Beefy.utils; using System.Diagnostics; using System.Threading; using IDE.Util; +using IDE.util; namespace IDE { @@ -316,6 +317,7 @@ namespace IDE public class ProjectSourceCompileInstance { public String mSource ~ delete _; + public SourceHash mSourceHash; public IdSpan mSourceCharIdData ~ _.Dispose(); public int32 mRefCount = 1; @@ -1126,7 +1128,7 @@ namespace IDE } } - public void ProjectSourceCompiled(ProjectSource projectSource, String source, IdSpan sourceCharIdData, bool canMoveSourceString = false) + public void ProjectSourceCompiled(ProjectSource projectSource, String source, SourceHash sourceHash, IdSpan sourceCharIdData, bool canMoveSourceString = false) { using (mMonitor.Enter()) { @@ -1141,6 +1143,7 @@ namespace IDE source.MoveTo(projectSourceCompileInstance.mSource, true); else projectSourceCompileInstance.mSource.Set(source); + projectSourceCompileInstance.mSourceHash = sourceHash; projectSourceCompileInstance.mSourceCharIdData = sourceCharIdData.Duplicate(); ProjectItem* keyPtr; diff --git a/IDE/src/ui/FindResultsPanel.bf b/IDE/src/ui/FindResultsPanel.bf index 099f89fc..f35be998 100644 --- a/IDE/src/ui/FindResultsPanel.bf +++ b/IDE/src/ui/FindResultsPanel.bf @@ -708,7 +708,7 @@ namespace IDE.ui if ((IDEApp.IsBeefFile(filePath)) && (gApp.mBfResolveCompiler != null)) { for (var projectSource in editData.mProjectSources) - gApp.mBfResolveCompiler.QueueProjectSource(projectSource, false); + gApp.mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); gApp.mBfResolveCompiler.QueueDeferredResolveAll(); } diff --git a/IDE/src/ui/ProjectPanel.bf b/IDE/src/ui/ProjectPanel.bf index 0411ae6f..4d328ab6 100644 --- a/IDE/src/ui/ProjectPanel.bf +++ b/IDE/src/ui/ProjectPanel.bf @@ -360,7 +360,7 @@ namespace IDE.ui var resolveCompiler = gApp.GetProjectCompilerForFile(projectSource.mName); if (resolveCompiler != null) { - resolveCompiler.QueueProjectSource(projectSource, false); + resolveCompiler.QueueProjectSource(projectSource, .None, false); resolveCompiler.QueueDeferredResolveAll(); } projectSource.mHasChangedSinceLastCompile = true; diff --git a/IDE/src/ui/RenameSymbolDialog.bf b/IDE/src/ui/RenameSymbolDialog.bf index 1f628ca3..ca7e89f1 100644 --- a/IDE/src/ui/RenameSymbolDialog.bf +++ b/IDE/src/ui/RenameSymbolDialog.bf @@ -740,7 +740,7 @@ namespace IDE.ui if ((mKind == Kind.Rename) && (IDEApp.IsBeefFile(editData.mFilePath))) { for (var projectSource in editData.mProjectSources) - app.mBfResolveCompiler.QueueProjectSource(projectSource, false); + app.mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); app.mBfResolveCompiler.QueueDeferredResolveAll(); } } diff --git a/IDE/src/util/GlobalUndoManager.bf b/IDE/src/util/GlobalUndoManager.bf index acfcadfe..31e218b2 100644 --- a/IDE/src/util/GlobalUndoManager.bf +++ b/IDE/src/util/GlobalUndoManager.bf @@ -83,7 +83,7 @@ namespace IDE.Util for (var projectSource in editData.mProjectSources) { projectSource.HasChangedSinceLastCompile = true; - IDEApp.sApp.mBfResolveCompiler.QueueProjectSource(projectSource, false); + IDEApp.sApp.mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); } } } @@ -127,7 +127,7 @@ namespace IDE.Util for (var projectSource in editData.mProjectSources) { projectSource.HasChangedSinceLastCompile = true; - IDEApp.sApp.mBfResolveCompiler.QueueProjectSource(projectSource, false); + IDEApp.sApp.mBfResolveCompiler.QueueProjectSource(projectSource, .None, false); } } } diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index 395d04dd..c861894a 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1290,8 +1290,8 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration) if (bfParser != NULL) { - mSignatureHashCtx->MixinStr(bfParser->mFileName); - mSignatureHashCtx->Mixin(bfParser->mParserData->mMD5Hash); + mFullHashCtx->MixinStr(bfParser->mFileName); + mFullHashCtx->Mixin(bfParser->mParserData->mMD5Hash); } HashNode(*mSignatureHashCtx, typeDeclaration->mTypeNode); for (auto& baseClassNode : typeDeclaration->mBaseClasses) @@ -2066,6 +2066,13 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString) HashContext inlineHashCtx; + if (mCurSource != NULL) + { + auto bfParser = mCurSource->ToParser(); + if (bfParser != NULL) + inlineHashCtx.MixinStr(bfParser->mFileName); + } + //for (auto methodDef : mCurTypeDef->mMethods) for (int methodIdx = 0; methodIdx < (int)mCurTypeDef->mMethods.size(); methodIdx++) {