diff --git a/grammar/src/class_members.grm b/grammar/src/class_members.grm index ac73ca56d1b..addd0c4eb65 100644 --- a/grammar/src/class_members.grm +++ b/grammar/src/class_members.grm @@ -119,7 +119,7 @@ parameter ; object - : "object" SimpleName ":" delegationSpecifier{","}? classBody? // Class body can be optional: this is a declaration + : "object" SimpleName (":" delegationSpecifier{","})? classBody? // Class body can be optional: this is a declaration /** bq. See [Object expressions and Declarations] */ diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index 2b3b21af0c5..fafe44f37f0 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -235,7 +235,7 @@ jump // Ambiguity when after a SimpleName (infix call). In this case (e) is treated as an expression in parentheses // to put a tuple, write write ((e)) tupleLiteral - : "(" ((SimpleName "=")? expression){","} ")" + : "(" (((SimpleName "=")? expression){","})? ")" ; // one can use "it" as a parameter name diff --git a/grammar/src/when.grm b/grammar/src/when.grm index ebdbcc58502..d6769712963 100644 --- a/grammar/src/when.grm +++ b/grammar/src/when.grm @@ -45,7 +45,7 @@ constantPattern ; tuplePattern - : "(" ((SimpleName "=")? pattern{","})? ")" + : "(" (((SimpleName "=")? pattern){","})? ")" ; bindingPattern diff --git a/idea/src/jet/Library.jet b/idea/src/jet/Library.jet index 9fbf46d6e81..211e49cf2db 100644 --- a/idea/src/jet/Library.jet +++ b/idea/src/jet/Library.jet @@ -100,7 +100,7 @@ class IntRange> : Range, Iterable { } -class Number : Hashable { +abstract class Number : Hashable { abstract val dbl : Double abstract val flt : Float abstract val lng : Long diff --git a/idea/src/org/jetbrains/jet/JetNodeTypes.java b/idea/src/org/jetbrains/jet/JetNodeTypes.java index 3fd8cddf4c3..a9add75e4e2 100644 --- a/idea/src/org/jetbrains/jet/JetNodeTypes.java +++ b/idea/src/org/jetbrains/jet/JetNodeTypes.java @@ -29,6 +29,7 @@ public interface JetNodeTypes { JetNodeType DELEGATOR_BY = new JetNodeType("DELEGATOR_BY", JetDelegatorByExpressionSpecifier.class); JetNodeType DELEGATOR_SUPER_CALL = new JetNodeType("DELEGATOR_SUPER_CALL", JetDelegatorToSuperCall.class); JetNodeType DELEGATOR_SUPER_CLASS = new JetNodeType("DELEGATOR_SUPER_CLASS", JetDelegatorToSuperClass.class); + JetNodeType CONSTRUCTOR_CALLEE = new JetNodeType("CONSTRUCTOR_CALLEE", JetConstructorCalleeExpression.class); JetNodeType VALUE_PARAMETER_LIST = new JetNodeType("VALUE_PARAMETER_LIST", JetParameterList.class); JetNodeType VALUE_PARAMETER = new JetNodeType("VALUE_PARAMETER", JetParameter.class); diff --git a/idea/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java index 58a6fa5d7d4..6c2079241e9 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClassBodyCodegen.java @@ -3,6 +3,7 @@ package org.jetbrains.jet.codegen; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.PropertyDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.Opcodes; @@ -29,7 +30,7 @@ public abstract class ClassBodyCodegen { public ClassBodyCodegen(JetClassOrObject aClass, ClassContext context, ClassVisitor v, GenerationState state) { this.state = state; - descriptor = state.getBindingContext().getClassDescriptor(aClass); + descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); myClass = aClass; this.context = context; this.kind = context.getContextKind(); @@ -81,14 +82,14 @@ public abstract class ClassBodyCodegen { OwnerKind kind = context.getContextKind(); for (JetParameter p : getPrimaryConstructorParameters()) { if (p.getValOrVarNode() != null) { - PropertyDescriptor propertyDescriptor = state.getBindingContext().getPropertyDescriptor(p); + PropertyDescriptor propertyDescriptor = state.getBindingContext().get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, p); if (propertyDescriptor != null) { propertyCodegen.generateDefaultGetter(propertyDescriptor, Opcodes.ACC_PUBLIC); if (propertyDescriptor.isVar()) { propertyCodegen.generateDefaultSetter(propertyDescriptor, Opcodes.ACC_PUBLIC); } - if (!(kind instanceof OwnerKind.DelegateKind) && kind != OwnerKind.INTERFACE && state.getBindingContext().hasBackingField(propertyDescriptor)) { + if (!(kind instanceof OwnerKind.DelegateKind) && kind != OwnerKind.INTERFACE && state.getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor)) { v.visitField(Opcodes.ACC_PRIVATE, p.getName(), state.getTypeMapper().mapType(propertyDescriptor.getOutType()).getDescriptor(), null, null); } } diff --git a/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java index 4c3ca0a0eea..c7d6d88809f 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClassCodegen.java @@ -2,6 +2,7 @@ package org.jetbrains.jet.codegen; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.psi.*; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.Type; import org.objectweb.asm.commons.InstructionAdapter; @@ -30,7 +31,7 @@ public class ClassCodegen { } } - ClassDescriptor descriptor = state.getBindingContext().getClassDescriptor(aClass); + ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); final ClassContext contextForInners = parentContext.intoClass(descriptor, OwnerKind.IMPLEMENTATION); for (JetDeclaration declaration : aClass.getDeclarations()) { if (declaration instanceof JetClass && !(declaration instanceof JetEnumEntry)) { @@ -40,13 +41,13 @@ public class ClassCodegen { } private void generateInterface(ClassContext parentContext, JetClassOrObject aClass) { - ClassDescriptor descriptor = state.getBindingContext().getClassDescriptor(aClass); + ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); final ClassVisitor visitor = state.forClassInterface(descriptor); new InterfaceBodyCodegen(aClass, parentContext.intoClass(descriptor, OwnerKind.INTERFACE), visitor, state).generate(); } private void generateImplementation(ClassContext parentContext, JetClassOrObject aClass, OwnerKind kind) { - ClassDescriptor descriptor = state.getBindingContext().getClassDescriptor(aClass); + ClassDescriptor descriptor = state.getBindingContext().get(BindingContext.CLASS, aClass); ClassVisitor v = kind == OwnerKind.IMPLEMENTATION ? state.forClassImplementation(descriptor) : state.forClassDelegatingImplementation(descriptor); diff --git a/idea/src/org/jetbrains/jet/codegen/ClassContext.java b/idea/src/org/jetbrains/jet/codegen/ClassContext.java index 87e92d070f7..d553ca2774e 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClassContext.java +++ b/idea/src/org/jetbrains/jet/codegen/ClassContext.java @@ -37,7 +37,7 @@ public class ClassContext { } public StackValue getThisExpression() { - if (parentContext == null) return null; + if (parentContext == null) return StackValue.none(); thisWasUsed = true; if (thisExpression != null) return thisExpression; diff --git a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java index a10d3804c82..4de5e2ff34a 100644 --- a/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ClosureCodegen.java @@ -10,6 +10,7 @@ import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.VariableDescriptor; import org.jetbrains.jet.lang.psi.JetFunctionLiteral; import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression; +import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.JetType; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.MethodVisitor; @@ -83,7 +84,7 @@ public class ClosureCodegen { public GeneratedAnonymousClassDescriptor gen(JetFunctionLiteralExpression fun) { final Pair nameAndVisitor = state.forAnonymousSubclass(fun); - final FunctionDescriptor funDescriptor = (FunctionDescriptor) state.getBindingContext().getDeclarationDescriptor(fun); + final FunctionDescriptor funDescriptor = (FunctionDescriptor) state.getBindingContext().get(BindingContext.DECLARATION_TO_DESCRIPTOR, fun); cv = nameAndVisitor.getSecond(); name = nameAndVisitor.getFirst(); diff --git a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 92b5774f673..df9e10521d2 100644 --- a/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/idea/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -14,6 +14,7 @@ import org.jetbrains.jet.codegen.intrinsics.IntrinsicMethods; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; import org.jetbrains.jet.lang.types.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; @@ -32,7 +33,7 @@ import java.util.*; * @author max * @author yole */ -public class ExpressionCodegen extends JetVisitorVoid { +public class ExpressionCodegen extends JetVisitor { private static final String CLASS_OBJECT = "java/lang/Object"; private static final String CLASS_STRING = "java/lang/String"; public static final String CLASS_STRING_BUILDER = "java/lang/StringBuilder"; @@ -58,7 +59,6 @@ public class ExpressionCodegen extends JetVisitorVoid { private final Stack