JvmDeclarationOrigin used in newMethod()

This commit is contained in:
Andrey Breslav
2014-05-27 19:15:07 +04:00
parent 87a8f52f70
commit 4e1ceb62b5
15 changed files with 47 additions and 55 deletions
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.*;
public abstract class AbstractClassBuilder implements ClassBuilder { public abstract class AbstractClassBuilder implements ClassBuilder {
@@ -64,8 +63,7 @@ public abstract class AbstractClassBuilder implements ClassBuilder {
@Override @Override
@NotNull @NotNull
public MethodVisitor newMethod( public MethodVisitor newMethod(
@Nullable PsiElement origin, @NotNull JvmDeclarationOrigin origin,
@Nullable DeclarationDescriptor descriptor,
int access, int access,
@NotNull String name, @NotNull String name,
@NotNull String desc, @NotNull String desc,
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor; import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -38,8 +37,7 @@ public interface ClassBuilder {
@NotNull @NotNull
MethodVisitor newMethod( MethodVisitor newMethod(
@Nullable PsiElement origin, @NotNull JvmDeclarationOrigin origin,
@Nullable DeclarationDescriptor descriptor,
int access, int access,
@NotNull String name, @NotNull String name,
@NotNull String desc, @NotNull String desc,
@@ -201,7 +201,7 @@ public class ClosureCodegen extends ParentCodegenAware {
private void generateConstInstance(@NotNull ClassBuilder cv) { private void generateConstInstance(@NotNull ClassBuilder cv) {
MethodVisitor mv = cv.newMethod(fun, funDescriptor, ACC_STATIC | ACC_SYNTHETIC, "<clinit>", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY); MethodVisitor mv = cv.newMethod(OtherOrigin(fun, funDescriptor), ACC_STATIC | ACC_SYNTHETIC, "<clinit>", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY);
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
cv.newField(OtherOrigin(fun, funDescriptor), ACC_STATIC | ACC_FINAL, JvmAbi.INSTANCE_FIELD, asmType.getDescriptor(), null, null); cv.newField(OtherOrigin(fun, funDescriptor), ACC_STATIC | ACC_FINAL, JvmAbi.INSTANCE_FIELD, asmType.getDescriptor(), null, null);
@@ -221,7 +221,7 @@ public class ClosureCodegen extends ParentCodegenAware {
if (bridge.equals(delegate)) return; if (bridge.equals(delegate)) return;
MethodVisitor mv = MethodVisitor mv =
cv.newMethod(fun, funDescriptor, ACC_PUBLIC | ACC_BRIDGE, bridge.getName(), bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY); cv.newMethod(OtherOrigin(fun, funDescriptor), ACC_PUBLIC | ACC_BRIDGE, bridge.getName(), bridge.getDescriptor(), null, ArrayUtil.EMPTY_STRING_ARRAY);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -258,7 +258,7 @@ public class ClosureCodegen extends ParentCodegenAware {
Type[] argTypes = fieldListToTypeArray(args); Type[] argTypes = fieldListToTypeArray(args);
Method constructor = new Method("<init>", Type.VOID_TYPE, argTypes); Method constructor = new Method("<init>", Type.VOID_TYPE, argTypes);
MethodVisitor mv = cv.newMethod(fun, funDescriptor, visibilityFlag, "<init>", constructor.getDescriptor(), null, MethodVisitor mv = cv.newMethod(OtherOrigin(fun, funDescriptor), visibilityFlag, "<init>", constructor.getDescriptor(), null,
ArrayUtil.EMPTY_STRING_ARRAY); ArrayUtil.EMPTY_STRING_ARRAY);
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode(); mv.visitCode();
@@ -19,7 +19,6 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor; import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -45,15 +44,14 @@ public abstract class DelegatingClassBuilder implements ClassBuilder {
@NotNull @NotNull
@Override @Override
public MethodVisitor newMethod( public MethodVisitor newMethod(
@Nullable PsiElement origin, @NotNull JvmDeclarationOrigin origin,
@Nullable DeclarationDescriptor descriptor,
int access, int access,
@NotNull String name, @NotNull String name,
@NotNull String desc, @NotNull String desc,
@Nullable String signature, @Nullable String signature,
@Nullable String[] exceptions @Nullable String[] exceptions
) { ) {
return getDelegate().newMethod(origin, descriptor, access, name, desc, signature, exceptions); return getDelegate().newMethod(origin, access, name, desc, signature, exceptions);
} }
@NotNull @NotNull
@@ -63,6 +63,7 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmSerializationBindings.*; import static org.jetbrains.jet.codegen.JvmSerializationBindings.*;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun; import static org.jetbrains.jet.codegen.binding.CodegenBinding.isLocalNamedFun;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.DECLARATION;
@@ -126,8 +127,7 @@ public class FunctionCodegen extends ParentCodegenAware {
OwnerKind methodContextKind = methodContext.getContextKind(); OwnerKind methodContextKind = methodContext.getContextKind();
Method asmMethod = jvmSignature.getAsmMethod(); Method asmMethod = jvmSignature.getAsmMethod();
MethodVisitor mv = v.newMethod(origin, MethodVisitor mv = v.newMethod(OtherOrigin(origin, functionDescriptor),
functionDescriptor,
getMethodAsmFlags(functionDescriptor, methodContextKind), getMethodAsmFlags(functionDescriptor, methodContextKind),
asmMethod.getName(), asmMethod.getName(),
asmMethod.getDescriptor(), asmMethod.getDescriptor(),
@@ -507,7 +507,7 @@ public class FunctionCodegen extends ParentCodegenAware {
return; return;
} }
int flags = getVisibilityAccessFlag(constructorDescriptor); int flags = getVisibilityAccessFlag(constructorDescriptor);
MethodVisitor mv = classBuilder.newMethod(null, constructorDescriptor, flags, "<init>", "()V", null, MethodVisitor mv = classBuilder.newMethod(OtherOrigin(constructorDescriptor), flags, "<init>", "()V", null,
getThrownExceptions(constructorDescriptor, state.getTypeMapper())); getThrownExceptions(constructorDescriptor, state.getTypeMapper()));
if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return; if (state.getClassBuilderMode() == ClassBuilderMode.LIGHT_CLASSES) return;
@@ -559,7 +559,7 @@ public class FunctionCodegen extends ParentCodegenAware {
Method defaultMethod = typeMapper.mapDefaultMethod(functionDescriptor, kind, owner); Method defaultMethod = typeMapper.mapDefaultMethod(functionDescriptor, kind, owner);
MethodVisitor mv = v.newMethod(null, functionDescriptor, flags | (isConstructor ? 0 : ACC_STATIC), MethodVisitor mv = v.newMethod(OtherOrigin(functionDescriptor), flags | (isConstructor ? 0 : ACC_STATIC),
defaultMethod.getName(), defaultMethod.getName(),
defaultMethod.getDescriptor(), null, defaultMethod.getDescriptor(), null,
getThrownExceptions(functionDescriptor, typeMapper)); getThrownExceptions(functionDescriptor, typeMapper));
@@ -729,7 +729,7 @@ public class FunctionCodegen extends ParentCodegenAware {
) { ) {
int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO. int flags = ACC_PUBLIC | ACC_BRIDGE | ACC_SYNTHETIC; // TODO.
MethodVisitor mv = v.newMethod(null, descriptor, flags, delegateTo.getName(), bridge.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, delegateTo.getName(), bridge.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
mv.visitCode(); mv.visitCode();
@@ -772,7 +772,7 @@ public class FunctionCodegen extends ParentCodegenAware {
int flags = ACC_PUBLIC; int flags = ACC_PUBLIC;
MethodVisitor mv = v.newMethod(null, functionDescriptor, flags, delegateMethod.getName(), delegateMethod.getDescriptor(), null, MethodVisitor mv = v.newMethod(OtherOrigin(functionDescriptor), flags, delegateMethod.getName(), delegateMethod.getDescriptor(), null,
getThrownExceptions(functionDescriptor, typeMapper)); getThrownExceptions(functionDescriptor, typeMapper));
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -68,6 +68,7 @@ import java.util.*;
import static org.jetbrains.jet.codegen.AsmUtil.*; import static org.jetbrains.jet.codegen.AsmUtil.*;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin; import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmCodegenUtil.*; import static org.jetbrains.jet.codegen.JvmCodegenUtil.*;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*;
import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver;
import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration; import static org.jetbrains.jet.lang.resolve.BindingContextUtils.descriptorToDeclaration;
@@ -493,7 +494,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ACC_PUBLIC | ACC_ABSTRACT : ACC_PUBLIC | ACC_ABSTRACT :
ACC_PUBLIC; ACC_PUBLIC;
if (JvmCodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("toArray"), builtIns.getArray()) == null) { if (JvmCodegenUtil.getDeclaredFunctionByRawSignature(descriptor, Name.identifier("toArray"), builtIns.getArray()) == null) {
MethodVisitor mv = v.newMethod(null, null, access, "toArray", "()[Ljava/lang/Object;", null, null); MethodVisitor mv = v.newMethod(NO_ORIGIN, access, "toArray", "()[Ljava/lang/Object;", null, null);
if (descriptor.getKind() != ClassKind.TRAIT) { if (descriptor.getKind() != ClassKind.TRAIT) {
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
@@ -508,7 +509,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
} }
if (!isGenericToArrayPresent()) { if (!isGenericToArrayPresent()) {
MethodVisitor mv = v.newMethod(null, null, access, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null); MethodVisitor mv = v.newMethod(NO_ORIGIN, access, "toArray", "([Ljava/lang/Object;)[Ljava/lang/Object;", null, null);
if (descriptor.getKind() != ClassKind.TRAIT) { if (descriptor.getKind() != ClassKind.TRAIT) {
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
@@ -536,7 +537,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
int access = descriptor.getKind() == ClassKind.TRAIT ? int access = descriptor.getKind() == ClassKind.TRAIT ?
ACC_PUBLIC | ACC_ABSTRACT : ACC_PUBLIC | ACC_ABSTRACT :
ACC_PUBLIC; ACC_PUBLIC;
MethodVisitor mv = v.newMethod(null, null, access, name, desc, null, null); MethodVisitor mv = v.newMethod(NO_ORIGIN, access, name, desc, null, null);
if (descriptor.getKind() != ClassKind.TRAIT) { if (descriptor.getKind() != ClassKind.TRAIT) {
mv.visitCode(); mv.visitCode();
genThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection"); genThrow(mv, "java/lang/UnsupportedOperationException", "Mutating immutable collection");
@@ -620,7 +621,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
KotlinBuiltIns.getInstance().getBoolean(), KotlinBuiltIns.getInstance().getBoolean(),
KotlinBuiltIns.getInstance().getAny() KotlinBuiltIns.getInstance().getAny()
); );
MethodVisitor mv = v.newMethod(null, equalsFunction, ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null); MethodVisitor mv = v.newMethod(OtherOrigin(equalsFunction), ACC_PUBLIC, "equals", "(Ljava/lang/Object;)Z", null, null);
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode(); mv.visitCode();
@@ -679,7 +680,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
descriptor, Name.identifier(CodegenUtil.HASH_CODE_METHOD_NAME), descriptor, Name.identifier(CodegenUtil.HASH_CODE_METHOD_NAME),
KotlinBuiltIns.getInstance().getInt() KotlinBuiltIns.getInstance().getInt()
); );
MethodVisitor mv = v.newMethod(null, hashCodeFunction, ACC_PUBLIC, "hashCode", "()I", null, null); MethodVisitor mv = v.newMethod(OtherOrigin(hashCodeFunction), ACC_PUBLIC, "hashCode", "()I", null, null);
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode(); mv.visitCode();
@@ -730,7 +731,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
descriptor, Name.identifier(CodegenUtil.TO_STRING_METHOD_NAME), descriptor, Name.identifier(CodegenUtil.TO_STRING_METHOD_NAME),
KotlinBuiltIns.getInstance().getString() KotlinBuiltIns.getInstance().getString()
); );
MethodVisitor mv = v.newMethod(null, toString, ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null); MethodVisitor mv = v.newMethod(OtherOrigin(toString), ACC_PUBLIC, "toString", "()Ljava/lang/String;", null, null);
InstructionAdapter iv = new InstructionAdapter(mv); InstructionAdapter iv = new InstructionAdapter(mv);
mv.visitCode(); mv.visitCode();
@@ -887,7 +888,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return DescriptorUtils.isEnumValuesMethod(descriptor); return DescriptorUtils.isEnumValuesMethod(descriptor);
} }
}); });
MethodVisitor mv = v.newMethod(myClass, valuesFunction, ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null); MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valuesFunction), ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
mv.visitCode(); mv.visitCode();
@@ -905,7 +906,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return DescriptorUtils.isEnumValueOfMethod(descriptor); return DescriptorUtils.isEnumValueOfMethod(descriptor);
} }
}); });
MethodVisitor mv = v.newMethod(myClass, valueOfFunction, MethodVisitor mv = v.newMethod(OtherOrigin(myClass, valueOfFunction),
ACC_PUBLIC | ACC_STATIC, "valueOf", "(Ljava/lang/String;)" + classAsmType.getDescriptor(), null, null); ACC_PUBLIC | ACC_STATIC, "valueOf", "(Ljava/lang/String;)" + classAsmType.getDescriptor(), null, null);
if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return; if (state.getClassBuilderMode() != ClassBuilderMode.FULL) return;
@@ -35,8 +35,11 @@ public class JvmDeclarationOrigin(
} }
} }
public fun OtherOrigin(element: PsiElement, descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, descriptor) public fun OtherOrigin(element: PsiElement?, descriptor: DeclarationDescriptor?): JvmDeclarationOrigin =
if (element == null && descriptor == null)
JvmDeclarationOrigin.NO_ORIGIN
else JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, descriptor)
public fun OtherOrigin(element: PsiElement): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, null) public fun OtherOrigin(element: PsiElement?): JvmDeclarationOrigin = OtherOrigin(element, null)
public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, descriptor) public fun OtherOrigin(descriptor: DeclarationDescriptor?): JvmDeclarationOrigin = OtherOrigin(null, descriptor)
@@ -50,6 +50,7 @@ import java.util.List;
import static org.jetbrains.jet.codegen.AsmUtil.boxType; import static org.jetbrains.jet.codegen.AsmUtil.boxType;
import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive; import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive;
import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED; import static org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor.Kind.SYNTHESIZED;
import static org.jetbrains.jet.lang.resolve.BindingContext.VARIABLE; import static org.jetbrains.jet.lang.resolve.BindingContext.VARIABLE;
@@ -200,7 +201,7 @@ public abstract class MemberCodegen<T extends JetElement/* TODO: & JetDeclaratio
assert state.getClassBuilderMode() == ClassBuilderMode.FULL assert state.getClassBuilderMode() == ClassBuilderMode.FULL
: "<clinit> should not be generated for light classes. Descriptor: " + descriptor; : "<clinit> should not be generated for light classes. Descriptor: " + descriptor;
if (clInit == null) { if (clInit == null) {
MethodVisitor mv = v.newMethod(null, descriptor, ACC_STATIC, "<clinit>", "()V", null, null); MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), ACC_STATIC, "<clinit>", "()V", null, null);
mv.visitCode(); mv.visitCode();
SimpleFunctionDescriptorImpl clInit = SimpleFunctionDescriptorImpl clInit =
SimpleFunctionDescriptorImpl.create(descriptor, Annotations.EMPTY, Name.special("<clinit>"), SYNTHESIZED); SimpleFunctionDescriptorImpl.create(descriptor, Annotations.EMPTY, Name.special("<clinit>"), SYNTHESIZED);
@@ -130,7 +130,7 @@ public class PropertyCodegen {
Type type = typeMapper.mapType(descriptor); Type type = typeMapper.mapType(descriptor);
String name = p.getName(); String name = p.getName();
assert name != null : "Annotation parameter has no name: " + p.getText(); assert name != null : "Annotation parameter has no name: " + p.getText();
MethodVisitor visitor = v.newMethod(p, descriptor, ACC_PUBLIC | ACC_ABSTRACT, name, "()" + type.getDescriptor(), null, null); MethodVisitor visitor = v.newMethod(OtherOrigin(p, descriptor), ACC_PUBLIC | ACC_ABSTRACT, name, "()" + type.getDescriptor(), null, null);
JetExpression defaultValue = p.getDefaultValue(); JetExpression defaultValue = p.getDefaultValue();
if (defaultValue != null) { if (defaultValue != null) {
CompileTimeConstant<?> constant = ExpressionCodegen.getCompileTimeConstant(defaultValue, bindingContext); CompileTimeConstant<?> constant = ExpressionCodegen.getCompileTimeConstant(defaultValue, bindingContext);
@@ -171,7 +171,7 @@ public class PropertyCodegen {
if (!isTrait(context.getContextDescriptor()) || kind == OwnerKind.TRAIT_IMPL) { if (!isTrait(context.getContextDescriptor()) || kind == OwnerKind.TRAIT_IMPL) {
int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC; int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC;
MethodVisitor mv = v.newMethod(null, descriptor, flags, name, desc, null, null); MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, name, desc, null, null);
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(descriptor); AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(descriptor);
mv.visitCode(); mv.visitCode();
mv.visitInsn(Opcodes.RETURN); mv.visitInsn(Opcodes.RETURN);
@@ -95,7 +95,7 @@ public class SamWrapperCodegen {
} }
private void generateConstructor(Type ownerType, Type functionType, ClassBuilder cv) { private void generateConstructor(Type ownerType, Type functionType, ClassBuilder cv) {
MethodVisitor mv = cv.newMethod(null, samType.getJavaClassDescriptor(), MethodVisitor mv = cv.newMethod(OtherOrigin(samType.getJavaClassDescriptor()),
NO_FLAG_PACKAGE_PRIVATE, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null); NO_FLAG_PACKAGE_PRIVATE, "<init>", Type.getMethodDescriptor(Type.VOID_TYPE, functionType), null, null);
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
@@ -129,7 +129,7 @@ public class ScriptCodegen extends MemberCodegen<JetScript> {
JvmMethodSignature jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor, context.getEarlierScripts()); JvmMethodSignature jvmSignature = typeMapper.mapScriptSignature(scriptDescriptor, context.getEarlierScripts());
MethodVisitor mv = classBuilder.newMethod( MethodVisitor mv = classBuilder.newMethod(
scriptDeclaration, scriptDescriptor.getClassDescriptor().getUnsubstitutedPrimaryConstructor(), OtherOrigin(scriptDeclaration, scriptDescriptor.getClassDescriptor().getUnsubstitutedPrimaryConstructor()),
ACC_PUBLIC, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), ACC_PUBLIC, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
null, null); null, null);
@@ -65,9 +65,9 @@ public abstract class SignatureCollectingClassBuilderFactory(
return super.newField(origin, access, name, desc, signature, value) return super.newField(origin, access, name, desc, signature, value)
} }
override fun newMethod(origin: PsiElement?, descriptor: DeclarationDescriptor?, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor { override fun newMethod(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, exceptions: Array<out String>?): MethodVisitor {
signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, origin, descriptor)) signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), origin)
return super.newMethod(origin, descriptor, access, name, desc, signature, exceptions) return super.newMethod(origin, access, name, desc, signature, exceptions)
} }
override fun done() { override fun done() {
@@ -21,10 +21,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil; import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.OutputFile; import org.jetbrains.jet.OutputFile;
import org.jetbrains.jet.codegen.AsmUtil; import org.jetbrains.jet.codegen.*;
import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.codegen.FieldInfo;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.codegen.state.GenerationState; import org.jetbrains.jet.codegen.state.GenerationState;
import org.jetbrains.jet.codegen.state.JetTypeMapper; import org.jetbrains.jet.codegen.state.JetTypeMapper;
import org.jetbrains.org.objectweb.asm.*; import org.jetbrains.org.objectweb.asm.*;
@@ -37,6 +34,8 @@ import org.jetbrains.org.objectweb.asm.tree.VarInsnNode;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.*;
import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN;
public class AnonymousObjectTransformer { public class AnonymousObjectTransformer {
protected final GenerationState state; protected final GenerationState state;
@@ -232,7 +231,7 @@ public class AnonymousObjectTransformer {
String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, descTypes.toArray(new Type[descTypes.size()])); String constructorDescriptor = Type.getMethodDescriptor(Type.VOID_TYPE, descTypes.toArray(new Type[descTypes.size()]));
MethodVisitor constructorVisitor = classBuilder.newMethod(null, null, MethodVisitor constructorVisitor = classBuilder.newMethod(NO_ORIGIN,
AsmUtil.NO_FLAG_PACKAGE_PRIVATE, AsmUtil.NO_FLAG_PACKAGE_PRIVATE,
"<init>", constructorDescriptor, "<init>", constructorDescriptor,
null, ArrayUtil.EMPTY_STRING_ARRAY); null, ArrayUtil.EMPTY_STRING_ARRAY);
@@ -304,8 +303,7 @@ public class AnonymousObjectTransformer {
@NotNull @NotNull
private static MethodVisitor newMethod(@NotNull ClassBuilder builder, @NotNull MethodNode original) { private static MethodVisitor newMethod(@NotNull ClassBuilder builder, @NotNull MethodNode original) {
return builder.newMethod( return builder.newMethod(
null, NO_ORIGIN,
null,
original.access, original.access,
original.name, original.name,
original.desc, original.desc,
@@ -16,13 +16,11 @@
package org.jetbrains.jet.codegen.inline; package org.jetbrains.jet.codegen.inline;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.ClassBuilder;
import org.jetbrains.jet.codegen.DelegatingClassBuilder; import org.jetbrains.jet.codegen.DelegatingClassBuilder;
import org.jetbrains.jet.codegen.JvmDeclarationOrigin; import org.jetbrains.jet.codegen.JvmDeclarationOrigin;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.AnnotationVisitor; import org.jetbrains.org.objectweb.asm.AnnotationVisitor;
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.FieldVisitor;
@@ -60,8 +58,7 @@ public class RemappingClassBuilder extends DelegatingClassBuilder {
@Override @Override
@NotNull @NotNull
public MethodVisitor newMethod( public MethodVisitor newMethod(
@Nullable PsiElement origin, @NotNull JvmDeclarationOrigin origin,
@Nullable DeclarationDescriptor descriptor,
int access, int access,
@NotNull String name, @NotNull String name,
@NotNull String desc, @NotNull String desc,
@@ -69,7 +66,7 @@ public class RemappingClassBuilder extends DelegatingClassBuilder {
@Nullable String[] exceptions @Nullable String[] exceptions
) { ) {
return new RemappingMethodAdapter(access, desc, return new RemappingMethodAdapter(access, desc,
builder.newMethod(origin, descriptor, access, name, remapper.mapMethodDesc(desc), signature, exceptions), builder.newMethod(origin, access, name, remapper.mapMethodDesc(desc), signature, exceptions),
remapper); remapper);
} }
@@ -25,7 +25,6 @@ import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.codegen.JvmDeclarationOrigin; import org.jetbrains.jet.codegen.JvmDeclarationOrigin;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.org.objectweb.asm.ClassVisitor; import org.jetbrains.org.objectweb.asm.ClassVisitor;
import org.jetbrains.org.objectweb.asm.FieldVisitor; import org.jetbrains.org.objectweb.asm.FieldVisitor;
import org.jetbrains.org.objectweb.asm.MethodVisitor; import org.jetbrains.org.objectweb.asm.MethodVisitor;
@@ -99,19 +98,18 @@ public class StubClassBuilder extends AbstractClassBuilder {
@NotNull @NotNull
@Override @Override
public MethodVisitor newMethod( public MethodVisitor newMethod(
@Nullable PsiElement origin, @NotNull JvmDeclarationOrigin origin,
@Nullable DeclarationDescriptor descriptor,
int access, int access,
@NotNull String name, @NotNull String name,
@NotNull String desc, @NotNull String desc,
@Nullable String signature, @Nullable String signature,
@Nullable String[] exceptions @Nullable String[] exceptions
) { ) {
MethodVisitor internalVisitor = super.newMethod(origin, descriptor, access, name, desc, signature, exceptions); MethodVisitor internalVisitor = super.newMethod(origin, access, name, desc, signature, exceptions);
if (internalVisitor != EMPTY_METHOD_VISITOR) { if (internalVisitor != EMPTY_METHOD_VISITOR) {
// If stub for method generated // If stub for method generated
markLastChild(origin); markLastChild(origin.getElement());
} }
return internalVisitor; return internalVisitor;