package com.jetbrains.lang.dart.fixes;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiManager;
import com.intellij.util.Consumer;
import com.jetbrains.lang.dart.analyzer.DartAnalysisServerService;
import com.jetbrains.lang.dart.ide.annotator.DartProblemGroup;
import org.dartlang.analysis.server.protocol.AnalysisErrorFixes;
import org.dartlang.analysis.server.protocol.SourceChange;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
public class DartQuickFixSet {
private static final int MAX_QUICK_FIXES = 5;
@NotNull private final PsiManager myPsiManager;
@NotNull private final VirtualFile myFile;
private final int myOffset;
@Nullable private final String myErrorCode;
@NotNull private final String myErrorSeverity;
@NotNull private final List<DartQuickFix> myQuickFixes = new ArrayList<>(MAX_QUICK_FIXES);
private volatile long myPsiModCountWhenRequestSent;
public DartQuickFixSet(@NotNull final PsiManager psiManager,
@NotNull final VirtualFile file,
final int offset,
@Nullable final String errorCode,
@NotNull final String errorSeverity) {
myPsiManager = psiManager;
myFile = file;
myOffset = offset;
myErrorCode = errorCode;
myErrorSeverity = errorSeverity;
for (int i = 0; i < MAX_QUICK_FIXES; i++) {
myQuickFixes.add(new DartQuickFix(this, i));
}
}
@NotNull
public List<DartQuickFix> getQuickFixes() {
return myQuickFixes;
}
synchronized void ensureInitialized() {
final long modCount = myPsiManager.getModificationTracker().getModificationCount();
if (myPsiModCountWhenRequestSent == modCount) {
return;
}
myPsiModCountWhenRequestSent = modCount;
for (DartQuickFix fix : myQuickFixes) {
fix.setSourceChange(null);
}
final Consumer<List<AnalysisErrorFixes>> consumer = fixes -> {
final long modCountWhenReceivedFixes = myPsiManager.getModificationTracker().getModificationCount();
if (myPsiModCountWhenRequestSent != modCountWhenReceivedFixes) {
return;
}
if (fixes == null || fixes.isEmpty()) {
if (myErrorCode != null) {
myQuickFixes.get(0).setSuppressActionDelegate(new DartProblemGroup.DartSuppressAction(myErrorCode, myErrorSeverity, false));
myQuickFixes.get(1).setSuppressActionDelegate(new DartProblemGroup.DartSuppressAction(myErrorCode, myErrorSeverity, true));
}
}
else {
int index = 0;
for (AnalysisErrorFixes fix : fixes) {
for (SourceChange sourceChange : fix.getFixes()) {
myQuickFixes.get(index).setSourceChange(sourceChange);
index++;
if (index == MAX_QUICK_FIXES) return;
}
}
}
};
DartAnalysisServerService.getInstance(myPsiManager.getProject()).askForFixesAndWaitABitIfReceivedQuickly(myFile, myOffset, consumer);
}
}