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 1321a1e8e9d4..b978ec624360 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 @@ -27,7 +27,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.tree.MethodNode; import org.jetbrains.org.objectweb.asm.tree.analysis.AnalyzerException; -import org.jetbrains.org.objectweb.asm.tree.analysis.Frame; import java.security.MessageDigest; import java.util.*; @@ -190,16 +189,16 @@ public class ClassDataIndexer implements DataIndexer[]> leakingParametersAndFrames = + final LeakingParameters leakingParametersAndFrames = maybeLeakingParameter ? leakingParametersAndFrames(method, methodNode, argumentTypes, jsr) : null; boolean[] leakingParameters = - leakingParametersAndFrames != null ? leakingParametersAndFrames.first : null; + leakingParametersAndFrames != null ? leakingParametersAndFrames.parameters : null; final NullableLazyValue origins = new NullableLazyValue() { @Override protected boolean[] compute() { try { - return OriginsAnalysis.resultOrigins(leakingParametersAndFrames.second, methodNode.instructions, richControlFlow.controlFlow); + return OriginsAnalysis.resultOrigins(leakingParametersAndFrames.frames, methodNode.instructions, richControlFlow.controlFlow); } catch (AnalyzerException e) { LOG.debug("when processing " + method + " in " + presentableUrl, e); @@ -350,14 +349,11 @@ public class ClassDataIndexer implements DataIndexer[]> leakingParametersAndFrames(Method method, - MethodNode methodNode, - Type[] argumentTypes, - boolean jsr) + private LeakingParameters leakingParametersAndFrames(Method method, MethodNode methodNode, Type[] argumentTypes, boolean jsr) throws AnalyzerException { return argumentTypes.length < 32 ? - LeakingParametersAnalysis.fastLeakingParameters(method.internalClassName, methodNode, jsr) : - LeakingParametersAnalysis.leakingParameters(method.internalClassName, methodNode, jsr); + LeakingParameters.buildFast(method.internalClassName, methodNode, jsr) : + LeakingParameters.build(method.internalClassName, methodNode, jsr); } }, ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES); diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParametersAnalysis.java b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java similarity index 95% rename from java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParametersAnalysis.java rename to java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java index 2d3206babf99..9fa5425e6999 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParametersAnalysis.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/bytecodeAnalysis/asm/LeakingParameters.java @@ -15,7 +15,6 @@ */ package com.intellij.codeInspection.bytecodeAnalysis.asm; -import com.intellij.openapi.util.Pair; import org.jetbrains.annotations.NotNull; import org.jetbrains.org.objectweb.asm.Type; import org.jetbrains.org.objectweb.asm.tree.*; @@ -29,8 +28,16 @@ import static org.jetbrains.org.objectweb.asm.Opcodes.*; /** * @author lambdamix */ -public class LeakingParametersAnalysis { - public static Pair[]> leakingParameters(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { +public class LeakingParameters { + public final Frame[] frames; + public final boolean[] parameters; + + public LeakingParameters(Frame[] frames, boolean[] parameters) { + this.frames = frames; + this.parameters = parameters; + } + + public static LeakingParameters build(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { Frame[] frames = jsr ? new Analyzer(new ParametersUsage(methodNode)).analyze(className, methodNode) : new LiteAnalyzer(new ParametersUsage(methodNode)).analyze(className, methodNode); @@ -50,10 +57,10 @@ public class LeakingParametersAnalysis { } } } - return Pair.create(collector.leaking, (Frame[])(Frame[])frames); + return new LeakingParameters((Frame[])(Frame[])frames, collector.leaking); } - public static Pair[]> fastLeakingParameters(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { + public static LeakingParameters buildFast(String className, MethodNode methodNode, boolean jsr) throws AnalyzerException { IParametersUsage parametersUsage = new IParametersUsage(methodNode); Frame[] frames = jsr ? new Analyzer(parametersUsage).analyze(className, methodNode) : @@ -63,7 +70,7 @@ public class LeakingParametersAnalysis { for (int i = 0; i < result.length; i++) { result[i] = (leakingMask & (1 << i)) != 0; } - return Pair.create(result, (Frame[])frames); + return new LeakingParameters((Frame[])frames, result); } } diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java index 592b231f5087..2cbf3fbdfd6c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInspection/bytecodeAnalysis/BytecodeAnalysisTest.java @@ -17,7 +17,7 @@ package com.intellij.codeInspection.bytecodeAnalysis; import com.intellij.codeInsight.AnnotationUtil; import com.intellij.codeInsight.InferredAnnotationsManager; -import com.intellij.codeInspection.bytecodeAnalysis.asm.LeakingParametersAnalysis; +import com.intellij.codeInspection.bytecodeAnalysis.asm.LeakingParameters; import com.intellij.codeInspection.bytecodeAnalysis.data.*; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.vfs.LocalFileSystem; @@ -95,7 +95,7 @@ public class BytecodeAnalysisTest extends JavaCodeInsightFixtureTestCase { public void visitEnd() { super.visitEnd(); try { - map.put(method, LeakingParametersAnalysis.leakingParameters(classReader.getClassName(), node, false).first); + map.put(method, LeakingParameters.build(classReader.getClassName(), node, false).parameters); } catch (AnalyzerException ignore) {} }