use of org.jetbrains.plugins.groovy.lang.psi.dataFlow.DFAEngine in project intellij-community by JetBrains.
the class InvalidWriteAccessSearcher method findInvalidWriteAccess.
@Nullable
public static List<ReadWriteVariableInstruction> findInvalidWriteAccess(@NotNull Instruction[] flow, @NotNull Map<String, GrVariable> variables, @NotNull Set<GrVariable> alreadyInitialized) {
DFAEngine<MyData> engine = new DFAEngine<>(flow, new MyDFAInstance(), new MySemilattice());
final List<MyData> dfaResult = engine.performDFAWithTimeout();
if (dfaResult == null)
return null;
List<ReadWriteVariableInstruction> result = ContainerUtil.newArrayList();
for (int i = 0; i < flow.length; i++) {
Instruction instruction = flow[i];
if (instruction instanceof ReadWriteVariableInstruction && ((ReadWriteVariableInstruction) instruction).isWrite()) {
final MyData initialized = dfaResult.get(i);
final GrVariable var = variables.get(((ReadWriteVariableInstruction) instruction).getVariableName());
if (alreadyInitialized.contains(var)) {
if (initialized.isInitialized(((ReadWriteVariableInstruction) instruction).getVariableName())) {
result.add((ReadWriteVariableInstruction) instruction);
}
} else {
if (initialized.isOverInitialized(((ReadWriteVariableInstruction) instruction).getVariableName())) {
result.add((ReadWriteVariableInstruction) instruction);
}
}
}
}
return result;
}
use of org.jetbrains.plugins.groovy.lang.psi.dataFlow.DFAEngine in project intellij-community by JetBrains.
the class UnusedDefInspection method check.
@Override
protected void check(@NotNull final GrControlFlowOwner owner, @NotNull final ProblemsHolder problemsHolder) {
final Instruction[] flow = owner.getControlFlow();
final ReachingDefinitionsDfaInstance dfaInstance = new ReachingDefinitionsDfaInstance(flow);
final ReachingDefinitionsSemilattice lattice = new ReachingDefinitionsSemilattice();
final DFAEngine<DefinitionMap> engine = new DFAEngine<>(flow, dfaInstance, lattice);
final List<DefinitionMap> dfaResult = engine.performDFAWithTimeout();
if (dfaResult == null) {
return;
}
final TIntHashSet unusedDefs = new TIntHashSet();
for (Instruction instruction : flow) {
if (instruction instanceof ReadWriteVariableInstruction && ((ReadWriteVariableInstruction) instruction).isWrite()) {
unusedDefs.add(instruction.num());
}
}
for (int i = 0; i < dfaResult.size(); i++) {
final Instruction instruction = flow[i];
if (instruction instanceof ReadWriteVariableInstruction) {
final ReadWriteVariableInstruction varInst = (ReadWriteVariableInstruction) instruction;
if (!varInst.isWrite()) {
final String varName = varInst.getVariableName();
DefinitionMap e = dfaResult.get(i);
e.forEachValue(new TObjectProcedure<TIntHashSet>() {
@Override
public boolean execute(TIntHashSet reaching) {
reaching.forEach(new TIntProcedure() {
@Override
public boolean execute(int defNum) {
final String defName = ((ReadWriteVariableInstruction) flow[defNum]).getVariableName();
if (varName.equals(defName)) {
unusedDefs.remove(defNum);
}
return true;
}
});
return true;
}
});
}
}
}
final Set<PsiElement> checked = ContainerUtil.newHashSet();
unusedDefs.forEach(new TIntProcedure() {
@Override
public boolean execute(int num) {
final ReadWriteVariableInstruction instruction = (ReadWriteVariableInstruction) flow[num];
final PsiElement element = instruction.getElement();
process(element, checked, problemsHolder, GroovyInspectionBundle.message("unused.assignment.tooltip"));
return true;
}
});
owner.accept(new GroovyRecursiveElementVisitor() {
@Override
public void visitVariable(@NotNull GrVariable variable) {
if (checked.contains(variable) || variable.getInitializerGroovy() != null)
return;
if (ReferencesSearch.search(variable, variable.getUseScope()).findFirst() == null) {
process(variable, checked, problemsHolder, GroovyInspectionBundle.message("unused.variable"));
}
}
});
}
use of org.jetbrains.plugins.groovy.lang.psi.dataFlow.DFAEngine in project intellij-community by JetBrains.
the class ControlFlowBuilderUtil method getReadsWithoutPriorWrites.
public static ReadWriteVariableInstruction[] getReadsWithoutPriorWrites(Instruction[] flow, boolean onlyFirstRead) {
DFAEngine<ReadBeforeWriteState> engine = new DFAEngine<>(flow, new ReadBeforeWriteInstance(buildNamesIndex(flow), onlyFirstRead), ReadBeforeWriteSemilattice.INSTANCE);
List<ReadBeforeWriteState> dfaResult = engine.performDFAWithTimeout();
if (dfaResult == null) {
return ReadWriteVariableInstruction.EMPTY_ARRAY;
}
List<ReadWriteVariableInstruction> result = new ArrayList<>();
BitSet reads = dfaResult.get(dfaResult.size() - 1).getReads();
for (int i = reads.nextSetBit(0); i >= 0; i = reads.nextSetBit(i + 1)) {
if (i == Integer.MAX_VALUE)
break;
result.add((ReadWriteVariableInstruction) flow[i]);
}
return result.toArray(ReadWriteVariableInstruction.EMPTY_ARRAY);
}
Aggregations