Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

No need to run the reconcile operation in WorkspaceJob #2660

Merged
merged 1 commit into from May 23, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -28,11 +28,9 @@
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceRuleFactory;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.resources.WorkspaceJob;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
Expand All @@ -42,7 +40,7 @@
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubMonitor;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
import org.eclipse.core.runtime.jobs.MultiRule;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IBuffer;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
Expand Down Expand Up @@ -107,28 +105,33 @@ public abstract class BaseDocumentLifeCycleHandler {
private static final long PUBLISH_DIAGNOSTICS_MAX_DEBOUNCE = 2000; /*ms*/

private CoreASTProvider sharedASTProvider;
private WorkspaceJob validationTimer;
private WorkspaceJob publishDiagnosticsJob;
private Job validationTimer;
private Job publishDiagnosticsJob;
private Set<ICompilationUnit> toReconcile = new HashSet<>();
private Map<String, Integer> documentVersions = new HashMap<>();
private MovingAverage movingAverageForValidation = new MovingAverage(DOCUMENT_LIFECYCLE_MAX_DEBOUNCE);
private MovingAverage movingAverageForDiagnostics = new MovingAverage(PUBLISH_DIAGNOSTICS_MIN_DEBOUNCE);
protected final PreferenceManager preferenceManager;
private Object reconcileLock = new Object();

public BaseDocumentLifeCycleHandler(PreferenceManager preferenceManager, boolean delayValidation) {
this.preferenceManager = preferenceManager;
this.sharedASTProvider = CoreASTProvider.getInstance();
if (delayValidation) {
this.validationTimer = new WorkspaceJob("Validate documents") {
this.validationTimer = new Job("Validate documents") {
@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
long startTime = System.nanoTime();
IStatus status = performValidation(monitor);
if (status.getSeverity() != IStatus.CANCEL) {
long elapsedTime = System.nanoTime() - startTime;
movingAverageForValidation.update(elapsedTime / 1_000_000);
protected IStatus run(IProgressMonitor monitor) {
try {
long startTime = System.nanoTime();
IStatus status = performValidation(monitor);
if (status.getSeverity() != IStatus.CANCEL) {
long elapsedTime = System.nanoTime() - startTime;
movingAverageForValidation.update(elapsedTime / 1_000_000);
}
return status;
} catch (JavaModelException e) {
return e.getStatus();
}
return status;
}

/* (non-Javadoc)
Expand All @@ -139,7 +142,7 @@ public boolean belongsTo(Object family) {
return DOCUMENT_LIFE_CYCLE_JOBS.equals(family);
}
};
this.publishDiagnosticsJob = new PublishDiagnosticJob(ResourcesPlugin.getWorkspace().getRoot());
this.publishDiagnosticsJob = new PublishDiagnosticJob();
}
}

Expand All @@ -163,12 +166,10 @@ protected void triggerValidation(ICompilationUnit cu, long delay) throws JavaMod
}
if (validationTimer != null) {
validationTimer.cancel();
ISchedulingRule rule = getRule(toReconcile);
if (publishDiagnosticsJob != null) {
publishDiagnosticsJob.cancel();
publishDiagnosticsJob = new PublishDiagnosticJob(rule);
publishDiagnosticsJob = new PublishDiagnosticJob();
}
validationTimer.setRule(rule);
validationTimer.schedule(delay);
} else {
performValidation(new NullProgressMonitor());
Expand All @@ -190,18 +191,6 @@ private long getPublishDiagnosticsDelay() {
);
}

private ISchedulingRule getRule(Set<ICompilationUnit> units) {
ISchedulingRule result = null;
IResourceRuleFactory ruleFactory = ResourcesPlugin.getWorkspace().getRuleFactory();
for (ICompilationUnit unit : units) {
if (unit.getResource() != null) {
ISchedulingRule rule = ruleFactory.createRule(unit.getResource());
result = MultiRule.combine(rule, result);
}
}
return result;
}

private IStatus performValidation(IProgressMonitor monitor) throws JavaModelException {
long start = System.currentTimeMillis();

Expand All @@ -219,13 +208,16 @@ private IStatus performValidation(IProgressMonitor monitor) throws JavaModelExce
}
// first reconcile all units with content changes
SubMonitor progress = SubMonitor.convert(monitor, cusToReconcile.size() + 1);
for (ICompilationUnit cu : cusToReconcile) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
synchronized(reconcileLock) {
for (ICompilationUnit cu : cusToReconcile) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
cu.makeConsistent(progress);
//cu.reconcile(ICompilationUnit.NO_AST, false, null, progress.newChild(1));
}
cu.makeConsistent(progress);
//cu.reconcile(ICompilationUnit.NO_AST, false, null, progress.newChild(1));
}

JavaLanguageServerPlugin.logInfo("Reconciled " + cusToReconcile.size() + ". Took " + (System.currentTimeMillis() - start) + " ms");
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
Expand Down Expand Up @@ -300,7 +292,9 @@ public IProblemRequestor getProblemRequestor(ICompilationUnit workingCopy) {

};
int flags = ICompilationUnit.FORCE_PROBLEM_DETECTION | ICompilationUnit.ENABLE_BINDINGS_RECOVERY | ICompilationUnit.ENABLE_STATEMENTS_RECOVERY;
unit.reconcile(ICompilationUnit.NO_AST, flags, wcOwner, monitor);
synchronized(reconcileLock) {
unit.reconcile(ICompilationUnit.NO_AST, flags, wcOwner, monitor);
}
}

public void didClose(DidCloseTextDocumentParams params) {
Expand Down Expand Up @@ -700,24 +694,27 @@ private void refreshLocalResource(IResource resource, int depth, IProgressMonito
* @author mistria
*
*/
private final class PublishDiagnosticJob extends WorkspaceJob {
private final class PublishDiagnosticJob extends Job {
/**
* @param rule
*/
private PublishDiagnosticJob(ISchedulingRule rule) {
private PublishDiagnosticJob() {
super("Publish Diagnostics");
setRule(rule);
}

@Override
public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
long startTime = System.nanoTime();
IStatus status = publishDiagnostics(monitor);
if (status.getSeverity() != IStatus.CANCEL) {
long elapsedTime = System.nanoTime() - startTime;
movingAverageForDiagnostics.update(elapsedTime / 1_000_000);
public IStatus run(IProgressMonitor monitor) {
try {
long startTime = System.nanoTime();
IStatus status = publishDiagnostics(monitor);
if (status.getSeverity() != IStatus.CANCEL) {
long elapsedTime = System.nanoTime() - startTime;
movingAverageForDiagnostics.update(elapsedTime / 1_000_000);
}
return status;
} catch (JavaModelException e) {
return e.getStatus();
}
return status;
}

/* (non-Javadoc)
Expand Down