package org.jetbrains.jet.codegen; import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.search.ProjectScope; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.PsiTreeUtil; import jet.IntRange; import jet.JetObject; import jet.Range; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; import org.jetbrains.jet.resolve.DescriptorRenderer; import org.objectweb.asm.Label; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; import org.objectweb.asm.commons.Method; import java.util.*; /** * @author max */ public class ExpressionCodegen extends JetVisitor { private static final String CLASS_OBJECT = "java/lang/Object"; private static final String CLASS_STRING = "java/lang/String"; private static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder"; private static final String CLASS_COMPARABLE = "java/lang/Comparable"; private static final String CLASS_ITERABLE = "java/lang/Iterable"; private static final String CLASS_ITERATOR = "java/util/Iterator"; private static final String CLASS_RANGE = "jet/Range"; private static final String CLASS_INT_RANGE = "jet/IntRange"; private static final String CLASS_NO_PATTERN_MATCHED_EXCEPTION = "jet/NoPatternMatchedException"; private static final String CLASS_TYPE_CAST_EXCEPTION = "jet/TypeCastException"; private static final String ITERABLE_ITERATOR_DESCRIPTOR = "()Ljava/util/Iterator;"; private static final String ITERATOR_HASNEXT_DESCRIPTOR = "()Z"; private static final String ITERATOR_NEXT_DESCRIPTOR = "()Ljava/lang/Object;"; private static final String INT_RANGE_CONSTRUCTOR_DESCRIPTOR = "(II)V"; private static final Type OBJECT_TYPE = Type.getType(Object.class); private static final Type INTEGER_TYPE = Type.getType(Integer.class); private static final Type ITERATOR_TYPE = Type.getType(Iterator.class); private static final Type THROWABLE_TYPE = Type.getType(Throwable.class); private static final Type RANGE_TYPE = Type.getType(Range.class); private static final Type INT_RANGE_TYPE = Type.getType(IntRange.class); private static final Type JET_OBJECT_TYPE = Type.getType(JetObject.class); private final Stack