From d3944cbd3798e16486450ef2e73abfe961102259 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Thu, 4 Feb 2021 17:35:18 +0700 Subject: [PATCH] [java-analysis] Combined: avoid stream API; some simplifications GitOrigin-RevId: e084277028abe134613f7579b317c15d86d20f25 --- .../bytecodeAnalysis/ClassDataIndexer.java | 67 +++++++++---------- .../bytecodeAnalysis/Combined.java | 7 +- .../bytecodeAnalysis/Value.java | 12 ++-- 3 files changed, 44 insertions(+), 42 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java index 05957d76c075..242ec639e432 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/ClassDataIndexer.java @@ -29,8 +29,6 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.function.BiFunction; import java.util.function.BinaryOperator; import java.util.function.Function; -import java.util.function.IntFunction; -import java.util.stream.Stream; import static com.intellij.codeInspection.bytecodeAnalysis.Direction.*; import static com.intellij.codeInspection.bytecodeAnalysis.Effects.VOLATILE_EFFECTS; @@ -502,31 +500,6 @@ public class ClassDataIndexer implements VirtualFileGist.GistCalculator>> inOuts = - index -> val -> { - if (isBooleanResult && negatedAnalysis != null) { - return Stream.of(negatedAnalysis.contractEquation(index, val, stable)); - } - Stream.Builder builder = Stream.builder(); - try { - if (isInterestingResult) { - builder.add(new InOutAnalysis(richControlFlow, new InOut(index, val), origins, stable, mySharedPendingStates).analyze()); - } - if (shouldInferNonTrivialFailingContracts) { - InThrow direction = new InThrow(index, val); - if (throwEquation.result.equals(Value.Fail)) { - builder.add(new Equation(new EKey(method, direction, stable), Value.Fail)); - } - else { - builder.add(new InThrowAnalysis(richControlFlow, direction, origins, stable, mySharedPendingStates).analyze()); - } - } - } - catch (AnalyzerException e) { - throw new RuntimeException("Analyzer error", e); - } - return builder.build(); - }; // arguments and contract clauses for (int i = 0; i < argumentTypes.length; i++) { boolean notNullParam = false; @@ -573,7 +546,27 @@ public class ClassDataIndexer implements VirtualFileGist.GistCalculator { + for (int i = 0; i < argumentTypes.length; i++) { + Type argType = argumentTypes[i]; if (ASMUtils.isReferenceType(argType)) { result.add(analyzer.notNullParamEquation(i, stable)); result.add(analyzer.nullableParamEquation(i, stable)); + for (Value val : Value.OBJECT) { + ContainerUtil.addIfNotNull(result, analyzer.contractEquation(i, val, stable)); + ContainerUtil.addIfNotNull(result, analyzer.failEquation(i, val, stable)); + } + } else if (ASMUtils.isBooleanType(argType)) { + for (Value val : Value.BOOLEAN) { + ContainerUtil.addIfNotNull(result, analyzer.contractEquation(i, val, stable)); + ContainerUtil.addIfNotNull(result, analyzer.failEquation(i, val, stable)); + } } - Value.typeValues(argType) - .flatMap(val -> Stream.of(analyzer.contractEquation(i, val, stable), analyzer.failEquation(i, val, stable))) - .filter(Objects::nonNull) - .forEach(result::add); - }); + } } private void storeStaticFieldEquations(CombinedAnalysis analyzer) { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java index e0a09add5667..4028bd731493 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Combined.java @@ -17,7 +17,6 @@ import org.jetbrains.org.objectweb.asm.tree.analysis.BasicValue; import org.jetbrains.org.objectweb.asm.tree.analysis.Frame; import java.util.*; -import java.util.stream.Collectors; import static com.intellij.codeInspection.bytecodeAnalysis.AbstractValues.*; import static com.intellij.codeInspection.bytecodeAnalysis.CombinedData.*; @@ -279,8 +278,10 @@ final class CombinedAnalysis { result = Value.Fail; } else if (!interpreter.calls.isEmpty()) { - Set keys = - interpreter.calls.stream().map(call -> new EKey(call.method, Throw, call.stableCall)).collect(Collectors.toSet()); + Set keys = new HashSet<>(); + for (TrackableCallValue call : interpreter.calls) { + keys.add(new EKey(call.method, Throw, call.stableCall)); + } result = new Pending(Collections.singleton(new Component(Value.Top, keys))); } else { diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Value.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Value.java index 6776a4cb3a05..1017a325a056 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Value.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/Value.java @@ -6,15 +6,17 @@ import com.intellij.codeInspection.dataFlow.ContractReturnValue; import com.intellij.codeInspection.dataFlow.StandardMethodContract; import org.jetbrains.org.objectweb.asm.Type; -import java.util.stream.Stream; +import java.util.List; enum Value implements Result { Bot, NotNull, Null, True, False, Fail, Pure, Top; + static final List BOOLEAN = List.of(True, False); + static final List OBJECT = List.of(Null, NotNull); - static Stream typeValues(Type type) { - if (ASMUtils.isReferenceType(type)) return Stream.of(Null, NotNull); - if (ASMUtils.isBooleanType(type)) return Stream.of(True, False); - return Stream.empty(); + static List typeValues(Type type) { + if (ASMUtils.isReferenceType(type)) return OBJECT; + if (ASMUtils.isBooleanType(type)) return BOOLEAN; + return List.of(); } ContractReturnValue toReturnValue() {