From ca46b0c37dcceab7189fec3d471ed491d7517994 Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Fri, 30 Nov 2018 19:07:06 +0100 Subject: [PATCH] Cleanup (reverts accidentally committed file) --- .../NotNullVerifyingInstrumenter.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) 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 8392b1f49ef3..615656796130 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 @@ -4,6 +4,8 @@ package com.intellij.compiler.notNullVerification; import com.intellij.compiler.instrumentation.FailSafeClassReader; import com.intellij.compiler.instrumentation.FailSafeMethodVisitor; import org.jetbrains.org.objectweb.asm.*; +import org.jetbrains.org.objectweb.asm.signature.SignatureReader; +import org.jetbrains.org.objectweb.asm.signature.SignatureVisitor; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -31,6 +33,7 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode private final Set myNotNullAnnotations = new HashSet(); private boolean myEnum; private boolean myInner; + private boolean myEnclosed; private NotNullVerifyingInstrumenter(ClassVisitor classVisitor, ClassReader reader, String[] notNullAnnotations) { super(Opcodes.API_VERSION, classVisitor); @@ -104,6 +107,12 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode } } + @Override + public void visitOuterClass(String owner, String name, String desc) { + super.visitOuterClass(owner, name, desc); + myEnclosed = true; + } + private static class NotNullState { String message; String exceptionType; @@ -141,6 +150,9 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode final boolean isStatic = isStatic(access); final Type[] args = Type.getArgumentTypes(desc); + boolean hasOuterClassParameter = myEnclosed && myInner && "".equals(name); + // see http://forge.ow2.org/tracker/?aid=307392&group_id=23&atid=100023&func=detail + final int syntheticCount = signature == null ? 0 : hasOuterClassParameter ? 1 : Math.max(0, args.length - getSignatureParameterCount(signature)); final int paramAnnotationOffset = !"".equals(name) ? 0 : myEnum ? 2 : myInner ? 1 : 0; final Type returnType = Type.getReturnType(desc); @@ -177,7 +189,7 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode return checkNotNullMethod(desc, base); } if (ref.getSort() == TypeReference.METHOD_FORMAL_PARAMETER) { - return checkNotNullParameter(ref.getFormalParameterIndex() + paramAnnotationOffset, desc, base); + return checkNotNullParameter(ref.getFormalParameterIndex() + syntheticCount, desc, base); } return base; } @@ -241,7 +253,7 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode String descrPattern = state.getNullParamMessage(paramName); String[] args = state.message != null ? EMPTY_STRING_ARRAY - : new String[]{paramName != null ? paramName : String.valueOf(param - paramAnnotationOffset), myClassName, name}; + : new String[]{paramName != null ? paramName : String.valueOf(param - syntheticCount), myClassName, name}; reportError(state.exceptionType, end, descrPattern, args); } } @@ -291,6 +303,18 @@ public class NotNullVerifyingInstrumenter extends ClassVisitor implements Opcode return (access & ACC_STATIC) != 0; } + private static int getSignatureParameterCount(String signature) { + final int[] count = {0}; + new SignatureReader(signature).accept(new SignatureVisitor(Opcodes.ASM6) { + @Override + public SignatureVisitor visitParameterType() { + count[0]++; + return super.visitParameterType(); + } + }); + return count[0]; + } + private static boolean isReferenceType(Type type) { return type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY; }