diff --git a/.idea/runConfigurations/All_Jvm_Backend_Tests.xml b/.idea/runConfigurations/All_Jvm_Backend_Tests.xml
index 4270bdf9050..e83bbdb5e13 100644
--- a/.idea/runConfigurations/All_Jvm_Backend_Tests.xml
+++ b/.idea/runConfigurations/All_Jvm_Backend_Tests.xml
@@ -23,7 +23,13 @@
+
+
+
+
+
+
diff --git a/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java b/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java
index 9c625a867d1..d1040cbefc1 100644
--- a/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java
+++ b/compiler/backend/src/org/jetbrains/jet/cli/jvm/compiler/TipsManager.java
@@ -51,12 +51,15 @@ public final class TipsManager {
}
@NotNull
- public static Collection getReferenceVariants(JetSimpleNameExpression expression, BindingContext context) {
+ public static Collection getReferenceVariants(
+ @NotNull final JetSimpleNameExpression expression,
+ @NotNull final BindingContext context
+ ) {
JetExpression receiverExpression = expression.getReceiverExpression();
if (receiverExpression != null) {
// Process as call expression
- final JetScope resolutionScope = context.get(BindingContext.RESOLUTION_SCOPE, expression);
- final JetType expressionType = context.get(BindingContext.EXPRESSION_TYPE, receiverExpression);
+ JetScope resolutionScope = context.get(BindingContext.RESOLUTION_SCOPE, expression);
+ JetType expressionType = context.get(BindingContext.EXPRESSION_TYPE, receiverExpression);
if (expressionType != null && resolutionScope != null) {
if (!(expressionType instanceof NamespaceType)) {
@@ -116,7 +119,7 @@ public final class TipsManager {
}
@NotNull
- public static Collection getReferenceVariants(JetNamespaceHeader expression, BindingContext context) {
+ public static Collection getPackageReferenceVariants(JetSimpleNameExpression expression, BindingContext context) {
JetScope resolutionScope = context.get(BindingContext.RESOLUTION_SCOPE, expression);
if (resolutionScope != null) {
return excludeNonPackageDescriptors(resolutionScope.getAllDescriptors());
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java
index 87735e64197..1f7160d83cf 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForFunctionDescriptor.java
@@ -24,7 +24,7 @@ import java.util.Collections;
/**
* @author alex.tkachman
-*/
+ */
public class AccessorForFunctionDescriptor extends SimpleFunctionDescriptorImpl {
public AccessorForFunctionDescriptor(DeclarationDescriptor descriptor, DeclarationDescriptor containingDeclaration, int index) {
super(containingDeclaration, Collections.emptyList(),
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForPropertyDescriptor.java b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForPropertyDescriptor.java
index fad288fc832..1b10d5984c1 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForPropertyDescriptor.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/AccessorForPropertyDescriptor.java
@@ -25,7 +25,7 @@ import java.util.Collections;
/**
* @author alex.tkachman
-*/
+ */
public class AccessorForPropertyDescriptor extends PropertyDescriptor {
public AccessorForPropertyDescriptor(PropertyDescriptor pd, DeclarationDescriptor containingDeclaration, int index) {
super(containingDeclaration, Collections.emptyList(), Modality.FINAL, Visibilities.PUBLIC,
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
index ade7c42458c..3a647608f89 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java
@@ -17,6 +17,10 @@
package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
+import org.jetbrains.asm4.AnnotationVisitor;
+import org.jetbrains.asm4.ClassVisitor;
+import org.jetbrains.asm4.FieldVisitor;
+import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.Annotated;
@@ -24,11 +28,13 @@ import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
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.calls.*;
+import org.jetbrains.jet.lang.resolve.calls.DefaultValueArgument;
+import org.jetbrains.jet.lang.resolve.calls.ResolvedCall;
+import org.jetbrains.jet.lang.resolve.calls.ResolvedValueArgument;
+import org.jetbrains.jet.lang.resolve.calls.VarargValueArgument;
import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType;
-import org.jetbrains.asm4.*;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
@@ -47,28 +53,32 @@ public abstract class AnnotationCodegen {
}
public void genAnnotations(Annotated annotated) {
- if (annotated == null)
+ if (annotated == null) {
return;
-
- if (!(annotated instanceof DeclarationDescriptor))
+ }
+
+ if (!(annotated instanceof DeclarationDescriptor)) {
return;
+ }
PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(bindingContext, (DeclarationDescriptor) annotated);
JetModifierList modifierList = null;
if (annotated instanceof ConstructorDescriptor && psiElement instanceof JetClass) {
- modifierList = ((JetClass)psiElement).getPrimaryConstructorModifierList();
+ modifierList = ((JetClass) psiElement).getPrimaryConstructorModifierList();
}
else if (psiElement instanceof JetModifierListOwner) {
modifierList = ((JetModifierListOwner) psiElement).getModifierList();
}
- if (modifierList == null)
+ if (modifierList == null) {
return;
+ }
List annotationEntries = modifierList.getAnnotationEntries();
for (JetAnnotationEntry annotationEntry : annotationEntries) {
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, annotationEntry.getCalleeExpression());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, annotationEntry.getCalleeExpression());
assert resolvedCall != null;
AnnotationDescriptor annotationDescriptor = bindingContext.get(BindingContext.ANNOTATION, annotationEntry);
@@ -79,8 +89,10 @@ public abstract class AnnotationCodegen {
}
}
- private void genAnnotation(ResolvedCall extends CallableDescriptor> resolvedCall,
- JetType type) {
+ private void genAnnotation(
+ ResolvedCall extends CallableDescriptor> resolvedCall,
+ JetType type
+ ) {
ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
RetentionPolicy rp = getRetentionPolicy(classifierDescriptor, typeMapper);
if (rp == RetentionPolicy.SOURCE) {
@@ -117,7 +129,7 @@ public abstract class AnnotationCodegen {
visitor.visitEnd();
}
else {
- assert valueArguments.size() == 1 : "Number of arguments on " + keyName + " = " + valueArguments.size(); // todo
+ assert valueArguments.size() == 1 : "Number of arguments on " + keyName + " = " + valueArguments.size(); // todo
JetExpression expression = valueArguments.get(0).getArgumentExpression();
genAnnotationExpressionValue(annotationVisitor, keyName, expression);
}
@@ -125,7 +137,7 @@ public abstract class AnnotationCodegen {
private void genAnnotationExpressionValue(AnnotationVisitor annotationVisitor, String keyName, JetExpression expression) {
CompileTimeConstant> compileTimeConstant =
- bindingContext.get(BindingContext.COMPILE_TIME_VALUE, expression);
+ bindingContext.get(BindingContext.COMPILE_TIME_VALUE, expression);
if (compileTimeConstant != null) {
Object value = compileTimeConstant.getValue();
@@ -134,40 +146,42 @@ public abstract class AnnotationCodegen {
}
if (expression instanceof JetDotQualifiedExpression) {
- JetDotQualifiedExpression qualifiedExpression = (JetDotQualifiedExpression)expression;
+ JetDotQualifiedExpression qualifiedExpression = (JetDotQualifiedExpression) expression;
ResolvedCall extends CallableDescriptor> call =
- bindingContext.get(BindingContext.RESOLVED_CALL, qualifiedExpression.getSelectorExpression());
+ bindingContext.get(BindingContext.RESOLVED_CALL, qualifiedExpression.getSelectorExpression());
if (call != null) {
if (call.getResultingDescriptor() instanceof PropertyDescriptor) {
- PropertyDescriptor descriptor = (PropertyDescriptor)call.getResultingDescriptor();
- annotationVisitor.visitEnum(keyName, typeMapper.mapType(descriptor.getReturnType(), MapTypeMode.VALUE).getDescriptor(), descriptor.getName().getName());
+ PropertyDescriptor descriptor = (PropertyDescriptor) call.getResultingDescriptor();
+ annotationVisitor.visitEnum(keyName, typeMapper.mapType(descriptor.getReturnType(), MapTypeMode.VALUE).getDescriptor(),
+ descriptor.getName().getName());
return;
}
}
}
else {
if (expression instanceof JetCallExpression) {
- JetCallExpression callExpression = (JetCallExpression)expression;
+ JetCallExpression callExpression = (JetCallExpression) expression;
ResolvedCall extends CallableDescriptor> call =
- bindingContext.get(BindingContext.RESOLVED_CALL, callExpression.getCalleeExpression());
+ bindingContext.get(BindingContext.RESOLVED_CALL, callExpression.getCalleeExpression());
if (call != null) {
List annotations = call.getResultingDescriptor().getOriginal().getAnnotations();
String value = null;
if (annotations != null) {
for (AnnotationDescriptor annotation : annotations) {
- if("Intrinsic".equals(annotation.getType().getConstructor().getDeclarationDescriptor().getName().getName())) {
+ if ("Intrinsic".equals(annotation.getType().getConstructor().getDeclarationDescriptor().getName().getName())) {
value = (String) annotation.getValueArguments().get(0).getValue();
break;
}
}
}
if (IntrinsicMethods.KOTLIN_JAVA_CLASS_FUNCTION.equals(value)) {
- annotationVisitor.visit(keyName, typeMapper.mapType(call.getResultingDescriptor().getReturnType().getArguments().get(0).getType(), MapTypeMode.VALUE));
+ annotationVisitor.visit(keyName, typeMapper
+ .mapType(call.getResultingDescriptor().getReturnType().getArguments().get(0).getType(), MapTypeMode.VALUE));
return;
}
else if (IntrinsicMethods.KOTLIN_ARRAYS_ARRAY.equals(value)) {
AnnotationVisitor visitor = annotationVisitor.visitArray(keyName);
- VarargValueArgument next = (VarargValueArgument)call.getValueArguments().values().iterator().next();
+ VarargValueArgument next = (VarargValueArgument) call.getValueArguments().values().iterator().next();
for (ValueArgument argument : next.getArguments()) {
genAnnotationExpressionValue(visitor, null, argument.getArgumentExpression());
}
@@ -175,9 +189,9 @@ public abstract class AnnotationCodegen {
return;
}
else if (call.getResultingDescriptor() instanceof ConstructorDescriptor) {
- ConstructorDescriptor descriptor = (ConstructorDescriptor)call.getResultingDescriptor();
+ ConstructorDescriptor descriptor = (ConstructorDescriptor) call.getResultingDescriptor();
AnnotationVisitor visitor = annotationVisitor.visitAnnotation(keyName, typeMapper
- .mapType(descriptor.getContainingDeclaration().getDefaultType(), MapTypeMode.VALUE).getDescriptor());
+ .mapType(descriptor.getContainingDeclaration().getDefaultType(), MapTypeMode.VALUE).getDescriptor());
getAnnotation(call, visitor);
visitor.visitEnd();
return;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java
index 4137ddfd573..dd473c62916 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CallableMethod.java
@@ -18,14 +18,12 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
-import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
-import org.jetbrains.jet.lang.resolve.java.JvmAbi;
-import org.jetbrains.jet.lang.resolve.java.JvmClassName;
-import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.asm4.Opcodes;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
+import org.jetbrains.jet.lang.resolve.java.JvmAbi;
+import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import java.util.List;
@@ -49,9 +47,11 @@ public class CallableMethod implements Callable {
@Nullable
private final Type generateCalleeType;
- public CallableMethod(@NotNull JvmClassName owner, @Nullable JvmClassName defaultImplOwner, @Nullable JvmClassName defaultImplParam,
+ public CallableMethod(
+ @NotNull JvmClassName owner, @Nullable JvmClassName defaultImplOwner, @Nullable JvmClassName defaultImplParam,
JvmMethodSignature signature, int invokeOpcode,
- @Nullable JvmClassName thisClass, @Nullable Type receiverParameterType, @Nullable Type generateCalleeType) {
+ @Nullable JvmClassName thisClass, @Nullable Type receiverParameterType, @Nullable Type generateCalleeType
+ ) {
this.owner = owner;
this.defaultImplOwner = defaultImplOwner;
this.defaultImplParam = defaultImplParam;
@@ -93,7 +93,8 @@ public class CallableMethod implements Callable {
}
void invoke(InstructionAdapter v) {
- v.visitMethodInsn(getInvokeOpcode(), owner.getInternalName(), getSignature().getAsmMethod().getName(), getSignature().getAsmMethod().getDescriptor());
+ v.visitMethodInsn(getInvokeOpcode(), owner.getInternalName(), getSignature().getAsmMethod().getName(),
+ getSignature().getAsmMethod().getDescriptor());
}
@Nullable
@@ -108,14 +109,15 @@ public class CallableMethod implements Callable {
v.iconst(mask);
String desc = getSignature().getAsmMethod().getDescriptor().replace(")", "I)");
- if("".equals(getSignature().getAsmMethod().getName())) {
+ if ("".equals(getSignature().getAsmMethod().getName())) {
v.visitMethodInsn(Opcodes.INVOKESPECIAL, defaultImplOwner.getInternalName(), "", desc);
}
else {
- if (getInvokeOpcode() != Opcodes.INVOKESTATIC)
+ if (getInvokeOpcode() != Opcodes.INVOKESTATIC) {
desc = desc.replace("(", "(" + defaultImplParam.getDescriptor());
+ }
v.visitMethodInsn(Opcodes.INVOKESTATIC, defaultImplOwner.getInternalName(),
- getSignature().getAsmMethod().getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, desc);
+ getSignature().getAsmMethod().getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, desc);
}
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java
index 167a0fe6d11..f47f323b70b 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java
@@ -90,17 +90,18 @@ public abstract class ClassBodyCodegen {
}
private void generatePrimaryConstructorProperties(PropertyCodegen propertyCodegen, JetClassOrObject origin) {
- boolean isAnnotation = origin instanceof JetClass && ((JetClass)origin).isAnnotation();
- OwnerKind kind = context.getContextKind();
+ boolean isAnnotation = origin instanceof JetClass && ((JetClass) origin).isAnnotation();
for (JetParameter p : getPrimaryConstructorParameters()) {
if (p.getValOrVarNode() != null) {
PropertyDescriptor propertyDescriptor = state.getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, p);
if (propertyDescriptor != null) {
if (!isAnnotation) {
propertyCodegen.generateBackingField(p, propertyDescriptor);
- propertyCodegen.generateDefaultGetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor,0), p);
+ propertyCodegen
+ .generateDefaultGetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p);
if (propertyDescriptor.isVar()) {
- propertyCodegen.generateDefaultSetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor,0), p);
+ propertyCodegen
+ .generateDefaultSetter(propertyDescriptor, JetTypeMapper.getAccessModifiers(propertyDescriptor, 0), p);
}
}
else {
@@ -121,7 +122,7 @@ public abstract class ClassBodyCodegen {
private void generateStaticInitializer() {
if (staticInitializerChunks.size() > 0) {
- final MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | Opcodes.ACC_STATIC,"", "()V", null, null);
+ final MethodVisitor mv = v.newMethod(null, ACC_PUBLIC | Opcodes.ACC_STATIC, "", "()V", null, null);
if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java
index 1f220128517..82818e8533a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilder.java
@@ -21,11 +21,7 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.PsiElement;
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.Opcodes;
+import org.jetbrains.asm4.*;
public abstract class ClassBuilder {
public static class Concrete extends ClassBuilder {
@@ -40,27 +36,33 @@ public abstract class ClassBuilder {
return v;
}
}
- public FieldVisitor newField(@Nullable PsiElement origin,
- int access,
- String name,
- String desc,
- @Nullable String signature,
- @Nullable Object value) {
+
+ public FieldVisitor newField(
+ @Nullable PsiElement origin,
+ int access,
+ String name,
+ String desc,
+ @Nullable String signature,
+ @Nullable Object value
+ ) {
return getVisitor().visitField(access, name, desc, signature, value);
}
- public MethodVisitor newMethod(@Nullable PsiElement origin,
- int access,
- String name,
- String desc,
- @Nullable String signature,
- @Nullable String[] exceptions) {
+ public MethodVisitor newMethod(
+ @Nullable PsiElement origin,
+ int access,
+ String name,
+ String desc,
+ @Nullable String signature,
+ @Nullable String[] exceptions
+ ) {
return getVisitor().visitMethod(access, name, desc, signature, exceptions);
}
-
- public AnnotationVisitor newAnnotation(PsiElement origin,
- String desc,
- boolean visible) {
+
+ public AnnotationVisitor newAnnotation(
+ String desc,
+ boolean visible
+ ) {
return getVisitor().visitAnnotation(desc, visible);
}
@@ -70,7 +72,15 @@ public abstract class ClassBuilder {
public abstract ClassVisitor getVisitor();
- public void defineClass(PsiElement origin, int version, int access, String name, @Nullable String signature, String superName, String[] interfaces) {
+ public void defineClass(
+ PsiElement origin,
+ int version,
+ int access,
+ String name,
+ @Nullable String signature,
+ String superName,
+ String[] interfaces
+ ) {
getVisitor().visit(version, access & ~Opcodes.ACC_STATIC, name, signature, superName, interfaces);
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java
index 9345f38177d..1bc6620a805 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactories.java
@@ -17,7 +17,6 @@
package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.asm4.ClassVisitor;
import org.jetbrains.asm4.ClassWriter;
import org.jetbrains.asm4.util.TraceClassVisitor;
@@ -27,6 +26,7 @@ import java.io.StringWriter;
/**
* @author Stepan Koltsov
*/
+@SuppressWarnings("IOResourceOpenedButNotSafelyClosed")
public class ClassBuilderFactories {
public static ClassBuilderFactory TEST = new ClassBuilderFactory() {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java
index bcc95a0a8ec..5634086919c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderFactory.java
@@ -17,11 +17,6 @@
package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.asm4.ClassWriter;
-import org.jetbrains.asm4.util.TraceClassVisitor;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
/**
* @author max
@@ -29,7 +24,10 @@ import java.io.StringWriter;
public interface ClassBuilderFactory {
@NotNull
ClassBuilderMode getClassBuilderMode();
+
ClassBuilder newClassBuilder();
+
String asText(ClassBuilder builder);
+
byte[] asBytes(ClassBuilder builder);
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java
index 096391c2be8..c68def746aa 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassBuilderMode.java
@@ -17,13 +17,19 @@
package org.jetbrains.jet.codegen;
/**
-* @author Stepan Koltsov
-*/
+ * @author Stepan Koltsov
+ */
public enum ClassBuilderMode {
- /** Full function bodies */
+ /**
+ * Full function bodies
+ */
FULL,
- /** Only function signatures */
+ /**
+ * Only function signatures
+ */
SIGNATURES,
- /** Function with stub bodies: just throw exception */
+ /**
+ * Function with stub bodies: just throw exception
+ */
STUBS,
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java
index e1f3aec4775..be10b76e8fa 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassCodegen.java
@@ -56,32 +56,44 @@ public class ClassCodegen {
// different for the case when we compute closures
generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder);
}
-
+
for (JetDeclaration declaration : aClass.getDeclarations()) {
- if (declaration instanceof JetClass && !(declaration instanceof JetEnumEntry)) {
+ if (declaration instanceof JetClass) {
+ if (declaration instanceof JetEnumEntry && !state.getInjector().getClosureAnnotator().enumEntryNeedSubclass(
+ (JetEnumEntry) declaration)) {
+ continue;
+ }
+
generate(contextForInners, (JetClass) declaration);
}
if (declaration instanceof JetClassObject) {
- generate(contextForInners, ((JetClassObject)declaration).getObjectDeclaration());
+ generate(contextForInners, ((JetClassObject) declaration).getObjectDeclaration());
}
}
if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) {
generateImplementation(context, aClass, OwnerKind.IMPLEMENTATION, contextForInners.accessors, classBuilder);
}
-
+
classBuilder.done();
}
- private void generateImplementation(CodegenContext context, JetClassOrObject aClass, OwnerKind kind, HashMap accessors, ClassBuilder classBuilder) {
+ private void generateImplementation(
+ CodegenContext context,
+ JetClassOrObject aClass,
+ OwnerKind kind,
+ HashMap accessors,
+ ClassBuilder classBuilder
+ ) {
ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass);
CodegenContext classContext = context.intoClass(descriptor, kind, jetTypeMapper);
classContext.copyAccessors(accessors);
new ImplementationBodyCodegen(aClass, classContext, classBuilder, state).generate();
- if (aClass instanceof JetClass && ((JetClass)aClass).isTrait()) {
+ if (aClass instanceof JetClass && ((JetClass) aClass).isTrait()) {
ClassBuilder traitBuilder = state.forTraitImplementation(descriptor);
- new TraitImplBodyCodegen(aClass, context.intoClass(descriptor, OwnerKind.TRAIT_IMPL, jetTypeMapper), traitBuilder, state).generate();
+ new TraitImplBodyCodegen(aClass, context.intoClass(descriptor, OwnerKind.TRAIT_IMPL, jetTypeMapper), traitBuilder, state)
+ .generate();
traitBuilder.done();
}
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
index b0226da2533..dbd73749039 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClassFileFactory.java
@@ -18,9 +18,8 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.psi.JetFile;
-import org.jetbrains.jet.lang.psi.JetPsiUtil;
-import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
+import org.jetbrains.jet.lang.resolve.name.FqName;
import javax.inject.Inject;
import java.util.*;
@@ -49,7 +48,6 @@ public class ClassFileFactory {
}
-
ClassBuilder newVisitor(String filePath) {
state.getProgress().log("Emitting: " + filePath);
final ClassBuilder answer = builderFactory.newClassBuilder();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
index 5dfd501ff89..14a7e835b6c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureAnnotator.java
@@ -42,14 +42,16 @@ public class ClosureAnnotator {
private final Map anonymousSubclassesCount = new HashMap();
private final Map classNameForScript = new HashMap();
private final Set scriptClassNames = new HashSet();
- private final Map classesForFunctions = new HashMap();
- private final Map enclosing = new HashMap();
+ private final Map classesForFunctions =
+ new HashMap();
+ private final Map enclosing = new HashMap();
private final MultiMap namespaceName2MultiNamespaceFiles = MultiMap.create();
private final MultiMap namespaceName2Files = MultiMap.create();
private BindingContext bindingContext;
private List files;
+ private final Map enumEntryNeedSubclass = new HashMap();
@Inject
public void setBindingContext(BindingContext bindingContext) {
@@ -81,7 +83,10 @@ public class ClosureAnnotator {
classDescriptor.initialize(
false,
Collections.emptyList(),
- Collections.singleton((funDescriptor.getReceiverParameter().exists() ? JetStandardClasses.getReceiverFunction(arity) : JetStandardClasses.getFunction(arity)).getDefaultType()), JetScope.EMPTY, Collections.emptySet(), null);
+ Collections.singleton((funDescriptor.getReceiverParameter().exists()
+ ? JetStandardClasses.getReceiverFunction(arity)
+ : JetStandardClasses.getFunction(arity)).getDefaultType()), JetScope.EMPTY,
+ Collections.emptySet(), null);
classesForFunctions.put(funDescriptor, classDescriptor);
}
return classDescriptor;
@@ -169,7 +174,7 @@ public class ClosureAnnotator {
ArrayList namespaceFiles = new ArrayList();
for (JetFile jetFile : entry.getValue()) {
- ArrayList fileFunctions = new ArrayList();
+ Collection fileFunctions = new ArrayList();
for (JetDeclaration declaration : jetFile.getDeclarations()) {
if (declaration instanceof JetNamedFunction) {
fileFunctions.add(declaration);
@@ -181,7 +186,7 @@ public class ClosureAnnotator {
}
}
- if(namespaceFiles.size() > 1) {
+ if (namespaceFiles.size() > 1) {
for (JetFile namespaceFile : namespaceFiles) {
namespaceName2MultiNamespaceFiles.putValue(entry.getKey(), namespaceFile);
}
@@ -214,12 +219,27 @@ public class ClosureAnnotator {
}
public boolean hasThis0(ClassDescriptor classDescriptor) {
- if (DescriptorUtils.isClassObject(classDescriptor)) { return false; }
+ if (DescriptorUtils.isClassObject(classDescriptor)) {
+ return false;
+ }
+ if (classDescriptor.getKind() == ClassKind.ENUM_CLASS || classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
+ return false;
+ }
ClassDescriptor other = enclosing.get(classDescriptor);
return other != null;
}
+ public boolean enumEntryNeedSubclass(JetEnumEntry enumEntry) {
+ ClassDescriptor descriptor = bindingContext.get(BindingContext.CLASS, enumEntry);
+ return enumEntryNeedSubclass.get(descriptor);
+ }
+
+ public boolean enumEntryNeedSubclass(ClassDescriptor enumEntry) {
+ Boolean aBoolean = enumEntryNeedSubclass.get(enumEntry);
+ return aBoolean != null && aBoolean;
+ }
+
private class MyJetVisitorVoid extends JetVisitorVoid {
private final LinkedList classStack = new LinkedList();
private final LinkedList nameStack = new LinkedList();
@@ -266,6 +286,7 @@ public class ClosureAnnotator {
@Override
public void visitJetFile(JetFile file) {
if (file.isScript()) {
+ //noinspection ConstantConditions
nameStack.push(classNameForScriptPsi(file.getScript()).getInternalName());
}
else {
@@ -275,10 +296,18 @@ public class ClosureAnnotator {
nameStack.pop();
}
+ @Override
+ public void visitEnumEntry(JetEnumEntry enumEntry) {
+ ClassDescriptor descriptor = bindingContext.get(BindingContext.CLASS, enumEntry);
+ enumEntryNeedSubclass.put(descriptor, !enumEntry.getDeclarations().isEmpty());
+ super.visitEnumEntry(enumEntry);
+ }
+
@Override
public void visitClassObject(JetClassObject classObject) {
JvmClassName name = recordClassObject(classObject);
ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, classObject.getObjectDeclaration());
+ assert classDescriptor != null;
recordEnclosing(classDescriptor);
recordName(classDescriptor, name);
classStack.push(classDescriptor);
@@ -303,7 +332,9 @@ public class ClosureAnnotator {
if (classDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor) {
nameStack.push(base.isEmpty() ? classDescriptor.getName().getName() : base + '/' + classDescriptor.getName());
}
- else { nameStack.push(base + '$' + classDescriptor.getName()); }
+ else {
+ nameStack.push(base + '$' + classDescriptor.getName());
+ }
super.visitObjectDeclaration(declaration);
nameStack.pop();
classStack.pop();
@@ -321,7 +352,9 @@ public class ClosureAnnotator {
if (classDescriptor.getContainingDeclaration() instanceof NamespaceDescriptor) {
nameStack.push(base.isEmpty() ? classDescriptor.getName().getName() : base + '/' + classDescriptor.getName());
}
- else { nameStack.push(base + '$' + classDescriptor.getName()); }
+ else {
+ nameStack.push(base + '$' + classDescriptor.getName());
+ }
super.visitClass(klass);
nameStack.pop();
classStack.pop();
@@ -347,7 +380,8 @@ public class ClosureAnnotator {
@Override
public void visitFunctionLiteralExpression(JetFunctionLiteralExpression expression) {
JvmClassName name = recordAnonymousClass(expression.getFunctionLiteral());
- FunctionDescriptor declarationDescriptor = (FunctionDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, expression);
+ FunctionDescriptor declarationDescriptor =
+ (FunctionDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, expression);
// working around a problem with shallow analysis
if (declarationDescriptor == null) return;
ClassDescriptor classDescriptor = classDescriptorForFunctionDescriptor(declarationDescriptor, name);
@@ -368,7 +402,8 @@ public class ClosureAnnotator {
@Override
public void visitNamedFunction(JetNamedFunction function) {
- FunctionDescriptor functionDescriptor = (FunctionDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, function);
+ FunctionDescriptor functionDescriptor =
+ (FunctionDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, function);
// working around a problem with shallow analysis
if (functionDescriptor == null) return;
DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration();
@@ -379,7 +414,9 @@ public class ClosureAnnotator {
}
else if (containingDeclaration instanceof NamespaceDescriptor) {
String peek = nameStack.peek();
- if (peek.isEmpty()) { peek = "namespace"; }
+ if (peek.isEmpty()) {
+ peek = "namespace";
+ }
else {
peek += "/namespace";
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
index 11dbb103f1e..ae1008d0445 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ClosureCodegen.java
@@ -23,6 +23,12 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.util.Pair;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Label;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.asm4.commons.Method;
+import org.jetbrains.asm4.signature.SignatureWriter;
import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
@@ -36,13 +42,6 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lang.types.JetType;
-import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
-import org.jetbrains.asm4.Label;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import org.jetbrains.asm4.commons.Method;
-import org.jetbrains.asm4.signature.SignatureWriter;
import java.util.ArrayList;
import java.util.List;
@@ -59,26 +58,26 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
public static JvmMethodSignature erasedInvokeSignature(FunctionDescriptor fd) {
-
+
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false);
-
+
signatureWriter.writeFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
-
+
boolean isExtensionFunction = fd.getReceiverParameter().exists();
int paramCount = fd.getValueParameters().size();
if (isExtensionFunction) {
paramCount++;
}
-
+
signatureWriter.writeParametersStart();
-
+
for (int i = 0; i < paramCount; ++i) {
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
signatureWriter.writeAsmType(JetTypeMapper.TYPE_OBJECT, true);
signatureWriter.writeParameterTypeEnd();
}
-
+
signatureWriter.writeParametersEnd();
signatureWriter.writeReturnType();
@@ -98,10 +97,9 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
else {
receiverParameterType = null;
}
- final CallableMethod result = new CallableMethod(
+ return new CallableMethod(
owner, null, null, descriptor, INVOKEVIRTUAL,
getInternalClassName(fd), receiverParameterType, getInternalClassName(fd).getAsmType());
- return result;
}
public JvmMethodSignature invokeSignature(FunctionDescriptor fd) {
@@ -118,6 +116,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
SignatureWriter signatureWriter = new SignatureWriter();
+ assert funDescriptor != null;
final List parameters = funDescriptor.getValueParameters();
final JvmClassName funClass = getInternalClassName(funDescriptor);
signatureWriter.visitClassType(funClass.getInternalName());
@@ -142,9 +141,12 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
generateBridge(name.getInternalName(), funDescriptor, fun, cv);
captureThis = generateBody(funDescriptor, cv, (JetDeclarationWithBody) fun);
ClassDescriptor thisDescriptor = context.getThisDescriptor();
- final Type enclosingType = thisDescriptor == null ? null : state.getInjector().getJetTypeMapper().mapType(thisDescriptor.getDefaultType(), MapTypeMode.VALUE);
- if (enclosingType == null)
+ final Type enclosingType = thisDescriptor == null
+ ? null
+ : state.getInjector().getJetTypeMapper().mapType(thisDescriptor.getDefaultType(), MapTypeMode.VALUE);
+ if (enclosingType == null) {
captureThis = null;
+ }
final Method constructor = generateConstructor(funClass, fun, funDescriptor);
@@ -158,16 +160,14 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
cv.done();
- final GeneratedAnonymousClassDescriptor answer = new GeneratedAnonymousClassDescriptor(name, constructor, captureThis, captureReceiver);
+ final GeneratedAnonymousClassDescriptor answer =
+ new GeneratedAnonymousClassDescriptor(name, constructor, captureThis, captureReceiver);
for (DeclarationDescriptor descriptor : closure.keySet()) {
if (descriptor == funDescriptor) {
continue;
}
- if (descriptor instanceof VariableDescriptor) {
- final EnclosedValueDescriptor valueDescriptor = closure.get(descriptor);
- answer.addArg(valueDescriptor.getOuterValue());
- }
- else if (CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) && descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
+ if (descriptor instanceof VariableDescriptor || CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) &&
+ descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
final EnclosedValueDescriptor valueDescriptor = closure.get(descriptor);
answer.addArg(valueDescriptor.getOuterValue());
}
@@ -204,7 +204,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
private Type generateBody(FunctionDescriptor funDescriptor, ClassBuilder cv, JetDeclarationWithBody body) {
- ClassDescriptor function = state.getInjector().getJetTypeMapper().getClosureAnnotator().classDescriptorForFunctionDescriptor(funDescriptor, name);
+ ClassDescriptor function =
+ state.getInjector().getJetTypeMapper().getClosureAnnotator().classDescriptorForFunctionDescriptor(funDescriptor, name);
final CodegenContexts.ClosureContext closureContext = context.intoClosure(
funDescriptor, function, name, this, state.getInjector().getJetTypeMapper());
@@ -218,10 +219,13 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
final JvmMethodSignature bridge = erasedInvokeSignature(funDescriptor);
final Method delegate = invokeSignature(funDescriptor).getAsmMethod();
- if (bridge.getAsmMethod().getDescriptor().equals(delegate.getDescriptor()))
+ if (bridge.getAsmMethod().getDescriptor().equals(delegate.getDescriptor())) {
return;
+ }
- final MethodVisitor mv = cv.newMethod(fun, ACC_PUBLIC | ACC_BRIDGE | ACC_VOLATILE, "invoke", bridge.getAsmMethod().getDescriptor(), null, new String[0]);
+ final MethodVisitor mv =
+ cv.newMethod(fun, ACC_PUBLIC | ACC_BRIDGE | ACC_VOLATILE, "invoke", bridge.getAsmMethod().getDescriptor(), null,
+ new String[0]);
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv);
}
@@ -236,14 +240,16 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
int count = 1;
if (receiver.exists()) {
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
- StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getInjector().getJetTypeMapper().mapType(receiver.getType(), MapTypeMode.VALUE), iv);
+ StackValue.onStack(JetTypeMapper.TYPE_OBJECT)
+ .upcast(state.getInjector().getJetTypeMapper().mapType(receiver.getType(), MapTypeMode.VALUE), iv);
count++;
}
final List params = funDescriptor.getValueParameters();
for (ValueParameterDescriptor param : params) {
StackValue.local(count, JetTypeMapper.TYPE_OBJECT).put(JetTypeMapper.TYPE_OBJECT, iv);
- StackValue.onStack(JetTypeMapper.TYPE_OBJECT).upcast(state.getInjector().getJetTypeMapper().mapType(param.getType(), MapTypeMode.VALUE), iv);
+ StackValue.onStack(JetTypeMapper.TYPE_OBJECT)
+ .upcast(state.getInjector().getJetTypeMapper().mapType(param.getType(), MapTypeMode.VALUE), iv);
count++;
}
@@ -261,7 +267,7 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
argCount += (captureReceiver != null ? 1 : 0);
ArrayList variableDescriptors = new ArrayList();
-
+
for (DeclarationDescriptor descriptor : closure.keySet()) {
if (descriptor == funDescriptor) {
continue;
@@ -270,7 +276,8 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
argCount++;
variableDescriptors.add(descriptor);
}
- else if (CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) && descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
+ else if (CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) &&
+ descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
argCount++;
variableDescriptors.add(descriptor);
}
@@ -308,8 +315,11 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
argTypes[i++] = type;
}
- else if (CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) && descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
- final Type type = state.getInjector().getJetTypeMapper().getClosureAnnotator().classNameForAnonymousClass((JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor)).getAsmType();
+ else if (CodegenUtil.isNamedFun(descriptor, state.getBindingContext()) &&
+ descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
+ final Type type = state.getInjector().getJetTypeMapper().getClosureAnnotator()
+ .classNameForAnonymousClass((JetElement) BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor))
+ .getAsmType();
argTypes[i++] = type;
}
}
@@ -374,16 +384,6 @@ public class ClosureCodegen extends ObjectOrClosureCodegen {
}
}
- public static ClassDescriptor getInternalType(FunctionDescriptor descriptor) {
- final int paramCount = descriptor.getValueParameters().size();
- if (descriptor.getReceiverParameter().exists()) {
- return JetStandardClasses.getReceiverFunction(paramCount);
- }
- else {
- return JetStandardClasses.getFunction(paramCount);
- }
- }
-
private void appendType(SignatureWriter signatureWriter, JetType type, char variance) {
signatureWriter.visitTypeArgument(variance);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
index 382fa0221fe..fb2f2b1b710 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java
@@ -18,14 +18,14 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
-import org.jetbrains.jet.lang.types.JetType;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import java.util.*;
+import java.util.Collections;
+import java.util.HashMap;
/*
* @author max
@@ -39,26 +39,32 @@ public abstract class CodegenContext {
private final OwnerKind contextKind;
@Nullable
private final CodegenContext parentContext;
- public final ObjectOrClosureCodegen closure;
+ public final ObjectOrClosureCodegen closure;
HashMap accessors;
protected StackValue outerExpression;
- protected Type outerWasUsed ;
+ protected Type outerWasUsed;
- public CodegenContext(@NotNull DeclarationDescriptor contextDescriptor, OwnerKind contextKind, @Nullable CodegenContext parentContext, @Nullable ObjectOrClosureCodegen closureCodegen) {
+ public CodegenContext(
+ @NotNull DeclarationDescriptor contextDescriptor,
+ OwnerKind contextKind,
+ @Nullable CodegenContext parentContext,
+ @Nullable ObjectOrClosureCodegen closureCodegen
+ ) {
this.contextDescriptor = contextDescriptor;
this.contextKind = contextKind;
this.parentContext = parentContext;
closure = closureCodegen;
}
- protected abstract ClassDescriptor getThisDescriptor ();
+ protected abstract ClassDescriptor getThisDescriptor();
public DeclarationDescriptor getClassOrNamespaceDescriptor() {
CodegenContext c = this;
- while(true) {
+ while (true) {
+ assert c != null;
DeclarationDescriptor contextDescriptor = c.getContextDescriptor();
if (!(contextDescriptor instanceof ClassDescriptor) && !(contextDescriptor instanceof NamespaceDescriptor)) {
c = c.getParentContext();
@@ -82,6 +88,7 @@ public abstract class CodegenContext {
return prefix != null ? StackValue.composed(prefix, outerExpression) : outerExpression;
}
+ @NotNull
public DeclarationDescriptor getContextDescriptor() {
return contextDescriptor;
}
@@ -95,14 +102,19 @@ public abstract class CodegenContext {
}
public CodegenContext intoNamespacePart(String delegateTo, NamespaceDescriptor descriptor) {
- return new CodegenContexts.NamespaceContext(descriptor, this, new OwnerKind.StaticDelegateKind(StackValue.none(), delegateTo));
+ return new CodegenContexts.NamespaceContext(descriptor, this, new OwnerKind.StaticDelegateKind(delegateTo));
}
public CodegenContext intoClass(ClassDescriptor descriptor, OwnerKind kind, JetTypeMapper typeMapper) {
return new CodegenContexts.ClassContext(descriptor, kind, this, typeMapper);
}
- public CodegenContext intoAnonymousClass(@NotNull ObjectOrClosureCodegen closure, ClassDescriptor descriptor, OwnerKind kind, JetTypeMapper typeMapper) {
+ public CodegenContext intoAnonymousClass(
+ @NotNull ObjectOrClosureCodegen closure,
+ ClassDescriptor descriptor,
+ OwnerKind kind,
+ JetTypeMapper typeMapper
+ ) {
return new CodegenContexts.AnonymousClassContext(descriptor, kind, this, closure, typeMapper);
}
@@ -113,7 +125,8 @@ public abstract class CodegenContext {
public CodegenContexts.ConstructorContext intoConstructor(ConstructorDescriptor descriptor, JetTypeMapper typeMapper) {
if (descriptor == null) {
descriptor = new ConstructorDescriptorImpl(getThisDescriptor(), Collections.emptyList(), true)
- .initialize(Collections.emptyList(), Collections.emptyList(), Visibilities.PUBLIC);
+ .initialize(Collections.emptyList(), Collections.emptyList(),
+ Visibilities.PUBLIC);
}
return new CodegenContexts.ConstructorContext(descriptor, getContextKind(), this, typeMapper);
}
@@ -122,7 +135,13 @@ public abstract class CodegenContext {
return new CodegenContexts.ScriptContext(script, classDescriptor, OwnerKind.IMPLEMENTATION, this, closure);
}
- public CodegenContexts.ClosureContext intoClosure(FunctionDescriptor funDescriptor, ClassDescriptor classDescriptor, JvmClassName internalClassName, ClosureCodegen closureCodegen, JetTypeMapper typeMapper) {
+ public CodegenContexts.ClosureContext intoClosure(
+ FunctionDescriptor funDescriptor,
+ ClassDescriptor classDescriptor,
+ JvmClassName internalClassName,
+ ClosureCodegen closureCodegen,
+ JetTypeMapper typeMapper
+ ) {
return new CodegenContexts.ClosureContext(funDescriptor, classDescriptor, this, closureCodegen, internalClassName, typeMapper);
}
@@ -151,7 +170,9 @@ public abstract class CodegenContext {
final ObjectOrClosureCodegen top = closure;
if (top != null) {
final StackValue answer = top.lookupInContext(d, result);
- if (answer != null) { return result == null ? answer : StackValue.composed(result, answer); }
+ if (answer != null) {
+ return result == null ? answer : StackValue.composed(result, answer);
+ }
StackValue outer = getOuterExpression(null);
result = result == null ? outer : StackValue.composed(result, outer);
@@ -171,17 +192,19 @@ public abstract class CodegenContext {
DeclarationDescriptor getAccessor(DeclarationDescriptor descriptor) {
if (accessors == null) {
- accessors = new HashMap();
+ accessors = new HashMap();
}
descriptor = descriptor.getOriginal();
DeclarationDescriptor accessor = accessors.get(descriptor);
- if (accessor != null) { return accessor; }
+ if (accessor != null) {
+ return accessor;
+ }
if (descriptor instanceof SimpleFunctionDescriptor) {
accessor = new AccessorForFunctionDescriptor(descriptor, contextDescriptor, accessors.size());
}
else if (descriptor instanceof PropertyDescriptor) {
- accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor,accessors.size());
+ accessor = new AccessorForPropertyDescriptor((PropertyDescriptor) descriptor, contextDescriptor, accessors.size());
}
else {
throw new UnsupportedOperationException();
@@ -201,7 +224,7 @@ public abstract class CodegenContext {
public void copyAccessors(HashMap accessors) {
if (accessors != null) {
if (this.accessors == null) {
- this.accessors = new HashMap();
+ this.accessors = new HashMap();
}
this.accessors.putAll(accessors);
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java
index ace432563b9..6b8a997226b 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContexts.java
@@ -18,21 +18,13 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
-import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
-import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
-import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
-import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
-import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
-import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
-import org.jetbrains.jet.lang.descriptors.PropertyAccessorDescriptor;
-import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.TypeSubstitutor;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -76,8 +68,10 @@ public class CodegenContexts {
throw new IllegalStateException();
}
- @NotNull @Override public Name getName() {
- return null;
+ @NotNull
+ @Override
+ public Name getName() {
+ throw new IllegalStateException();
}
}
@@ -97,13 +91,17 @@ public class CodegenContexts {
return "ROOT";
}
};
- protected static final StackValue local0 = StackValue.local(0, JetTypeMapper.TYPE_OBJECT);
protected static final StackValue local1 = StackValue.local(1, JetTypeMapper.TYPE_OBJECT);
public abstract static class ReceiverContext extends CodegenContext {
final CallableDescriptor receiverDescriptor;
- public ReceiverContext(CallableDescriptor contextDescriptor, OwnerKind contextKind, CodegenContext parentContext, @Nullable ObjectOrClosureCodegen closureCodegen) {
+ public ReceiverContext(
+ CallableDescriptor contextDescriptor,
+ OwnerKind contextKind,
+ CodegenContext parentContext,
+ @Nullable ObjectOrClosureCodegen closureCodegen
+ ) {
super(contextDescriptor, contextKind, parentContext, closureCodegen);
receiverDescriptor = contextDescriptor.getReceiverParameter().exists() ? contextDescriptor : null;
}
@@ -114,39 +112,41 @@ public class CodegenContexts {
}
}
- public static class MethodContext extends ReceiverContext {
- @NotNull
- private final FunctionDescriptor functionDescriptor;
+ public static class MethodContext extends ReceiverContext {
public MethodContext(@NotNull FunctionDescriptor contextType, OwnerKind contextKind, CodegenContext parentContext) {
- super(contextType instanceof PropertyAccessorDescriptor ? ((PropertyAccessorDescriptor)contextType).getCorrespondingProperty() : contextType, contextKind, parentContext, null);
- this.functionDescriptor = contextType;
- }
-
- @NotNull
- public FunctionDescriptor getFunctionDescriptor() {
- return functionDescriptor;
+ super(contextType instanceof PropertyAccessorDescriptor
+ ? ((PropertyAccessorDescriptor) contextType).getCorrespondingProperty()
+ : contextType, contextKind, parentContext, null);
}
@Override
protected ClassDescriptor getThisDescriptor() {
+ //noinspection ConstantConditions
return getParentContext().getThisDescriptor();
}
+ @Override
public StackValue lookupInContext(DeclarationDescriptor d, InstructionAdapter v, StackValue result) {
+ //noinspection ConstantConditions
return getParentContext().lookupInContext(d, v, result);
}
+ @Override
public Type enclosingClassType(JetTypeMapper typeMapper) {
+ //noinspection ConstantConditions
return getParentContext().enclosingClassType(typeMapper);
}
@Override
public boolean isStatic() {
+ //noinspection ConstantConditions
return getParentContext().isStatic();
}
+ @Override
protected StackValue getOuterExpression(StackValue prefix) {
+ //noinspection ConstantConditions
return getParentContext().getOuterExpression(prefix);
}
@@ -157,15 +157,21 @@ public class CodegenContexts {
}
public static class ConstructorContext extends MethodContext {
- public ConstructorContext(ConstructorDescriptor contextDescriptor, OwnerKind kind, CodegenContext parent, JetTypeMapper typeMapper) {
+ public ConstructorContext(
+ ConstructorDescriptor contextDescriptor,
+ OwnerKind kind,
+ CodegenContext parent,
+ JetTypeMapper typeMapper
+ ) {
super(contextDescriptor, kind, parent);
final Type type = enclosingClassType(typeMapper);
outerExpression = type != null
- ? local1
- : null;
+ ? local1
+ : null;
}
+ @Override
protected StackValue getOuterExpression(StackValue prefix) {
return outerExpression;
}
@@ -188,7 +194,8 @@ public class CodegenContexts {
@NotNull ClassDescriptor contextDescriptor,
@NotNull OwnerKind contextKind,
@Nullable CodegenContext parentContext,
- @Nullable ObjectOrClosureCodegen closureCodegen) {
+ @Nullable ObjectOrClosureCodegen closureCodegen
+ ) {
super(contextDescriptor, contextKind, parentContext, closureCodegen);
this.classDescriptor = contextDescriptor;
@@ -212,13 +219,18 @@ public class CodegenContexts {
}
public static class ClassContext extends CodegenContext {
- public ClassContext(ClassDescriptor contextDescriptor, OwnerKind contextKind, CodegenContext parentContext, JetTypeMapper typeMapper) {
+ public ClassContext(
+ ClassDescriptor contextDescriptor,
+ OwnerKind contextKind,
+ CodegenContext parentContext,
+ JetTypeMapper typeMapper
+ ) {
super(contextDescriptor, contextKind, parentContext, null);
final Type type = enclosingClassType(typeMapper);
outerExpression = type != null
- ? StackValue.field(type, typeMapper.getJvmClassName(contextDescriptor), "this$0", false)
- : null;
+ ? StackValue.field(type, typeMapper.getJvmClassName(contextDescriptor), "this$0", false)
+ : null;
}
@Override
@@ -233,14 +245,20 @@ public class CodegenContexts {
}
public static class AnonymousClassContext extends CodegenContext {
- public AnonymousClassContext(ClassDescriptor contextDescriptor, OwnerKind contextKind, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closure, JetTypeMapper typeMapper) {
+ public AnonymousClassContext(
+ ClassDescriptor contextDescriptor,
+ OwnerKind contextKind,
+ CodegenContext parentContext,
+ @NotNull ObjectOrClosureCodegen closure,
+ JetTypeMapper typeMapper
+ ) {
super(contextDescriptor, contextKind, parentContext, closure);
final Type type = enclosingClassType(typeMapper);
Type owner = closure.state.getInjector().getJetTypeMapper().mapType(contextDescriptor.getDefaultType(), MapTypeMode.IMPL);
outerExpression = type != null
- ? StackValue.field(type, JvmClassName.byType(owner), "this$0", false)
- : null;
+ ? StackValue.field(type, JvmClassName.byType(owner), "this$0", false)
+ : null;
}
@Override
@@ -260,16 +278,23 @@ public class CodegenContexts {
}
public static class ClosureContext extends ReceiverContext {
- private ClassDescriptor classDescriptor;
+ private final ClassDescriptor classDescriptor;
- public ClosureContext(FunctionDescriptor contextDescriptor, ClassDescriptor classDescriptor, CodegenContext parentContext, @NotNull ObjectOrClosureCodegen closureCodegen, JvmClassName internalClassName, JetTypeMapper typeMapper) {
+ public ClosureContext(
+ FunctionDescriptor contextDescriptor,
+ ClassDescriptor classDescriptor,
+ CodegenContext parentContext,
+ @NotNull ObjectOrClosureCodegen closureCodegen,
+ JvmClassName internalClassName,
+ JetTypeMapper typeMapper
+ ) {
super(contextDescriptor, OwnerKind.IMPLEMENTATION, parentContext, closureCodegen);
this.classDescriptor = classDescriptor;
final Type type = enclosingClassType(typeMapper);
outerExpression = type != null
- ? StackValue.field(type, internalClassName, "this$0", false)
- : null;
+ ? StackValue.field(type, internalClassName, "this$0", false)
+ : null;
}
@Override
@@ -277,6 +302,7 @@ public class CodegenContexts {
return classDescriptor;
}
+ @NotNull
@Override
public DeclarationDescriptor getContextDescriptor() {
return classDescriptor;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
index cb7078f5321..2b8b0f84199 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java
@@ -25,12 +25,12 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.name.Name;
-import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.JetType;
+import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import java.util.BitSet;
-import java.util.Collections;
import java.util.Collection;
+import java.util.Collections;
import java.util.Random;
/**
@@ -64,20 +64,20 @@ public class CodegenUtil {
CallableMemberDescriptor.Kind.DECLARATION);
invokeDescriptor.initialize(fd.getReceiverParameter().exists() ? fd.getReceiverParameter().getType() : null,
- fd.getExpectedThisObject(),
- Collections.emptyList(),
- fd.getValueParameters(),
- fd.getReturnType(),
- Modality.FINAL,
- Visibilities.PUBLIC,
- /*isInline = */false
+ fd.getExpectedThisObject(),
+ Collections.emptyList(),
+ fd.getValueParameters(),
+ fd.getReturnType(),
+ Modality.FINAL,
+ Visibilities.PUBLIC,
+ /*isInline = */false
);
return invokeDescriptor;
}
public static boolean isNonLiteralObject(JetClassOrObject myClass) {
return myClass instanceof JetObjectDeclaration && !((JetObjectDeclaration) myClass).isObjectLiteral() &&
- !(myClass.getParent() instanceof JetClassObject);
+ !(myClass.getParent() instanceof JetClassObject);
}
public static boolean isLocalFun(DeclarationDescriptor fd, BindingContext bindingContext) {
@@ -109,7 +109,9 @@ public class CodegenUtil {
}
- public static @NotNull BitSet getFlagsForVisibility(@NotNull Visibility visibility) {
+ public static
+ @NotNull
+ BitSet getFlagsForVisibility(@NotNull Visibility visibility) {
BitSet flags = new BitSet();
if (visibility == Visibilities.INTERNAL) {
flags.set(JvmStdlibNames.FLAG_INTERNAL_BIT);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java
index a3b2acf3846..678c890fac5 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationErrorHandler.java
@@ -25,7 +25,7 @@ public interface CompilationErrorHandler {
@Override
public void reportException(Throwable exception, String fileUrl) {
if (exception instanceof RuntimeException) {
- throw (RuntimeException)exception;
+ throw (RuntimeException) exception;
}
throw new IllegalStateException(exception);
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java
index f5de01c32f2..f48a303a0f7 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/CompilationException.java
@@ -24,9 +24,9 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
/**
-* @author alex.tkachman
-* @author abreslav
-*/
+ * @author alex.tkachman
+ * @author abreslav
+ */
public class CompilationException extends RuntimeException {
private final PsiElement element;
@@ -56,7 +56,8 @@ public class CompilationException extends RuntimeException {
return ApplicationManager.getApplication().runReadAction(new Computable() {
@Override
public String compute() {
- StringBuilder message = new StringBuilder("Back-end (JVM) Internal error: ").append(CompilationException.super.getMessage()).append("\n");
+ StringBuilder message =
+ new StringBuilder("Back-end (JVM) Internal error: ").append(CompilationException.super.getMessage()).append("\n");
Throwable cause = getCause();
if (cause != null) {
String causeMessage = cause.getMessage();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ConstructorFrameMap.java b/compiler/backend/src/org/jetbrains/jet/codegen/ConstructorFrameMap.java
index cb3ffe37da7..8f15765b90f 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ConstructorFrameMap.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ConstructorFrameMap.java
@@ -17,10 +17,10 @@
package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Type;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
-import org.jetbrains.asm4.Type;
import java.util.Collections;
import java.util.List;
@@ -31,7 +31,6 @@ import java.util.List;
*/
public class ConstructorFrameMap extends FrameMap {
private int myOuterThisIndex = -1;
- private int myTypeInfoIndex = -1;
public ConstructorFrameMap(CallableMethod callableMethod, @Nullable ConstructorDescriptor descriptor, boolean hasThis0) {
enterTemp(); // this
@@ -43,14 +42,16 @@ public class ConstructorFrameMap extends FrameMap {
List explicitArgTypes = callableMethod.getValueParameterTypes();
- if(descriptor != null && descriptor.getContainingDeclaration().getKind() == ClassKind.ENUM_CLASS) {
+ if (descriptor != null &&
+ (descriptor.getContainingDeclaration().getKind() == ClassKind.ENUM_CLASS ||
+ descriptor.getContainingDeclaration().getKind() == ClassKind.ENUM_ENTRY)) {
enterTemp(); // name
enterTemp(); // ordinal
}
List paramDescrs = descriptor != null
- ? descriptor.getValueParameters()
- : Collections.emptyList();
+ ? descriptor.getValueParameters()
+ : Collections.emptyList();
for (int i = 0; i < paramDescrs.size(); i++) {
ValueParameterDescriptor parameter = paramDescrs.get(i);
enter(parameter, explicitArgTypes.get(i).getSize());
@@ -60,8 +61,4 @@ public class ConstructorFrameMap extends FrameMap {
public int getOuterThisIndex() {
return myOuterThisIndex;
}
-
- public int getTypeInfoIndex() {
- return myTypeInfoIndex;
- }
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
index 9191951e0c9..8fcc3ecc98c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java
@@ -24,6 +24,12 @@ import com.intellij.psi.PsiMethod;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Label;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.jet.codegen.signature.JvmPropertyAccessorSignature;
import org.jetbrains.jet.lang.descriptors.*;
@@ -40,12 +46,6 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.lang.types.lang.JetStandardLibraryNames;
import org.jetbrains.jet.lexer.JetTokens;
-import org.jetbrains.asm4.Label;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import org.jetbrains.asm4.commons.Method;
import java.util.*;
@@ -79,7 +79,7 @@ public class ExpressionCodegen extends JetVisitor {
static class BlockStackElement {
}
-
+
static class LoopBlockStackElement extends BlockStackElement {
final Label continueLabel;
final Label breakLabel;
@@ -101,11 +101,13 @@ public class ExpressionCodegen extends JetVisitor {
}
- public ExpressionCodegen(MethodVisitor v,
- FrameMap myMap,
- Type returnType,
- CodegenContext context,
- GenerationState state) {
+ public ExpressionCodegen(
+ MethodVisitor v,
+ FrameMap myMap,
+ Type returnType,
+ CodegenContext context,
+ GenerationState state
+ ) {
this.myFrameMap = myMap;
this.typeMapper = state.getInjector().getJetTypeMapper();
this.returnType = returnType;
@@ -123,11 +125,13 @@ public class ExpressionCodegen extends JetVisitor {
}
StackValue castToRequiredTypeOfInterfaceIfNeeded(StackValue inner, DeclarationDescriptor provided, @Nullable ClassDescriptor required) {
- if (required == null)
+ if (required == null) {
return inner;
+ }
- if (provided instanceof CallableDescriptor)
- provided = ((CallableDescriptor)provided).getReceiverParameter().getType().getConstructor().getDeclarationDescriptor();
+ if (provided instanceof CallableDescriptor) {
+ provided = ((CallableDescriptor) provided).getReceiverParameter().getType().getConstructor().getDeclarationDescriptor();
+ }
assert provided instanceof ClassDescriptor;
@@ -229,8 +233,9 @@ public class ExpressionCodegen extends JetVisitor {
}
private static boolean isEmptyExpression(JetElement expr) {
- if (expr == null)
+ if (expr == null) {
return true;
+ }
if (expr instanceof JetBlockExpression) {
JetBlockExpression blockExpression = (JetBlockExpression) expr;
List statements = blockExpression.getStatements();
@@ -310,14 +315,14 @@ public class ExpressionCodegen extends JetVisitor {
return StackValue.onStack(Type.VOID_TYPE);
}
-
+
@Override
public StackValue visitDoWhileExpression(JetDoWhileExpression expression, StackValue receiver) {
Label condition = new Label();
v.mark(condition);
Label end = new Label();
-
+
blockStackElements.push(new LoopBlockStackElement(end, condition, targetLabel(expression)));
gen(expression.getBody(), Type.VOID_TYPE);
@@ -361,12 +366,15 @@ public class ExpressionCodegen extends JetVisitor {
FunctionDescriptor nextDescriptor = bindingContext.get(BindingContext.LOOP_RANGE_NEXT, loopRange);
DeclarationDescriptor hasNextDescriptor = bindingContext.get(BindingContext.LOOP_RANGE_HAS_NEXT, loopRange);
- if (iteratorDescriptor == null)
+ if (iteratorDescriptor == null) {
throw new IllegalStateException("No iterator() method " + DiagnosticUtils.atLocation(loopRange));
- if (nextDescriptor == null)
+ }
+ if (nextDescriptor == null) {
throw new IllegalStateException("No next() method " + DiagnosticUtils.atLocation(loopRange));
- if (hasNextDescriptor == null)
+ }
+ if (hasNextDescriptor == null) {
throw new IllegalStateException("No hasNext method or property" + DiagnosticUtils.atLocation(loopRange));
+ }
final JetParameter loopParameter = expression.getLoopParameter();
final VariableDescriptor parameterDescriptor = bindingContext.get(BindingContext.VALUE_PARAMETER, loopParameter);
@@ -381,7 +389,7 @@ public class ExpressionCodegen extends JetVisitor {
gen(expression.getLoopRange(), boxType(loopRangeType));
invokeFunctionNoParams(iteratorDescriptor, asmIterType, v);
v.store(iteratorVar, asmIterType);
-
+
Label end = new Label();
if (iteratorType.isNullable()) {
v.load(iteratorVar, TYPE_OBJECT);
@@ -398,11 +406,11 @@ public class ExpressionCodegen extends JetVisitor {
invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
}
else {
-// hND = ((PropertyDescriptor) hasNextDescriptor).getGetter();
-// if (hND != null)
-// invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
-// else
- intermediateValueForProperty((PropertyDescriptor) hasNextDescriptor, false, null).put(Type.BOOLEAN_TYPE, v);
+ // hND = ((PropertyDescriptor) hasNextDescriptor).getGetter();
+ // if (hND != null)
+ // invokeFunctionNoParams(hND, Type.BOOLEAN_TYPE, v);
+ // else
+ intermediateValueForProperty((PropertyDescriptor) hasNextDescriptor, false, null).put(Type.BOOLEAN_TYPE, v);
}
v.ifeq(end);
@@ -504,7 +512,7 @@ public class ExpressionCodegen extends JetVisitor {
StackValue value = gen(expression.getLoopRange());
if (value instanceof StackValue.Local) {
- myArrayVar = ((StackValue.Local)value).index;
+ myArrayVar = ((StackValue.Local) value).index;
localArrayVar = true;
}
else {
@@ -580,7 +588,7 @@ public class ExpressionCodegen extends JetVisitor {
v.iconst(1);
v.add(Type.INT_TYPE);
v.store(myCountVar, Type.INT_TYPE);
-
+
v.load(myCountVar, Type.INT_TYPE);
v.iflt(end);
@@ -636,8 +644,8 @@ public class ExpressionCodegen extends JetVisitor {
@Override
public StackValue visitBreakExpression(JetBreakExpression expression, StackValue receiver) {
JetSimpleNameExpression labelElement = expression.getTargetLabel();
-
- for(int i = blockStackElements.size()-1; i >= 0; --i) {
+
+ for (int i = blockStackElements.size() - 1; i >= 0; --i) {
BlockStackElement stackElement = blockStackElements.get(i);
if (stackElement instanceof FinallyBlockStackElement) {
FinallyBlockStackElement finallyBlockStackElement = (FinallyBlockStackElement) stackElement;
@@ -647,7 +655,9 @@ public class ExpressionCodegen extends JetVisitor {
}
else if (stackElement instanceof LoopBlockStackElement) {
LoopBlockStackElement loopBlockStackElement = (LoopBlockStackElement) stackElement;
- if (labelElement == null || loopBlockStackElement.targetLabel != null && labelElement.getReferencedName().equals(loopBlockStackElement.targetLabel.getReferencedName())) {
+ if (labelElement == null ||
+ loopBlockStackElement.targetLabel != null &&
+ labelElement.getReferencedName().equals(loopBlockStackElement.targetLabel.getReferencedName())) {
v.goTo(loopBlockStackElement.breakLabel);
return StackValue.none();
}
@@ -656,7 +666,7 @@ public class ExpressionCodegen extends JetVisitor {
throw new UnsupportedOperationException();
}
}
-
+
throw new UnsupportedOperationException();
}
@@ -664,7 +674,7 @@ public class ExpressionCodegen extends JetVisitor {
public StackValue visitContinueExpression(JetContinueExpression expression, StackValue receiver) {
JetSimpleNameExpression labelElement = expression.getTargetLabel();
- for(int i = blockStackElements.size()-1; i >= 0; --i) {
+ for (int i = blockStackElements.size() - 1; i >= 0; --i) {
BlockStackElement stackElement = blockStackElements.get(i);
if (stackElement instanceof FinallyBlockStackElement) {
FinallyBlockStackElement finallyBlockStackElement = (FinallyBlockStackElement) stackElement;
@@ -673,7 +683,9 @@ public class ExpressionCodegen extends JetVisitor {
}
else if (stackElement instanceof LoopBlockStackElement) {
LoopBlockStackElement loopBlockStackElement = (LoopBlockStackElement) stackElement;
- if (labelElement == null || loopBlockStackElement.targetLabel != null && labelElement.getReferencedName().equals(loopBlockStackElement.targetLabel.getReferencedName())) {
+ if (labelElement == null ||
+ loopBlockStackElement.targetLabel != null &&
+ labelElement.getReferencedName().equals(loopBlockStackElement.targetLabel.getReferencedName())) {
v.goTo(loopBlockStackElement.continueLabel);
return StackValue.none();
}
@@ -743,8 +755,8 @@ public class ExpressionCodegen extends JetVisitor {
}
else {
String text = entry instanceof JetEscapeStringTemplateEntry
- ? ((JetEscapeStringTemplateEntry) entry).getUnescapedValue()
- : entry.getText();
+ ? ((JetEscapeStringTemplateEntry) entry).getUnescapedValue()
+ : entry.getText();
v.aconst(text);
invokeAppendMethod(JL_STRING_TYPE);
}
@@ -809,12 +821,13 @@ public class ExpressionCodegen extends JetVisitor {
if (closure.isCaptureReceiver() != null) {
k++;
- v.load(context.getContextDescriptor().getContainingDeclaration() instanceof NamespaceDescriptor ? 0: 1, closure.isCaptureReceiver());
+ v.load(context.getContextDescriptor().getContainingDeclaration() instanceof NamespaceDescriptor ? 0 : 1,
+ closure.isCaptureReceiver());
}
for (int i = 0; i < closure.getArgs().size(); i++) {
StackValue arg = closure.getArgs().get(i);
- arg.put(cons.getArgumentTypes()[i+k], v);
+ arg.put(cons.getArgumentTypes()[i + k], v);
}
v.invokespecial(closure.getClassname().getInternalName(), "", cons.getDescriptor());
@@ -839,26 +852,32 @@ public class ExpressionCodegen extends JetVisitor {
v.load(context.isStatic() ? 0 : 1, closureCodegen.captureReceiver);
consArgTypes.add(closureCodegen.captureReceiver);
}
-
+
for (Map.Entry entry : closureCodegen.closure.entrySet()) {
if (entry.getKey() instanceof VariableDescriptor && !(entry.getKey() instanceof PropertyDescriptor)) {
Type sharedVarType = typeMapper.getSharedVarType(entry.getKey());
- if (sharedVarType == null)
- sharedVarType = state.getInjector().getJetTypeMapper().mapType(((VariableDescriptor) entry.getKey()).getType(), MapTypeMode.VALUE);
+ if (sharedVarType == null) {
+ sharedVarType = state.getInjector().getJetTypeMapper()
+ .mapType(((VariableDescriptor) entry.getKey()).getType(), MapTypeMode.VALUE);
+ }
consArgTypes.add(sharedVarType);
entry.getValue().getOuterValue().put(sharedVarType, v);
}
}
if (closureCodegen.superCall != null) {
- ConstructorDescriptor superConstructor = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, closureCodegen.superCall.getCalleeExpression().getConstructorReferenceExpression());
- CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION, typeMapper.hasThis0(superConstructor.getContainingDeclaration()));
+ ConstructorDescriptor superConstructor = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET,
+ closureCodegen.superCall
+ .getCalleeExpression()
+ .getConstructorReferenceExpression());
+ CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION,
+ typeMapper.hasThis0(superConstructor.getContainingDeclaration()));
Type[] argumentTypes = superCallable.getSignature().getAsmMethod().getArgumentTypes();
Collections.addAll(consArgTypes, argumentTypes);
ResolvedCall resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, closureCodegen.superCall.getCalleeExpression());
pushMethodArguments(resolvedCall, Arrays.asList(argumentTypes));
}
-
+
Method cons = new Method("", Type.VOID_TYPE, consArgTypes.toArray(new Type[consArgTypes.size()]));
v.invokespecial(closure.getClassname().getInternalName(), "", cons.getDescriptor());
return StackValue.onStack(closure.getClassname().getAsmType());
@@ -885,7 +904,7 @@ public class ExpressionCodegen extends JetVisitor {
final Type type = sharedVarType != null ? sharedVarType : asmType(variableDescriptor.getType());
myFrameMap.enter(variableDescriptor, type.getSize());
}
-
+
if (statement instanceof JetNamedFunction) {
DeclarationDescriptor descriptor = bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, statement);
myFrameMap.enter(descriptor, 1);
@@ -895,7 +914,9 @@ public class ExpressionCodegen extends JetVisitor {
StackValue answer = StackValue.none();
for (int i = 0, statementsSize = statements.size(); i < statementsSize; i++) {
JetElement statement = statements.get(i);
- if (i == statements.size() - 1 /*&& statement instanceof JetExpression && !bindingContext.get(BindingContext.STATEMENT, statement)*/) {
+ if (i ==
+ statements.size() -
+ 1 /*&& statement instanceof JetExpression && !bindingContext.get(BindingContext.STATEMENT, statement)*/) {
answer = gen(statement);
}
else {
@@ -962,7 +983,7 @@ public class ExpressionCodegen extends JetVisitor {
}
private void doFinallyOnReturn() {
- for(int i = blockStackElements.size()-1; i >= 0; --i) {
+ for (int i = blockStackElements.size() - 1; i >= 0; --i) {
BlockStackElement stackElement = blockStackElements.get(i);
if (stackElement instanceof FinallyBlockStackElement) {
FinallyBlockStackElement finallyBlockStackElement = (FinallyBlockStackElement) stackElement;
@@ -976,7 +997,7 @@ public class ExpressionCodegen extends JetVisitor {
}
}
}
-
+
@Override
public StackValue visitReturnExpression(JetReturnExpression expression, StackValue receiver) {
final JetExpression returnedExpression = expression.getReturnedExpression();
@@ -993,7 +1014,7 @@ public class ExpressionCodegen extends JetVisitor {
public void returnExpression(JetExpression expr) {
StackValue lastValue = gen(expr);
-
+
if (lastValue.type != Type.VOID_TYPE) {
lastValue.put(returnType, v);
v.areturn(returnType);
@@ -1006,12 +1027,12 @@ public class ExpressionCodegen extends JetVisitor {
private static boolean endsWithReturn(JetElement bodyExpression) {
if (bodyExpression instanceof JetBlockExpression) {
final List statements = ((JetBlockExpression) bodyExpression).getStatements();
- return statements.size() > 0 && statements.get(statements.size()-1) instanceof JetReturnExpression;
+ return statements.size() > 0 && statements.get(statements.size() - 1) instanceof JetReturnExpression;
}
-
+
return bodyExpression instanceof JetReturnExpression;
}
-
+
@Override
public StackValue visitSimpleNameExpression(JetSimpleNameExpression expression, StackValue receiver) {
ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression);
@@ -1036,7 +1057,7 @@ public class ExpressionCodegen extends JetVisitor {
IntrinsicMethod intrinsic = null;
if (descriptor instanceof CallableMemberDescriptor) {
CallableMemberDescriptor memberDescriptor = (CallableMemberDescriptor) descriptor;
- while(memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
+ while (memberDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
memberDescriptor = memberDescriptor.getOverriddenDescriptors().iterator().next();
}
intrinsic = state.getInjector().getIntrinsics().getIntrinsic(memberDescriptor);
@@ -1056,17 +1077,18 @@ public class ExpressionCodegen extends JetVisitor {
if (descriptor instanceof PropertyDescriptor) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
-
+
if (propertyDescriptor.isObjectDeclaration()) {
- ClassDescriptor classDescriptor = (ClassDescriptor) propertyDescriptor.getReturnType().getConstructor().getDeclarationDescriptor();
+ ClassDescriptor classDescriptor =
+ (ClassDescriptor) propertyDescriptor.getReturnType().getConstructor().getDeclarationDescriptor();
+ assert classDescriptor != null;
if (classDescriptor.getKind() == ClassKind.ENUM_ENTRY) {
ClassDescriptor containing = (ClassDescriptor) classDescriptor.getContainingDeclaration().getContainingDeclaration();
+ assert containing != null;
Type type = typeMapper.mapType(containing.getDefaultType(), MapTypeMode.VALUE);
- StackValue.field(type, JvmClassName.byType(type), classDescriptor.getName().getName(), true).put(TYPE_OBJECT, v);
-
- // todo: for now we don't generate classes for enum entries, so we need this hack
- type = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE);
- return StackValue.onStack(type);
+ Type entryType = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE);
+ StackValue.field(type, JvmClassName.byType(type), classDescriptor.getName().getName(), true).put(entryType, v);
+ return StackValue.onStack(entryType);
}
else {
Type type = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE);
@@ -1075,11 +1097,13 @@ public class ExpressionCodegen extends JetVisitor {
}
boolean isStatic = container instanceof NamespaceDescriptor;
- final boolean directToField = expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER && contextKind() != OwnerKind.TRAIT_IMPL ;
+ final boolean directToField =
+ expression.getReferencedNameElementType() == JetTokens.FIELD_IDENTIFIER && contextKind() != OwnerKind.TRAIT_IMPL;
JetExpression r = getReceiverForSelector(expression);
final boolean isSuper = r instanceof JetSuperExpression;
propertyDescriptor = accessablePropertyDescriptor(propertyDescriptor);
- final StackValue.Property iValue = intermediateValueForProperty(propertyDescriptor, directToField, isSuper ? (JetSuperExpression)r : null);
+ final StackValue.Property iValue =
+ intermediateValueForProperty(propertyDescriptor, directToField, isSuper ? (JetSuperExpression) r : null);
if (!directToField && resolvedCall != null && !isSuper) {
receiver.put(propertyDescriptor.getReceiverParameter().exists() || isStatic
? receiver.type
@@ -1088,20 +1112,24 @@ public class ExpressionCodegen extends JetVisitor {
else {
if (!isStatic) {
if (receiver == StackValue.none()) {
- if (resolvedCall == null)
+ if (resolvedCall == null) {
receiver = generateThisOrOuter((ClassDescriptor) propertyDescriptor.getContainingDeclaration());
+ }
else {
- if (resolvedCall.getThisObject() instanceof ExtensionReceiver)
- receiver = generateReceiver(((ExtensionReceiver)resolvedCall.getThisObject()).getDeclarationDescriptor());
- else
+ if (resolvedCall.getThisObject() instanceof ExtensionReceiver) {
+ receiver = generateReceiver(((ExtensionReceiver) resolvedCall.getThisObject()).getDeclarationDescriptor());
+ }
+ else {
receiver = generateThisOrOuter((ClassDescriptor) propertyDescriptor.getContainingDeclaration());
+ }
}
}
JetType receiverType = bindingContext.get(BindingContext.EXPRESSION_TYPE, r);
- receiver.put(receiverType != null && !isSuper? asmType(receiverType) : TYPE_OBJECT, v);
+ receiver.put(receiverType != null && !isSuper ? asmType(receiverType) : TYPE_OBJECT, v);
if (receiverType != null) {
ClassDescriptor propReceiverDescriptor = (ClassDescriptor) propertyDescriptor.getContainingDeclaration();
- if (!CodegenUtil.isInterface(propReceiverDescriptor) && CodegenUtil.isInterface(receiverType.getConstructor().getDeclarationDescriptor())) {
+ if (!CodegenUtil.isInterface(propReceiverDescriptor) &&
+ CodegenUtil.isInterface(receiverType.getConstructor().getDeclarationDescriptor())) {
// I hope it happens only in case of required super class for traits
assert propReceiverDescriptor != null;
v.checkcast(asmType(propReceiverDescriptor.getDefaultType()));
@@ -1115,13 +1143,14 @@ public class ExpressionCodegen extends JetVisitor {
if (descriptor instanceof ClassDescriptor) {
PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor);
if (declaration instanceof JetClass) {
- final ClassDescriptor descriptor1 = ((ClassDescriptor)descriptor).getClassObjectDescriptor();
+ final ClassDescriptor descriptor1 = ((ClassDescriptor) descriptor).getClassObjectDescriptor();
assert descriptor1 != null;
final Type type = typeMapper.mapType(descriptor1.getDefaultType(), MapTypeMode.VALUE);
return StackValue.field(type,
- JvmClassName.byType(typeMapper.mapType(((ClassDescriptor) descriptor).getDefaultType(), MapTypeMode.IMPL)),
- "$classobj",
- true);
+ JvmClassName.byType(typeMapper.mapType(((ClassDescriptor) descriptor).getDefaultType(),
+ MapTypeMode.IMPL)),
+ "$classobj",
+ true);
}
else {
// todo ?
@@ -1149,7 +1178,8 @@ public class ExpressionCodegen extends JetVisitor {
if (value instanceof StackValue.FieldForSharedVar) {
StackValue.FieldForSharedVar fieldForSharedVar = (StackValue.FieldForSharedVar) value;
Type sharedType = StackValue.sharedTypeForType(value.type);
- v.visitFieldInsn(Opcodes.GETFIELD, fieldForSharedVar.owner.getInternalName(), fieldForSharedVar.name, sharedType.getDescriptor());
+ v.visitFieldInsn(Opcodes.GETFIELD, fieldForSharedVar.owner.getInternalName(), fieldForSharedVar.name,
+ sharedType.getDescriptor());
}
return value;
@@ -1215,11 +1245,15 @@ public class ExpressionCodegen extends JetVisitor {
int opcode = isStatic ? Opcodes.INVOKESTATIC : isInterface ? Opcodes.INVOKEINTERFACE : Opcodes.INVOKEVIRTUAL;
v.visitMethodInsn(opcode, owner.getInternalName(), functionDescriptor.getName().getName(),
- typeMapper.mapSignature(functionDescriptor.getName(),functionDescriptor).getAsmMethod().getDescriptor());
+ typeMapper.mapSignature(functionDescriptor.getName(), functionDescriptor).getAsmMethod().getDescriptor());
StackValue.onStack(asmType(functionDescriptor.getReturnType())).coerce(type, v);
}
- public StackValue.Property intermediateValueForProperty(PropertyDescriptor propertyDescriptor, final boolean forceField, @Nullable JetSuperExpression superExpression) {
+ public StackValue.Property intermediateValueForProperty(
+ PropertyDescriptor propertyDescriptor,
+ final boolean forceField,
+ @Nullable JetSuperExpression superExpression
+ ) {
boolean isSuper = superExpression != null;
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
@@ -1232,23 +1266,27 @@ public class ExpressionCodegen extends JetVisitor {
PropertyDescriptor initialDescriptor = propertyDescriptor;
propertyDescriptor = initialDescriptor.getOriginal();
boolean isInsideClass = !isFakeOverride && (((containingDeclaration == context.getThisDescriptor()) ||
- (context.getParentContext() instanceof CodegenContexts.NamespaceContext) && context.getParentContext().getContextDescriptor() == containingDeclaration)
- && contextKind() != OwnerKind.TRAIT_IMPL);
+ (context.getParentContext() instanceof CodegenContexts.NamespaceContext) &&
+ context.getParentContext().getContextDescriptor() == containingDeclaration)
+ && contextKind() != OwnerKind.TRAIT_IMPL);
Method getter = null;
Method setter = null;
if (!forceField) {
//noinspection ConstantConditions
- if (isInsideClass && (propertyDescriptor.getGetter() == null || propertyDescriptor.getGetter().isDefault() && propertyDescriptor.getGetter().getModality() == Modality.FINAL)) {
+ if (isInsideClass &&
+ (propertyDescriptor.getGetter() == null ||
+ propertyDescriptor.getGetter().isDefault() && propertyDescriptor.getGetter().getModality() == Modality.FINAL)) {
getter = null;
}
else {
if (isSuper) {
PsiElement enclosingElement = bindingContext.get(BindingContext.LABEL_TARGET, superExpression.getTargetLabel());
- ClassDescriptor enclosed = (ClassDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, enclosingElement);
+ ClassDescriptor enclosed =
+ (ClassDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, enclosingElement);
if (!CodegenUtil.isInterface(containingDeclaration)) {
if (enclosed != null && enclosed != context.getThisDescriptor()) {
CodegenContext c = context;
- while(c.getContextDescriptor() != enclosed) {
+ while (c.getContextDescriptor() != enclosed) {
c = c.getParentContext();
}
propertyDescriptor = (PropertyDescriptor) c.getAccessor(propertyDescriptor);
@@ -1269,20 +1307,22 @@ public class ExpressionCodegen extends JetVisitor {
if (getter == null && propertyDescriptor.getReceiverParameter().exists()) {
throw new IllegalStateException();
}
-
}
//noinspection ConstantConditions
- if (isInsideClass && (propertyDescriptor.getSetter() == null || propertyDescriptor.getSetter().isDefault() && propertyDescriptor.getSetter().getModality() == Modality.FINAL)) {
+ if (isInsideClass &&
+ (propertyDescriptor.getSetter() == null ||
+ propertyDescriptor.getSetter().isDefault() && propertyDescriptor.getSetter().getModality() == Modality.FINAL)) {
setter = null;
}
else {
- JvmPropertyAccessorSignature jvmMethodSignature = typeMapper.mapSetterSignature(propertyDescriptor, OwnerKind.IMPLEMENTATION);
+ JvmPropertyAccessorSignature jvmMethodSignature =
+ typeMapper.mapSetterSignature(propertyDescriptor, OwnerKind.IMPLEMENTATION);
setter = jvmMethodSignature != null ? jvmMethodSignature.getJvmMethodSignature().getAsmMethod() : null;
if (propertyDescriptor.getSetter() == null) {
setter = null;
}
-
+
if (setter == null && propertyDescriptor.isVar() && propertyDescriptor.getReceiverParameter().exists()) {
throw new IllegalStateException();
}
@@ -1306,26 +1346,33 @@ public class ExpressionCodegen extends JetVisitor {
// TODO ugly
CallableMethod callableMethod = typeMapper.mapToCallableMethod(propertyDescriptor.getGetter(), isSuper, contextKind());
invokeOpcode = callableMethod.getInvokeOpcode();
- owner = isFakeOverride && !overridesTrait && !CodegenUtil.isInterface(initialDescriptor.getContainingDeclaration()) ? JvmClassName.byType(typeMapper.mapType(((ClassDescriptor)initialDescriptor.getContainingDeclaration()).getDefaultType(), MapTypeMode.IMPL)): callableMethod.getOwner();
+ owner = isFakeOverride && !overridesTrait && !CodegenUtil.isInterface(initialDescriptor.getContainingDeclaration())
+ ? JvmClassName.byType(typeMapper.mapType(
+ ((ClassDescriptor) initialDescriptor.getContainingDeclaration()).getDefaultType(), MapTypeMode.IMPL))
+ : callableMethod.getOwner();
ownerParam = callableMethod.getDefaultImplParam();
}
- return StackValue.property(propertyDescriptor.getName().getName(), owner, ownerParam, asmType(propertyDescriptor.getType()), isStatic, isInterface, isSuper, getter, setter, invokeOpcode);
+ return StackValue
+ .property(propertyDescriptor.getName().getName(), owner, ownerParam, asmType(propertyDescriptor.getType()), isStatic,
+ isInterface, isSuper, getter, setter, invokeOpcode);
}
private PropertyDescriptor accessablePropertyDescriptor(PropertyDescriptor propertyDescriptor) {
- if ((propertyDescriptor.getVisibility() == Visibilities.PRIVATE ||(propertyDescriptor.getSetter() != null && propertyDescriptor.getSetter().getVisibility() == Visibilities.PRIVATE))
- && !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration())
- && propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) {
+ if ((propertyDescriptor.getVisibility() == Visibilities.PRIVATE ||
+ (propertyDescriptor.getSetter() != null && propertyDescriptor.getSetter().getVisibility() == Visibilities.PRIVATE))
+ && !DescriptorUtils.isClassObject(propertyDescriptor.getContainingDeclaration())
+ && propertyDescriptor.getContainingDeclaration() instanceof ClassDescriptor) {
if (context.getClassOrNamespaceDescriptor() != propertyDescriptor.getContainingDeclaration()) {
DeclarationDescriptor enclosed = propertyDescriptor.getContainingDeclaration();
if (enclosed != context.getThisDescriptor()) {
CodegenContext c = context;
- while(c != null && c.getContextDescriptor() != enclosed) {
+ while (c != null && c.getContextDescriptor() != enclosed) {
c = c.getParentContext();
}
- if(c != null)
+ if (c != null) {
propertyDescriptor = (PropertyDescriptor) c.getAccessor(propertyDescriptor);
+ }
}
}
}
@@ -1376,10 +1423,12 @@ public class ExpressionCodegen extends JetVisitor {
}
}
- private StackValue invokeFunction(JetCallExpression expression,
+ private StackValue invokeFunction(
+ JetCallExpression expression,
FunctionDescriptor fd,
StackValue receiver,
- ResolvedCall extends CallableDescriptor> resolvedCall) {
+ ResolvedCall extends CallableDescriptor> resolvedCall
+ ) {
boolean superCall = false;
if (expression.getParent() instanceof JetQualifiedExpression) {
final JetExpression receiverExpression = ((JetQualifiedExpression) expression.getParent()).getReceiverExpression();
@@ -1390,12 +1439,13 @@ public class ExpressionCodegen extends JetVisitor {
PsiElement enclosingElement = bindingContext.get(BindingContext.LABEL_TARGET, superExpression.getTargetLabel());
ClassDescriptor enclosed = (ClassDescriptor) bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, enclosingElement);
if (!CodegenUtil.isInterface(fd.getContainingDeclaration())) {
- if(enclosed == null) {
+ if (enclosed == null) {
enclosed = (ClassDescriptor) fd.getContainingDeclaration();
}
if (enclosed != context.getThisDescriptor()) {
CodegenContext c = context;
- while(!(c instanceof CodegenContexts.ClassContext) || !DescriptorUtils.isSubclass(c.getThisDescriptor(), enclosed)) {
+ while (!(c instanceof CodegenContexts.ClassContext) ||
+ !DescriptorUtils.isSubclass(c.getThisDescriptor(), enclosed)) {
c = c.getParentContext();
}
fd = (FunctionDescriptor) c.getAccessor(fd);
@@ -1407,13 +1457,13 @@ public class ExpressionCodegen extends JetVisitor {
}
if (fd.getVisibility() == Visibilities.PRIVATE
- && !DescriptorUtils.isClassObject(fd.getContainingDeclaration())
- && fd.getContainingDeclaration() instanceof ClassDescriptor) {
+ && !DescriptorUtils.isClassObject(fd.getContainingDeclaration())
+ && fd.getContainingDeclaration() instanceof ClassDescriptor) {
if (context.getClassOrNamespaceDescriptor() != fd.getContainingDeclaration()) {
DeclarationDescriptor enclosed = fd.getContainingDeclaration();
if (enclosed != context.getThisDescriptor()) {
CodegenContext c = context;
- while(c.getContextDescriptor() != enclosed) {
+ while (c.getContextDescriptor() != enclosed) {
c = c.getParentContext();
}
fd = (FunctionDescriptor) c.getAccessor(fd);
@@ -1437,10 +1487,10 @@ public class ExpressionCodegen extends JetVisitor {
for (ValueArgument argument : expression.getValueArguments()) {
args.add(argument.getArgumentExpression());
}
- Type callType = typeMapper.mapType(resolvedCall.getCandidateDescriptor().getReturnType(),MapTypeMode.VALUE);
+ Type callType = typeMapper.mapType(resolvedCall.getCandidateDescriptor().getReturnType(), MapTypeMode.VALUE);
Type exprType = expressionType(expression);
StackValue stackValue = intrinsic.generate(this, v, callType, expression, args, receiver, state);
- stackValue.put(exprType,v);
+ stackValue.put(exprType, v);
return StackValue.onStack(exprType);
}
}
@@ -1483,7 +1533,9 @@ public class ExpressionCodegen extends JetVisitor {
else if (fd instanceof ExpressionAsFunctionDescriptor) {
return true;
}
- else if (fd instanceof SimpleFunctionDescriptor && (fd.getContainingDeclaration() instanceof FunctionDescriptor || fd.getContainingDeclaration() instanceof ScriptDescriptor)) {
+ else if (fd instanceof SimpleFunctionDescriptor &&
+ (fd.getContainingDeclaration() instanceof FunctionDescriptor ||
+ fd.getContainingDeclaration() instanceof ScriptDescriptor)) {
return true;
}
else {
@@ -1498,11 +1550,12 @@ public class ExpressionCodegen extends JetVisitor {
gen(expression.getCalleeExpression(), calleeType);
}
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
assert resolvedCall != null;
if (resolvedCall instanceof VariableAsFunctionResolvedCall) {
- resolvedCall = ((VariableAsFunctionResolvedCall)resolvedCall).getFunctionCall();
+ resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall();
}
if (!(resolvedCall.getResultingDescriptor() instanceof ConstructorDescriptor)) { // otherwise already
@@ -1514,13 +1567,19 @@ public class ExpressionCodegen extends JetVisitor {
}
int mask = pushMethodArguments(expression, callableMethod.getValueParameterTypes());
- if (mask == 0)
+ if (mask == 0) {
callableMethod.invoke(v);
- else
+ }
+ else {
callableMethod.invokeWithDefault(v, mask);
+ }
}
- private void genThisAndReceiverFromResolvedCall(StackValue receiver, ResolvedCall extends CallableDescriptor> resolvedCall, CallableMethod callableMethod) {
+ private void genThisAndReceiverFromResolvedCall(
+ StackValue receiver,
+ ResolvedCall extends CallableDescriptor> resolvedCall,
+ CallableMethod callableMethod
+ ) {
receiver = StackValue.receiver(resolvedCall, receiver, this, callableMethod, state);
receiver.put(receiver.type, v);
}
@@ -1533,9 +1592,12 @@ public class ExpressionCodegen extends JetVisitor {
if (DescriptorUtils.isClassObject(classReceiverDeclarationDescriptor)) {
ClassDescriptor containingDeclaration = (ClassDescriptor) classReceiverDeclarationDescriptor.getContainingDeclaration();
Type classObjType = typeMapper.mapType(containingDeclaration.getDefaultType(), MapTypeMode.IMPL);
- if (context.getContextDescriptor() instanceof ConstructorDescriptor && classReceiverDeclarationDescriptor.getDefaultType().equals(((ConstructorDescriptor)context.getContextDescriptor()).getReturnType())) {
+ if (context.getContextDescriptor() instanceof ConstructorDescriptor &&
+ classReceiverDeclarationDescriptor.getDefaultType()
+ .equals(((ConstructorDescriptor) context.getContextDescriptor()).getReturnType())) {
v.load(0, classObjType);
- } else {
+ }
+ else {
v.getstatic(classObjType.getInternalName(), "$classobj", exprType.getDescriptor());
}
StackValue.onStack(exprType).put(type, v);
@@ -1596,18 +1658,21 @@ public class ExpressionCodegen extends JetVisitor {
cur = context;
StackValue result = StackValue.local(0, TYPE_OBJECT);
while (cur != null) {
- if (cur instanceof CodegenContexts.MethodContext && !(cur instanceof CodegenContexts.ConstructorContext))
+ if (cur instanceof CodegenContexts.MethodContext && !(cur instanceof CodegenContexts.ConstructorContext)) {
cur = cur.getParentContext();
+ }
if (cur instanceof CodegenContexts.ScriptContext) {
CodegenContexts.ScriptContext scriptContext = (CodegenContexts.ScriptContext) cur;
- JvmClassName currentScriptClassName = state.getInjector().getClosureAnnotator().classNameForScriptDescriptor(scriptContext.getScriptDescriptor());
+ JvmClassName currentScriptClassName =
+ state.getInjector().getClosureAnnotator().classNameForScriptDescriptor(scriptContext.getScriptDescriptor());
if (scriptContext.getScriptDescriptor() == receiver.getDeclarationDescriptor()) {
result.put(currentScriptClassName.getAsmType(), v);
}
else {
- JvmClassName className = state.getInjector().getClosureAnnotator().classNameForScriptDescriptor(receiver.getDeclarationDescriptor());
+ JvmClassName className =
+ state.getInjector().getClosureAnnotator().classNameForScriptDescriptor(receiver.getDeclarationDescriptor());
String fieldName = state.getInjector().getScriptCodegen().getScriptFieldName(receiver.getDeclarationDescriptor());
result.put(currentScriptClassName.getAsmType(), v);
StackValue.field(className.getAsmType(), currentScriptClassName, fieldName, false).put(className.getAsmType(), v);
@@ -1629,13 +1694,14 @@ public class ExpressionCodegen extends JetVisitor {
public StackValue generateThisOrOuter(@NotNull final ClassDescriptor calleeContainingClass) {
PsiElement psiElement = BindingContextUtils.classDescriptorToDeclaration(bindingContext, calleeContainingClass);
boolean isObject = psiElement instanceof JetClassOrObject && CodegenUtil.isNonLiteralObject((JetClassOrObject) psiElement);
-
+
CodegenContext cur = context;
Type type = asmType(calleeContainingClass.getDefaultType());
StackValue result = StackValue.local(0, type);
while (cur != null) {
- if (cur instanceof CodegenContexts.MethodContext && !(cur instanceof CodegenContexts.ConstructorContext))
+ if (cur instanceof CodegenContexts.MethodContext && !(cur instanceof CodegenContexts.ConstructorContext)) {
cur = cur.getParentContext();
+ }
if (DescriptorUtils.isSubclass(cur.getThisDescriptor(), calleeContainingClass)) {
if (!isObject || (cur.getThisDescriptor() == calleeContainingClass)) {
@@ -1653,7 +1719,7 @@ public class ExpressionCodegen extends JetVisitor {
}
cur = cur.getParentContext();
}
-
+
throw new UnsupportedOperationException();
}
@@ -1676,7 +1742,7 @@ public class ExpressionCodegen extends JetVisitor {
}
int index = 0;
- int mask = 0;
+ int mask = 0;
for (ValueParameterDescriptor valueParameterDescriptor : fd.getValueParameters()) {
ResolvedValueArgument resolvedValueArgument = valueArguments.get(valueParameterDescriptor.getIndex());
@@ -1686,8 +1752,9 @@ public class ExpressionCodegen extends JetVisitor {
}
else if (resolvedValueArgument instanceof DefaultValueArgument) {
Type type = valueParameterTypes.get(index);
- if (type.getSort() == Type.OBJECT||type.getSort() == Type.ARRAY)
+ if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
v.aconst(null);
+ }
else if (type.getSort() == Type.FLOAT) {
v.aconst(0f);
}
@@ -1724,7 +1791,7 @@ public class ExpressionCodegen extends JetVisitor {
int size = arguments.size();
boolean hasSpread = false;
- for(int i = 0; i != size; ++i) {
+ for (int i = 0; i != size; ++i) {
if (arguments.get(i).getSpreadElement() != null) {
hasSpread = true;
break;
@@ -1740,11 +1807,11 @@ public class ExpressionCodegen extends JetVisitor {
v.anew(Type.getObjectType(owner));
v.dup();
v.invokespecial(owner, "", "()V");
- for(int i = 0; i != size; ++i) {
+ for (int i = 0; i != size; ++i) {
v.dup();
ValueArgument argument = arguments.get(i);
if (argument.getSpreadElement() != null) {
- gen(argument.getArgumentExpression(),JetTypeMapper.TYPE_OBJECT);
+ gen(argument.getArgumentExpression(), JetTypeMapper.TYPE_OBJECT);
v.invokevirtual(owner, "addSpread", "(Ljava/lang/Object;)V");
}
else {
@@ -1763,7 +1830,7 @@ public class ExpressionCodegen extends JetVisitor {
else {
v.iconst(arguments.size());
v.newarray(elementType);
- for(int i = 0; i != size; ++i) {
+ for (int i = 0; i != size; ++i) {
v.dup();
v.iconst(i);
gen(arguments.get(i).getArgumentExpression(), elementType);
@@ -1773,7 +1840,8 @@ public class ExpressionCodegen extends JetVisitor {
}
public int pushMethodArguments(JetCallElement expression, List valueParameterTypes) {
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getCalleeExpression());
if (resolvedCall != null) {
return pushMethodArguments(resolvedCall, valueParameterTypes);
}
@@ -1795,11 +1863,11 @@ public class ExpressionCodegen extends JetVisitor {
public int indexOfLocal(JetReferenceExpression lhs) {
final DeclarationDescriptor declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, lhs);
if (typeMapper.isVarCapturedInClosure(declarationDescriptor)) {
- return -1;
+ return -1;
}
return lookupLocal(declarationDescriptor);
}
-
+
@Override
public StackValue visitDotQualifiedExpression(JetDotQualifiedExpression expression, StackValue receiver) {
return genQualified(StackValue.none(), expression.getSelectorExpression());
@@ -1875,7 +1943,7 @@ public class ExpressionCodegen extends JetVisitor {
return generateElvis(expression);
}
else if (opToken == JetTokens.IN_KEYWORD || opToken == JetTokens.NOT_IN) {
- return generateIn (expression);
+ return generateIn(expression);
}
else {
DeclarationDescriptor op = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference());
@@ -1886,7 +1954,7 @@ public class ExpressionCodegen extends JetVisitor {
Arrays.asList(expression.getLeft(), expression.getRight()), receiver, state);
}
else {
- return invokeOperation(expression, (FunctionDescriptor)op, (CallableMethod) callable);
+ return invokeOperation(expression, (FunctionDescriptor) op, (CallableMethod) callable);
}
}
}
@@ -1901,10 +1969,11 @@ public class ExpressionCodegen extends JetVisitor {
}
else {
StackValue leftValue = gen(expr);
- FunctionDescriptor op = (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference());
+ FunctionDescriptor op =
+ (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference());
assert op != null;
Type type = asmType(op.getValueParameters().get(0).getType());
- if(type.getSize() == 1) {
+ if (type.getSize() == 1) {
leftValue.put(type, v);
genToJVMStack(expression.getRight());
v.swap();
@@ -2015,7 +2084,9 @@ public class ExpressionCodegen extends JetVisitor {
}
if (isPrimitive(leftType)) // both are primitive
+ {
return generateEqualsForExpressionsOnStack(opToken, leftType, rightType, false, false);
+ }
assert leftJetType != null;
assert rightJetType != null;
@@ -2038,7 +2109,13 @@ public class ExpressionCodegen extends JetVisitor {
return StackValue.onStack(Type.BOOLEAN_TYPE);
}
- public StackValue generateEqualsForExpressionsOnStack(IElementType opToken, Type leftType, Type rightType, boolean leftNullable, boolean rightNullable) {
+ public StackValue generateEqualsForExpressionsOnStack(
+ IElementType opToken,
+ Type leftType,
+ Type rightType,
+ boolean leftNullable,
+ boolean rightNullable
+ ) {
if ((isNumberPrimitive(leftType) || leftType.getSort() == Type.BOOLEAN) && leftType == rightType) {
return compareExpressionsOnStack(opToken, leftType);
}
@@ -2112,7 +2189,7 @@ public class ExpressionCodegen extends JetVisitor {
JetType type = bindingContext.get(BindingContext.EXPRESSION_TYPE, expression.getLeft());
assert type != null;
final Type leftType = asmType(type);
- if (type.isNullable()) {
+ if (type.isNullable()) {
gen(expression.getLeft(), leftType);
v.dup();
Label end = new Label();
@@ -2181,12 +2258,12 @@ public class ExpressionCodegen extends JetVisitor {
final Callable callable = resolveToCallable((FunctionDescriptor) op, false);
final JetExpression lhs = expression.getLeft();
-// if (lhs instanceof JetArrayAccessExpression) {
-// JetArrayAccessExpression arrayAccessExpression = (JetArrayAccessExpression) lhs;
-// if (arrayAccessExpression.getIndexExpressions().size() != 1) {
-// throw new UnsupportedOperationException("Augmented assignment with multi-index");
-// }
-// }
+ // if (lhs instanceof JetArrayAccessExpression) {
+ // JetArrayAccessExpression arrayAccessExpression = (JetArrayAccessExpression) lhs;
+ // if (arrayAccessExpression.getIndexExpressions().size() != 1) {
+ // throw new UnsupportedOperationException("Augmented assignment with multi-index");
+ // }
+ // }
Type lhsType = expressionType(lhs);
//noinspection ConstantConditions
@@ -2211,12 +2288,13 @@ public class ExpressionCodegen extends JetVisitor {
final boolean keepReturnValue = !((FunctionDescriptor) op).getReturnType().equals(JetStandardClasses.getUnitType());
callAugAssignMethod(expression, (CallableMethod) callable, lhsType, keepReturnValue);
}
-
+
return StackValue.none();
}
private void callAugAssignMethod(JetBinaryExpression expression, CallableMethod callable, Type lhsType, final boolean keepReturnValue) {
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
StackValue value = gen(expression.getLeft());
@@ -2269,7 +2347,7 @@ public class ExpressionCodegen extends JetVisitor {
public void invokeAppendMethod(Type exprType) {
Method appendDescriptor = new Method("append", JL_STRING_BUILDER,
- new Type[] { exprType.getSort() == Type.OBJECT ? TYPE_OBJECT : exprType});
+ new Type[] {exprType.getSort() == Type.OBJECT ? TYPE_OBJECT : exprType});
v.invokevirtual("java/lang/StringBuilder", "append", appendDescriptor.getDescriptor());
}
@@ -2283,7 +2361,7 @@ public class ExpressionCodegen extends JetVisitor {
}
return null;
}
-
+
@Override
public StackValue visitPrefixExpression(JetPrefixExpression expression, StackValue receiver) {
JetSimpleNameExpression operationSign = expression.getOperationReference();
@@ -2301,11 +2379,12 @@ public class ExpressionCodegen extends JetVisitor {
else {
DeclarationDescriptor cls = op.getContainingDeclaration();
CallableMethod callableMethod = (CallableMethod) callable;
- if (isNumberPrimitive(cls) || !(op.getName().getName().equals("inc") || op.getName().getName().equals("dec")) ) {
+ if (isNumberPrimitive(cls) || !(op.getName().getName().equals("inc") || op.getName().getName().equals("dec"))) {
return invokeOperation(expression, (FunctionDescriptor) op, callableMethod);
}
else {
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
StackValue value = gen(expression.getBaseExpression());
@@ -2327,12 +2406,13 @@ public class ExpressionCodegen extends JetVisitor {
if (functionLocalIndex >= 0) {
stackValueForLocal(op, functionLocalIndex).put(ClosureCodegen.getInternalClassName(op).getAsmType(), v);
}
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
genThisAndReceiverFromResolvedCall(StackValue.none(), resolvedCall, callable);
pushMethodArguments(resolvedCall, callable.getValueParameterTypes());
callable.invoke(v);
- return returnValueAsStackValue(op, callable.getSignature().getAsmMethod().getReturnType());
+ return returnValueAsStackValue(op, callable.getSignature().getAsmMethod().getReturnType());
}
@Override
@@ -2350,8 +2430,9 @@ public class ExpressionCodegen extends JetVisitor {
v.mark(ok);
return StackValue.onStack(base.type);
}
- else
+ else {
return base;
+ }
}
DeclarationDescriptor op = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getOperationReference());
if (op instanceof FunctionDescriptor) {
@@ -2373,7 +2454,8 @@ public class ExpressionCodegen extends JetVisitor {
return StackValue.onStack(asmType); // old value
}
else {
- ResolvedCall extends CallableDescriptor> resolvedCall = bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
+ ResolvedCall extends CallableDescriptor> resolvedCall =
+ bindingContext.get(BindingContext.RESOLVED_CALL, expression.getOperationReference());
assert resolvedCall != null;
final Callable callable = resolveToCallable((FunctionDescriptor) op, false);
@@ -2384,26 +2466,32 @@ public class ExpressionCodegen extends JetVisitor {
Type type = expressionType(expression.getBaseExpression());
value.put(type, v);
- switch(value.receiverSize()) {
+ switch (value.receiverSize()) {
case 0:
- if (type.getSize() == 2)
+ if (type.getSize() == 2) {
v.dup2();
- else
+ }
+ else {
v.dup();
- break;
+ }
+ break;
case 1:
- if (type.getSize() == 2)
+ if (type.getSize() == 2) {
v.dup2X1();
- else
+ }
+ else {
v.dupX1();
- break;
+ }
+ break;
case 2:
- if (type.getSize() == 2)
+ if (type.getSize() == 2) {
v.dup2X2();
- else
+ }
+ else {
v.dupX2();
+ }
break;
case -1:
@@ -2462,7 +2550,8 @@ public class ExpressionCodegen extends JetVisitor {
if (property.isScriptDeclaration()) {
JetScript scriptPsi = property.getScript();
JvmClassName scriptClassName = state.getInjector().getClosureAnnotator().classNameForScriptPsi(scriptPsi);
- StackValue field = StackValue.field(typeMapper.mapType(variableDescriptor.getType(), MapTypeMode.VALUE), scriptClassName, property.getName(), false);
+ StackValue field = StackValue
+ .field(typeMapper.mapType(variableDescriptor.getType(), MapTypeMode.VALUE), scriptClassName, property.getName(), false);
return StackValue.none();
}
else {
@@ -2474,7 +2563,6 @@ public class ExpressionCodegen extends JetVisitor {
sharedVarType = typeMapper.getSharedVarType(variableDescriptor);
assert variableDescriptor != null;
-
}
Type varType = asmType(variableDescriptor.getType());
@@ -2500,13 +2588,18 @@ public class ExpressionCodegen extends JetVisitor {
else {
v.load(index, TYPE_OBJECT);
gen(initializer, varType);
- v.putfield(sharedVarType.getInternalName(), "ref", sharedVarType == TYPE_SHARED_VAR ? "Ljava/lang/Object;" : varType.getDescriptor());
+ v.putfield(sharedVarType.getInternalName(), "ref",
+ sharedVarType == TYPE_SHARED_VAR ? "Ljava/lang/Object;" : varType.getDescriptor());
}
}
return StackValue.none();
}
- private StackValue generateConstructorCall(JetCallExpression expression, JetSimpleNameExpression constructorReference, StackValue receiver) {
+ private StackValue generateConstructorCall(
+ JetCallExpression expression,
+ JetSimpleNameExpression constructorReference,
+ StackValue receiver
+ ) {
DeclarationDescriptor constructorDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, constructorReference);
final PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bindingContext, constructorDescriptor);
Type type;
@@ -2533,7 +2626,9 @@ public class ExpressionCodegen extends JetVisitor {
receiver.put(receiver.type, v);
}
- CallableMethod method = typeMapper.mapToCallableMethod((ConstructorDescriptor) constructorDescriptor, OwnerKind.IMPLEMENTATION, typeMapper.hasThis0(((ConstructorDescriptor) constructorDescriptor).getContainingDeclaration()));
+ CallableMethod method = typeMapper
+ .mapToCallableMethod((ConstructorDescriptor) constructorDescriptor, OwnerKind.IMPLEMENTATION, typeMapper
+ .hasThis0(((ConstructorDescriptor) constructorDescriptor).getContainingDeclaration()));
invokeMethodWithArguments(method, expression, StackValue.none());
}
}
@@ -2563,15 +2658,16 @@ public class ExpressionCodegen extends JetVisitor {
public void generateNewArray(JetCallExpression expression, JetType arrayType) {
List args = new ArrayList();
- for(ValueArgument va : expression.getValueArguments())
+ for (ValueArgument va : expression.getValueArguments()) {
args.add(va.getArgumentExpression());
+ }
args.addAll(expression.getFunctionLiteralArguments());
boolean isArray = JetStandardLibraryNames.ARRAY.is(arrayType);
if (isArray) {
-// if (args.size() != 2 && !arrayType.getArguments().get(0).getType().isNullable()) {
-// throw new CompilationException("array constructor of non-nullable type requires two arguments");
-// }
+ // if (args.size() != 2 && !arrayType.getArguments().get(0).getType().isNullable()) {
+ // throw new CompilationException("array constructor of non-nullable type requires two arguments");
+ // }
}
else {
if (args.size() != 1) {
@@ -2590,8 +2686,8 @@ public class ExpressionCodegen extends JetVisitor {
}
if (args.size() == 2) {
- int sizeIndex = myFrameMap.enterTemp(2);
- int indexIndex = sizeIndex+1;
+ int sizeIndex = myFrameMap.enterTemp(2);
+ int indexIndex = sizeIndex + 1;
v.dup();
v.arraylength();
@@ -2606,7 +2702,7 @@ public class ExpressionCodegen extends JetVisitor {
Label end = new Label();
v.visitLabel(begin);
v.load(indexIndex, Type.INT_TYPE);
- v.load(sizeIndex, Type.INT_TYPE);
+ v.load(sizeIndex, Type.INT_TYPE);
v.ificmpge(end);
v.dup2();
@@ -2634,7 +2730,9 @@ public class ExpressionCodegen extends JetVisitor {
final List indices = expression.getIndexExpressions();
FunctionDescriptor operationDescriptor = (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, expression);
assert operationDescriptor != null;
- if (arrayType.getSort() == Type.ARRAY && indices.size() == 1 && JetStandardLibraryNames.INT.is(operationDescriptor.getValueParameters().get(0).getType())) {
+ if (arrayType.getSort() == Type.ARRAY &&
+ indices.size() == 1 &&
+ JetStandardLibraryNames.INT.is(operationDescriptor.getValueParameters().get(0).getType())) {
gen(array, arrayType);
for (JetExpression index : indices) {
gen(index, Type.INT_TYPE);
@@ -2665,13 +2763,14 @@ public class ExpressionCodegen extends JetVisitor {
int index = 0;
if (isGetter) {
Callable callable = resolveToCallable(getterDescriptor, false);
- if (callable instanceof CallableMethod)
+ if (callable instanceof CallableMethod) {
genThisAndReceiverFromResolvedCall(receiver, resolvedGetCall, (CallableMethod) callable);
+ }
else {
assert getterDescriptor != null;
- gen(array, asmType(((ClassDescriptor)getterDescriptor.getContainingDeclaration()).getDefaultType()));
+ gen(array, asmType(((ClassDescriptor) getterDescriptor.getContainingDeclaration()).getDefaultType()));
}
-
+
assert getterDescriptor != null;
if (getterDescriptor.getReceiverParameter().exists()) {
index++;
@@ -2684,13 +2783,14 @@ public class ExpressionCodegen extends JetVisitor {
if (callable instanceof CallableMethod) {
genThisAndReceiverFromResolvedCall(receiver, resolvedSetCall, (CallableMethod) callable);
}
- else
+ else {
gen(array, arrayType);
+ }
if (setterDescriptor.getReceiverParameter().exists()) {
index++;
}
- asmType = argumentTypes[argumentTypes.length-1];
+ asmType = argumentTypes[argumentTypes.length - 1];
}
for (JetExpression jetExpression : expression.getIndexExpressions()) {
@@ -2877,8 +2977,10 @@ The "returned" value of try expression with no finally is either the last expres
}
// on entering the function, expressionToMatch is already placed on stack, and we should consume it
- private StackValue generatePatternMatch(JetPattern pattern, boolean negated, StackValue expressionToMatch,
- boolean expressionToMatchIsNullable, @Nullable Label nextEntry) {
+ private StackValue generatePatternMatch(
+ JetPattern pattern, boolean negated, StackValue expressionToMatch,
+ boolean expressionToMatchIsNullable, @Nullable Label nextEntry
+ ) {
if (pattern instanceof JetTypePattern) {
JetTypeReference typeReference = ((JetTypePattern) pattern).getTypeReference();
JetType jetType = bindingContext.get(BindingContext.TYPE, typeReference);
@@ -2911,7 +3013,8 @@ The "returned" value of try expression with no finally is either the last expres
patternIsNullable = condJetType != null && condJetType.isNullable();
}
gen(condExpression, condType);
- return generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType, expressionToMatchIsNullable, patternIsNullable);
+ return generateEqualsForExpressionsOnStack(JetTokens.EQEQ, subjectType, condType, expressionToMatchIsNullable,
+ patternIsNullable);
}
else {
JetExpression condExpression = ((JetExpressionPattern) pattern).getExpression();
@@ -2938,8 +3041,10 @@ The "returned" value of try expression with no finally is either the last expres
}
}
- private StackValue generateTuplePatternMatch(JetTuplePattern pattern, boolean negated, StackValue expressionToMatch,
- @Nullable Label nextEntry) {
+ private StackValue generateTuplePatternMatch(
+ JetTuplePattern pattern, boolean negated, StackValue expressionToMatch,
+ @Nullable Label nextEntry
+ ) {
final List entries = pattern.getEntries();
Label lblFail = new Label();
@@ -2969,7 +3074,7 @@ The "returned" value of try expression with no finally is either the last expres
v.goTo(nextEntry);
}
else {
- v.iconst(!negated?1:0);
+ v.iconst(!negated ? 1 : 0);
}
v.goTo(lblDone);
v.mark(lblFail);
@@ -2977,7 +3082,7 @@ The "returned" value of try expression with no finally is either the last expres
v.goTo(nextEntry);
}
else {
- v.iconst(negated?1:0);
+ v.iconst(negated ? 1 : 0);
}
v.mark(lblDone);
return StackValue.onStack(Type.BOOLEAN_TYPE);
@@ -3068,24 +3173,27 @@ The "returned" value of try expression with no finally is either the last expres
return StackValue.onStack(resultType);
}
- private StackValue generateWhenCondition(Type subjectType, int subjectLocal, boolean subjectIsNullable,
- JetWhenCondition condition, @Nullable Label nextEntry) {
+ private StackValue generateWhenCondition(
+ Type subjectType, int subjectLocal, boolean subjectIsNullable,
+ JetWhenCondition condition, @Nullable Label nextEntry
+ ) {
if (condition instanceof JetWhenConditionInRange) {
JetWhenConditionInRange conditionInRange = (JetWhenConditionInRange) condition;
JetExpression rangeExpression = conditionInRange.getRangeExpression();
while (rangeExpression instanceof JetParenthesizedExpression) {
- rangeExpression = ((JetParenthesizedExpression)rangeExpression).getExpression();
+ rangeExpression = ((JetParenthesizedExpression) rangeExpression).getExpression();
}
boolean inverted = conditionInRange.getOperationReference().getReferencedNameElementType() == JetTokens.NOT_IN;
if (isIntRangeExpr(rangeExpression)) {
getInIntRange(new StackValue.Local(subjectLocal, subjectType), (JetBinaryExpression) rangeExpression, inverted);
}
else {
- FunctionDescriptor op = (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, conditionInRange.getOperationReference());
+ FunctionDescriptor op =
+ (FunctionDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, conditionInRange.getOperationReference());
genToJVMStack(rangeExpression);
new StackValue.Local(subjectLocal, subjectType).put(TYPE_OBJECT, v);
invokeFunctionNoParams(op, Type.BOOLEAN_TYPE, v);
- if(inverted) {
+ if (inverted) {
invertBoolean();
}
}
@@ -3131,7 +3239,7 @@ The "returned" value of try expression with no finally is either the last expres
}
}
}
- return false ;
+ return false;
}
@Override
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java b/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java
index 4405ca52129..f9e07cc51a8 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/FrameMap.java
@@ -132,12 +132,15 @@ public class FrameMap {
Collections.sort(descriptors, new Comparator>() {
@Override
- public int compare(Tuple3 left, Tuple3 right) {
+ public int compare(
+ Tuple3 left,
+ Tuple3 right
+ ) {
return left._2 - right._2;
}
});
- sb.append("size=" + myMaxIndex);
+ sb.append("size=").append(myMaxIndex);
boolean first = true;
for (Tuple3 t : descriptors) {
@@ -145,7 +148,7 @@ public class FrameMap {
sb.append(", ");
}
first = false;
- sb.append(t._1 + ",i=" + t._2 + ",s=" + t._3);
+ sb.append(t._1).append(",i=").append(t._2).append(",s=").append(t._3);
}
return sb.toString();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
index a745a601f41..0a6023213d1 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/FunctionCodegen.java
@@ -19,6 +19,11 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Label;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter;
import org.jetbrains.jet.codegen.signature.kotlin.JetValueParameterAnnotationWriter;
@@ -32,11 +37,6 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
-import org.jetbrains.asm4.Label;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import org.jetbrains.asm4.commons.Method;
import java.util.*;
@@ -61,13 +61,17 @@ public class FunctionCodegen {
public void gen(JetNamedFunction f) {
final SimpleFunctionDescriptor functionDescriptor = state.getBindingContext().get(BindingContext.FUNCTION, f);
assert functionDescriptor != null;
- JvmMethodSignature method = state.getInjector().getJetTypeMapper().mapToCallableMethod(functionDescriptor, false, owner.getContextKind()).getSignature();
+ JvmMethodSignature method =
+ state.getInjector().getJetTypeMapper().mapToCallableMethod(functionDescriptor, false, owner.getContextKind())
+ .getSignature();
generateMethod(f, method, true, null, functionDescriptor);
}
- public void generateMethod(JetDeclarationWithBody f,
+ public void generateMethod(
+ JetDeclarationWithBody f,
JvmMethodSignature jvmMethod, boolean needJetAnnotations,
- @Nullable String propertyTypeSignature, FunctionDescriptor functionDescriptor) {
+ @Nullable String propertyTypeSignature, FunctionDescriptor functionDescriptor
+ ) {
CodegenContexts.MethodContext funContext = owner.intoFunction(functionDescriptor);
@@ -75,40 +79,39 @@ public class FunctionCodegen {
generatedMethod(bodyExpression, jvmMethod, needJetAnnotations, propertyTypeSignature, funContext, functionDescriptor, f);
}
- private void generatedMethod(JetExpression bodyExpressions,
+ private void generatedMethod(
+ JetExpression bodyExpressions,
JvmMethodSignature jvmSignature,
boolean needJetAnnotations, @Nullable String propertyTypeSignature,
CodegenContexts.MethodContext context,
FunctionDescriptor functionDescriptor,
JetDeclarationWithBody fun
- )
- {
+ ) {
if (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
throw new IllegalStateException("must not generate code for fake overrides");
}
List paramDescrs = functionDescriptor.getValueParameters();
- List typeParameters = (functionDescriptor instanceof PropertyAccessorDescriptor ? ((PropertyAccessorDescriptor)functionDescriptor).getCorrespondingProperty(): functionDescriptor).getTypeParameters();
int flags = JetTypeMapper.getAccessModifiers(functionDescriptor, 0);
-
+
if (!functionDescriptor.getValueParameters().isEmpty()
- && functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
- .getVarargElementType() != null)
- {
+ && functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
+ .getVarargElementType() != null) {
flags |= ACC_VARARGS;
}
Modality modality = functionDescriptor.getModality();
if (modality == Modality.FINAL) {
DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration();
- if (!(containingDeclaration instanceof ClassDescriptor) || ((ClassDescriptor)containingDeclaration).getKind() != ClassKind.TRAIT) {
+ if (!(containingDeclaration instanceof ClassDescriptor) ||
+ ((ClassDescriptor) containingDeclaration).getKind() != ClassKind.TRAIT) {
flags |= ACC_FINAL;
}
}
OwnerKind kind = context.getContextKind();
-
+
if (kind == OwnerKind.TRAIT_IMPL) {
needJetAnnotations = false;
}
@@ -118,16 +121,19 @@ public class FunctionCodegen {
if (kind != OwnerKind.TRAIT_IMPL || bodyExpressions != null) {
boolean isStatic = kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind;
- if (isStatic || kind == OwnerKind.TRAIT_IMPL)
+ if (isStatic || kind == OwnerKind.TRAIT_IMPL) {
flags |= ACC_STATIC;
+ }
boolean isAbstract = (
- modality == Modality.ABSTRACT
- || CodegenUtil.isInterface(functionDescriptor.getContainingDeclaration())
- ) && !isStatic && kind != OwnerKind.TRAIT_IMPL;
+ modality == Modality.ABSTRACT
+ || CodegenUtil.isInterface(functionDescriptor.getContainingDeclaration())
+ ) && !isStatic && kind != OwnerKind.TRAIT_IMPL;
if (isAbstract) flags |= ACC_ABSTRACT;
-
- final MethodVisitor mv = v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), jvmSignature.getGenericsSignature(), null);
+
+ final MethodVisitor mv =
+ v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
+ jvmSignature.getGenericsSignature(), null);
AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(functionDescriptor);
if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES) {
int start = 0;
@@ -169,7 +175,7 @@ public class FunctionCodegen {
}
av.visitEnd();
}
- for(int i = 0; i != paramDescrs.size(); ++i) {
+ for (int i = 0; i != paramDescrs.size(); ++i) {
ValueParameterDescriptor parameterDescriptor = paramDescrs.get(i);
AnnotationCodegen.forParameter(i, mv, state.getInjector().getJetTypeMapper()).genAnnotations(parameterDescriptor);
JetValueParameterAnnotationWriter av = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i + start);
@@ -191,29 +197,33 @@ public class FunctionCodegen {
if (!isAbstract && state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode();
-
+
Label methodBegin = new Label();
mv.visitLabel(methodBegin);
-
+
FrameMap frameMap = context.prepareFrame(state.getInjector().getJetTypeMapper());
- ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
+ ExpressionCodegen codegen =
+ new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
Type[] argTypes = jvmSignature.getAsmMethod().getArgumentTypes();
int add = 0;
- if (kind == OwnerKind.TRAIT_IMPL)
+ if (kind == OwnerKind.TRAIT_IMPL) {
add++;
+ }
- if (receiverParameter.exists())
+ if (receiverParameter.exists()) {
add++;
+ }
for (int i = 0; i < paramDescrs.size(); i++) {
ValueParameterDescriptor parameter = paramDescrs.get(i);
- frameMap.enter(parameter, argTypes[i+add].getSize());
+ frameMap.enter(parameter, argTypes[i + add].getSize());
}
- if (!isStatic && (kind instanceof OwnerKind.DelegateKind) != (functionDescriptor.getKind() == FunctionDescriptor.Kind.DELEGATION)) {
+ if (!isStatic &&
+ (kind instanceof OwnerKind.DelegateKind) != (functionDescriptor.getKind() == FunctionDescriptor.Kind.DELEGATION)) {
throw new IllegalStateException("mismatching kind in " + functionDescriptor);
}
@@ -225,6 +235,7 @@ public class FunctionCodegen {
for (int i = 0, k = 0; i < argTypes.length; i++) {
Type argType = argTypes[i];
iv.load(k, argType);
+ //noinspection AssignmentToForLoopParameter
k += argType.getSize();
}
iv.invokestatic(dk.getOwnerClass(), jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor());
@@ -239,7 +250,8 @@ public class FunctionCodegen {
Type argType = argTypes[i];
iv.load(i + 1, argType);
}
- iv.invokeinterface(dk.getOwnerClass(), jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor());
+ iv.invokeinterface(dk.getOwnerClass(), jvmSignature.getAsmMethod().getName(),
+ jvmSignature.getAsmMethod().getDescriptor());
iv.areturn(jvmSignature.getAsmMethod().getReturnType());
}
else {
@@ -253,11 +265,13 @@ public class FunctionCodegen {
mv.visitInsn(DUP);
mv.visitMethodInsn(INVOKESPECIAL, sharedVarType.getInternalName(), "", "()V");
mv.visitVarInsn(localVarType.getOpcode(ILOAD), index);
- mv.visitFieldInsn(PUTFIELD, sharedVarType.getInternalName(), "ref", StackValue.refType(localVarType).getDescriptor());
+ mv.visitFieldInsn(PUTFIELD, sharedVarType.getInternalName(), "ref",
+ StackValue.refType(localVarType).getDescriptor());
Label labelToDivideLocalVarForSharedVarVisibility = new Label();
mv.visitLabel(labelToDivideLocalVarForSharedVarVisibility);
- mapLabelsToDivideLocalVarVisibilityForSharedVar.put(parameter.getName(), labelToDivideLocalVarForSharedVarVisibility);
+ mapLabelsToDivideLocalVarVisibilityForSharedVar
+ .put(parameter.getName(), labelToDivideLocalVarForSharedVarVisibility);
mv.visitVarInsn(sharedVarType.getOpcode(ISTORE), index);
}
@@ -265,7 +279,7 @@ public class FunctionCodegen {
codegen.returnExpression(bodyExpressions);
}
-
+
Label methodEnd = new Label();
mv.visitLabel(methodEnd);
@@ -282,7 +296,8 @@ public class FunctionCodegen {
// TODO: specify signature
mv.visitLocalVariable("this", type.getDescriptor(), null, methodBegin, methodEnd, k++);
}
- else if (fun instanceof JetFunctionLiteralExpression || CodegenUtil.isLocalFun(functionDescriptor, state.getBindingContext())) {
+ else if (fun instanceof JetFunctionLiteralExpression ||
+ CodegenUtil.isLocalFun(functionDescriptor, state.getBindingContext())) {
Type type = state.getInjector().getJetTypeMapper().mapType(
context.getThisDescriptor().getDefaultType(), MapTypeMode.VALUE);
mv.visitLocalVariable("this", type.getDescriptor(), null, methodBegin, methodEnd, k++);
@@ -310,7 +325,8 @@ public class FunctionCodegen {
mv.visitLocalVariable(nameForSharedVar, sharedVarType.getDescriptor(), null, divideLabel, methodEnd, k);
k += Math.max(type.getSize(), sharedVarType.getSize());
- } else {
+ }
+ else {
mv.visitLocalVariable(parameter.getName().getName(), type.getDescriptor(), null, methodBegin, methodEnd, k);
k += type.getSize();
}
@@ -326,7 +342,7 @@ public class FunctionCodegen {
generateDefaultIfNeeded(context, state, v, jvmSignature.getAsmMethod(), functionDescriptor, kind);
}
- public static void endVisit(MethodVisitor mv, String description, PsiElement method) {
+ public static void endVisit(MethodVisitor mv, @Nullable String description, @Nullable PsiElement method) {
try {
mv.visitMaxs(-1, -1);
}
@@ -335,18 +351,30 @@ public class FunctionCodegen {
}
catch (Throwable t) {
throw new CompilationException(
- "wrong code generated" + (description != null ? " for " + description : "") + t.getClass().getName() + " " + t.getMessage(),
- t, method);
+ "wrong code generated" +
+ (description != null ? " for " + description : "") +
+ t.getClass().getName() +
+ " " +
+ t.getMessage(),
+ t, method);
}
mv.visitEnd();
}
- static void generateBridgeIfNeeded(CodegenContext owner, GenerationState state, ClassBuilder v, Method jvmSignature, FunctionDescriptor functionDescriptor, OwnerKind kind) {
+ static void generateBridgeIfNeeded(
+ CodegenContext owner,
+ GenerationState state,
+ ClassBuilder v,
+ Method jvmSignature,
+ FunctionDescriptor functionDescriptor,
+ OwnerKind kind
+ ) {
if (kind == OwnerKind.TRAIT_IMPL) {
return;
}
- Method method = state.getInjector().getJetTypeMapper().mapSignature(functionDescriptor.getName(), functionDescriptor).getAsmMethod();
+ Method method =
+ state.getInjector().getJetTypeMapper().mapSignature(functionDescriptor.getName(), functionDescriptor).getAsmMethod();
Queue bfsQueue = new LinkedList();
Set visited = new HashSet();
@@ -365,7 +393,8 @@ public class FunctionCodegen {
while (!bfsQueue.isEmpty()) {
FunctionDescriptor descriptor = bfsQueue.poll();
if (descriptor.getKind() == CallableMemberDescriptor.Kind.DECLARATION) {
- Method overridden = state.getInjector().getJetTypeMapper().mapSignature(descriptor.getName(), descriptor.getOriginal()).getAsmMethod();
+ Method overridden =
+ state.getInjector().getJetTypeMapper().mapSignature(descriptor.getName(), descriptor.getOriginal()).getAsmMethod();
if (differentMethods(method, overridden)) {
bridgesToGenerate.add(overridden);
}
@@ -386,7 +415,14 @@ public class FunctionCodegen {
}
}
- static void generateDefaultIfNeeded(CodegenContexts.MethodContext owner, GenerationState state, ClassBuilder v, Method jvmSignature, @Nullable FunctionDescriptor functionDescriptor, OwnerKind kind) {
+ static void generateDefaultIfNeeded(
+ CodegenContexts.MethodContext owner,
+ GenerationState state,
+ ClassBuilder v,
+ Method jvmSignature,
+ @Nullable FunctionDescriptor functionDescriptor,
+ OwnerKind kind
+ ) {
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
if (kind != OwnerKind.TRAIT_IMPL) {
@@ -395,8 +431,9 @@ public class FunctionCodegen {
PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), contextClass);
if (psiElement instanceof JetClass) {
JetClass element = (JetClass) psiElement;
- if (element.isTrait())
+ if (element.isTrait()) {
return;
+ }
}
}
}
@@ -428,14 +465,19 @@ public class FunctionCodegen {
ownerInternalName = NamespaceCodegen.getJVMClassNameForKotlinNs(DescriptorUtils.getFQName(contextClass).toSafe());
}
else {
- ownerInternalName = JvmClassName.byType(state.getInjector().getJetTypeMapper().mapType(((ClassDescriptor) contextClass).getDefaultType(), MapTypeMode.IMPL));
+ ownerInternalName = JvmClassName.byType(state.getInjector().getJetTypeMapper()
+ .mapType(((ClassDescriptor) contextClass).getDefaultType(),
+ MapTypeMode.IMPL));
}
- String descriptor = jvmSignature.getDescriptor().replace(")","I)");
+ String descriptor = jvmSignature.getDescriptor().replace(")", "I)");
boolean isConstructor = "".equals(jvmSignature.getName());
- if (!isStatic && !isConstructor)
+ if (!isStatic && !isConstructor) {
descriptor = descriptor.replace("(", "(" + ownerInternalName.getDescriptor());
- final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC), isConstructor ? "" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX, descriptor, null, null);
+ }
+ final MethodVisitor mv = v.newMethod(null, flags | (isConstructor ? 0 : ACC_STATIC),
+ isConstructor ? "" : jvmSignature.getName() + JvmAbi.DEFAULT_PARAMS_IMPL_SUFFIX,
+ descriptor, null, null);
InstructionAdapter iv = new InstructionAdapter(mv);
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv);
@@ -469,7 +511,7 @@ public class FunctionCodegen {
List paramDescrs = functionDescriptor.getValueParameters();
for (int i = 0; i < paramDescrs.size(); i++) {
int size = argTypes[i + (hasReceiver ? 1 : 0)].getSize();
- frameMap.enter(paramDescrs.get(i),size);
+ frameMap.enter(paramDescrs.get(i), size);
var += size;
}
@@ -503,7 +545,8 @@ public class FunctionCodegen {
Label loadArg = new Label();
iv.ifeq(loadArg);
- JetParameter jetParameter = (JetParameter) BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), parameterDescriptor);
+ JetParameter jetParameter =
+ (JetParameter) BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), parameterDescriptor);
assert jetParameter != null;
codegen.gen(jetParameter.getDefaultValue(), t);
@@ -522,10 +565,12 @@ public class FunctionCodegen {
iv.invokeinterface(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor());
}
else {
- if (!isConstructor)
+ if (!isConstructor) {
iv.invokevirtual(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor());
- else
+ }
+ else {
iv.invokespecial(ownerInternalName.getInternalName(), jvmSignature.getName(), jvmSignature.getDescriptor());
+ }
}
}
else {
@@ -534,26 +579,38 @@ public class FunctionCodegen {
iv.areturn(jvmSignature.getReturnType());
- endVisit(mv, "default method", BindingContextUtils.callableDescriptorToDeclaration(state.getBindingContext(), functionDescriptor));
+ endVisit(mv, "default method",
+ BindingContextUtils.callableDescriptorToDeclaration(state.getBindingContext(), functionDescriptor));
mv.visitEnd();
}
}
}
private static boolean differentMethods(Method method, Method overridden) {
- if (!method.getReturnType().equals(overridden.getReturnType()))
+ if (!method.getReturnType().equals(overridden.getReturnType())) {
return true;
+ }
Type[] methodArgumentTypes = method.getArgumentTypes();
Type[] overriddenArgumentTypes = overridden.getArgumentTypes();
- if (methodArgumentTypes.length != overriddenArgumentTypes.length)
+ if (methodArgumentTypes.length != overriddenArgumentTypes.length) {
return true;
- for(int i = 0; i != methodArgumentTypes.length; ++i)
- if (!methodArgumentTypes[i].equals(overriddenArgumentTypes[i]))
+ }
+ for (int i = 0; i != methodArgumentTypes.length; ++i) {
+ if (!methodArgumentTypes[i].equals(overriddenArgumentTypes[i])) {
return true;
+ }
+ }
return false;
}
-
- private static void generateBridge(CodegenContext owner, GenerationState state, ClassBuilder v, Method jvmSignature, FunctionDescriptor functionDescriptor, Method overridden) {
+
+ private static void generateBridge(
+ CodegenContext owner,
+ GenerationState state,
+ ClassBuilder v,
+ Method jvmSignature,
+ FunctionDescriptor functionDescriptor,
+ Method overridden
+ ) {
int flags = ACC_PUBLIC | ACC_BRIDGE; // TODO.
final MethodVisitor mv = v.newMethod(null, flags, jvmSignature.getName(), overridden.getDescriptor(), null, null);
@@ -584,21 +641,30 @@ public class FunctionCodegen {
iv.invokevirtual(state.getInjector().getJetTypeMapper().mapType(
((ClassDescriptor) owner.getContextDescriptor()).getDefaultType(), MapTypeMode.VALUE).getInternalName(),
jvmSignature.getName(), jvmSignature.getDescriptor());
- if (JetTypeMapper.isPrimitive(jvmSignature.getReturnType()) && !JetTypeMapper.isPrimitive(overridden.getReturnType()))
+ if (JetTypeMapper.isPrimitive(jvmSignature.getReturnType()) && !JetTypeMapper.isPrimitive(overridden.getReturnType())) {
StackValue.valueOf(iv, jvmSignature.getReturnType());
- if (jvmSignature.getReturnType() == Type.VOID_TYPE)
+ }
+ if (jvmSignature.getReturnType() == Type.VOID_TYPE) {
iv.aconst(null);
+ }
iv.areturn(overridden.getReturnType());
- endVisit(mv, "bridge method", BindingContextUtils.callableDescriptorToDeclaration(state.getBindingContext(), functionDescriptor));
+ endVisit(mv, "bridge method",
+ BindingContextUtils.callableDescriptorToDeclaration(state.getBindingContext(), functionDescriptor));
}
}
public void genDelegate(FunctionDescriptor functionDescriptor, CallableMemberDescriptor overriddenDescriptor, StackValue field) {
- JvmMethodSignature jvmMethodSignature = state.getInjector().getJetTypeMapper().mapSignature(functionDescriptor.getName(), functionDescriptor);
+ JvmMethodSignature jvmMethodSignature =
+ state.getInjector().getJetTypeMapper().mapSignature(functionDescriptor.getName(), functionDescriptor);
genDelegate(functionDescriptor, overriddenDescriptor, field, jvmMethodSignature);
}
- public void genDelegate(CallableMemberDescriptor functionDescriptor, CallableMemberDescriptor overriddenDescriptor, StackValue field, JvmMethodSignature jvmMethodSignature) {
+ public void genDelegate(
+ CallableMemberDescriptor functionDescriptor,
+ CallableMemberDescriptor overriddenDescriptor,
+ StackValue field,
+ JvmMethodSignature jvmMethodSignature
+ ) {
Method method = jvmMethodSignature.getAsmMethod();
int flags = ACC_PUBLIC | ACC_SYNTHETIC; // TODO.
@@ -629,11 +695,14 @@ public class FunctionCodegen {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
field.put(field.type, iv);
ClassDescriptor classDescriptor = (ClassDescriptor) overriddenDescriptor.getContainingDeclaration();
- String internalName = state.getInjector().getJetTypeMapper().mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName();
- if (classDescriptor.getKind() == ClassKind.TRAIT)
+ String internalName =
+ state.getInjector().getJetTypeMapper().mapType(classDescriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName();
+ if (classDescriptor.getKind() == ClassKind.TRAIT) {
iv.invokeinterface(internalName, method.getName(), method.getDescriptor());
- else
+ }
+ else {
iv.invokevirtual(internalName, method.getName(), method.getDescriptor());
+ }
iv.areturn(method.getReturnType());
endVisit(mv, "delegate method", BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), functionDescriptor));
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java
index 9d97cf95fe5..128723b104a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedAnonymousClassDescriptor.java
@@ -19,19 +19,19 @@
*/
package org.jetbrains.jet.codegen;
-import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.Method;
+import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import java.util.ArrayList;
import java.util.List;
public class GeneratedAnonymousClassDescriptor {
private final JvmClassName classname;
- private Method constructor;
+ private final Method constructor;
private final Type captureThis;
private final Type captureReceiver;
- private List args = new ArrayList();
+ private final List args = new ArrayList();
public GeneratedAnonymousClassDescriptor(JvmClassName classname, Method constructor, Type captureThis, Type captureReceiver) {
this.classname = classname;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java
index 5bb039572d8..af9b12388ca 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/GeneratedClassLoader.java
@@ -19,15 +19,11 @@ package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.NotNull;
/**
-* @author yole
-*/
+ * @author yole
+ */
public class GeneratedClassLoader extends ClassLoader {
private ClassFileFactory state;
- public GeneratedClassLoader(@NotNull ClassFileFactory state) {
- this(state, GeneratedClassLoader.class.getClassLoader());
- }
-
public GeneratedClassLoader(@NotNull ClassFileFactory state, ClassLoader parentClassLoader) {
super(parentClassLoader);
this.state = state;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
index 72e89ad3ac1..cb6465292c9 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/GenerationState.java
@@ -62,8 +62,10 @@ public class GenerationState {
this(builderFactory, Progress.DEAF, analyzeExhaust, files, BuiltinToJavaTypesMapping.ENABLED);
}
- public GenerationState(ClassBuilderFactory builderFactory, Progress progress,
- @NotNull AnalyzeExhaust exhaust, @NotNull List files, @NotNull BuiltinToJavaTypesMapping builtinToJavaTypesMapping) {
+ public GenerationState(
+ ClassBuilderFactory builderFactory, Progress progress,
+ @NotNull AnalyzeExhaust exhaust, @NotNull List files, @NotNull BuiltinToJavaTypesMapping builtinToJavaTypesMapping
+ ) {
this.progress = progress;
this.analyzeExhaust = exhaust;
this.files = files;
@@ -90,6 +92,7 @@ public class GenerationState {
return progress;
}
+ @NotNull
public InjectorForJvmCodegen getInjector() {
return injector;
}
@@ -112,15 +115,17 @@ public class GenerationState {
}
public ClassBuilder forClassImplementation(ClassDescriptor aClass) {
- return getFactory().newVisitor(getInjector().getJetTypeMapper().mapType(aClass.getDefaultType(), MapTypeMode.IMPL).getInternalName() + ".class");
+ return getFactory().newVisitor(
+ getInjector().getJetTypeMapper().mapType(aClass.getDefaultType(), MapTypeMode.IMPL).getInternalName() + ".class");
}
- public ClassBuilder forNamespacepart(String name, JetFile file) {
+ public ClassBuilder forNamespacepart(String name) {
return getFactory().newVisitor(name + ".class");
}
public ClassBuilder forTraitImplementation(ClassDescriptor aClass) {
- return getFactory().newVisitor(getInjector().getJetTypeMapper().mapType(aClass.getDefaultType(), MapTypeMode.TRAIT_IMPL).getInternalName() + ".class");
+ return getFactory().newVisitor(
+ getInjector().getJetTypeMapper().mapType(aClass.getDefaultType(), MapTypeMode.TRAIT_IMPL).getInternalName() + ".class");
}
public Pair forAnonymousSubclass(JetExpression expression) {
@@ -142,7 +147,9 @@ public class GenerationState {
for (JetFile file : this.files) {
if (file.isScript()) {
String name = ScriptNameUtil.classNameForScript(file);
- injector.getClosureAnnotator().registerClassNameForScript(file.getScript(), JvmClassName.byInternalName(name));
+ JetScript script = file.getScript();
+ assert script != null;
+ injector.getClosureAnnotator().registerClassNameForScript(script, JvmClassName.byInternalName(name));
}
}
@@ -165,7 +172,8 @@ public class GenerationState {
@NotNull JetScript script,
@NotNull JvmClassName className,
@NotNull List> earlierScripts,
- @NotNull CompilationErrorHandler errorHandler) {
+ @NotNull CompilationErrorHandler errorHandler
+ ) {
injector.getScriptCodegen().registerEarlierScripts(earlierScripts);
injector.getClosureAnnotator().registerClassNameForScript(script, className);
@@ -191,14 +199,18 @@ public class GenerationState {
closure.cv = nameAndVisitor.getSecond();
closure.name = nameAndVisitor.getFirst();
final CodegenContext objectContext = closure.context.intoAnonymousClass(
- closure, analyzeExhaust.getBindingContext().get(BindingContext.CLASS, objectDeclaration), OwnerKind.IMPLEMENTATION, injector.getJetTypeMapper());
+ closure, analyzeExhaust.getBindingContext().get(BindingContext.CLASS, objectDeclaration), OwnerKind.IMPLEMENTATION,
+ injector.getJetTypeMapper());
new ImplementationBodyCodegen(objectDeclaration, objectContext, nameAndVisitor.getSecond(), this).generate();
ConstructorDescriptor constructorDescriptor = analyzeExhaust.getBindingContext().get(BindingContext.CONSTRUCTOR, objectDeclaration);
+ assert constructorDescriptor != null;
CallableMethod callableMethod = injector.getJetTypeMapper().mapToCallableMethod(
- constructorDescriptor, OwnerKind.IMPLEMENTATION, injector.getJetTypeMapper().hasThis0(constructorDescriptor.getContainingDeclaration()));
- return new GeneratedAnonymousClassDescriptor(nameAndVisitor.first, callableMethod.getSignature().getAsmMethod(), objectContext.outerWasUsed, null);
+ constructorDescriptor, OwnerKind.IMPLEMENTATION,
+ injector.getJetTypeMapper().hasThis0(constructorDescriptor.getContainingDeclaration()));
+ return new GeneratedAnonymousClassDescriptor(nameAndVisitor.first, callableMethod.getSignature().getAsmMethod(),
+ objectContext.outerWasUsed, null);
}
public String createText() {
@@ -207,10 +219,10 @@ public class GenerationState {
final ClassFileFactory factory = getFactory();
List files = factory.files();
for (String file : files) {
-// if (!file.startsWith("kotlin/")) {
- answer.append("@").append(file).append('\n');
- answer.append(factory.asText(file));
-// }
+ // if (!file.startsWith("kotlin/")) {
+ answer.append("@").append(file).append('\n');
+ answer.append(factory.asText(file));
+ // }
}
return answer.toString();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
index 3a4218d912d..368e9c68974 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ImplementationBodyCodegen.java
@@ -21,6 +21,11 @@ import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.AnnotationVisitor;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.signature.*;
import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter;
import org.jetbrains.jet.codegen.signature.kotlin.JetValueParameterAnnotationWriter;
@@ -38,16 +43,11 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lexer.JetTokens;
import org.jetbrains.jet.utils.BitSetUtils;
-import org.jetbrains.asm4.AnnotationVisitor;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import org.jetbrains.asm4.commons.Method;
import java.util.*;
-import static org.jetbrains.jet.codegen.JetTypeMapper.TYPE_OBJECT;
import static org.jetbrains.asm4.Opcodes.*;
+import static org.jetbrains.jet.codegen.JetTypeMapper.TYPE_OBJECT;
/**
* @author max
@@ -84,8 +84,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (myClass instanceof JetClass) {
JetClass jetClass = (JetClass) myClass;
- if (jetClass.hasModifier(JetTokens.ABSTRACT_KEYWORD))
- isAbstract = true;
+ if (jetClass.hasModifier(JetTokens.ABSTRACT_KEYWORD)) {
+ isAbstract = true;
+ }
if (jetClass.isTrait()) {
isAbstract = true;
isInterface = true;
@@ -129,14 +130,22 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
access |= ACC_ANNOTATION;
}
if (isEnum) {
+ for (JetDeclaration declaration : myClass.getDeclarations()) {
+ if (declaration instanceof JetEnumEntry) {
+ if (state.getInjector().getClosureAnnotator().enumEntryNeedSubclass((JetEnumEntry) declaration)) {
+ access &= ~ACC_FINAL;
+ }
+ }
+ }
access |= ACC_ENUM;
}
+ List interfaces = signature.getInterfaces();
v.defineClass(myClass, V1_6,
- access,
+ access,
signature.getName(),
signature.getJavaGenericSignature(),
signature.getSuperclassName(),
- signature.getInterfaces().toArray(new String[0])
+ interfaces.toArray(new String[interfaces.size()])
);
v.visitSource(myClass.getContainingFile().getName(), null);
@@ -170,13 +179,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (descriptor.getClassObjectDescriptor() != null) {
int innerClassAccess = ACC_PUBLIC | ACC_FINAL | ACC_STATIC;
String outerClassInernalName = typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName();
- v.visitInnerClass(outerClassInernalName + JvmAbi.CLASS_OBJECT_SUFFIX, outerClassInernalName, JvmAbi.CLASS_OBJECT_CLASS_NAME, innerClassAccess);
+ v.visitInnerClass(outerClassInernalName + JvmAbi.CLASS_OBJECT_SUFFIX, outerClassInernalName, JvmAbi.CLASS_OBJECT_CLASS_NAME,
+ innerClassAccess);
}
AnnotationCodegen.forClass(v.getVisitor(), typeMapper).genAnnotations(descriptor);
if (signature.getKotlinGenericSignature() != null || descriptor.getVisibility() != Visibilities.PUBLIC) {
- AnnotationVisitor annotationVisitor = v.newAnnotation(myClass, JvmStdlibNames.JET_CLASS.getDescriptor(), true);
+ AnnotationVisitor annotationVisitor = v.newAnnotation(JvmStdlibNames.JET_CLASS.getDescriptor(), true);
annotationVisitor.visit(JvmStdlibNames.JET_CLASS_SIGNATURE, signature.getKotlinGenericSignature());
BitSet flags = CodegenUtil.getFlagsForVisibility(descriptor.getVisibility());
int flagsValue = BitSetUtils.toInt(flags);
@@ -209,7 +219,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
List typeParameters = descriptor.getTypeConstructor().getParameters();
typeMapper.writeFormalTypeParameters(typeParameters, signatureVisitor);
}
-
+
signatureVisitor.writeSupersStart();
{ // superclass
@@ -242,10 +252,11 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
superInterfaces = new ArrayList(superInterfacesLinkedHashSet);
}
-
+
signatureVisitor.writeSupersEnd();
- return new JvmClassSignature(jvmName(), superClass, superInterfaces, signatureVisitor.makeJavaString(), signatureVisitor.makeKotlinClassSignature());
+ return new JvmClassSignature(jvmName(), superClass, superInterfaces, signatureVisitor.makeJavaString(),
+ signatureVisitor.makeKotlinClassSignature());
}
private String jvmName() {
@@ -261,8 +272,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
List delegationSpecifiers = myClass.getDelegationSpecifiers();
- if (myClass instanceof JetClass && ((JetClass) myClass).isTrait())
+ if (myClass instanceof JetClass && ((JetClass) myClass).isTrait()) {
return;
+ }
if (kind != OwnerKind.IMPLEMENTATION) {
throw new IllegalStateException("must be impl to reach this code: " + kind);
@@ -275,16 +287,21 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor();
if (!CodegenUtil.isInterface(superClassDescriptor)) {
superClassType = superType;
+ assert superClassDescriptor != null;
superClass = typeMapper.mapType(superClassDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName();
superCall = specifier;
}
}
}
- if(superClassType == null) {
- if (myClass instanceof JetClass && ((JetClass) myClass).hasModifier(JetTokens.ENUM_KEYWORD)) {
+ if (superClassType == null) {
+ if (descriptor.getKind() == ClassKind.ENUM_CLASS) {
superClassType = JetStandardLibrary.getInstance().getEnumType(descriptor.getDefaultType());
- superClass = typeMapper.mapType(superClassType,MapTypeMode.VALUE).getInternalName();
+ superClass = typeMapper.mapType(superClassType, MapTypeMode.VALUE).getInternalName();
+ }
+ if (descriptor.getKind() == ClassKind.ENUM_ENTRY) {
+ superClassType = descriptor.getTypeConstructor().getSupertypes().iterator().next();
+ superClass = typeMapper.mapType(superClassType, MapTypeMode.VALUE).getInternalName();
}
}
}
@@ -300,10 +317,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
catch (CompilationException e) {
throw e;
}
- catch(ProcessCanceledException e) {
+ catch (ProcessCanceledException e) {
throw e;
}
- catch(RuntimeException e) {
+ catch (RuntimeException e) {
throw new RuntimeException("Error generating primary constructor of class " + myClass.getName() + " with kind " + kind, e);
}
@@ -315,18 +332,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
private void generateEnumMethods() {
- if(myEnumConstants.size() > 0) {
+ if (myEnumConstants.size() > 0) {
{
- Type type = typeMapper.mapType(JetStandardLibrary.getInstance().getArrayType(descriptor.getDefaultType()), MapTypeMode.IMPL);
+ Type type =
+ typeMapper.mapType(JetStandardLibrary.getInstance().getArrayType(descriptor.getDefaultType()), MapTypeMode.IMPL);
MethodVisitor mv =
v.newMethod(myClass, ACC_PUBLIC | ACC_STATIC, "values", "()" + type.getDescriptor(), null, null);
mv.visitCode();
- mv.visitFieldInsn(GETSTATIC, typeMapper.mapType(descriptor.getDefaultType(),MapTypeMode.VALUE).getInternalName(), VALUES, type.getDescriptor());
+ mv.visitFieldInsn(GETSTATIC, typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), VALUES,
+ type.getDescriptor());
mv.visitMethodInsn(INVOKEVIRTUAL, type.getInternalName(), "clone", "()Ljava/lang/Object;");
mv.visitTypeInsn(CHECKCAST, type.getInternalName());
mv.visitInsn(ARETURN);
- FunctionCodegen.endVisit(mv,"values()",myClass);
+ FunctionCodegen.endVisit(mv, "values()", myClass);
}
{
Type type = typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.IMPL);
@@ -339,7 +358,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
mv.visitMethodInsn(INVOKESTATIC, "java/lang/Enum", "valueOf", "(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Enum;");
mv.visitTypeInsn(CHECKCAST, type.getInternalName());
mv.visitInsn(ARETURN);
- FunctionCodegen.endVisit(mv,"values()",myClass);
+ FunctionCodegen.endVisit(mv, "values()", myClass);
}
}
}
@@ -393,10 +412,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Method method = typeMapper.mapGetterSignature(bridge, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
JvmPropertyAccessorSignature originalSignature = typeMapper.mapGetterSignature(original, OwnerKind.IMPLEMENTATION);
Method originalMethod = originalSignature.getJvmMethodSignature().getAsmMethod();
- MethodVisitor mv = v.newMethod(null, ACC_BRIDGE | ACC_SYNTHETIC | ACC_STATIC, method.getName(), method.getDescriptor(), null, null);
+ MethodVisitor mv =
+ v.newMethod(null, ACC_BRIDGE | ACC_SYNTHETIC | ACC_STATIC, method.getName(), method.getDescriptor(), null, null);
+ PropertyGetterDescriptor getter = ((PropertyDescriptor) entry.getValue()).getGetter();
+ assert getter != null;
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature.getPropertyTypeKotlinSignature(),
originalSignature.getJvmMethodSignature().getKotlinTypeParameter(),
- original, ((PropertyDescriptor) entry.getValue()).getGetter().getVisibility());
+ original,
+ getter.getVisibility());
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv);
}
@@ -406,25 +429,32 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
InstructionAdapter iv = new InstructionAdapter(mv);
iv.load(0, JetTypeMapper.TYPE_OBJECT);
- if (original.getVisibility() == Visibilities.PRIVATE)
- iv.getfield(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), original.getName().getName(), originalMethod.getReturnType().getDescriptor());
- else
- iv.invokespecial(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), originalMethod.getName(), originalMethod.getDescriptor());
+ if (original.getVisibility() == Visibilities.PRIVATE) {
+ iv.getfield(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), original.getName().getName(),
+ originalMethod.getReturnType().getDescriptor());
+ }
+ else {
+ iv.invokespecial(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(),
+ originalMethod.getName(), originalMethod.getDescriptor());
+ }
iv.areturn(method.getReturnType());
FunctionCodegen.endVisit(iv, "accessor", null);
}
}
- if (bridge.isVar())
- {
+ if (bridge.isVar()) {
Method method = typeMapper.mapSetterSignature(bridge, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
JvmPropertyAccessorSignature originalSignature2 = typeMapper.mapSetterSignature(original, OwnerKind.IMPLEMENTATION);
Method originalMethod = originalSignature2.getJvmMethodSignature().getAsmMethod();
- MethodVisitor mv = v.newMethod(null, ACC_STATIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
+ MethodVisitor mv =
+ v.newMethod(null, ACC_STATIC | ACC_BRIDGE | ACC_FINAL, method.getName(), method.getDescriptor(), null, null);
+ PropertySetterDescriptor setter = ((PropertyDescriptor) entry.getValue()).getSetter();
+ assert setter != null;
PropertyCodegen.generateJetPropertyAnnotation(mv, originalSignature2.getPropertyTypeKotlinSignature(),
originalSignature2.getJvmMethodSignature().getKotlinTypeParameter(),
- original, ((PropertyDescriptor) entry.getValue()).getSetter().getVisibility());
+ original,
+ setter.getVisibility());
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubCode(mv);
}
@@ -441,10 +471,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
//noinspection AssignmentToForLoopParameter
reg += argType.getSize();
}
- if (original.getVisibility() == Visibilities.PRIVATE && original.getModality() == Modality.FINAL)
- iv.putfield(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), original.getName().getName(), originalMethod.getArgumentTypes()[0].getDescriptor());
- else
- iv.invokespecial(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), originalMethod.getName(), originalMethod.getDescriptor());
+ if (original.getVisibility() == Visibilities.PRIVATE && original.getModality() == Modality.FINAL) {
+ iv.putfield(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(), original.getName().getName(),
+ originalMethod.getArgumentTypes()[0].getDescriptor());
+ }
+ else {
+ iv.invokespecial(typeMapper.getOwner(original, OwnerKind.IMPLEMENTATION).getInternalName(),
+ originalMethod.getName(), originalMethod.getDescriptor());
+ }
iv.areturn(method.getReturnType());
FunctionCodegen.endVisit(iv, "accessor", null);
@@ -471,7 +505,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
v.putstatic(name, "$instance", typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getDescriptor());
}
});
-
}
}
@@ -479,6 +512,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
final JetClassObject classObject = getClassObject();
if (classObject != null) {
final ClassDescriptor descriptor1 = bindingContext.get(BindingContext.CLASS, classObject.getObjectDeclaration());
+ assert descriptor1 != null;
Type type = Type.getObjectType(typeMapper.mapType(descriptor1.getDefaultType(), MapTypeMode.VALUE).getInternalName());
v.newField(classObject, ACC_PUBLIC | ACC_STATIC, "$classobj", type.getDescriptor(), null, null);
@@ -486,6 +520,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
@Override
public void generate(InstructionAdapter v) {
final ClassDescriptor descriptor1 = bindingContext.get(BindingContext.CLASS, classObject.getObjectDeclaration());
+ assert descriptor1 != null;
String name = typeMapper.mapType(descriptor1.getDefaultType(), MapTypeMode.IMPL).getInternalName();
final Type classObjectType = Type.getObjectType(name);
v.anew(classObjectType);
@@ -500,9 +535,10 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
protected void generatePrimaryConstructor() {
if (myClass instanceof JetClass) {
- JetClass aClass = (JetClass)myClass;
- if (aClass.isTrait())
+ JetClass aClass = (JetClass) myClass;
+ if (aClass.isTrait()) {
return;
+ }
if (aClass.isAnnotation()) {
return;
}
@@ -521,27 +557,32 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
boolean hasThis0 = typeMapper.hasThis0(descriptor);
if (constructorDescriptor == null) {
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false);
-
+
signatureWriter.writeFormalTypeParametersStart();
signatureWriter.writeFormalTypeParametersEnd();
-
+
signatureWriter.writeParametersStart();
-
+
if (hasThis0) {
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS0);
- typeMapper.mapType(typeMapper.getClosureAnnotator().getEclosingClassDescriptor(descriptor).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ typeMapper
+ .mapType(typeMapper.getClosureAnnotator().getEclosingClassDescriptor(descriptor).getDefaultType(), signatureWriter,
+ MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
signatureWriter.writeParametersEnd();
-
+
signatureWriter.writeVoidReturn();
constructorMethod = signatureWriter.makeJvmMethodSignature("");
- callableMethod = new CallableMethod(JvmClassName.byInternalName("Ignored"), null, null, constructorMethod, INVOKESPECIAL, null, null, null);
+ callableMethod =
+ new CallableMethod(JvmClassName.byInternalName("Ignored"), null, null, constructorMethod, INVOKESPECIAL, null, null,
+ null);
}
else {
- callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
+ callableMethod = typeMapper.mapToCallableMethod(constructorDescriptor, kind,
+ typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
constructorMethod = callableMethod.getSignature();
}
@@ -566,22 +607,28 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ObjectOrClosureCodegen closure = context.closure;
int firstSuperArgument = -1;
- final LinkedList consArgTypes = new LinkedList(constructorMethod.getKotlinParameterTypes());
+ final LinkedList consArgTypes =
+ new LinkedList(constructorMethod.getKotlinParameterTypes());
int insert = 0;
if (closure != null) {
if (closure.captureThis != null) {
- if (!hasThis0)
- consArgTypes.add(insert, new JvmMethodParameterSignature(Type.getObjectType(context.getThisDescriptor().getName().getName()), "", JvmMethodParameterKind.THIS0));
+ if (!hasThis0) {
+ consArgTypes.add(insert,
+ new JvmMethodParameterSignature(Type.getObjectType(context.getThisDescriptor().getName().getName()),
+ "", JvmMethodParameterKind.THIS0));
+ }
insert++;
}
else {
- if (hasThis0)
+ if (hasThis0) {
insert++;
+ }
}
- if (closure.captureReceiver != null)
+ if (closure.captureReceiver != null) {
consArgTypes.add(insert++, new JvmMethodParameterSignature(closure.captureReceiver, "", JvmMethodParameterKind.RECEIVER));
+ }
for (DeclarationDescriptor descriptor : closure.closure.keySet()) {
if (descriptor instanceof VariableDescriptor && !(descriptor instanceof PropertyDescriptor)) {
@@ -591,7 +638,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
type = sharedVarType;
}
else {
- type = state.getInjector().getJetTypeMapper().mapType(((VariableDescriptor) descriptor).getType(), MapTypeMode.VALUE);
+ type = state.getInjector().getJetTypeMapper()
+ .mapType(((VariableDescriptor) descriptor).getType(), MapTypeMode.VALUE);
}
consArgTypes.add(insert++, new JvmMethodParameterSignature(type, "", JvmMethodParameterKind.SHARED_VAR));
}
@@ -603,16 +651,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (myClass instanceof JetObjectDeclaration && ((JetObjectDeclaration) myClass).isObjectLiteral()) {
if (superCall instanceof JetDelegatorToSuperCall) {
- if (closure != null)
+ if (closure != null) {
closure.superCall = (JetDelegatorToSuperCall) superCall;
- DeclarationDescriptor declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, ((JetDelegatorToSuperCall) superCall).getCalleeExpression().getConstructorReferenceExpression());
- if (declarationDescriptor instanceof ClassDescriptor) {
+ }
+ DeclarationDescriptor declarationDescriptor = bindingContext.get(BindingContext.REFERENCE_TARGET,
+ ((JetDelegatorToSuperCall) superCall).getCalleeExpression()
+ .getConstructorReferenceExpression());
+ if (declarationDescriptor instanceof ClassDescriptorFromSource) {
declarationDescriptor = ((ClassDescriptorFromSource) declarationDescriptor).getUnsubstitutedPrimaryConstructor();
}
ConstructorDescriptor superConstructor = (ConstructorDescriptor) declarationDescriptor;
- CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION, typeMapper.hasThis0(superConstructor.getContainingDeclaration()));
+ CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION, typeMapper
+ .hasThis0(superConstructor.getContainingDeclaration()));
firstSuperArgument = insert;
- for(Type t : superCallable.getSignature().getAsmMethod().getArgumentTypes()) {
+ for (Type t : superCallable.getSignature().getAsmMethod().getArgumentTypes()) {
consArgTypes.add(insert++, new JvmMethodParameterSignature(t, "", JvmMethodParameterKind.SHARED_VAR));
}
}
@@ -621,7 +673,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
int flags = JetTypeMapper.getAccessModifiers(constructorDescriptor, 0);
- final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(), constructorMethod.getGenericsSignature(), null);
+ final MethodVisitor mv = v.newMethod(myClass, flags, constructorMethod.getName(), constructorMethod.getAsmMethod().getDescriptor(),
+ constructorMethod.getGenericsSignature(), null);
if (state.getClassBuilderMode() == ClassBuilderMode.SIGNATURES) return;
AnnotationVisitor jetConstructorVisitor = mv.visitAnnotation(JvmStdlibNames.JET_CONSTRUCTOR.getDescriptor(), true);
@@ -632,7 +685,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
jetConstructorVisitor.visitEnd();
-
+
AnnotationCodegen.forMethod(mv, typeMapper).genAnnotations(constructorDescriptor);
if (constructorDescriptor != null) {
@@ -642,13 +695,14 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
i++;
}
- if(myClass instanceof JetClass && ((JetClass)myClass).hasModifier(JetTokens.ENUM_KEYWORD)) {
+ if (descriptor.getKind() == ClassKind.ENUM_CLASS || descriptor.getKind() == ClassKind.ENUM_ENTRY) {
i += 2;
}
for (ValueParameterDescriptor valueParameter : constructorDescriptor.getValueParameters()) {
AnnotationCodegen.forParameter(i, mv, state.getInjector().getJetTypeMapper()).genAnnotations(valueParameter);
- JetValueParameterAnnotationWriter jetValueParameterAnnotation = JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i);
+ JetValueParameterAnnotationWriter jetValueParameterAnnotation =
+ JetValueParameterAnnotationWriter.visitParameterAnnotation(mv, i);
jetValueParameterAnnotation.writeName(valueParameter.getName().getName());
jetValueParameterAnnotation.writeHasDefaultValue(valueParameter.declaresDefaultValue());
jetValueParameterAnnotation.writeType(constructorMethod.getKotlinParameterType(i));
@@ -665,20 +719,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
mv.visitCode();
List paramDescrs = constructorDescriptor != null
- ? constructorDescriptor.getValueParameters()
- : Collections.emptyList();
+ ? constructorDescriptor.getValueParameters()
+ : Collections.emptyList();
ConstructorFrameMap frameMap = new ConstructorFrameMap(callableMethod, constructorDescriptor, hasThis0);
final InstructionAdapter iv = new InstructionAdapter(mv);
ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, constructorContext, state);
-// for(int slot = 0; slot != frameMap.getTypeParameterCount(); ++slot) {
-// if (constructorDescriptor != null)
-// codegen.addTypeParameter(constructorDescriptor.getTypeParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
-// else
-// codegen.addTypeParameter(descriptor.getTypeConstructor().getParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
-// }
+ // for(int slot = 0; slot != frameMap.getTypeParameterCount(); ++slot) {
+ // if (constructorDescriptor != null)
+ // codegen.addTypeParameter(constructorDescriptor.getTypeParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
+ // else
+ // codegen.addTypeParameter(descriptor.getTypeConstructor().getParameters().get(slot), StackValue.local(frameMap.getFirstTypeParameter() + slot, JetTypeMapper.TYPE_TYPEINFO));
+ // }
Type classType = typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.IMPL);
JvmClassName classname = JvmClassName.byType(classType);
@@ -694,7 +748,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (superCall == null) {
iv.load(0, Type.getType("L" + superClass + ";"));
- if(descriptor.getKind() == ClassKind.ENUM_CLASS) {
+ if (descriptor.getKind() == ClassKind.ENUM_CLASS || descriptor.getKind() == ClassKind.ENUM_ENTRY) {
iv.load(1, JetTypeMapper.JL_STRING_TYPE);
iv.load(2, Type.INT_TYPE);
iv.invokespecial(superClass, "", "(Ljava/lang/String;I)V");
@@ -711,14 +765,20 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
ClassDescriptor superClassDescriptor = (ClassDescriptor) superType.getConstructor().getDeclarationDescriptor();
if (typeMapper.hasThis0(superClassDescriptor)) {
iv.load(1, JetTypeMapper.TYPE_OBJECT);
- parameterTypes.add(typeMapper.mapType(typeMapper.getClosureAnnotator().getEclosingClassDescriptor(descriptor).getDefaultType(), MapTypeMode.VALUE));
+ parameterTypes.add(typeMapper.mapType(
+ typeMapper.getClosureAnnotator().getEclosingClassDescriptor(descriptor).getDefaultType(), MapTypeMode.VALUE));
}
Method superCallMethod = new Method("", Type.VOID_TYPE, parameterTypes.toArray(new Type[parameterTypes.size()]));
- iv.invokespecial(typeMapper.mapType(superClassDescriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), "", superCallMethod.getDescriptor());
+ iv.invokespecial(typeMapper.mapType(superClassDescriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), "",
+ superCallMethod.getDescriptor());
}
else {
- ConstructorDescriptor constructorDescriptor1 = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, ((JetDelegatorToSuperCall) superCall).getCalleeExpression().getConstructorReferenceExpression());
- generateDelegatorToConstructorCall(iv, codegen, (JetDelegatorToSuperCall) superCall, constructorDescriptor1, frameMap, firstSuperArgument);
+ ConstructorDescriptor constructorDescriptor1 = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET,
+ ((JetDelegatorToSuperCall) superCall)
+ .getCalleeExpression()
+ .getConstructorReferenceExpression());
+ generateDelegatorToConstructorCall(iv, codegen, (JetDelegatorToSuperCall) superCall, constructorDescriptor1, frameMap,
+ firstSuperArgument);
}
final ClassDescriptor outerDescriptor = typeMapper.getClosureAnnotator().getEclosingClassDescriptor(descriptor);
@@ -738,11 +798,11 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
if (closure.captureReceiver != null) {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(1, closure.captureReceiver);
- iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), "receiver$0", closure.captureReceiver.getDescriptor());
+ iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), "receiver$0",
+ closure.captureReceiver.getDescriptor());
k += closure.captureReceiver.getSize();
}
- int l = 0;
for (DeclarationDescriptor varDescr : closure.closure.keySet()) {
if (varDescr instanceof VariableDescriptor && !(varDescr instanceof PropertyDescriptor)) {
Type sharedVarType = typeMapper.getSharedVarType(varDescr);
@@ -752,16 +812,17 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.load(0, JetTypeMapper.TYPE_OBJECT);
iv.load(k, StackValue.refType(sharedVarType));
k += StackValue.refType(sharedVarType).getSize();
- iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(), "$" + varDescr.getName(), sharedVarType.getDescriptor());
- l++;
+ iv.putfield(typeMapper.mapType(descriptor.getDefaultType(), MapTypeMode.VALUE).getInternalName(),
+ "$" + varDescr.getName(), sharedVarType.getDescriptor());
}
}
}
int n = 0;
for (JetDelegationSpecifier specifier : myClass.getDelegationSpecifiers()) {
- if (specifier == superCall)
+ if (specifier == superCall) {
continue;
+ }
if (specifier instanceof JetDelegatorByExpressionSpecifier) {
iv.load(0, classType);
@@ -779,8 +840,13 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
JetClass superClass = (JetClass) BindingContextUtils.classDescriptorToDeclaration(bindingContext, superClassDescriptor);
final CodegenContext delegateContext = context.intoClass(superClassDescriptor,
- new OwnerKind.DelegateKind(StackValue.field(fieldType, classname, delegateField, false),
- typeMapper.mapType(superClassDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName()), state.getInjector().getJetTypeMapper());
+ new OwnerKind.DelegateKind(StackValue.field(fieldType, classname,
+ delegateField, false),
+ typeMapper.mapType(superClassDescriptor
+ .getDefaultType(),
+ MapTypeMode.IMPL)
+ .getInternalName()),
+ state.getInjector().getJetTypeMapper());
generateDelegates(superClass, delegateContext, field);
}
}
@@ -803,15 +869,17 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
mv.visitInsn(RETURN);
FunctionCodegen.endVisit(mv, "constructor", myClass);
- FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor, OwnerKind.IMPLEMENTATION);
+ FunctionCodegen.generateDefaultIfNeeded(constructorContext, state, v, constructorMethod.getAsmMethod(), constructorDescriptor,
+ OwnerKind.IMPLEMENTATION);
}
private void generateTraitMethods() {
- if (myClass instanceof JetClass && (((JetClass)myClass).isTrait() || ((JetClass)myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD)))
+ if (myClass instanceof JetClass &&
+ (((JetClass) myClass).isTrait() || ((JetClass) myClass).hasModifier(JetTokens.ABSTRACT_KEYWORD))) {
return;
-
+ }
+
for (Pair needDelegates : getTraitImplementations(descriptor)) {
- CallableMemberDescriptor callableDescriptor = needDelegates.first;
if (needDelegates.second instanceof SimpleFunctionDescriptor) {
generateDelegationToTraitImpl((FunctionDescriptor) needDelegates.second, (FunctionDescriptor) needDelegates.first);
}
@@ -843,11 +911,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
PropertyDescriptor property = ((PropertyAccessorDescriptor) fun).getCorrespondingProperty();
if (fun instanceof PropertyGetterDescriptor) {
function = typeMapper.mapGetterSignature(property, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
- functionOriginal = typeMapper.mapGetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
+ functionOriginal =
+ typeMapper.mapGetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature()
+ .getAsmMethod();
}
else if (fun instanceof PropertySetterDescriptor) {
function = typeMapper.mapSetterSignature(property, OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
- functionOriginal = typeMapper.mapSetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature().getAsmMethod();
+ functionOriginal =
+ typeMapper.mapSetterSignature(property.getOriginal(), OwnerKind.IMPLEMENTATION).getJvmMethodSignature()
+ .getAsmMethod();
}
else {
throw new IllegalStateException("Accessor is neither getter, nor setter, what is it?");
@@ -861,15 +933,19 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
final MethodVisitor mv = v.newMethod(myClass, flags, function.getName(), function.getDescriptor(), null, null);
AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(fun);
- JvmMethodSignature jvmSignature = typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature();
+ JvmMethodSignature jvmSignature =
+ typeMapper.mapToCallableMethod(inheritedFun, false, OwnerKind.IMPLEMENTATION).getSignature();
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
BitSet kotlinFlags = CodegenUtil.getFlagsForVisibility(fun.getVisibility());
if (fun instanceof PropertyAccessorDescriptor) {
kotlinFlags.set(JvmStdlibNames.FLAG_PROPERTY_BIT);
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
aw.writePropertyType(jvmSignature.getKotlinReturnType());
- } else {
- aw.writeNullableReturnType(fun.getReturnType().isNullable());
+ }
+ else {
+ JetType returnType = fun.getReturnType();
+ assert returnType != null;
+ aw.writeNullableReturnType(returnType.isNullable());
aw.writeTypeParameters(jvmSignature.getKotlinTypeParameter());
aw.writeReturnType(jvmSignature.getKotlinReturnType());
}
@@ -882,7 +958,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
else if (state.getClassBuilderMode() == ClassBuilderMode.FULL) {
mv.visitCode();
FrameMap frameMap = context.prepareFrame(state.getInjector().getJetTypeMapper());
- ExpressionCodegen codegen = new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
+ ExpressionCodegen codegen =
+ new ExpressionCodegen(mv, frameMap, jvmSignature.getAsmMethod().getReturnType(), context, state);
codegen.generateThisOrOuter(descriptor); // ??? wouldn't it be a good idea to put it?
Type[] argTypes = function.getArgumentTypes();
@@ -904,10 +981,12 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
type = typeMapper.mapType(jetType, MapTypeMode.IMPL);
}
- String fdescriptor = functionOriginal.getDescriptor().replace("(","(" + type.getDescriptor());
- Type type1 = typeMapper.mapType(((ClassDescriptor) fun.getContainingDeclaration()).getDefaultType(), MapTypeMode.TRAIT_IMPL);
+ String fdescriptor = functionOriginal.getDescriptor().replace("(", "(" + type.getDescriptor());
+ Type type1 =
+ typeMapper.mapType(((ClassDescriptor) fun.getContainingDeclaration()).getDefaultType(), MapTypeMode.TRAIT_IMPL);
iv.invokestatic(type1.getInternalName(), function.getName(), fdescriptor);
- if (function.getReturnType().getSort() == Type.OBJECT && !function.getReturnType().equals(functionOriginal.getReturnType())) {
+ if (function.getReturnType().getSort() == Type.OBJECT &&
+ !function.getReturnType().equals(functionOriginal.getReturnType())) {
iv.checkcast(function.getReturnType());
}
iv.areturn(function.getReturnType());
@@ -919,28 +998,39 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
}
- private void generateDelegatorToConstructorCall(InstructionAdapter iv, ExpressionCodegen codegen, JetCallElement constructorCall,
- ConstructorDescriptor constructorDescriptor,
- ConstructorFrameMap frameMap, int firstSuperArgument) {
+ private void generateDelegatorToConstructorCall(
+ InstructionAdapter iv, ExpressionCodegen codegen, JetCallElement constructorCall,
+ ConstructorDescriptor constructorDescriptor,
+ ConstructorFrameMap frameMap, int firstSuperArgument
+ ) {
ClassDescriptor classDecl = constructorDescriptor.getContainingDeclaration();
iv.load(0, TYPE_OBJECT);
- if(classDecl.getKind() == ClassKind.ENUM_CLASS) {
+ if (classDecl.getKind() == ClassKind.ENUM_CLASS || classDecl.getKind() == ClassKind.ENUM_ENTRY) {
iv.load(1, JetTypeMapper.TYPE_OBJECT);
iv.load(2, Type.INT_TYPE);
}
if (classDecl.getContainingDeclaration() instanceof ClassDescriptor) {
- iv.load(frameMap.getOuterThisIndex(), typeMapper.mapType(((ClassDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), MapTypeMode.IMPL));
+ iv.load(frameMap.getOuterThisIndex(),
+ typeMapper.mapType(((ClassDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), MapTypeMode.IMPL));
}
- CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
+ CallableMethod method = typeMapper
+ .mapToCallableMethod(constructorDescriptor, kind, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
- if (myClass instanceof JetObjectDeclaration && superCall instanceof JetDelegatorToSuperCall && ((JetObjectDeclaration) myClass).isObjectLiteral()) {
- ConstructorDescriptor superConstructor = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, ((JetDelegatorToSuperCall) superCall).getCalleeExpression().getConstructorReferenceExpression());
- CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION, typeMapper.hasThis0(superConstructor.getContainingDeclaration()));
- int nextVar = firstSuperArgument+1;
- for(Type t : superCallable.getSignature().getAsmMethod().getArgumentTypes()) {
+ if (myClass instanceof JetObjectDeclaration &&
+ superCall instanceof JetDelegatorToSuperCall &&
+ ((JetObjectDeclaration) myClass).isObjectLiteral()) {
+ ConstructorDescriptor superConstructor = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET,
+ ((JetDelegatorToSuperCall) superCall)
+ .getCalleeExpression()
+ .getConstructorReferenceExpression());
+ assert superConstructor != null;
+ CallableMethod superCallable = typeMapper.mapToCallableMethod(superConstructor, OwnerKind.IMPLEMENTATION,
+ typeMapper.hasThis0(superConstructor.getContainingDeclaration()));
+ int nextVar = firstSuperArgument + 1;
+ for (Type t : superCallable.getSignature().getAsmMethod().getArgumentTypes()) {
iv.load(nextVar, t);
nextVar += t.getSize();
}
@@ -998,8 +1088,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.dup();
iv.iconst(ordinal);
- // TODO type and constructor parameters
- String implClass = typeMapper.mapType(myType, MapTypeMode.IMPL).getInternalName();
+ ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, enumConstant);
+ String implClass = typeMapper.mapType(classDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName();
final List delegationSpecifiers = enumConstant.getDelegationSpecifiers();
if (delegationSpecifiers.size() > 1) {
@@ -1012,12 +1102,15 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.aconst(enumConstant.getName());
iv.iconst(ordinal);
- if (delegationSpecifiers.size() == 1) {
+ if (delegationSpecifiers.size() == 1 && !state.getInjector().getClosureAnnotator().enumEntryNeedSubclass(enumConstant)) {
final JetDelegationSpecifier specifier = delegationSpecifiers.get(0);
if (specifier instanceof JetDelegatorToSuperCall) {
final JetDelegatorToSuperCall superCall = (JetDelegatorToSuperCall) specifier;
- ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) bindingContext.get(BindingContext.REFERENCE_TARGET, superCall.getCalleeExpression().getConstructorReferenceExpression());
- CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, OwnerKind.IMPLEMENTATION, typeMapper.hasThis0(constructorDescriptor.getContainingDeclaration()));
+ ConstructorDescriptor constructorDescriptor = (ConstructorDescriptor) bindingContext
+ .get(BindingContext.REFERENCE_TARGET, superCall.getCalleeExpression().getConstructorReferenceExpression());
+ assert constructorDescriptor != null;
+ CallableMethod method = typeMapper.mapToCallableMethod(constructorDescriptor, OwnerKind.IMPLEMENTATION, typeMapper
+ .hasThis0(constructorDescriptor.getContainingDeclaration()));
codegen.invokeMethodWithArguments(method, superCall, StackValue.none());
}
else {
@@ -1028,14 +1121,16 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
iv.invokespecial(implClass, "", "(Ljava/lang/String;I)V");
}
iv.dup();
- iv.putstatic(implClass, enumConstant.getName(), "L" + implClass + ";");
+ iv.putstatic(myAsmType.getInternalName(), enumConstant.getName(), "L" + myAsmType.getInternalName() + ";");
iv.astore(TYPE_OBJECT);
}
iv.putstatic(myAsmType.getInternalName(), "$VALUES", arrayAsmType.getDescriptor());
}
- public static void generateInitializers(@NotNull ExpressionCodegen codegen, @NotNull InstructionAdapter iv, @NotNull List declarations,
- @NotNull BindingContext bindingContext, @NotNull JetTypeMapper typeMapper) {
+ public static void generateInitializers(
+ @NotNull ExpressionCodegen codegen, @NotNull InstructionAdapter iv, @NotNull List declarations,
+ @NotNull BindingContext bindingContext, @NotNull JetTypeMapper typeMapper
+ ) {
for (JetDeclaration declaration : declarations) {
if (declaration instanceof JetProperty) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) bindingContext.get(BindingContext.VARIABLE, declaration);
@@ -1048,34 +1143,44 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
Object value = compileTimeValue.getValue();
Type type = typeMapper.mapType(propertyDescriptor.getType(), MapTypeMode.VALUE);
if (JetTypeMapper.isPrimitive(type)) {
- if ( !propertyDescriptor.getType().isNullable() && value instanceof Number) {
- if (type == Type.INT_TYPE && ((Number)value).intValue() == 0)
+ if (!propertyDescriptor.getType().isNullable() && value instanceof Number) {
+ if (type == Type.INT_TYPE && ((Number) value).intValue() == 0) {
continue;
- if (type == Type.BYTE_TYPE && ((Number)value).byteValue() == 0)
+ }
+ if (type == Type.BYTE_TYPE && ((Number) value).byteValue() == 0) {
continue;
- if (type == Type.LONG_TYPE && ((Number)value).longValue() == 0L)
+ }
+ if (type == Type.LONG_TYPE && ((Number) value).longValue() == 0L) {
continue;
- if (type == Type.SHORT_TYPE && ((Number)value).shortValue() == 0)
+ }
+ if (type == Type.SHORT_TYPE && ((Number) value).shortValue() == 0) {
continue;
- if (type == Type.DOUBLE_TYPE && ((Number)value).doubleValue() == 0d)
+ }
+ if (type == Type.DOUBLE_TYPE && ((Number) value).doubleValue() == 0d) {
continue;
- if (type == Type.FLOAT_TYPE && ((Number)value).byteValue() == 0f)
+ }
+ if (type == Type.FLOAT_TYPE && ((Number) value).byteValue() == 0f) {
continue;
+ }
}
- if (type == Type.BOOLEAN_TYPE && value instanceof Boolean && !((Boolean)value))
+ if (type == Type.BOOLEAN_TYPE && value instanceof Boolean && !((Boolean) value)) {
continue;
- if (type == Type.CHAR_TYPE && value instanceof Character && ((Character)value) == 0)
+ }
+ if (type == Type.CHAR_TYPE && value instanceof Character && ((Character) value) == 0) {
continue;
+ }
}
else {
- if (value == null)
+ if (value == null) {
continue;
+ }
}
}
iv.load(0, JetTypeMapper.TYPE_OBJECT);
Type type = codegen.expressionType(initializer);
- if (propertyDescriptor.getType().isNullable())
+ if (propertyDescriptor.getType().isNullable()) {
type = JetTypeMapper.boxType(type);
+ }
codegen.gen(initializer, type);
// @todo write directly to the field. Fix test excloset.jet::test6
JvmClassName owner = typeMapper.getOwner(propertyDescriptor, OwnerKind.IMPLEMENTATION);
@@ -1083,7 +1188,6 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
StackValue.property(propertyDescriptor.getName().getName(), owner, owner,
propType, false, false, false, null, null, 0).store(propType, iv);
}
-
}
}
else if (declaration instanceof JetClassInitializer) {
@@ -1105,7 +1209,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
for (CallableMemberDescriptor overriddenDescriptor : overriddenDescriptors) {
if (overriddenDescriptor.getContainingDeclaration() == classDescriptor) {
if (declaration instanceof PropertyDescriptor) {
- propertyCodegen.genDelegate((PropertyDescriptor) declaration, (PropertyDescriptor) overriddenDescriptor, field);
+ propertyCodegen
+ .genDelegate((PropertyDescriptor) declaration, (PropertyDescriptor) overriddenDescriptor, field);
}
else if (declaration instanceof SimpleFunctionDescriptor) {
functionCodegen.genDelegate((SimpleFunctionDescriptor) declaration, overriddenDescriptor, field);
@@ -1129,7 +1234,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
*/
public static List> getTraitImplementations(@NotNull ClassDescriptor classDescriptor) {
List> r = Lists.newArrayList();
-
+
root:
for (DeclarationDescriptor decl : classDescriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
if (!(decl instanceof CallableMemberDescriptor)) {
@@ -1141,7 +1246,8 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
continue;
}
- Collection overriddenDeclarations = OverridingUtil.getOverriddenDeclarations(callableMemberDescriptor);
+ Collection overriddenDeclarations =
+ OverridingUtil.getOverriddenDeclarations(callableMemberDescriptor);
for (CallableMemberDescriptor overriddenDeclaration : overriddenDeclarations) {
if (overriddenDeclaration.getModality() != Modality.ABSTRACT) {
if (!CodegenUtil.isInterface(overriddenDeclaration.getContainingDeclaration())) {
@@ -1149,7 +1255,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
}
}
}
-
+
for (CallableMemberDescriptor overriddenDeclaration : overriddenDeclarations) {
if (overriddenDeclaration.getModality() != Modality.ABSTRACT) {
r.add(Pair.create(callableMemberDescriptor, overriddenDeclaration));
@@ -1159,5 +1265,4 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
return r;
}
-
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
index aea38a49409..b7cca4de60c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/JetTypeMapper.java
@@ -20,6 +20,8 @@ import com.google.common.collect.Maps;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
import org.jetbrains.jet.codegen.signature.BothSignatureWriter;
import org.jetbrains.jet.codegen.signature.JvmMethodParameterKind;
import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
@@ -42,12 +44,13 @@ import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
import org.jetbrains.jet.lang.types.lang.JetStandardLibraryNames;
import org.jetbrains.jet.lang.types.lang.PrimitiveType;
import org.jetbrains.jet.lang.types.ref.ClassName;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
import static org.jetbrains.asm4.Opcodes.*;
@@ -122,6 +125,7 @@ public class JetTypeMapper {
@Nullable
public Type get(@NotNull JetType type) {
ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor();
+ assert classifier != null;
return asmTypes.get(new SpecialTypeKey(DescriptorUtils.getFQName(classifier), type.isNullable()));
}
@@ -306,11 +310,13 @@ public class JetTypeMapper {
return JvmClassName.byInternalName(r.toString());
}
- @NotNull public Type mapReturnType(@NotNull final JetType jetType) {
+ @NotNull
+ public Type mapReturnType(@NotNull final JetType jetType) {
return mapReturnType(jetType, null);
}
- @NotNull private Type mapReturnType(@NotNull final JetType jetType, @Nullable BothSignatureWriter signatureVisitor) {
+ @NotNull
+ private Type mapReturnType(@NotNull final JetType jetType, @Nullable BothSignatureWriter signatureVisitor) {
if (jetType.equals(JetStandardClasses.getUnitType())) {
if (signatureVisitor != null) {
signatureVisitor.writeAsmType(Type.VOID_TYPE, false);
@@ -375,7 +381,12 @@ public class JetTypeMapper {
}
}
else if (klass.getKind() == ClassKind.ENUM_ENTRY) {
- return getJvmInternalFQName(klass.getContainingDeclaration());
+ if (closureAnnotator.enumEntryNeedSubclass(klass)) {
+ return getJvmInternalFQName(klass.getContainingDeclaration()) + "$" + klass.getName().getName();
+ }
+ else {
+ return getJvmInternalFQName(klass.getContainingDeclaration());
+ }
}
}
@@ -428,6 +439,7 @@ public class JetTypeMapper {
throw new IllegalStateException("TRAIT_IMPL is not possible for " + jetType);
}
else if (kind == MapTypeMode.IMPL) {
+ //noinspection ConstantConditions
if (mapBuiltinsToJava) {
// TODO: enable and fix tests
//throw new IllegalStateException("must not map known type to IMPL when not compiling builtins: " + jetType);
@@ -462,13 +474,13 @@ public class JetTypeMapper {
}
if (descriptor instanceof ClassDescriptor
- && JetStandardLibraryNames.ARRAY.is((ClassDescriptor) descriptor)
- && mapBuiltinsToJava) {
+ && JetStandardLibraryNames.ARRAY.is((ClassDescriptor) descriptor)
+ && mapBuiltinsToJava) {
if (jetType.getArguments().size() != 1) {
throw new UnsupportedOperationException("arrays must have one type argument");
}
JetType memberType = jetType.getArguments().get(0).getType();
-
+
if (signatureVisitor != null) {
signatureVisitor.writeArrayType(jetType.isNullable());
mapType(memberType, signatureVisitor, MapTypeMode.TYPE_PARAMETER);
@@ -511,7 +523,8 @@ public class JetTypeMapper {
Type type = mapType(((TypeParameterDescriptor) descriptor).getUpperBoundsAsType(), kind);
if (signatureVisitor != null) {
- TypeParameterDescriptor typeParameterDescriptor = (TypeParameterDescriptor) jetType.getConstructor().getDeclarationDescriptor();
+ TypeParameterDescriptor typeParameterDescriptor =
+ (TypeParameterDescriptor) jetType.getConstructor().getDeclarationDescriptor();
assert typeParameterDescriptor != null;
signatureVisitor.writeTypeVariable(typeParameterDescriptor.getName(), jetType.isNullable(), type);
}
@@ -584,11 +597,13 @@ public class JetTypeMapper {
}
public CallableMethod mapToCallableMethod(FunctionDescriptor functionDescriptor, boolean superCall, OwnerKind kind) {
- if (functionDescriptor == null) { return null; }
+ if (functionDescriptor == null) {
+ return null;
+ }
final DeclarationDescriptor functionParent = functionDescriptor.getOriginal().getContainingDeclaration();
- while(functionDescriptor.getKind()==CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
+ while (functionDescriptor.getKind() == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
functionDescriptor = functionDescriptor.getOverriddenDescriptors().iterator().next();
}
@@ -614,11 +629,12 @@ public class JetTypeMapper {
thisClass = null;
}
else if (functionParent instanceof ScriptDescriptor) {
- thisClass = owner = ownerForDefaultParam = ownerForDefaultImpl = closureAnnotator.classNameForScriptDescriptor((ScriptDescriptor) functionParent);
+ thisClass = owner =
+ ownerForDefaultParam = ownerForDefaultImpl = closureAnnotator.classNameForScriptDescriptor((ScriptDescriptor) functionParent);
invokeOpcode = INVOKEVIRTUAL;
}
else if (functionParent instanceof ClassDescriptor) {
-
+
FunctionDescriptor declarationFunctionDescriptor = findAnyDeclaration(functionDescriptor);
ClassDescriptor currentOwner = (ClassDescriptor) functionParent;
@@ -647,8 +663,8 @@ public class JetTypeMapper {
ownerForDefaultParam.getInternalName() + (originalIsInterface ? JvmAbi.TRAIT_IMPL_SUFFIX : ""));
invokeOpcode = isInterface
- ? (superCall ? Opcodes.INVOKESTATIC : Opcodes.INVOKEINTERFACE)
- : (isAccessor ? Opcodes.INVOKESTATIC : (superCall ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL));
+ ? (superCall ? Opcodes.INVOKESTATIC : Opcodes.INVOKEINTERFACE)
+ : (isAccessor ? Opcodes.INVOKESTATIC : (superCall ? Opcodes.INVOKESPECIAL : Opcodes.INVOKEVIRTUAL));
if (isInterface && superCall) {
descriptor = mapSignature(functionDescriptor, false, OwnerKind.TRAIT_IMPL);
owner = JvmClassName.byInternalName(owner.getInternalName() + JvmAbi.TRAIT_IMPL_SUFFIX);
@@ -673,7 +689,9 @@ public class JetTypeMapper {
}
private static boolean isAccessor(FunctionDescriptor functionDescriptor) {
- return functionDescriptor instanceof AccessorForFunctionDescriptor || functionDescriptor instanceof AccessorForPropertyDescriptor.Getter || functionDescriptor instanceof AccessorForPropertyDescriptor.Setter;
+ return functionDescriptor instanceof AccessorForFunctionDescriptor ||
+ functionDescriptor instanceof AccessorForPropertyDescriptor.Getter ||
+ functionDescriptor instanceof AccessorForPropertyDescriptor.Setter;
}
@NotNull
@@ -689,11 +707,11 @@ public class JetTypeMapper {
}
private JvmMethodSignature mapSignature(FunctionDescriptor f, boolean needGenericSignature, OwnerKind kind) {
-
+
if (kind == OwnerKind.TRAIT_IMPL) {
needGenericSignature = false;
}
-
+
BothSignatureWriter signatureVisitor = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, needGenericSignature);
writeFormalTypeParameters(f.getTypeParameters(), signatureVisitor);
@@ -704,9 +722,9 @@ public class JetTypeMapper {
signatureVisitor.writeParametersStart();
- if(isAccessor(f)) {
+ if (isAccessor(f)) {
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
- mapType(((ClassifierDescriptor)f.getContainingDeclaration()).getDefaultType(), signatureVisitor, MapTypeMode.VALUE);
+ mapType(((ClassifierDescriptor) f.getContainingDeclaration()).getDefaultType(), signatureVisitor, MapTypeMode.VALUE);
signatureVisitor.writeParameterTypeEnd();
}
@@ -714,11 +732,11 @@ public class JetTypeMapper {
ClassDescriptor containingDeclaration = (ClassDescriptor) f.getContainingDeclaration();
JetType jetType = TraitImplBodyCodegen.getSuperClass(containingDeclaration);
Type type = mapType(jetType, MapTypeMode.VALUE);
- if(type.getInternalName().equals("java/lang/Object")) {
+ if (type.getInternalName().equals("java/lang/Object")) {
jetType = containingDeclaration.getDefaultType();
type = mapType(jetType, MapTypeMode.VALUE);
}
-
+
signatureVisitor.writeParameterType(JvmMethodParameterKind.THIS);
signatureVisitor.writeAsmType(type, jetType.isNullable());
signatureVisitor.writeParameterTypeEnd();
@@ -743,7 +761,9 @@ public class JetTypeMapper {
}
else {
signatureVisitor.writeReturnType();
- mapReturnType(f.getReturnType(), signatureVisitor);
+ JetType returnType = f.getReturnType();
+ assert returnType != null;
+ mapReturnType(returnType, signatureVisitor);
signatureVisitor.writeReturnTypeEnd();
}
return signatureVisitor.makeJvmMethodSignature(f.getName().getName());
@@ -763,7 +783,8 @@ public class JetTypeMapper {
}
private void writeFormalTypeParameter(TypeParameterDescriptor typeParameterDescriptor, BothSignatureWriter signatureVisitor) {
- signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName().getName(), typeParameterDescriptor.getVariance(), typeParameterDescriptor.isReified());
+ signatureVisitor.writeFormalTypeParameter(typeParameterDescriptor.getName().getName(), typeParameterDescriptor.getVariance(),
+ typeParameterDescriptor.isReified());
classBound:
{
@@ -799,23 +820,22 @@ public class JetTypeMapper {
signatureVisitor.writeInterfaceBoundEnd();
}
}
-
- signatureVisitor.writeFormalTypeParameterEnd();
+ signatureVisitor.writeFormalTypeParameterEnd();
}
public JvmMethodSignature mapSignature(Name name, FunctionDescriptor f) {
final ReceiverDescriptor receiver = f.getReceiverParameter();
-
+
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, false);
-
+
writeFormalTypeParameters(f.getTypeParameters(), signatureWriter);
signatureWriter.writeParametersStart();
- if(isAccessor(f)) {
+ if (isAccessor(f)) {
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS);
- mapType(((ClassifierDescriptor)f.getContainingDeclaration()).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ mapType(((ClassifierDescriptor) f.getContainingDeclaration()).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
@@ -832,15 +852,17 @@ public class JetTypeMapper {
}
signatureWriter.writeParametersEnd();
-
+
signatureWriter.writeReturnType();
- mapReturnType(f.getReturnType(), signatureWriter);
+ JetType returnType = f.getReturnType();
+ assert returnType != null;
+ mapReturnType(returnType, signatureWriter);
signatureWriter.writeReturnTypeEnd();
-
+
return signatureWriter.makeJvmMethodSignature(name.getName());
}
-
+
public JvmPropertyAccessorSignature mapGetterSignature(PropertyDescriptor descriptor, OwnerKind kind) {
final DeclarationDescriptor parentDescriptor = descriptor.getContainingDeclaration();
boolean isAnnotation = parentDescriptor instanceof ClassDescriptor &&
@@ -854,16 +876,17 @@ public class JetTypeMapper {
signatureWriter.writeParametersStart();
- if(kind == OwnerKind.TRAIT_IMPL) {
- ClassDescriptor containingDeclaration = (ClassDescriptor) parentDescriptor;
+ if (kind == OwnerKind.TRAIT_IMPL) {
+ @SuppressWarnings("ConstantConditions") ClassDescriptor containingDeclaration = (ClassDescriptor) parentDescriptor;
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS);
mapType(containingDeclaration.getDefaultType(), signatureWriter, MapTypeMode.IMPL);
signatureWriter.writeParameterTypeEnd();
}
else {
- if(descriptor instanceof AccessorForPropertyDescriptor) {
+ if (descriptor instanceof AccessorForPropertyDescriptor) {
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS);
- mapType(((ClassifierDescriptor)descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter,
+ MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
}
@@ -893,7 +916,7 @@ public class JetTypeMapper {
// TODO: generics signature is not always needed
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
-
+
writeFormalTypeParameters(descriptor.getTypeParameters(), signatureWriter);
JetType outType = descriptor.getType();
@@ -908,9 +931,10 @@ public class JetTypeMapper {
signatureWriter.writeParameterTypeEnd();
}
else {
- if(descriptor instanceof AccessorForPropertyDescriptor) {
+ if (descriptor instanceof AccessorForPropertyDescriptor) {
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS);
- mapType(((ClassifierDescriptor)descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ mapType(((ClassifierDescriptor) descriptor.getContainingDeclaration()).getDefaultType(), signatureWriter,
+ MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
}
@@ -924,19 +948,20 @@ public class JetTypeMapper {
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
mapType(outType, signatureWriter, MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
-
+
signatureWriter.writeParametersEnd();
-
+
signatureWriter.writeVoidReturn();
JvmMethodSignature jvmMethodSignature = signatureWriter.makeJvmMethodSignature(name);
- return new JvmPropertyAccessorSignature(jvmMethodSignature, jvmMethodSignature.getKotlinParameterType(jvmMethodSignature.getParameterCount() - 1));
+ return new JvmPropertyAccessorSignature(jvmMethodSignature,
+ jvmMethodSignature.getKotlinParameterType(jvmMethodSignature.getParameterCount() - 1));
}
private JvmMethodSignature mapConstructorSignature(ConstructorDescriptor descriptor, boolean hasThis0) {
-
+
BothSignatureWriter signatureWriter = new BothSignatureWriter(BothSignatureWriter.Mode.METHOD, true);
-
+
List parameters = descriptor.getOriginal().getValueParameters();
// constructor type parmeters are fake
@@ -947,11 +972,12 @@ public class JetTypeMapper {
ClassDescriptor containingDeclaration = descriptor.getContainingDeclaration();
if (hasThis0) {
signatureWriter.writeParameterType(JvmMethodParameterKind.THIS0);
- mapType(closureAnnotator.getEclosingClassDescriptor(containingDeclaration).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ mapType(closureAnnotator.getEclosingClassDescriptor(containingDeclaration).getDefaultType(), signatureWriter,
+ MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
- if(containingDeclaration.getKind() == ClassKind.ENUM_CLASS) {
+ if (containingDeclaration.getKind() == ClassKind.ENUM_CLASS || containingDeclaration.getKind() == ClassKind.ENUM_ENTRY) {
signatureWriter.writeParameterType(JvmMethodParameterKind.ENUM_NAME);
mapType(JetStandardLibrary.getInstance().getStringType(), signatureWriter, MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
@@ -965,9 +991,9 @@ public class JetTypeMapper {
mapType(parameter.getType(), signatureWriter, MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
-
+
signatureWriter.writeParametersEnd();
-
+
signatureWriter.writeVoidReturn();
return signatureWriter.makeJvmMethodSignature("");
@@ -983,7 +1009,8 @@ public class JetTypeMapper {
for (ScriptDescriptor importedScript : importedScripts) {
signatureWriter.writeParameterType(JvmMethodParameterKind.VALUE);
- mapType(closureAnnotator.classDescriptorForScriptDescriptor(importedScript).getDefaultType(), signatureWriter, MapTypeMode.VALUE);
+ mapType(closureAnnotator.classDescriptorForScriptDescriptor(importedScript).getDefaultType(), signatureWriter,
+ MapTypeMode.VALUE);
signatureWriter.writeParameterTypeEnd();
}
@@ -1044,39 +1071,42 @@ public class JetTypeMapper {
}
}
- public Collection allJvmNames(JetClassOrObject jetClass) {
- Set result = new HashSet();
+ @Nullable
+ public String getJvmInternalName(JetClassOrObject jetClass) {
final ClassDescriptor classDescriptor = bindingContext.get(BindingContext.CLASS, jetClass);
- if (classDescriptor != null) {
- result.add(mapType(classDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName());
+ if (classDescriptor == null) {
+ return null;
}
- return result;
+ return mapType(classDescriptor.getDefaultType(), MapTypeMode.IMPL).getInternalName();
}
private static boolean isForceReal(JvmClassName className) {
return JvmPrimitiveType.getByWrapperClass(className) != null
- || className.getFqName().getFqName().equals("java.lang.String")
- || className.getFqName().getFqName().equals("java.lang.CharSequence")
- || className.getFqName().getFqName().equals("java.lang.Object")
- || className.getFqName().getFqName().equals("java.lang.Number")
- || className.getFqName().getFqName().equals("java.lang.Enum")
- || className.getFqName().getFqName().equals("java.lang.Comparable");
+ || className.getFqName().getFqName().equals("java.lang.String")
+ || className.getFqName().getFqName().equals("java.lang.CharSequence")
+ || className.getFqName().getFqName().equals("java.lang.Object")
+ || className.getFqName().getFqName().equals("java.lang.Number")
+ || className.getFqName().getFqName().equals("java.lang.Enum")
+ || className.getFqName().getFqName().equals("java.lang.Comparable");
}
public static boolean isGenericsArray(JetType type) {
- return JetStandardLibraryNames.ARRAY.is(type) && type.getArguments().get(0).getType().getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor;
+ return JetStandardLibraryNames.ARRAY.is(type) &&
+ type.getArguments().get(0).getType().getConstructor().getDeclarationDescriptor() instanceof TypeParameterDescriptor;
}
public Type getSharedVarType(DeclarationDescriptor descriptor) {
if (descriptor instanceof PropertyDescriptor) {
- return StackValue.sharedTypeForType(mapType(((PropertyDescriptor) descriptor).getReceiverParameter().getType(), MapTypeMode.VALUE));
+ return StackValue
+ .sharedTypeForType(mapType(((PropertyDescriptor) descriptor).getReceiverParameter().getType(), MapTypeMode.VALUE));
}
else if (descriptor instanceof SimpleFunctionDescriptor && descriptor.getContainingDeclaration() instanceof FunctionDescriptor) {
PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(bindingContext, descriptor);
return closureAnnotator.classNameForAnonymousClass((JetElement) psiElement).getAsmType();
}
else if (descriptor instanceof FunctionDescriptor) {
- return StackValue.sharedTypeForType(mapType(((FunctionDescriptor) descriptor).getReceiverParameter().getType(), MapTypeMode.VALUE));
+ return StackValue
+ .sharedTypeForType(mapType(((FunctionDescriptor) descriptor).getReceiverParameter().getType(), MapTypeMode.VALUE));
}
else if (descriptor instanceof VariableDescriptor && isVarCapturedInClosure(descriptor)) {
JetType outType = ((VariableDescriptor) descriptor).getType();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MapTypeMode.java b/compiler/backend/src/org/jetbrains/jet/codegen/MapTypeMode.java
index e29d76067ac..ab6652cecbf 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/MapTypeMode.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/MapTypeMode.java
@@ -20,12 +20,20 @@ package org.jetbrains.jet.codegen;
* @author Stepan Koltsov
*/
public enum MapTypeMode {
- /** jet.Int is mapped to Ljet/Int; */
+ /**
+ * jet.Int is mapped to Ljet/Int;
+ */
IMPL,
- /** jet.Int is mapped to Ljet/Impl$TImpl; */
+ /**
+ * jet.Int is mapped to Ljet/Impl$TImpl;
+ */
TRAIT_IMPL,
- /** jet.Int is mapped to I */
+ /**
+ * jet.Int is mapped to I
+ */
VALUE,
- /** jet.Int is mapped to Ljava/lang/Integer; */
+ /**
+ * jet.Int is mapped to Ljava/lang/Integer;
+ */
TYPE_PARAMETER,
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java
index 8b2f88cb965..30faa2bcbf3 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/MemberCodegen.java
@@ -37,8 +37,10 @@ public class MemberCodegen {
}
- public void generateFunctionOrProperty(@NotNull JetTypeParameterListOwner functionOrProperty,
- @NotNull CodegenContext context, @NotNull ClassBuilder classBuilder) {
+ public void generateFunctionOrProperty(
+ @NotNull JetTypeParameterListOwner functionOrProperty,
+ @NotNull CodegenContext context, @NotNull ClassBuilder classBuilder
+ ) {
FunctionCodegen functionCodegen = new FunctionCodegen(context, classBuilder, state);
if (functionOrProperty instanceof JetNamedFunction) {
try {
@@ -66,5 +68,4 @@ public class MemberCodegen {
throw new IllegalArgumentException("Unknown parameter: " + functionOrProperty);
}
}
-
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
index da0314565b7..6349b106159 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/NamespaceCodegen.java
@@ -18,10 +18,12 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.progress.ProcessCanceledException;
-import com.intellij.openapi.util.Pair;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.descriptors.PropertyDescriptor;
import org.jetbrains.jet.lang.diagnostics.DiagnosticUtils;
@@ -32,11 +34,7 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.utils.Progress;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import java.util.ArrayList;
import java.util.Collection;
import static org.jetbrains.asm4.Opcodes.*;
@@ -50,9 +48,13 @@ public class NamespaceCodegen {
@NotNull private final FqName name;
private final GenerationState state;
private final Collection files;
- private int nextMultiFile = 0;
- public NamespaceCodegen(@NotNull ClassBuilderOnDemand v, @NotNull final FqName fqName, GenerationState state, Collection namespaceFiles) {
+ public NamespaceCodegen(
+ @NotNull ClassBuilderOnDemand v,
+ @NotNull final FqName fqName,
+ GenerationState state,
+ Collection namespaceFiles
+ ) {
checkAllFilesHaveSameNamespace(namespaceFiles);
this.v = v;
@@ -77,7 +79,6 @@ public class NamespaceCodegen {
v.visitSource(sourceFile.getName(), null);
}
});
-
}
public void generate(CompilationErrorHandler errorHandler, final Progress progress) {
@@ -101,7 +102,7 @@ public class NamespaceCodegen {
throw e;
}
catch (Throwable e) {
- if(errorHandler != null) errorHandler.reportException(e, vFile == null ? "no file" : vFile.getUrl());
+ if (errorHandler != null) errorHandler.reportException(e, vFile == null ? "no file" : vFile.getUrl());
DiagnosticUtils.throwIfRunningOnServer(e);
if (ApplicationManager.getApplication().isInternal()) {
e.printStackTrace();
@@ -151,17 +152,17 @@ public class NamespaceCodegen {
if (k > 0) {
PsiFile containingFile = file.getContainingFile();
String fname = containingFile.getName();
- fname = fname.substring(0,fname.lastIndexOf('.'));
- String className = name.child(Name.identifier("namespace$src$" + fname)).getFqName().replace('.','/');
- ClassBuilder builder = state.forNamespacepart(className, file);
+ fname = fname.substring(0, fname.lastIndexOf('.'));
+ String className = name.child(Name.identifier("namespace$src$" + fname)).getFqName().replace('.', '/');
+ ClassBuilder builder = state.forNamespacepart(className);
builder.defineClass(containingFile, V1_6,
- ACC_PUBLIC/*|ACC_SUPER*/,
- className,
- null,
- //"jet/lang/Namespace",
- "java/lang/Object",
- new String[0]
+ ACC_PUBLIC/*|ACC_SUPER*/,
+ className,
+ null,
+ //"jet/lang/Namespace",
+ "java/lang/Object",
+ new String[0]
);
builder.visitSource(containingFile.getName(), null);
@@ -169,11 +170,13 @@ public class NamespaceCodegen {
if (declaration instanceof JetNamedFunction) {
{
final CodegenContext context = CodegenContexts.STATIC.intoNamespace(descriptor);
- state.getInjector().getMemberCodegen().generateFunctionOrProperty((JetTypeParameterListOwner) declaration, context, builder);
+ state.getInjector().getMemberCodegen()
+ .generateFunctionOrProperty((JetTypeParameterListOwner) declaration, context, builder);
}
{
final CodegenContext context = CodegenContexts.STATIC.intoNamespacePart(className, descriptor);
- state.getInjector().getMemberCodegen().generateFunctionOrProperty((JetTypeParameterListOwner) declaration, context, v.getClassBuilder());
+ state.getInjector().getMemberCodegen()
+ .generateFunctionOrProperty((JetTypeParameterListOwner) declaration, context, v.getClassBuilder());
}
}
}
@@ -234,7 +237,8 @@ public class NamespaceCodegen {
if (declaration instanceof JetProperty) {
final JetExpression initializer = ((JetProperty) declaration).getInitializer();
if (initializer != null && !(initializer instanceof JetConstantExpression)) {
- final PropertyDescriptor descriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, declaration);
+ final PropertyDescriptor descriptor =
+ (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, declaration);
assert descriptor != null;
codegen.genToJVMStack(initializer);
StackValue.Property propValue = codegen.intermediateValueForProperty(descriptor, true, null);
@@ -260,7 +264,6 @@ public class NamespaceCodegen {
if (initializer != null && !(initializer instanceof JetConstantExpression)) {
return true;
}
-
}
}
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
index 6eb31d83af5..16985a2ef7a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ObjectOrClosureCodegen.java
@@ -17,13 +17,13 @@
package org.jetbrains.jet.codegen;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperCall;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
import org.jetbrains.jet.lang.resolve.java.JvmClassName;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
import java.util.LinkedHashMap;
import java.util.Map;
@@ -40,7 +40,8 @@ public class ObjectOrClosureCodegen {
protected final CodegenContext context;
protected ClassBuilder cv = null;
public JvmClassName name = null;
- protected Map closure = new LinkedHashMap();
+ protected Map closure =
+ new LinkedHashMap();
public JetDelegatorToSuperCall superCall;
public ObjectOrClosureCodegen(ExpressionCodegen exprContext, CodegenContext context, GenerationState state) {
@@ -69,8 +70,8 @@ public class ObjectOrClosureCodegen {
StackValue outerValue = StackValue.local(idx, type);
final String fieldName = "$" + vd.getName();
StackValue innerValue = sharedVarType != null
- ? StackValue.fieldForSharedVar(localType, name, fieldName)
- : StackValue.field(type, name, fieldName, false);
+ ? StackValue.fieldForSharedVar(localType, name, fieldName)
+ : StackValue.field(type, name, fieldName, false);
cv.newField(null, Opcodes.ACC_PUBLIC, fieldName, type.getDescriptor(), null, null);
@@ -111,10 +112,12 @@ public class ObjectOrClosureCodegen {
CodegenContexts.ReceiverContext fcontext = (CodegenContexts.ReceiverContext) context;
- if (fcontext.getReceiverDescriptor() != fd)
+ if (fcontext.getReceiverDescriptor() != fd) {
return null;
+ }
- Type type = state.getInjector().getJetTypeMapper().mapType(fcontext.getReceiverDescriptor().getReceiverParameter().getType(), MapTypeMode.VALUE);
+ Type type = state.getInjector().getJetTypeMapper()
+ .mapType(fcontext.getReceiverDescriptor().getReceiverParameter().getType(), MapTypeMode.VALUE);
boolean isStatic = fcontext.getContextDescriptor().getContainingDeclaration() instanceof NamespaceDescriptor;
StackValue outerValue = StackValue.local(isStatic ? 0 : 1, type);
final String fieldName = "receiver$0";
@@ -134,7 +137,7 @@ public class ObjectOrClosureCodegen {
return null;
}
- public boolean isConst () {
+ public boolean isConst() {
return captureThis == null && captureReceiver == null && closure.isEmpty();
}
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/OwnerKind.java b/compiler/backend/src/org/jetbrains/jet/codegen/OwnerKind.java
index 85686c55086..000fe15c9fa 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/OwnerKind.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/OwnerKind.java
@@ -50,19 +50,13 @@ public class OwnerKind {
}
public static class StaticDelegateKind extends OwnerKind {
- private final StackValue delegate;
private final String ownerClass;
- public StaticDelegateKind(StackValue delegate, String ownerClass) {
+ public StaticDelegateKind(String ownerClass) {
super("staticDelegateKind");
- this.delegate = delegate;
this.ownerClass = ownerClass;
}
- public StackValue getDelegate() {
- return delegate;
- }
-
public String getOwnerClass() {
return ownerClass;
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ProjectionErasingJetType.java b/compiler/backend/src/org/jetbrains/jet/codegen/ProjectionErasingJetType.java
deleted file mode 100644
index 74562cf0380..00000000000
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ProjectionErasingJetType.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2010-2012 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 org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
-import org.jetbrains.jet.lang.resolve.scopes.JetScope;
-import org.jetbrains.jet.lang.types.JetType;
-import org.jetbrains.jet.lang.types.TypeConstructor;
-import org.jetbrains.jet.lang.types.TypeProjection;
-import org.jetbrains.jet.lang.types.Variance;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author alex.tkachman
- *
- * Utility class used by back-end to
- */
-public class ProjectionErasingJetType implements JetType {
- private final JetType delegate;
- private List arguments;
-
- public ProjectionErasingJetType(JetType delegate) {
- this.delegate = delegate;
- arguments = new ArrayList();
- for(TypeProjection tp : delegate.getArguments()) {
- arguments.add(new TypeProjection(Variance.INVARIANT, tp.getType()));
- }
- }
-
- @NotNull
- @Override
- public TypeConstructor getConstructor() {
- return delegate.getConstructor();
- }
-
- @NotNull
- @Override
- public List getArguments() {
- return arguments;
- }
-
- @Override
- public boolean isNullable() {
- return false;
- }
-
- @NotNull
- @Override
- public JetScope getMemberScope() {
- return delegate.getMemberScope();
- }
-
- @Override
- public List getAnnotations() {
- return delegate.getAnnotations();
- }
-
- @Override
- public int hashCode() {
- return delegate.hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- return ((obj instanceof ProjectionErasingJetType) && delegate.equals(((ProjectionErasingJetType)obj).delegate)) || delegate.equals(obj);
- }
-}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
index 2b43bb9085f..74e7957889c 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/PropertyCodegen.java
@@ -19,8 +19,13 @@ package org.jetbrains.jet.codegen;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter;
+import org.jetbrains.asm4.FieldVisitor;
+import org.jetbrains.asm4.MethodVisitor;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.signature.JvmPropertyAccessorSignature;
+import org.jetbrains.jet.codegen.signature.kotlin.JetMethodAnnotationWriter;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.resolve.BindingContext;
@@ -31,11 +36,6 @@ import org.jetbrains.jet.lang.resolve.java.JvmAbi;
import org.jetbrains.jet.lang.resolve.java.JvmStdlibNames;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.JetStandardLibrary;
-import org.jetbrains.asm4.FieldVisitor;
-import org.jetbrains.asm4.MethodVisitor;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.BitSet;
@@ -62,9 +62,10 @@ public class PropertyCodegen {
throw new UnsupportedOperationException("expect a property to have a property descriptor");
}
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
- if (kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind ==OwnerKind.TRAIT_IMPL ) {
- if (kind != OwnerKind.TRAIT_IMPL)
+ if (kind == OwnerKind.NAMESPACE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.TRAIT_IMPL) {
+ if (kind != OwnerKind.TRAIT_IMPL) {
generateBackingField(p, propertyDescriptor);
+ }
generateGetter(p, propertyDescriptor);
generateSetter(p, propertyDescriptor);
}
@@ -77,13 +78,15 @@ public class PropertyCodegen {
}
public void generateBackingField(PsiElement p, PropertyDescriptor propertyDescriptor) {
+ //noinspection ConstantConditions
if (state.getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor)) {
DeclarationDescriptor containingDeclaration = propertyDescriptor.getContainingDeclaration();
- if (CodegenUtil.isInterface(containingDeclaration))
+ if (CodegenUtil.isInterface(containingDeclaration)) {
return;
+ }
Object value = null;
- final JetExpression initializer = p instanceof JetProperty ? ((JetProperty)p).getInitializer() : null;
+ final JetExpression initializer = p instanceof JetProperty ? ((JetProperty) p).getInitializer() : null;
if (initializer != null) {
if (initializer instanceof JetConstantExpression) {
CompileTimeConstant> compileTimeValue = state.getBindingContext().get(BindingContext.COMPILE_TIME_VALUE, initializer);
@@ -113,8 +116,10 @@ public class PropertyCodegen {
final JetPropertyAccessor getter = p.getGetter();
if (getter != null) {
if (getter.getBodyExpression() != null) {
- JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapGetterSignature(propertyDescriptor, kind);
- functionCodegen.generateMethod(getter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(), propertyDescriptor.getGetter());
+ JvmPropertyAccessorSignature signature =
+ state.getInjector().getJetTypeMapper().mapGetterSignature(propertyDescriptor, kind);
+ functionCodegen.generateMethod(getter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(),
+ propertyDescriptor.getGetter());
}
else if (isExternallyAccessible(propertyDescriptor)) {
generateDefaultGetter(p);
@@ -136,8 +141,11 @@ public class PropertyCodegen {
if (setter.getBodyExpression() != null) {
final PropertySetterDescriptor setterDescriptor = propertyDescriptor.getSetter();
assert setterDescriptor != null;
- JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapSetterSignature(propertyDescriptor, kind);
- functionCodegen.generateMethod(setter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(), setterDescriptor);
+ JvmPropertyAccessorSignature signature =
+ state.getInjector().getJetTypeMapper().mapSetterSignature(propertyDescriptor, kind);
+ assert signature != null;
+ functionCodegen.generateMethod(setter, signature.getJvmMethodSignature(), true, signature.getPropertyTypeKotlinSignature(),
+ setterDescriptor);
}
else if (isExternallyAccessible(propertyDescriptor)) {
generateDefaultSetter(p);
@@ -151,7 +159,10 @@ public class PropertyCodegen {
private void generateDefaultGetter(JetProperty p) {
final PropertyDescriptor propertyDescriptor = (PropertyDescriptor) state.getBindingContext().get(BindingContext.VARIABLE, p);
assert propertyDescriptor != null;
- int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0) | (propertyDescriptor.getModality() == Modality.ABSTRACT ? Opcodes.ACC_ABSTRACT : (propertyDescriptor.getModality() == Modality.FINAL ? Opcodes.ACC_FINAL : 0));
+ int flags = JetTypeMapper.getAccessModifiers(propertyDescriptor, 0) |
+ (propertyDescriptor.getModality() == Modality.ABSTRACT
+ ? Opcodes.ACC_ABSTRACT
+ : (propertyDescriptor.getModality() == Modality.FINAL ? Opcodes.ACC_FINAL : 0));
generateDefaultGetter(propertyDescriptor, flags, p);
}
@@ -168,10 +179,12 @@ public class PropertyCodegen {
flags |= Opcodes.ACC_STATIC;
}
- PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), propertyDescriptor.getContainingDeclaration());
+ PsiElement psiElement =
+ BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), propertyDescriptor.getContainingDeclaration());
boolean isTrait = psiElement instanceof JetClass && ((JetClass) psiElement).isTrait();
- if (isTrait && !(kind instanceof OwnerKind.DelegateKind))
+ if (isTrait && !(kind instanceof OwnerKind.DelegateKind)) {
flags |= Opcodes.ACC_ABSTRACT;
+ }
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= Opcodes.ACC_FINAL;
@@ -181,19 +194,21 @@ public class PropertyCodegen {
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
String getterName = getterName(propertyDescriptor.getName());
MethodVisitor mv = v.newMethod(origin, flags, getterName, descriptor, null, null);
+ PropertyGetterDescriptor getter = propertyDescriptor.getGetter();
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor,
- propertyDescriptor.getGetter() == null
- ? propertyDescriptor.getVisibility()
- : propertyDescriptor.getGetter().getVisibility());
+ getter == null
+ ? propertyDescriptor.getVisibility()
+ : getter.getVisibility());
- if (propertyDescriptor.getGetter() != null) {
- assert !propertyDescriptor.getGetter().hasBody();
- AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getGetter());
+ if (getter != null) {
+ //noinspection ConstantConditions
+ assert !getter.hasBody();
+ AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(getter);
}
if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
- if (propertyDescriptor.getModality() != Modality.ABSTRACT) {
+ if (propertyDescriptor.getModality() != Modality.ABSTRACT) {
mv.visitCode();
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubThrow(mv);
@@ -228,8 +243,10 @@ public class PropertyCodegen {
FunctionCodegen.endVisit(mv, "getter", origin);
}
- public static void generateJetPropertyAnnotation(MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters,
- @NotNull PropertyDescriptor propertyDescriptor, @NotNull Visibility visibility) {
+ public static void generateJetPropertyAnnotation(
+ MethodVisitor mv, @NotNull String kotlinType, @NotNull String typeParameters,
+ @NotNull PropertyDescriptor propertyDescriptor, @NotNull Visibility visibility
+ ) {
JetMethodAnnotationWriter aw = JetMethodAnnotationWriter.visitAnnotation(mv);
Modality modality = propertyDescriptor.getModality();
BitSet flags = CodegenUtil.getFlagsForVisibility(visibility);
@@ -269,29 +286,32 @@ public class PropertyCodegen {
flags |= Opcodes.ACC_STATIC;
}
- PsiElement psiElement = BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), propertyDescriptor.getContainingDeclaration());
+ PsiElement psiElement =
+ BindingContextUtils.descriptorToDeclaration(state.getBindingContext(), propertyDescriptor.getContainingDeclaration());
boolean isTrait = psiElement instanceof JetClass && ((JetClass) psiElement).isTrait();
- if (isTrait && !(kind instanceof OwnerKind.DelegateKind))
+ if (isTrait && !(kind instanceof OwnerKind.DelegateKind)) {
flags |= Opcodes.ACC_ABSTRACT;
+ }
if (propertyDescriptor.getModality() == Modality.FINAL) {
flags |= Opcodes.ACC_FINAL;
}
JvmPropertyAccessorSignature signature = state.getInjector().getJetTypeMapper().mapSetterSignature(propertyDescriptor, kind);
+ assert signature != null;
final String descriptor = signature.getJvmMethodSignature().getAsmMethod().getDescriptor();
MethodVisitor mv = v.newMethod(origin, flags, setterName(propertyDescriptor.getName()), descriptor, null, null);
+ PropertySetterDescriptor setter = propertyDescriptor.getSetter();
+ assert setter != null;
generateJetPropertyAnnotation(mv, signature.getPropertyTypeKotlinSignature(),
signature.getJvmMethodSignature().getKotlinTypeParameter(), propertyDescriptor,
- propertyDescriptor.getSetter().getVisibility());
+ setter.getVisibility());
- if (propertyDescriptor.getSetter() != null) {
- assert !propertyDescriptor.getSetter().hasBody();
- AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(propertyDescriptor.getSetter());
- }
+ assert !setter.hasBody();
+ AnnotationCodegen.forMethod(mv, state.getInjector().getJetTypeMapper()).genAnnotations(setter);
if (state.getClassBuilderMode() != ClassBuilderMode.SIGNATURES && (!isTrait || kind instanceof OwnerKind.DelegateKind)) {
- if (propertyDescriptor.getModality() != Modality.ABSTRACT) {
+ if (propertyDescriptor.getModality() != Modality.ABSTRACT) {
mv.visitCode();
if (state.getClassBuilderMode() == ClassBuilderMode.STUBS) {
StubCodegen.generateStubThrow(mv);
@@ -320,8 +340,9 @@ public class PropertyCodegen {
else {
iv.load(paramCode, type);
iv.visitFieldInsn(kind == OwnerKind.NAMESPACE ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD,
- state.getInjector().getJetTypeMapper().getOwner(propertyDescriptor, kind).getInternalName(), propertyDescriptor.getName().getName(),
- type.getDescriptor());
+ state.getInjector().getJetTypeMapper().getOwner(propertyDescriptor, kind).getInternalName(),
+ propertyDescriptor.getName().getName(),
+ type.getDescriptor());
}
iv.visitInsn(Opcodes.RETURN);
@@ -340,11 +361,13 @@ public class PropertyCodegen {
}
public void genDelegate(PropertyDescriptor declaration, PropertyDescriptor overriddenDescriptor, StackValue field) {
- JvmPropertyAccessorSignature jvmPropertyAccessorSignature = state.getInjector().getJetTypeMapper().mapGetterSignature(declaration, OwnerKind.IMPLEMENTATION);
+ JvmPropertyAccessorSignature jvmPropertyAccessorSignature =
+ state.getInjector().getJetTypeMapper().mapGetterSignature(declaration, OwnerKind.IMPLEMENTATION);
functionCodegen.genDelegate(declaration, overriddenDescriptor, field, jvmPropertyAccessorSignature.getJvmMethodSignature());
if (declaration.isVar()) {
jvmPropertyAccessorSignature = state.getInjector().getJetTypeMapper().mapSetterSignature(declaration, OwnerKind.IMPLEMENTATION);
+ assert jvmPropertyAccessorSignature != null;
functionCodegen.genDelegate(declaration, overriddenDescriptor, field, jvmPropertyAccessorSignature.getJvmMethodSignature());
}
}
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java
index c0959ddd0a1..c2cf83c0ea0 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/ScriptCodegen.java
@@ -19,19 +19,21 @@ package org.jetbrains.jet.codegen;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.Pair;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
-import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
-import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
-import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
-import org.jetbrains.jet.lang.psi.*;
-import org.jetbrains.jet.lang.resolve.BindingContext;
-import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
-import org.jetbrains.jet.lang.resolve.java.JdkNames;
-import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.asm4.MethodVisitor;
import org.jetbrains.asm4.Opcodes;
import org.jetbrains.asm4.Type;
import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.jet.codegen.signature.JvmMethodSignature;
+import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
+import org.jetbrains.jet.lang.descriptors.ScriptDescriptor;
+import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
+import org.jetbrains.jet.lang.psi.JetDeclaration;
+import org.jetbrains.jet.lang.psi.JetScript;
+import org.jetbrains.jet.lang.psi.JetTypeParameterListOwner;
+import org.jetbrains.jet.lang.resolve.BindingContext;
+import org.jetbrains.jet.lang.resolve.ScriptNameUtil;
+import org.jetbrains.jet.lang.resolve.java.JdkNames;
+import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import javax.inject.Inject;
import java.util.List;
@@ -88,30 +90,31 @@ public class ScriptCodegen {
}
-
public void generate(JetScript scriptDeclaration) {
ScriptDescriptor scriptDescriptor = state.getBindingContext().get(BindingContext.SCRIPT, scriptDeclaration);
+ assert scriptDescriptor != null;
ClassDescriptor classDescriptorForScript = closureAnnotator.classDescriptorForScriptDescriptor(scriptDescriptor);
- CodegenContexts.ScriptContext context = (CodegenContexts.ScriptContext) CodegenContexts.STATIC.intoScript(scriptDescriptor, classDescriptorForScript);
+ CodegenContexts.ScriptContext context =
+ (CodegenContexts.ScriptContext) CodegenContexts.STATIC.intoScript(scriptDescriptor, classDescriptorForScript);
JvmClassName className = closureAnnotator.classNameForClassDescriptor(classDescriptorForScript);
ClassBuilder classBuilder = classFileFactory.newVisitor(className.getInternalName() + ".class");
classBuilder.defineClass(scriptDeclaration,
- Opcodes.V1_6,
- Opcodes.ACC_PUBLIC,
- className.getInternalName(),
- null,
- JdkNames.JL_OBJECT.getInternalName(),
- new String[0]);
+ Opcodes.V1_6,
+ Opcodes.ACC_PUBLIC,
+ className.getInternalName(),
+ null,
+ JdkNames.JL_OBJECT.getInternalName(),
+ new String[0]);
genMembers(scriptDeclaration, context, classBuilder);
genFieldsForParameters(scriptDescriptor, classBuilder);
genConstructor(scriptDeclaration, scriptDescriptor, classDescriptorForScript, classBuilder,
- context.intoFunction(scriptDescriptor.getScriptCodeDescriptor()), earlierScripts);
+ context.intoFunction(scriptDescriptor.getScriptCodeDescriptor()), earlierScripts);
classBuilder.done();
}
@@ -122,18 +125,21 @@ public class ScriptCodegen {
@NotNull ClassDescriptor classDescriptorForScript,
@NotNull ClassBuilder classBuilder,
@NotNull CodegenContext context,
- @NotNull List importedScripts) {
+ @NotNull List importedScripts
+ ) {
Type blockType = jetTypeMapper.mapType(scriptDescriptor.getReturnType(), MapTypeMode.VALUE);
- classBuilder.newField(null, Opcodes.ACC_PUBLIC|Opcodes.ACC_FINAL, ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME, blockType.getDescriptor(), null, null);
+ classBuilder.newField(null, Opcodes.ACC_PUBLIC | Opcodes.ACC_FINAL, ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME,
+ blockType.getDescriptor(), null, null);
JvmMethodSignature jvmSignature = jetTypeMapper.mapScriptSignature(scriptDescriptor, importedScripts);
state.setScriptConstructorMethod(jvmSignature.getAsmMethod());
MethodVisitor mv = classBuilder.newMethod(
- scriptDeclaration, Opcodes.ACC_PUBLIC, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(), null, null);
+ scriptDeclaration, Opcodes.ACC_PUBLIC, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
+ null, null);
mv.visitCode();
@@ -157,7 +163,7 @@ public class ScriptCodegen {
for (int i = 0; i < scriptDescriptor.getValueParameters().size(); i++) {
ValueParameterDescriptor parameter = scriptDescriptor.getValueParameters().get(i);
- frameMap.enter(parameter, argTypes[i+add].getSize());
+ frameMap.enter(parameter, argTypes[i + add].getSize());
}
ImplementationBodyCodegen.generateInitializers(
@@ -174,7 +180,8 @@ public class ScriptCodegen {
instructionAdapter.load(0, className.getAsmType());
instructionAdapter.load(offset, earlierClassName.getAsmType());
offset += earlierClassName.getAsmType().getSize();
- instructionAdapter.putfield(className.getInternalName(), getScriptFieldName(earlierScript), earlierClassName.getAsmType().getDescriptor());
+ instructionAdapter.putfield(className.getInternalName(), getScriptFieldName(earlierScript),
+ earlierClassName.getAsmType().getDescriptor());
}
for (ValueParameterDescriptor parameter : scriptDescriptor.getValueParameters()) {
@@ -185,10 +192,12 @@ public class ScriptCodegen {
instructionAdapter.putfield(className.getInternalName(), parameter.getName().getIdentifier(), parameterType.getDescriptor());
}
- StackValue stackValue = new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, context, state).gen(scriptDeclaration.getBlockExpression());
+ StackValue stackValue =
+ new ExpressionCodegen(mv, frameMap, Type.VOID_TYPE, context, state).gen(scriptDeclaration.getBlockExpression());
if (stackValue.type != Type.VOID_TYPE) {
stackValue.put(stackValue.type, instructionAdapter);
- instructionAdapter.putfield(className.getInternalName(), ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME, blockType.getDescriptor());
+ instructionAdapter
+ .putfield(className.getInternalName(), ScriptNameUtil.LAST_EXPRESSION_VALUE_FIELD_NAME, blockType.getDescriptor());
}
instructionAdapter.areturn(Type.VOID_TYPE);
@@ -227,7 +236,6 @@ public class ScriptCodegen {
List earlierScriptDescriptors = Lists.newArrayList();
for (Pair t : earlierScripts) {
ScriptDescriptor earlierDescriptor = t.first;
- JvmClassName earlierClassName = t.second;
earlierScriptDescriptors.add(earlierDescriptor);
}
this.earlierScripts = earlierScriptDescriptors;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
index 88937bf29af..e4a41bf5c70 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/StackValue.java
@@ -19,6 +19,11 @@ package org.jetbrains.jet.codegen;
import com.intellij.psi.tree.IElementType;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Label;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
+import org.jetbrains.asm4.commons.Method;
import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethod;
import org.jetbrains.jet.lang.descriptors.*;
import org.jetbrains.jet.lang.psi.JetExpression;
@@ -27,11 +32,6 @@ import org.jetbrains.jet.lang.resolve.java.JvmClassName;
import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor;
import org.jetbrains.jet.lexer.JetTokens;
-import org.jetbrains.asm4.Label;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
-import org.jetbrains.asm4.commons.Method;
import java.util.List;
@@ -69,8 +69,8 @@ public abstract class StackValue {
* This method is called to put the value on the top of the JVM stack if depth other values have been put on the
* JVM stack after this value was generated.
*
- * @param type the type as which the value should be put
- * @param v the visitor used to generate the instructions
+ * @param type the type as which the value should be put
+ * @param v the visitor used to generate the instructions
* @param depth the number of new values put onto the stack
*/
public void moveToTopOfStack(Type type, InstructionAdapter v, int depth) {
@@ -130,7 +130,13 @@ public abstract class StackValue {
return new ArrayElement(type, unbox);
}
- public static StackValue collectionElement(Type type, ResolvedCall getter, ResolvedCall setter, ExpressionCodegen codegen, GenerationState state) {
+ public static StackValue collectionElement(
+ Type type,
+ ResolvedCall getter,
+ ResolvedCall setter,
+ ExpressionCodegen codegen,
+ GenerationState state
+ ) {
return new CollectionElement(type, getter, setter, codegen, state);
}
@@ -138,7 +144,18 @@ public abstract class StackValue {
return new Field(type, owner, name, isStatic);
}
- public static Property property(String name, JvmClassName methodOwner, JvmClassName methodOwnerParam, Type type, boolean isStatic, boolean isInterface, boolean isSuper, Method getter, Method setter, int invokeOpcode) {
+ public static Property property(
+ String name,
+ JvmClassName methodOwner,
+ JvmClassName methodOwnerParam,
+ Type type,
+ boolean isStatic,
+ boolean isInterface,
+ boolean isSuper,
+ @Nullable Method getter,
+ @Nullable Method setter,
+ int invokeOpcode
+ ) {
return new Property(name, methodOwner, methodOwnerParam, getter, setter, isStatic, isInterface, isSuper, type, invokeOpcode);
}
@@ -213,10 +230,12 @@ public abstract class StackValue {
}
protected static void pop(Type type, InstructionAdapter v) {
- if (type.getSize() == 1)
+ if (type.getSize() == 1) {
v.pop();
- else
+ }
+ else {
v.pop2();
+ }
}
protected void coerce(Type toType, InstructionAdapter v) {
@@ -233,28 +252,33 @@ public abstract class StackValue {
if (toType.getSort() == Type.OBJECT) {
putTuple0Instance(v);
}
- else if (toType == Type.LONG_TYPE)
+ else if (toType == Type.LONG_TYPE) {
v.lconst(0);
- else if (toType == Type.FLOAT_TYPE)
+ }
+ else if (toType == Type.FLOAT_TYPE) {
v.fconst(0);
- else if (toType == Type.DOUBLE_TYPE)
+ }
+ else if (toType == Type.DOUBLE_TYPE) {
v.dconst(0);
- else
+ }
+ else {
v.iconst(0);
+ }
}
else if (toType.equals(JetTypeMapper.TUPLE0_TYPE) && !fromType.equals(JetTypeMapper.TUPLE0_TYPE)) {
pop(fromType, v);
putTuple0Instance(v);
}
else if (toType.getSort() == Type.OBJECT && fromType.equals(JetTypeMapper.TYPE_OBJECT) || toType.getSort() == Type.ARRAY) {
- v.checkcast(toType);
+ v.checkcast(toType);
}
else if (toType.getSort() == Type.OBJECT) {
if (fromType.getSort() == Type.OBJECT && !toType.equals(JetTypeMapper.TYPE_OBJECT)) {
v.checkcast(toType);
}
- else
+ else {
box(fromType, toType, v);
+ }
}
else if (fromType.getSort() == Type.OBJECT && toType.getSort() <= Type.DOUBLE) {
if (fromType.equals(JetTypeMapper.TYPE_OBJECT)) {
@@ -314,14 +338,22 @@ public abstract class StackValue {
return new PreIncrement(index, increment);
}
- public static StackValue receiver(ResolvedCall extends CallableDescriptor> resolvedCall, StackValue receiver, ExpressionCodegen codegen, @Nullable CallableMethod callableMethod, GenerationState state) {
- if (resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists())
+ public static StackValue receiver(
+ ResolvedCall extends CallableDescriptor> resolvedCall,
+ StackValue receiver,
+ ExpressionCodegen codegen,
+ @Nullable CallableMethod callableMethod,
+ GenerationState state
+ ) {
+ if (resolvedCall.getThisObject().exists() || resolvedCall.getReceiverArgument().exists()) {
return new CallReceiver(resolvedCall, receiver, codegen, state, callableMethod);
+ }
return receiver;
}
private static class None extends StackValue {
public static None INSTANCE = new None();
+
private None() {
super(Type.VOID_TYPE);
}
@@ -396,19 +428,21 @@ public abstract class StackValue {
@Override
public void put(Type type, InstructionAdapter v) {
- if (value instanceof Integer)
+ if (value instanceof Integer) {
v.iconst((Integer) value);
- else
- if (value instanceof Long)
+ }
+ else if (value instanceof Long) {
v.lconst((Long) value);
- else
- if (value instanceof Float)
+ }
+ else if (value instanceof Float) {
v.fconst((Float) value);
- else
- if (value instanceof Double)
+ }
+ else if (value instanceof Double) {
v.dconst((Double) value);
- else
+ }
+ else {
v.aconst(value);
+ }
coerce(type, v);
}
@@ -449,8 +483,9 @@ public abstract class StackValue {
throw new UnsupportedOperationException("don't know how to put a compare as a non-boolean type " + type);
}
putAsBoolean(v);
- if(type != Type.BOOLEAN_TYPE)
- box(Type.BOOLEAN_TYPE,type,v);
+ if (type != Type.BOOLEAN_TYPE) {
+ box(Type.BOOLEAN_TYPE, type, v);
+ }
}
@Override
@@ -522,8 +557,9 @@ public abstract class StackValue {
private Invert(StackValue operand) {
super(Type.BOOLEAN_TYPE);
myOperand = operand;
- if (myOperand.type != Type.BOOLEAN_TYPE)
+ if (myOperand.type != Type.BOOLEAN_TYPE) {
throw new UnsupportedOperationException("operand of ! must be boolean");
+ }
}
@Override
@@ -536,8 +572,9 @@ public abstract class StackValue {
throw new UnsupportedOperationException("don't know how to put a compare as a non-boolean type");
}
putAsBoolean(v);
- if(type != Type.BOOLEAN_TYPE)
- box(Type.BOOLEAN_TYPE,type,v);
+ if (type != Type.BOOLEAN_TYPE) {
+ box(Type.BOOLEAN_TYPE, type, v);
+ }
}
@Override
@@ -571,6 +608,7 @@ public abstract class StackValue {
v.dup2(); // array and index
}
+ @Override
public int receiverSize() {
return 2;
}
@@ -587,7 +625,13 @@ public abstract class StackValue {
private final FunctionDescriptor setterDescriptor;
private final FunctionDescriptor getterDescriptor;
- public CollectionElement(Type type, ResolvedCall resolvedGetCall, ResolvedCall resolvedSetCall, ExpressionCodegen codegen, GenerationState state) {
+ public CollectionElement(
+ Type type,
+ ResolvedCall resolvedGetCall,
+ ResolvedCall resolvedSetCall,
+ ExpressionCodegen codegen,
+ GenerationState state
+ ) {
super(type);
this.resolvedGetCall = resolvedGetCall;
this.resolvedSetCall = resolvedSetCall;
@@ -605,10 +649,12 @@ public abstract class StackValue {
if (getter == null) {
throw new UnsupportedOperationException("no getter specified");
}
- if (getter instanceof CallableMethod)
- ((CallableMethod)getter).invoke(v);
- else
- ((IntrinsicMethod)getter).generate(codegen, v, type, null, null, null, state);
+ if (getter instanceof CallableMethod) {
+ ((CallableMethod) getter).invoke(v);
+ }
+ else {
+ ((IntrinsicMethod) getter).generate(codegen, v, type, null, null, null, state);
+ }
coerce(type, v);
}
@@ -621,17 +667,19 @@ public abstract class StackValue {
CallableMethod method = (CallableMethod) setter;
Method asmMethod = method.getSignature().getAsmMethod();
Type[] argumentTypes = asmMethod.getArgumentTypes();
- coerce(topOfStackType, argumentTypes[argumentTypes.length-1], v);
+ coerce(topOfStackType, argumentTypes[argumentTypes.length - 1], v);
method.invoke(v);
Type returnType = asmMethod.getReturnType();
if (returnType != Type.VOID_TYPE) {
pop(returnType, v);
}
}
- else
+ else {
((IntrinsicMethod) setter).generate(codegen, v, null, null, null, null, state);
+ }
}
+ @Override
public int receiverSize() {
if (isStandardStack(resolvedGetCall, 1) && isStandardStack(resolvedSetCall, 2)) {
return 2;
@@ -650,27 +698,27 @@ public abstract class StackValue {
int size = 0;
int lastIndex = frame.enterTemp();
frame.leaveTemp();
-
+
// indexes
List valueParameters = resolvedGetCall.getResultingDescriptor().getValueParameters();
int firstParamIndex = -1;
- for(int i = valueParameters.size()-1; i >= 0; --i) {
+ for (int i = valueParameters.size() - 1; i >= 0; --i) {
Type type = codegen.typeMapper.mapType(valueParameters.get(i).getType(), MapTypeMode.VALUE);
int sz = type.getSize();
frame.enterTemp(sz);
lastIndex += sz;
size += sz;
- v.store((firstParamIndex = lastIndex)-sz, type);
+ v.store((firstParamIndex = lastIndex) - sz, type);
}
List typeParameters = resolvedGetCall.getResultingDescriptor().getTypeParameters();
int firstTypeParamIndex = -1;
- for(int i = typeParameters.size()-1; i >= 0; --i) {
+ for (int i = typeParameters.size() - 1; i >= 0; --i) {
if (typeParameters.get(i).isReified()) {
frame.enterTemp();
lastIndex++;
size++;
- v.store(firstTypeParamIndex = lastIndex-1, JetTypeMapper.TYPE_OBJECT);
+ v.store(firstTypeParamIndex = lastIndex - 1, JetTypeMapper.TYPE_OBJECT);
}
}
@@ -682,7 +730,7 @@ public abstract class StackValue {
frame.enterTemp(sz);
lastIndex += sz;
size += sz;
- v.store((receiverIndex = lastIndex)-sz, type);
+ v.store((receiverIndex = lastIndex) - sz, type);
}
ReceiverDescriptor thisObject = resolvedGetCall.getThisObject();
@@ -691,17 +739,17 @@ public abstract class StackValue {
frame.enterTemp();
lastIndex++;
size++;
- v.store((thisIndex = lastIndex)-1, JetTypeMapper.TYPE_OBJECT);
+ v.store((thisIndex = lastIndex) - 1, JetTypeMapper.TYPE_OBJECT);
}
-
+
// for setter
- int realReceiverIndex;
+ int realReceiverIndex;
Type realReceiverType;
if (thisIndex != -1) {
if (receiverIndex != -1) {
realReceiverIndex = receiverIndex;
- realReceiverType = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
+ realReceiverType = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
}
else {
realReceiverIndex = thisIndex;
@@ -710,7 +758,7 @@ public abstract class StackValue {
}
else {
if (receiverIndex != -1) {
- realReceiverType = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
+ realReceiverType = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
realReceiverIndex = receiverIndex;
}
else {
@@ -734,38 +782,38 @@ public abstract class StackValue {
}
int index = firstParamIndex;
- for(int i = 0; i != valueParameters.size(); ++i) {
+ for (int i = 0; i != valueParameters.size(); ++i) {
Type type = codegen.typeMapper.mapType(valueParameters.get(i).getType(), MapTypeMode.VALUE);
int sz = type.getSize();
- v.load(index-sz, type);
+ v.load(index - sz, type);
index -= sz;
}
// restoring original
if (thisIndex != -1) {
- v.load(thisIndex-1, JetTypeMapper.TYPE_OBJECT);
+ v.load(thisIndex - 1, JetTypeMapper.TYPE_OBJECT);
}
-
+
if (receiverIndex != -1) {
Type type = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
- v.load(receiverIndex-type.getSize(), type);
+ v.load(receiverIndex - type.getSize(), type);
}
if (firstTypeParamIndex != -1) {
index = firstTypeParamIndex;
- for(int i = 0; i != typeParameters.size(); ++i) {
+ for (int i = 0; i != typeParameters.size(); ++i) {
if (typeParameters.get(i).isReified()) {
- v.load(index-1, JetTypeMapper.TYPE_OBJECT);
+ v.load(index - 1, JetTypeMapper.TYPE_OBJECT);
index--;
}
}
}
-
+
index = firstParamIndex;
- for(int i = 0; i != valueParameters.size(); ++i) {
+ for (int i = 0; i != valueParameters.size(); ++i) {
Type type = codegen.typeMapper.mapType(valueParameters.get(i).getType(), MapTypeMode.VALUE);
int sz = type.getSize();
- v.load(index-sz, type);
+ v.load(index - sz, type);
index -= sz;
}
@@ -774,30 +822,37 @@ public abstract class StackValue {
}
private boolean isStandardStack(ResolvedCall call, int valueParamsSize) {
- if (call == null)
+ if (call == null) {
return true;
+ }
for (TypeParameterDescriptor typeParameterDescriptor : call.getResultingDescriptor().getTypeParameters()) {
- if (typeParameterDescriptor.isReified())
+ if (typeParameterDescriptor.isReified()) {
return false;
+ }
}
List valueParameters = call.getResultingDescriptor().getValueParameters();
- if (valueParameters.size() != valueParamsSize)
+ if (valueParameters.size() != valueParamsSize) {
return false;
+ }
for (ValueParameterDescriptor valueParameter : valueParameters) {
- if (codegen.typeMapper.mapType(valueParameter.getType(), MapTypeMode.VALUE).getSize() != 1)
+ if (codegen.typeMapper.mapType(valueParameter.getType(), MapTypeMode.VALUE).getSize() != 1) {
return false;
+ }
}
if (call.getThisObject().exists()) {
- if (call.getReceiverArgument().exists())
+ if (call.getReceiverArgument().exists()) {
return false;
+ }
}
else {
- if (codegen.typeMapper.mapType(call.getResultingDescriptor().getReceiverParameter().getType(), MapTypeMode.VALUE).getSize() != 1)
+ if (codegen.typeMapper.mapType(call.getResultingDescriptor().getReceiverParameter().getType(), MapTypeMode.VALUE)
+ .getSize() != 1) {
return false;
+ }
}
return true;
@@ -830,6 +885,7 @@ public abstract class StackValue {
}
}
+ @Override
public int receiverSize() {
return isStatic ? 0 : 1;
}
@@ -857,8 +913,10 @@ public abstract class StackValue {
private final boolean isSuper;
private final int invokeOpcode;
- public Property(@NotNull String name, @NotNull JvmClassName methodOwner, @NotNull JvmClassName methodOwnerParam,
- Method getter, Method setter, boolean aStatic, boolean isInterface, boolean isSuper, Type type, int invokeOpcode) {
+ public Property(
+ @NotNull String name, @NotNull JvmClassName methodOwner, @NotNull JvmClassName methodOwnerParam,
+ Method getter, Method setter, boolean aStatic, boolean isInterface, boolean isSuper, Type type, int invokeOpcode
+ ) {
super(type);
this.name = name;
this.methodOwner = methodOwner;
@@ -879,15 +937,18 @@ public abstract class StackValue {
@Override
public void put(Type type, InstructionAdapter v) {
if (isSuper && isInterface) {
- v.visitMethodInsn(Opcodes.INVOKESTATIC, methodOwner.getInternalName(), getter.getName(), getter.getDescriptor().replace("(", "(" + methodOwnerParam.getDescriptor()));
+ assert getter != null;
+ v.visitMethodInsn(Opcodes.INVOKESTATIC, methodOwner.getInternalName(), getter.getName(),
+ getter.getDescriptor().replace("(", "(" + methodOwnerParam.getDescriptor()));
}
else {
- if (getter == null) {
- v.visitFieldInsn(isStatic ? Opcodes.GETSTATIC : Opcodes.GETFIELD, methodOwner.getInternalName(), name, this.type.getDescriptor());
- }
- else {
- v.visitMethodInsn(invokeOpcode, methodOwner.getInternalName(), getter.getName(), getter.getDescriptor());
- }
+ if (getter == null) {
+ v.visitFieldInsn(isStatic ? Opcodes.GETSTATIC : Opcodes.GETFIELD, methodOwner.getInternalName(), name,
+ this.type.getDescriptor());
+ }
+ else {
+ v.visitMethodInsn(invokeOpcode, methodOwner.getInternalName(), getter.getName(), getter.getDescriptor());
+ }
}
coerce(type, v);
}
@@ -895,10 +956,13 @@ public abstract class StackValue {
@Override
public void store(Type topOfStackType, InstructionAdapter v) {
if (isSuper && isInterface) {
- v.visitMethodInsn(Opcodes.INVOKESTATIC, methodOwner.getInternalName(), setter.getName(), setter.getDescriptor().replace("(", "(" + methodOwnerParam.getDescriptor()));
+ assert setter != null;
+ v.visitMethodInsn(Opcodes.INVOKESTATIC, methodOwner.getInternalName(), setter.getName(),
+ setter.getDescriptor().replace("(", "(" + methodOwnerParam.getDescriptor()));
}
else if (setter == null) {
- v.visitFieldInsn(isStatic ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD, methodOwner.getInternalName(), name, this.type.getDescriptor());
+ v.visitFieldInsn(isStatic ? Opcodes.PUTSTATIC : Opcodes.PUTFIELD, methodOwner.getInternalName(), name,
+ this.type.getDescriptor());
}
else {
v.visitMethodInsn(invokeOpcode, methodOwner.getInternalName(), setter.getName(), setter.getDescriptor());
@@ -912,6 +976,7 @@ public abstract class StackValue {
}
}
+ @Override
public int receiverSize() {
return isStatic ? 0 : 1;
}
@@ -975,7 +1040,7 @@ public abstract class StackValue {
}
public static Type sharedTypeForType(Type type) {
- switch(type.getSort()) {
+ switch (type.getSort()) {
case Type.OBJECT:
case Type.ARRAY:
return JetTypeMapper.TYPE_SHARED_VAR;
@@ -1010,8 +1075,9 @@ public abstract class StackValue {
}
public static Type refType(Type type) {
- if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY)
+ if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
return JetTypeMapper.TYPE_OBJECT;
+ }
return type;
}
@@ -1031,6 +1097,7 @@ public abstract class StackValue {
v.dup();
}
+ @Override
public int receiverSize() {
return 1;
}
@@ -1135,20 +1202,27 @@ public abstract class StackValue {
private ResolvedCall extends CallableDescriptor> resolvedCall;
StackValue receiver;
private ExpressionCodegen codegen;
- @NotNull
- private final GenerationState state;
private CallableMethod callableMethod;
- public CallReceiver(ResolvedCall extends CallableDescriptor> resolvedCall, StackValue receiver, ExpressionCodegen codegen, @NotNull GenerationState state, CallableMethod callableMethod) {
+ public CallReceiver(
+ ResolvedCall extends CallableDescriptor> resolvedCall,
+ StackValue receiver,
+ ExpressionCodegen codegen,
+ @NotNull GenerationState state,
+ CallableMethod callableMethod
+ ) {
super(calcType(resolvedCall, codegen, callableMethod));
this.resolvedCall = resolvedCall;
this.receiver = receiver;
this.codegen = codegen;
- this.state = state;
this.callableMethod = callableMethod;
}
- private static Type calcType(ResolvedCall extends CallableDescriptor> resolvedCall, ExpressionCodegen codegen, CallableMethod callableMethod) {
+ private static Type calcType(
+ ResolvedCall extends CallableDescriptor> resolvedCall,
+ ExpressionCodegen codegen,
+ CallableMethod callableMethod
+ ) {
ReceiverDescriptor thisObject = resolvedCall.getThisObject();
ReceiverDescriptor receiverArgument = resolvedCall.getReceiverArgument();
@@ -1174,10 +1248,12 @@ public abstract class StackValue {
}
else {
if (receiverArgument.exists()) {
- if (callableMethod != null)
+ if (callableMethod != null) {
return callableMethod.getReceiverClass();
- else
+ }
+ else {
return codegen.typeMapper.mapType(descriptor.getReceiverParameter().getType(), MapTypeMode.VALUE);
+ }
}
else {
return Type.VOID_TYPE;
@@ -1197,7 +1273,8 @@ public abstract class StackValue {
codegen.generateFromResolvedCall(thisObject, callableMethod.getOwner().getAsmType());
}
else {
- codegen.generateFromResolvedCall(thisObject, codegen.typeMapper.mapType(descriptor.getExpectedThisObject().getType(), MapTypeMode.VALUE));
+ codegen.generateFromResolvedCall(thisObject, codegen.typeMapper
+ .mapType(descriptor.getExpectedThisObject().getType(), MapTypeMode.VALUE));
}
genReceiver(v, receiverArgument, type, descriptor.getReceiverParameter(), 1);
}
@@ -1212,8 +1289,10 @@ public abstract class StackValue {
}
}
- private void genReceiver(InstructionAdapter v, ReceiverDescriptor receiverArgument, Type type,
- @Nullable ReceiverDescriptor receiverParameter, int depth) {
+ private void genReceiver(
+ InstructionAdapter v, ReceiverDescriptor receiverArgument, Type type,
+ @Nullable ReceiverDescriptor receiverParameter, int depth
+ ) {
if (receiver == StackValue.none()) {
if (receiverParameter != null) {
Type receiverType = codegen.typeMapper.mapType(receiverParameter.getType(), MapTypeMode.VALUE);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/StubCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/StubCodegen.java
index 1b6fd156bb2..258040827d4 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/StubCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/StubCodegen.java
@@ -28,11 +28,12 @@ public class StubCodegen {
}
public static void generateStubThrow(MethodVisitor mv) {
- new InstructionAdapter(mv).anew(Type.getObjectType("java/lang/RuntimeException"));
- new InstructionAdapter(mv).dup();
- new InstructionAdapter(mv).aconst("Stubs are for compiler only, do not add them to runtime classpath");
- new InstructionAdapter(mv).invokespecial("java/lang/RuntimeException", "", "(Ljava/lang/String;)V");
- new InstructionAdapter(mv).athrow();
+ InstructionAdapter iv = new InstructionAdapter(mv);
+ iv.anew(Type.getObjectType("java/lang/RuntimeException"));
+ iv.dup();
+ iv.aconst("Stubs are for compiler only, do not add them to runtime classpath");
+ iv.invokespecial("java/lang/RuntimeException", "", "(Ljava/lang/String;)V");
+ iv.athrow();
}
public static void generateStubCode(MethodVisitor mv) {
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
index ff2f40e7c90..86530e482db 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/TraitImplBodyCodegen.java
@@ -16,13 +16,13 @@
package org.jetbrains.jet.codegen;
+import org.jetbrains.asm4.Opcodes;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.ClassKind;
import org.jetbrains.jet.lang.psi.JetClassOrObject;
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
-import org.jetbrains.asm4.Opcodes;
import java.util.List;
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java
index 4c19c781649..d5aa57215df 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayGet.java
@@ -18,13 +18,13 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -33,7 +33,15 @@ import java.util.List;
*/
public class ArrayGet implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v);
Type type = JetTypeMapper.correctElementType(receiver.type);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java
index 6cde0728790..27ba2ad13cb 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIndices.java
@@ -18,19 +18,27 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
public class ArrayIndices implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v);
v.arraylength();
v.invokestatic("jet/IntRange", "count", "(I)Ljet/IntRange;");
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java
index 47b17d80742..1e60efce96d 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArrayIterator.java
@@ -41,10 +41,20 @@ import java.util.List;
*/
public class ArrayIterator implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v);
JetCallExpression call = (JetCallExpression) element;
- FunctionDescriptor funDescriptor = (FunctionDescriptor) codegen.getBindingContext().get(BindingContext.REFERENCE_TARGET, (JetSimpleNameExpression) call.getCalleeExpression());
+ FunctionDescriptor funDescriptor = (FunctionDescriptor) codegen.getBindingContext()
+ .get(BindingContext.REFERENCE_TARGET, (JetSimpleNameExpression) call.getCalleeExpression());
+ assert funDescriptor != null;
ClassDescriptor containingDeclaration = (ClassDescriptor) funDescriptor.getContainingDeclaration().getOriginal();
if (JetStandardLibraryNames.ARRAY.is(containingDeclaration)) {
v.invokestatic("jet/runtime/ArrayIterator", "iterator", "([Ljava/lang/Object;)Ljet/Iterator;");
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java
index beb942e9e20..fbb246db59a 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySet.java
@@ -18,13 +18,13 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -33,7 +33,15 @@ import java.util.List;
*/
public class ArraySet implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v);
Type type = JetTypeMapper.correctElementType(receiver.type);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java
index 960509ee3eb..8b77a3f9915 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/ArraySize.java
@@ -18,13 +18,13 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -33,7 +33,15 @@ import java.util.List;
*/
public class ArraySize implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
receiver.put(JetTypeMapper.TYPE_OBJECT, v);
v.arraylength();
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java
index 6c708ab6d8e..c535fa07fb3 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/BinaryOp.java
@@ -18,14 +18,14 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.asm4.Opcodes;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.JetTypeMapper;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Opcodes;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -40,7 +40,15 @@ public class BinaryOp implements IntrinsicMethod {
}
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, PsiElement element, List arguments, StackValue receiver, @NotNull GenerationState state) {
+ public StackValue generate(
+ ExpressionCodegen codegen,
+ InstructionAdapter v,
+ @NotNull Type expectedType,
+ PsiElement element,
+ List arguments,
+ StackValue receiver,
+ @NotNull GenerationState state
+ ) {
boolean nullable = expectedType.getSort() == Type.OBJECT;
if (nullable) {
expectedType = JetTypeMapper.unboxType(expectedType);
diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java
index df3280f44ad..29b84bfb670 100644
--- a/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java
+++ b/compiler/backend/src/org/jetbrains/jet/codegen/intrinsics/CompareTo.java
@@ -19,12 +19,12 @@ package org.jetbrains.jet.codegen.intrinsics;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
+import org.jetbrains.asm4.Type;
+import org.jetbrains.asm4.commons.InstructionAdapter;
import org.jetbrains.jet.codegen.ExpressionCodegen;
import org.jetbrains.jet.codegen.GenerationState;
import org.jetbrains.jet.codegen.StackValue;
import org.jetbrains.jet.lang.psi.JetExpression;
-import org.jetbrains.asm4.Type;
-import org.jetbrains.asm4.commons.InstructionAdapter;
import java.util.List;
@@ -33,12 +33,21 @@ import java.util.List;
*/
public class CompareTo implements IntrinsicMethod {
@Override
- public StackValue generate(ExpressionCodegen codegen, InstructionAdapter v, @NotNull Type expectedType, @Nullable PsiElement element, @Nullable List