From 08a90ba7d488b9ff265658e3a6d5c02d9b88f183 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Oct 2013 14:02:28 +0400 Subject: [PATCH] Fixing EA-50643 - NPE: PropertyCodegen.generateBackingField Do not return null as a method/field visitor --- .../jetbrains/jet/codegen/ClassBuilder.java | 22 ++++++++++++++----- .../jet/asJava/StubClassBuilder.java | 6 +++-- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java index dcb6c102e34..f36a4510650 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java @@ -19,12 +19,12 @@ package org.jetbrains.jet.codegen; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.asm4.AnnotationVisitor; -import org.jetbrains.asm4.ClassVisitor; -import org.jetbrains.asm4.FieldVisitor; -import org.jetbrains.asm4.MethodVisitor; +import org.jetbrains.asm4.*; public abstract class ClassBuilder { + protected static final MethodVisitor EMPTY_METHOD_VISITOR = new MethodVisitor(Opcodes.ASM4) {}; + protected static final FieldVisitor EMPTY_FIELD_VISITOR = new FieldVisitor(Opcodes.ASM4) {}; + private String thisName; private final MemberMap members = new MemberMap(); @@ -43,6 +43,7 @@ public abstract class ClassBuilder { } } + @NotNull public FieldVisitor newField( @Nullable PsiElement origin, int access, @@ -51,9 +52,14 @@ public abstract class ClassBuilder { @Nullable String signature, @Nullable Object value ) { - return getVisitor().visitField(access, name, desc, signature, value); + FieldVisitor visitor = getVisitor().visitField(access, name, desc, signature, value); + if (visitor == null) { + return EMPTY_FIELD_VISITOR; + } + return visitor; } + @NotNull public MethodVisitor newMethod( @Nullable PsiElement origin, int access, @@ -62,7 +68,11 @@ public abstract class ClassBuilder { @Nullable String signature, @Nullable String[] exceptions ) { - return getVisitor().visitMethod(access, name, desc, signature, exceptions); + MethodVisitor visitor = getVisitor().visitMethod(access, name, desc, signature, exceptions); + if (visitor == null) { + return EMPTY_METHOD_VISITOR; + } + return visitor; } @NotNull diff --git a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java index 28970cdde0f..6521db00964 100644 --- a/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java +++ b/compiler/jet.as.java.psi/src/org/jetbrains/jet/asJava/StubClassBuilder.java @@ -96,6 +96,7 @@ public class StubClassBuilder extends ClassBuilder { ((StubBase) v.getResult()).putUserData(ClsWrapperStubPsiFactory.ORIGIN_ELEMENT, origin); } + @NotNull @Override public MethodVisitor newMethod( @Nullable PsiElement origin, @@ -107,7 +108,7 @@ public class StubClassBuilder extends ClassBuilder { ) { MethodVisitor internalVisitor = super.newMethod(origin, access, name, desc, signature, exceptions); - if (internalVisitor != null) { + if (internalVisitor != EMPTY_METHOD_VISITOR) { // If stub for method generated markLastChild(origin); } @@ -115,6 +116,7 @@ public class StubClassBuilder extends ClassBuilder { return internalVisitor; } + @NotNull @Override public FieldVisitor newField( @Nullable PsiElement origin, @@ -126,7 +128,7 @@ public class StubClassBuilder extends ClassBuilder { ) { FieldVisitor internalVisitor = super.newField(origin, access, name, desc, signature, value); - if (internalVisitor != null) { + if (internalVisitor != EMPTY_FIELD_VISITOR) { // If stub for field generated markLastChild(origin); }