diff --git a/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java b/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java index 80b5ad023765..957d3acdb60b 100644 --- a/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java +++ b/java/compiler/instrumentation-util/src/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenter.java @@ -77,18 +77,23 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode methodParamNames.put(methodName, names); final boolean isStatic = (access & ACC_STATIC) != 0; + + final Map paramSlots = new LinkedHashMap(); // map: localVariableSlot -> methodParameterIndex + int slotIndex = isStatic? 0 : 1; + for (int paramIndex = 0; paramIndex < args.length; paramIndex++) { + final Type arg = args[paramIndex]; + paramSlots.put(slotIndex, paramIndex); + slotIndex += arg.getSize(); + } + return new MethodVisitor(api) { - int varIndex = 0; - + @Override - public void visitLocalVariable(String name2, String desc, String signature, Label start, Label end, int index) { - if (!isStatic && index == 0) { - return; //'this' variable + public void visitLocalVariable(String name2, String desc, String signature, Label start, Label end, int slotIndex) { + final Integer paramIndex = paramSlots.get(slotIndex); + if (paramIndex != null) { + names.put(paramIndex, name2); } - if (varIndex >= args.length) { - return; // no parameters anymore - } - names.put(varIndex++, name2); } }; } diff --git a/java/java-tests/testData/compiler/notNullVerification/DoubleParameter.java b/java/java-tests/testData/compiler/notNullVerification/DoubleParameter.java new file mode 100644 index 000000000000..0def45a77ccc --- /dev/null +++ b/java/java-tests/testData/compiler/notNullVerification/DoubleParameter.java @@ -0,0 +1,9 @@ +import org.jetbrains.annotations.NotNull; + +public class DoubleParameter { + + public static void foo(double a, @NotNull String b, @NotNull String c) { + + } + +} diff --git a/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java b/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java index f05c612a12a8..e84f02578026 100644 --- a/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java +++ b/java/java-tests/testSrc/com/intellij/compiler/notNullVerification/NotNullVerifyingInstrumenterTest.java @@ -132,6 +132,12 @@ public class NotNullVerifyingInstrumenterTest extends UsefulTestCase { verifyCallThrowsException("Argument for @NotNull parameter 'c' of LongParameter.foo must not be null", null, staticMethod, new Long(2), "z", null); } + public void testDoubleParameter() throws Exception { + Class testClass = prepareTest(true); + Method staticMethod = testClass.getMethod("foo", double.class, String.class, String.class); + verifyCallThrowsException("Argument for @NotNull parameter 'c' of DoubleParameter.foo must not be null", null, staticMethod, new Long(2), "z", null); + } + public void testEnumConstructor() throws Exception { Class testClass = prepareTest(); Object field = testClass.getField("Value");