diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AbstractClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/AbstractClassBuilder.java index e4cba5942d6..13ceb90a550 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AbstractClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AbstractClassBuilder.java @@ -47,8 +47,7 @@ public abstract class AbstractClassBuilder implements ClassBuilder { @Override @NotNull public FieldVisitor newField( - @Nullable PsiElement origin, - @Nullable DeclarationDescriptor descriptor, + @NotNull JvmDeclarationOrigin origin, int access, @NotNull String name, @NotNull String desc, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java index 20ede7597b0..a21aef15732 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AsmUtil.java @@ -51,6 +51,7 @@ import java.util.Map; import java.util.Set; import static org.jetbrains.jet.codegen.JvmCodegenUtil.*; +import static org.jetbrains.jet.codegen.JvmDeclarationOrigin.NO_ORIGIN; import static org.jetbrains.jet.lang.resolve.DescriptorUtils.*; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.JAVA_STRING_TYPE; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.getType; @@ -373,7 +374,7 @@ public class AsmUtil { //noinspection PointlessBitwiseExpression int access = NO_FLAG_PACKAGE_PRIVATE | ACC_SYNTHETIC | ACC_FINAL; for (Pair field : allFields) { - builder.newField(null, null, access, field.first, field.second.getDescriptor(), null, null); + builder.newField(NO_ORIGIN, access, field.first, field.second.getDescriptor(), null, null); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java index 1ca97acdc9d..d38820982b1 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java @@ -28,8 +28,7 @@ import org.jetbrains.org.objectweb.asm.MethodVisitor; public interface ClassBuilder { @NotNull FieldVisitor newField( - @Nullable PsiElement origin, - @Nullable DeclarationDescriptor descriptor, + @NotNull JvmDeclarationOrigin origin, int access, @NotNull String name, @NotNull String desc, diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java index 5cc4a15f69b..77203cf090a 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -45,6 +45,7 @@ import java.util.Collections; import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.*; +import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin; import static org.jetbrains.jet.codegen.JvmCodegenUtil.isConst; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.lang.resolve.java.JvmAnnotationNames.KotlinSyntheticClass; @@ -203,7 +204,7 @@ public class ClosureCodegen extends ParentCodegenAware { MethodVisitor mv = cv.newMethod(fun, funDescriptor, ACC_STATIC | ACC_SYNTHETIC, "", "()V", null, ArrayUtil.EMPTY_STRING_ARRAY); InstructionAdapter iv = new InstructionAdapter(mv); - cv.newField(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); if (state.getClassBuilderMode() == ClassBuilderMode.FULL) { mv.visitCode(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java index e045cc8de82..1f31dc49be0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/DelegatingClassBuilder.java @@ -32,15 +32,14 @@ public abstract class DelegatingClassBuilder implements ClassBuilder { @NotNull @Override public FieldVisitor newField( - @Nullable PsiElement origin, - @Nullable DeclarationDescriptor descriptor, + @NotNull JvmDeclarationOrigin origin, int access, @NotNull String name, @NotNull String desc, @Nullable String signature, @Nullable Object value ) { - return getDelegate().newField(origin, descriptor, access, name, desc, signature, value); + return getDelegate().newField(origin, access, name, desc, signature, value); } @NotNull diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java index 4b2692c58fc..17f8c04440e 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java @@ -43,7 +43,6 @@ import org.jetbrains.jet.descriptors.serialization.ProtoBuf; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; -import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.CallResolverUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -67,6 +66,7 @@ import org.jetbrains.org.objectweb.asm.commons.Method; import java.util.*; import static org.jetbrains.jet.codegen.AsmUtil.*; +import static org.jetbrains.jet.codegen.CodegenPackage.OtherOrigin; import static org.jetbrains.jet.codegen.JvmCodegenUtil.*; import static org.jetbrains.jet.codegen.binding.CodegenBinding.*; import static org.jetbrains.jet.descriptors.serialization.NameSerializationUtil.createNameResolver; @@ -1055,7 +1055,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { StackValue.Field field = StackValue.singleton(fieldTypeDescriptor, typeMapper); - v.newField(original, null, ACC_PUBLIC | ACC_STATIC | ACC_FINAL, field.name, field.type.getDescriptor(), null, null); + v.newField(OtherOrigin(original), ACC_PUBLIC | ACC_STATIC | ACC_FINAL, field.name, field.type.getDescriptor(), null, null); if (!AsmUtil.isClassObjectWithBackingFieldsInOuter(fieldTypeDescriptor)) { genInitSingleton(fieldTypeDescriptor, field); @@ -1068,7 +1068,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { for (PropertyAndDefaultValue info : classObjectPropertiesToCopy) { PropertyDescriptor property = info.descriptor; - FieldVisitor fv = v.newField(null, property, ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(property, false), + FieldVisitor fv = v.newField(OtherOrigin(property), ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(property, false), typeMapper.mapType(property).getDescriptor(), typeMapper.mapFieldSignature(property.getType()), info.defaultValue); @@ -1317,7 +1317,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { Type fieldType = typeMapper.mapType(superClassDescriptor); String fieldDesc = fieldType.getDescriptor(); - v.newField(specifier, null, ACC_PRIVATE | ACC_FINAL | ACC_SYNTHETIC, delegateField, fieldDesc, /*TODO*/null, null); + v.newField(OtherOrigin(specifier), ACC_PRIVATE | ACC_FINAL | ACC_SYNTHETIC, delegateField, fieldDesc, /*TODO*/null, null); field = StackValue.field(fieldType, classAsmType, delegateField, false); field.store(fieldType, iv); @@ -1543,7 +1543,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { assert name != null : "Enum entry has no name: " + declaration.getText(); String desc = "L" + classAsmType.getInternalName() + ";"; ClassDescriptor entryDescriptor = bindingContext.get(BindingContext.CLASS, declaration); - v.newField(declaration, entryDescriptor, ACC_PUBLIC | ACC_ENUM | ACC_STATIC | ACC_FINAL, name, desc, null, null); + v.newField(OtherOrigin(declaration, entryDescriptor), ACC_PUBLIC | ACC_ENUM | ACC_STATIC | ACC_FINAL, name, desc, null, null); myEnumConstants.add((JetEnumEntry) declaration); } @@ -1559,7 +1559,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { InstructionAdapter iv = codegen.v; Type arrayAsmType = typeMapper.mapType(KotlinBuiltIns.getInstance().getArrayType(descriptor.getDefaultType())); - v.newField(myClass, null, ACC_PRIVATE | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC, VALUES, arrayAsmType.getDescriptor(), null, null); + v.newField(OtherOrigin(myClass), ACC_PRIVATE | ACC_STATIC | ACC_FINAL | ACC_SYNTHETIC, VALUES, arrayAsmType.getDescriptor(), null, null); iv.iconst(myEnumConstants.size()); iv.newarray(classAsmType); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JvmDeclarationOrigin.kt b/compiler/backend/src/org/jetbrains/jet/codegen/JvmDeclarationOrigin.kt new file mode 100644 index 00000000000..f3fa34dcf73 --- /dev/null +++ b/compiler/backend/src/org/jetbrains/jet/codegen/JvmDeclarationOrigin.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.codegen + +import com.intellij.psi.PsiElement +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor + +public enum class MemberKind { FIELD; METHOD } + +public enum class JvmDeclarationOriginKind { + OTHER +} + +public class JvmDeclarationOrigin( + val originKind: JvmDeclarationOriginKind, + val element: PsiElement?, + val descriptor: DeclarationDescriptor? +) { + class object { + public val NO_ORIGIN: JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, null) + } +} + +public fun OtherOrigin(element: PsiElement, descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, descriptor) + +public fun OtherOrigin(element: PsiElement): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, element, null) + +public fun OtherOrigin(descriptor: DeclarationDescriptor): JvmDeclarationOrigin = JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, null, descriptor) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java index 379bfaa4fb9..a6817bed992 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java @@ -50,6 +50,7 @@ import java.util.List; import static org.jetbrains.jet.codegen.AsmUtil.boxType; import static org.jetbrains.jet.codegen.AsmUtil.isPrimitive; +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.resolve.BindingContext.VARIABLE; import static org.jetbrains.jet.lang.resolve.java.AsmTypeConstants.*; @@ -326,7 +327,7 @@ public abstract class MemberCodegen { Type blockType = typeMapper.mapType(scriptDescriptor.getScriptCodeDescriptor().getReturnType()); PropertyDescriptor scriptResultProperty = scriptDescriptor.getScriptResultProperty(); - classBuilder.newField(null, scriptResultProperty, + classBuilder.newField(OtherOrigin(scriptResultProperty), ACC_PUBLIC | ACC_FINAL, scriptResultProperty.getName().asString(), blockType.getDescriptor(), null, null); @@ -199,13 +201,13 @@ public class ScriptCodegen extends MemberCodegen { for (ScriptDescriptor earlierScript : context.getEarlierScripts()) { Type earlierClassName = asmTypeForScriptDescriptor(bindingContext, earlierScript); int access = ACC_PRIVATE | ACC_FINAL; - classBuilder.newField(null, null, access, context.getScriptFieldName(earlierScript), earlierClassName.getDescriptor(), null, null); + classBuilder.newField(NO_ORIGIN, access, context.getScriptFieldName(earlierScript), earlierClassName.getDescriptor(), null, null); } for (ValueParameterDescriptor parameter : script.getScriptCodeDescriptor().getValueParameters()) { Type parameterType = typeMapper.mapType(parameter); int access = ACC_PUBLIC | ACC_FINAL; - classBuilder.newField(null, parameter, access, parameter.getName().getIdentifier(), parameterType.getDescriptor(), null, null); + classBuilder.newField(OtherOrigin(parameter), access, parameter.getName().getIdentifier(), parameterType.getDescriptor(), null, null); } } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/SignatureCollectingClassBuilderFactory.kt b/compiler/backend/src/org/jetbrains/jet/codegen/SignatureCollectingClassBuilderFactory.kt index 676a78fe429..b5c3256ede0 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/SignatureCollectingClassBuilderFactory.kt +++ b/compiler/backend/src/org/jetbrains/jet/codegen/SignatureCollectingClassBuilderFactory.kt @@ -22,16 +22,8 @@ import org.jetbrains.org.objectweb.asm.FieldVisitor import org.jetbrains.org.objectweb.asm.MethodVisitor import com.intellij.util.containers.MultiMap -public enum class MemberKind { FIELD; METHOD } public data class RawSignature(val name: String, val desc: String, val field: MemberKind) -public class JvmDeclarationOrigin( - val element: PsiElement?, - val descriptor: DeclarationDescriptor? -) - -public val NO_ORIGIN: JvmDeclarationOrigin = JvmDeclarationOrigin(null, null) - public abstract class SignatureCollectingClassBuilderFactory( private val delegate: ClassBuilderFactory @@ -45,7 +37,7 @@ public abstract class SignatureCollectingClassBuilderFactory( ) override fun newClassBuilder(forElement: PsiElement?, forDescriptor: DeclarationDescriptor?): SignatureCollectingClassBuilder { - return SignatureCollectingClassBuilder(JvmDeclarationOrigin(forElement, forDescriptor), delegate.newClassBuilder(forElement, forDescriptor)) + return SignatureCollectingClassBuilder(JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, forElement, forDescriptor), delegate.newClassBuilder(forElement, forDescriptor)) } public override fun asBytes(builder: ClassBuilder?): ByteArray? { @@ -68,13 +60,13 @@ public abstract class SignatureCollectingClassBuilderFactory( super.defineClass(origin, version, access, name, signature, superName, interfaces) } - override fun newField(origin: PsiElement?, descriptor: DeclarationDescriptor?, access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor { - signatures.putValue(RawSignature(name, desc, MemberKind.FIELD), JvmDeclarationOrigin(origin, descriptor)) - return super.newField(origin, descriptor, access, name, desc, signature, value) + override fun newField(origin: JvmDeclarationOrigin, access: Int, name: String, desc: String, signature: String?, value: Any?): FieldVisitor { + signatures.putValue(RawSignature(name, desc, MemberKind.FIELD), origin) + 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?): MethodVisitor { - signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), JvmDeclarationOrigin(origin, descriptor)) + signatures.putValue(RawSignature(name, desc, MemberKind.METHOD), JvmDeclarationOrigin(JvmDeclarationOriginKind.OTHER, origin, descriptor)) return super.newMethod(origin, descriptor, access, name, desc, signature, exceptions) } diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java index 3d9229473b1..2f957c833a7 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/inline/RemappingClassBuilder.java @@ -21,6 +21,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.codegen.ClassBuilder; import org.jetbrains.jet.codegen.DelegatingClassBuilder; +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.ClassVisitor; @@ -46,15 +47,14 @@ public class RemappingClassBuilder extends DelegatingClassBuilder { @Override @NotNull public FieldVisitor newField( - @Nullable PsiElement origin, - @Nullable DeclarationDescriptor descriptor, + @NotNull JvmDeclarationOrigin origin, int access, @NotNull String name, @NotNull String desc, @Nullable String signature, @Nullable Object value ) { - return new RemappingFieldAdapter(builder.newField(origin, descriptor, access, name, remapper.mapDesc(desc), signature, value), remapper); + return new RemappingFieldAdapter(builder.newField(origin, access, name, remapper.mapDesc(desc), signature, value), remapper); } @Override 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 4d21b70f170..b0b105c5992 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 @@ -24,6 +24,7 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.util.containers.Stack; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +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.FieldVisitor; @@ -119,19 +120,18 @@ public class StubClassBuilder extends AbstractClassBuilder { @NotNull @Override public FieldVisitor newField( - @Nullable PsiElement origin, - @Nullable DeclarationDescriptor descriptor, + @NotNull JvmDeclarationOrigin origin, int access, @NotNull String name, @NotNull String desc, @Nullable String signature, @Nullable Object value ) { - FieldVisitor internalVisitor = super.newField(origin, descriptor, access, name, desc, signature, value); + FieldVisitor internalVisitor = super.newField(origin, access, name, desc, signature, value); if (internalVisitor != EMPTY_FIELD_VISITOR) { // If stub for field generated - markLastChild(origin); + markLastChild(origin.getElement()); } return internalVisitor;