diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 936b20af22b..babc46ddfa5 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -1988,7 +1988,7 @@ public class ExpressionCodegen extends JetVisitor { @Override public StackValue visitThisExpression(JetThisExpression expression, StackValue receiver) { - final DeclarationDescriptor descriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getThisReference()); + final DeclarationDescriptor descriptor = bindingContext.get(BindingContext.REFERENCE_TARGET, expression.getInstanceReference()); if (descriptor instanceof ClassDescriptor) { return generateThisOrOuter((ClassDescriptor) descriptor); } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java index ab02a9d9d42..c46e086ab25 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaClassMembersScope.java @@ -51,11 +51,6 @@ public class JavaClassMembersScope implements JetScope { return null; } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - throw new UnsupportedOperationException(); - } - @Override public ClassifierDescriptor getClassifier(@NotNull String name) { ClassifierDescriptor classifierDescriptor = classifiers.get(name); diff --git a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java index 9656239e4a2..e26d14c12dc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java +++ b/compiler/frontend/src/org/jetbrains/jet/JetNodeTypes.java @@ -109,6 +109,7 @@ public interface JetNodeTypes { JetNodeType LABEL_QUALIFIER = new JetNodeType("LABEL_QUALIFIER", JetContainerNode.class); JetNodeType THIS_EXPRESSION = new JetNodeType("THIS_EXPRESSION", JetThisExpression.class); + JetNodeType SUPER_EXPRESSION = new JetNodeType("SUPER_EXPRESSION", JetSuperExpression.class); JetNodeType BINARY_EXPRESSION = new JetNodeType("BINARY_EXPRESSION", JetBinaryExpression.class); JetNodeType BINARY_WITH_TYPE = new JetNodeType("BINARY_WITH_TYPE", JetBinaryExpressionWithTypeRHS.class); JetNodeType BINARY_WITH_PATTERN = new JetNodeType("BINARY_WITH_PATTERN", JetIsExpression.class); // TODO: diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index b91883012bc..6881ae9d2d3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -159,11 +159,14 @@ public interface Errors { SimpleDiagnosticFactory EQUALS_MISSING = SimpleDiagnosticFactory.create(ERROR, "No method 'equals(Any?) : Boolean' available"); SimpleDiagnosticFactory ASSIGNMENT_IN_EXPRESSION_CONTEXT = SimpleDiagnosticFactory.create(ERROR, "Assignments are not expressions, and only expressions are allowed in this context"); - SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory.create(ERROR, "'namespace' is not an expression"); + SimpleDiagnosticFactory NAMESPACE_IS_NOT_AN_EXPRESSION = SimpleDiagnosticFactory.create(ERROR, "'namespace' is not an expression, it can only be used on the left-hand side of a dot ('.')"); + ParameterizedDiagnosticFactory1 SUPER_IS_NOT_AN_EXPRESSION = ParameterizedDiagnosticFactory1.create(ERROR, "{0} is not an expression, it can only be used on the left-hand side of a dot ('.')"); SimpleDiagnosticFactory DECLARATION_IN_ILLEGAL_CONTEXT = SimpleDiagnosticFactory.create(ERROR, "Declarations are not allowed in this position"); SimpleDiagnosticFactory REF_SETTER_PARAMETER = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not be 'ref'"); SimpleDiagnosticFactory SETTER_PARAMETER_WITH_DEFAULT_VALUE = SimpleDiagnosticFactory.create(ERROR, "Setter parameters can not have default values"); SimpleDiagnosticFactory NO_THIS = SimpleDiagnosticFactory.create(ERROR, "'this' is not defined in this context"); + SimpleDiagnosticFactory SUPER_NOT_AVAILABLE = SimpleDiagnosticFactory.create(ERROR, "No supertypes are accessible in this context"); + SimpleDiagnosticFactory AMBIGUOUS_SUPER = SimpleDiagnosticFactory.create(ERROR, "Many supertypes available, please specify the one you mean in angle brackets, e.g. 'super'"); SimpleDiagnosticFactory NOT_A_SUPERTYPE = SimpleDiagnosticFactory.create(ERROR, "Not a supertype"); SimpleDiagnosticFactory NO_WHEN_ENTRIES = SimpleDiagnosticFactory.create(ERROR, "Entries are required for when-expression"); // TODO : Scope, and maybe this should not be an error SimplePsiElementOnlyDiagnosticFactory USELESS_CAST_STATIC_ASSERT_IS_FINE = SimplePsiElementOnlyDiagnosticFactory.create(WARNING, "No cast needed, use ':' instead"); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java index 2da63a0e2d6..d5b8b5a8760 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/parsing/JetExpressionParsing.java @@ -49,6 +49,7 @@ public class JetExpressionParsing extends AbstractJetParsing { LPAR, // tuple THIS_KEYWORD, // this + SUPER_KEYWORD, // super IF_KEYWORD, // if WHEN_KEYWORD, // when @@ -464,7 +465,8 @@ public class JetExpressionParsing extends AbstractJetParsing { /* * atomicExpression * : tupleLiteral // or parenthesized element - * : "this" getEntryPoint? ("<" type ">")? + * : "this" label? + * : "super" ("<" type ">")? label? * : objectLiteral * : jump * : if @@ -490,6 +492,9 @@ public class JetExpressionParsing extends AbstractJetParsing { else if (at(THIS_KEYWORD)) { parseThisExpression(); } + else if (at(SUPER_KEYWORD)) { + parseSuperExpression(); + } else if (at(OBJECT_KEYWORD)) { parseObjectLiteral(); } @@ -1593,7 +1598,7 @@ public class JetExpressionParsing extends AbstractJetParsing { } /* - * "this" getEntryPoint? ("<" type ">")? + * "this" label? */ private void parseThisExpression() { assert _at(THIS_KEYWORD); @@ -1605,8 +1610,22 @@ public class JetExpressionParsing extends AbstractJetParsing { parseLabel(); + mark.done(THIS_EXPRESSION); + } + + /* + * "this" ("<" type ">")? label? + */ + private void parseSuperExpression() { + assert _at(SUPER_KEYWORD); + PsiBuilder.Marker mark = mark(); + + PsiBuilder.Marker superReference = mark(); + advance(); // SUPER_KEYWORD + superReference.done(REFERENCE_EXPRESSION); + if (at(LT)) { - // This may be "this < foo" or "this", thus the backtracking + // This may be "super < foo" or "super", thus the backtracking PsiBuilder.Marker supertype = mark(); myBuilder.disableNewlines(); @@ -1623,7 +1642,9 @@ public class JetExpressionParsing extends AbstractJetParsing { } myBuilder.restoreNewlinesState(); } - mark.done(THIS_EXPRESSION); + parseLabel(); + + mark.done(SUPER_EXPRESSION); } /* diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedInstanceExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedInstanceExpression.java new file mode 100644 index 00000000000..297830432d7 --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetLabelQualifiedInstanceExpression.java @@ -0,0 +1,20 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.JetNodeTypes; + +/** + * @author abreslav + */ +public abstract class JetLabelQualifiedInstanceExpression extends JetLabelQualifiedExpression { + + public JetLabelQualifiedInstanceExpression(@NotNull ASTNode node) { + super(node); + } + + @NotNull + public JetReferenceExpression getInstanceReference() { + return (JetReferenceExpression) findChildByType(JetNodeTypes.REFERENCE_EXPRESSION); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java index c40c07518a3..4ef04645259 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSimpleNameExpression.java @@ -10,13 +10,14 @@ import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.parsing.JetExpressionParsing; -import org.jetbrains.jet.lexer.JetTokens; + +import static org.jetbrains.jet.lexer.JetTokens.*; /** * @author max */ public class JetSimpleNameExpression extends JetReferenceExpression { - public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(JetTokens.LABELS, TokenSet.create(JetTokens.IDENTIFIER, JetTokens.FIELD_IDENTIFIER, JetTokens.THIS_KEYWORD)); + public static final TokenSet REFERENCE_TOKENS = TokenSet.orSet(LABELS, TokenSet.create(IDENTIFIER, FIELD_IDENTIFIER, THIS_KEYWORD, SUPER_KEYWORD)); public JetSimpleNameExpression(@NotNull ASTNode node) { super(node); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSuperExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSuperExpression.java new file mode 100644 index 00000000000..1eaa7bcf08d --- /dev/null +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetSuperExpression.java @@ -0,0 +1,39 @@ +package org.jetbrains.jet.lang.psi; + +import com.intellij.lang.ASTNode; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; + +/** + * @author max + */ +public class JetSuperExpression extends JetLabelQualifiedInstanceExpression { + + public JetSuperExpression(@NotNull ASTNode node) { + super(node); + } + + @Override + public void accept(@NotNull JetVisitorVoid visitor) { + visitor.visitSuperExpression(this); + } + + @Override + public R accept(@NotNull JetVisitor visitor, D data) { + return visitor.visitSuperExpression(this, data); + } + + /** + * class A : B, C { + * override fun foo() { + * super.foo() + * super.foo() + * } + * } + */ + @Nullable + public JetTypeReference getSuperTypeQualifier() { + return (JetTypeReference) findChildByType(JetNodeTypes.TYPE_REFERENCE); + } +} diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetThisExpression.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetThisExpression.java index eb176aa19bd..ac42c897c7b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetThisExpression.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetThisExpression.java @@ -2,13 +2,11 @@ package org.jetbrains.jet.lang.psi; import com.intellij.lang.ASTNode; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.jet.JetNodeTypes; /** * @author max */ -public class JetThisExpression extends JetLabelQualifiedExpression { +public class JetThisExpression extends JetLabelQualifiedInstanceExpression { public JetThisExpression(@NotNull ASTNode node) { super(node); @@ -23,23 +21,4 @@ public class JetThisExpression extends JetLabelQualifiedExpression { public R accept(@NotNull JetVisitor visitor, D data) { return visitor.visitThisExpression(this, data); } - - /** - * class A : B, C { - * override fun foo() { - * this.foo() - * this.foo() - * } - * } - */ - @Nullable - public JetTypeReference getSuperTypeQualifier() { - return (JetTypeReference) findChildByType(JetNodeTypes.TYPE_REFERENCE); - } - - @NotNull - public JetReferenceExpression getThisReference() { - return (JetReferenceExpression) findChildByType(JetNodeTypes.REFERENCE_EXPRESSION); - } - } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetTreeVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetTreeVisitor.java index d343f8bccf8..d48dc9a4d31 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetTreeVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetTreeVisitor.java @@ -511,7 +511,15 @@ public class JetTreeVisitor extends JetVisitor { @Override public Void visitThisExpression(JetThisExpression expression, D data) { - JetReferenceExpression thisReference = expression.getThisReference(); + JetReferenceExpression thisReference = expression.getInstanceReference(); + thisReference.accept(this, data); + visitLabelQualifiedExpression(expression, data); + return null; + } + + @Override + public Void visitSuperExpression(JetSuperExpression expression, D data) { + JetReferenceExpression thisReference = expression.getInstanceReference(); thisReference.accept(this, data); JetTypeReference superTypeQualifier = expression.getSuperTypeQualifier(); if (superTypeQualifier != null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java index 9c5787cda2c..4817657f54c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitor.java @@ -280,6 +280,10 @@ public class JetVisitor extends PsiElementVisitor { return visitLabelQualifiedExpression(expression, data); } + public R visitSuperExpression(JetSuperExpression expression, D data) { + return visitLabelQualifiedExpression(expression, data); + } + public R visitParenthesizedExpression(JetParenthesizedExpression expression, D data) { return visitExpression(expression, data); } @@ -419,4 +423,5 @@ public class JetVisitor extends PsiElementVisitor { public R visitEscapeStringTemplateEntry(JetEscapeStringTemplateEntry entry, D data) { return visitStringTemplateEntry(entry, data); } + } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java index 8fc840217da..e62e607a705 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/psi/JetVisitorVoid.java @@ -278,6 +278,10 @@ public class JetVisitorVoid extends PsiElementVisitor { visitLabelQualifiedExpression(expression); } + public void visitSuperExpression(JetSuperExpression expression) { + visitLabelQualifiedExpression(expression); + } + public void visitParenthesizedExpression(JetParenthesizedExpression expression) { visitExpression(expression); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java index 2d5218a40a3..fec39dc6493 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/AbstractScopeAdapter.java @@ -65,11 +65,6 @@ public abstract class AbstractScopeAdapter implements JetScope { return getWorkerScope().getPropertyByFieldReference(fieldName); } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - return getWorkerScope().getDeclarationDescriptorForUnqualifiedThis(); - } - @NotNull @Override public Collection getAllDescriptors() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java index c01f2934b82..5c35018b7a8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/TypeResolver.java @@ -234,7 +234,7 @@ public class TypeResolver { } @Nullable - public ClassifierDescriptor resolveClass(JetScope scope, JetUserType userType) { + private ClassifierDescriptor resolveClass(JetScope scope, JetUserType userType) { ClassifierDescriptor classifierDescriptor = resolveClassWithoutErrorReporting(scope, userType); if (classifierDescriptor == null) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java index 27d964e1656..334321bfaf2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/autocasts/DataFlowValueFactory.java @@ -86,7 +86,7 @@ public class DataFlowValueFactory { } else if (expression instanceof JetThisExpression) { JetThisExpression thisExpression = (JetThisExpression) expression; - DeclarationDescriptor declarationDescriptor = bindingContext.get(REFERENCE_TARGET, thisExpression.getThisReference()); + DeclarationDescriptor declarationDescriptor = bindingContext.get(REFERENCE_TARGET, thisExpression.getInstanceReference()); if (declarationDescriptor instanceof CallableDescriptor) { return Pair.create((Object) ((CallableDescriptor) declarationDescriptor).getReceiverParameter(), true); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java index 6e457d2ebce..d68055d33f3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/ChainedScope.java @@ -3,7 +3,6 @@ package org.jetbrains.jet.lang.resolve.scopes; import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import java.util.Collection; @@ -109,21 +108,6 @@ public class ChainedScope implements JetScope { return null; } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - if (DescriptorUtils.definesItsOwnThis(getContainingDeclaration())) { - return getContainingDeclaration(); - } - - for (JetScope jetScope : scopeChain) { - DeclarationDescriptor containingDeclaration = jetScope.getContainingDeclaration(); - if (DescriptorUtils.definesItsOwnThis(containingDeclaration)) { - return containingDeclaration; - } - } - return null; - } - @NotNull @Override public Collection getAllDescriptors() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java index 6f4495e1bef..aa3123b79c8 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScope.java @@ -17,7 +17,7 @@ public interface JetScope { @NotNull @Override public DeclarationDescriptor getContainingDeclaration() { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException("Don't take containing declaration of the EMPTY scope"); } @Override @@ -51,9 +51,6 @@ public interface JetScope { @Nullable PropertyDescriptor getPropertyByFieldReference(@NotNull String fieldName); - @Nullable - DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis(); - @NotNull Collection getAllDescriptors(); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java index b738d76a50c..589bee9496b 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/JetScopeImpl.java @@ -51,11 +51,6 @@ public abstract class JetScopeImpl implements JetScope { return null; } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - return null; - } - @NotNull @Override public Collection getAllDescriptors() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java index f09364216e1..a45bab80eda 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/SubstitutingScope.java @@ -109,12 +109,6 @@ public class SubstitutingScope implements JetScope { throw new UnsupportedOperationException(); // TODO } - @Override - @Nullable - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - return workerScope.getDeclarationDescriptorForUnqualifiedThis(); - } - @NotNull @Override public Collection getAllDescriptors() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java index 65e2693b630..81ee15a1873 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/scopes/WritableScopeImpl.java @@ -1,10 +1,12 @@ package org.jetbrains.jet.lang.resolve.scopes; -import com.google.common.collect.*; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.common.collect.SetMultimap; +import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.descriptors.*; -import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; import org.jetbrains.jet.util.CommonSuppliers; @@ -51,14 +53,6 @@ public class WritableScopeImpl extends WritableScopeWithImports { return ownerDeclarationDescriptor; } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - if (DescriptorUtils.definesItsOwnThis(ownerDeclarationDescriptor)) { - return ownerDeclarationDescriptor; - } - return super.getDeclarationDescriptorForUnqualifiedThis(); - } - @Override public void importScope(@NotNull JetScope imported) { super.importScope(imported); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 549684f6fc5..52af4480db1 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -64,11 +64,6 @@ public class ErrorUtils { return null; // TODO : review } - @Override - public DeclarationDescriptor getDeclarationDescriptorForUnqualifiedThis() { - return ERROR_CLASS; // TODO : review - } - @NotNull @Override public Collection getAllDescriptors() { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index c4f2f06b8da..f78176228be 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -15,8 +15,10 @@ import org.jetbrains.jet.lang.resolve.calls.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.constants.*; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.lang.resolve.scopes.WritableScopeImpl; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ClassReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverDescriptor; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiverDescriptor; import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lexer.JetTokens; @@ -277,62 +279,101 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { @Override public JetType visitThisExpression(JetThisExpression expression, ExpressionTypingContext context) { JetType result = null; - ReceiverDescriptor thisReceiver = null; - String labelName = expression.getLabelName(); - if (labelName != null) { - thisReceiver = context.labelResolver.resolveThisLabel(expression, context, thisReceiver, labelName); - } - else { - thisReceiver = context.scope.getImplicitReceiver(); - - DeclarationDescriptor declarationDescriptorForUnqualifiedThis = context.scope.getDeclarationDescriptorForUnqualifiedThis(); - if (declarationDescriptorForUnqualifiedThis != null) { - context.trace.record(REFERENCE_TARGET, expression.getThisReference(), declarationDescriptorForUnqualifiedThis); - } - } + ReceiverDescriptor thisReceiver = resolveToReceiver(expression, context, false); if (thisReceiver != null) { if (!thisReceiver.exists()) { context.trace.report(NO_THIS.on(expression)); } else { - JetTypeReference superTypeQualifier = expression.getSuperTypeQualifier(); - if (superTypeQualifier != null) { - JetTypeElement superTypeElement = superTypeQualifier.getTypeElement(); - // Errors are reported by the parser - if (superTypeElement instanceof JetUserType) { - JetUserType typeElement = (JetUserType) superTypeElement; - - ClassifierDescriptor classifierCandidate = context.getTypeResolver().resolveClass(context.scope, typeElement); - if (classifierCandidate instanceof ClassDescriptor) { - ClassDescriptor superclass = (ClassDescriptor) classifierCandidate; - - JetType thisType = thisReceiver.getType(); - Collection supertypes = thisType.getConstructor().getSupertypes(); - TypeSubstitutor substitutor = TypeSubstitutor.create(thisType); - for (JetType declaredSupertype : supertypes) { - if (declaredSupertype.getConstructor().equals(superclass.getTypeConstructor())) { - result = substitutor.safeSubstitute(declaredSupertype, Variance.INVARIANT); - break; - } - } - if (result == null) { - context.trace.report(NOT_A_SUPERTYPE.on(superTypeElement)); - } - } - } - } - else { - result = thisReceiver.getType(); - } - if (result != null) { - context.trace.record(BindingContext.EXPRESSION_TYPE, expression.getThisReference(), result); - } + result = thisReceiver.getType(); + context.trace.record(BindingContext.EXPRESSION_TYPE, expression.getInstanceReference(), result); } } return DataFlowUtils.checkType(result, expression, context); } + @Override + public JetType visitSuperExpression(JetSuperExpression expression, ExpressionTypingContext context) { + if (!context.namespacesAllowed) { + context.trace.report(SUPER_IS_NOT_AN_EXPRESSION.on(expression, expression.getText())); + return null; + } + JetType result = null; + + ReceiverDescriptor thisReceiver = resolveToReceiver(expression, context, true); + if (thisReceiver == null) return null; + + if (!thisReceiver.exists()) { + context.trace.report(SUPER_NOT_AVAILABLE.on(expression)); + } + else { + JetType thisType = thisReceiver.getType(); + Collection supertypes = thisType.getConstructor().getSupertypes(); + TypeSubstitutor substitutor = TypeSubstitutor.create(thisType); + + JetTypeReference superTypeQualifier = expression.getSuperTypeQualifier(); + if (superTypeQualifier != null) { + JetType supertype = context.getTypeResolver().resolveType(context.scope, superTypeQualifier); + DeclarationDescriptor classifierCandidate = supertype.getConstructor().getDeclarationDescriptor(); + if (classifierCandidate instanceof ClassDescriptor) { + ClassDescriptor superclass = (ClassDescriptor) classifierCandidate; + + for (JetType declaredSupertype : supertypes) { + if (declaredSupertype.getConstructor().equals(superclass.getTypeConstructor())) { + result = substitutor.safeSubstitute(declaredSupertype, Variance.INVARIANT); + break; + } + } + } + if (result == null && !ErrorUtils.isErrorType(supertype)) { + context.trace.report(NOT_A_SUPERTYPE.on(superTypeQualifier)); + } + } + else { + if (supertypes.size() > 1) { + context.trace.report(AMBIGUOUS_SUPER.on(expression)); + } + else { + result = substitutor.substitute(supertypes.iterator().next(), Variance.INVARIANT); + } + } + if (result != null) { + context.trace.record(BindingContext.EXPRESSION_TYPE, expression.getInstanceReference(), result); + context.trace.record(BindingContext.REFERENCE_TARGET, expression.getInstanceReference(), result.getConstructor().getDeclarationDescriptor()); + } + } + return DataFlowUtils.checkType(result, expression, context); + } + + @Nullable + private ReceiverDescriptor resolveToReceiver(JetLabelQualifiedInstanceExpression expression, ExpressionTypingContext context, boolean onlyClassReceivers) { + ReceiverDescriptor thisReceiver = null; + String labelName = expression.getLabelName(); + if (labelName != null) { + thisReceiver = context.labelResolver.resolveThisLabel(expression.getInstanceReference(), expression.getTargetLabel(), context, thisReceiver, labelName); + } + else { + if (onlyClassReceivers) { + List receivers = Lists.newArrayList(); + context.scope.getImplicitReceiversHierarchy(receivers); + for (ReceiverDescriptor receiver : receivers) { + if (receiver instanceof ClassReceiver) { + thisReceiver = receiver; + break; + } + } + } + else { + thisReceiver = context.scope.getImplicitReceiver(); + } + if (thisReceiver instanceof ThisReceiverDescriptor) { + context.trace.record(REFERENCE_TARGET, expression.getInstanceReference(), ((ThisReceiverDescriptor) thisReceiver).getDeclarationDescriptor()); + } + } + return thisReceiver; + } + @Override public JetType visitBlockExpression(JetBlockExpression expression, ExpressionTypingContext context) { return context.getServices().getBlockReturnedType(context.scope, expression, CoercionStrategy.NO_COERCION, context); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingContext.java index e4a7da67786..c84fbf93516 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingContext.java @@ -65,6 +65,7 @@ import java.util.Map; public final Map> patternsToBoundVariableLists; public final LabelResolver labelResolver; + // true for positions on the lhs of a '.', i.e. allows namespace results and 'super' public final boolean namespacesAllowed; private CallResolver callResolver; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java index 63e92541bd1..bcf5b82dcd3 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/LabelResolver.java @@ -106,10 +106,9 @@ public class LabelResolver { return result; } - public ReceiverDescriptor resolveThisLabel(JetThisExpression expression, ExpressionTypingContext context, ReceiverDescriptor thisReceiver, String labelName) { + public ReceiverDescriptor resolveThisLabel(JetReferenceExpression thisReference, JetSimpleNameExpression targetLabel, ExpressionTypingContext context, ReceiverDescriptor thisReceiver, String labelName) { Collection declarationsByLabel = context.scope.getDeclarationsByLabel(labelName); int size = declarationsByLabel.size(); - final JetSimpleNameExpression targetLabel = expression.getTargetLabel(); assert targetLabel != null; if (size == 1) { DeclarationDescriptor declarationDescriptor = declarationsByLabel.iterator().next(); @@ -127,7 +126,7 @@ public class LabelResolver { PsiElement element = context.trace.get(DESCRIPTOR_TO_DECLARATION, declarationDescriptor); assert element != null; context.trace.record(LABEL_TARGET, targetLabel, element); - context.trace.record(REFERENCE_TARGET, expression.getThisReference(), declarationDescriptor); + context.trace.record(REFERENCE_TARGET, thisReference, declarationDescriptor); } else if (size == 0) { JetElement element = resolveNamedLabel(labelName, targetLabel, false, context); @@ -137,7 +136,7 @@ public class LabelResolver { thisReceiver = ((FunctionDescriptor) declarationDescriptor).getReceiverParameter(); if (thisReceiver.exists()) { context.trace.record(LABEL_TARGET, targetLabel, element); - context.trace.record(REFERENCE_TARGET, expression.getThisReference(), declarationDescriptor); + context.trace.record(REFERENCE_TARGET, thisReference, declarationDescriptor); } } else { diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex index e13a8025175..95576d76e5a 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex @@ -168,6 +168,7 @@ LONG_TEMPLATE_ENTRY_END=\} "trait" { return JetTokens.TRAIT_KEYWORD ;} "throw" { return JetTokens.THROW_KEYWORD ;} "false" { return JetTokens.FALSE_KEYWORD ;} +"super" { return JetTokens.SUPER_KEYWORD ;} "when" { return JetTokens.WHEN_KEYWORD ;} "true" { return JetTokens.TRUE_KEYWORD ;} "type" { return JetTokens.TYPE_KEYWORD ;} diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java index 1322d09776c..c66e06e3a60 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/JetTokens.java @@ -36,6 +36,7 @@ public interface JetTokens { JetKeywordToken TYPE_KEYWORD = JetKeywordToken.keyword("type"); JetKeywordToken CLASS_KEYWORD = JetKeywordToken.keyword("class"); JetKeywordToken THIS_KEYWORD = JetKeywordToken.keyword("this"); + JetKeywordToken SUPER_KEYWORD = JetKeywordToken.keyword("super"); JetKeywordToken VAL_KEYWORD = JetKeywordToken.keyword("val"); JetKeywordToken VAR_KEYWORD = JetKeywordToken.keyword("var"); JetKeywordToken FUN_KEYWORD = JetKeywordToken.keyword("fun"); @@ -145,7 +146,7 @@ public interface JetTokens { JetKeywordToken REF_KEYWORD = JetKeywordToken.softKeyword("ref"); TokenSet KEYWORDS = TokenSet.create(NAMESPACE_KEYWORD, AS_KEYWORD, TYPE_KEYWORD, CLASS_KEYWORD, TRAIT_KEYWORD, - THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD, + THIS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD, VAR_KEYWORD, FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD, TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, IN_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, diff --git a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java index 0e2f7e09222..e2851597318 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java +++ b/compiler/frontend/src/org/jetbrains/jet/lexer/_JetLexer.java @@ -1,4 +1,4 @@ -/* The following code was generated by JFlex 1.4.3 on 10/17/11 7:35 PM */ +/* The following code was generated by JFlex 1.4.3 on 10/19/11 2:50 PM */ /* It's an automatically generated code. Do not modify it. */ package org.jetbrains.jet.lexer; @@ -14,7 +14,7 @@ import org.jetbrains.jet.lexer.JetTokens; /** * This class is a scanner generated by * JFlex 1.4.3 - * on 10/17/11 7:35 PM from the specification file + * on 10/19/11 2:50 PM from the specification file * /Users/abreslav/work/jet/compiler/frontend/src/org/jetbrains/jet/lexer/Jet.flex */ class _JetLexer implements FlexLexer { @@ -122,26 +122,26 @@ class _JetLexer implements FlexLexer { private static final String ZZ_ACTION_PACKED_0 = "\4\0\1\1\1\2\1\3\1\4\2\1\1\5\1\6"+ "\1\7\1\2\1\10\1\11\1\12\1\13\1\14\1\15"+ - "\16\3\1\16\1\17\1\20\1\21\1\22\1\23\2\1"+ + "\17\3\1\16\1\17\1\20\1\21\1\22\1\23\2\1"+ "\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33"+ "\1\34\2\35\1\36\1\0\1\37\1\40\1\0\1\41"+ "\1\42\1\0\1\43\1\0\1\44\1\0\1\45\1\0"+ "\1\46\1\47\1\50\1\51\1\52\1\43\2\2\1\43"+ "\1\53\1\54\1\55\1\56\2\12\1\0\2\3\1\57"+ - "\7\3\1\60\1\61\1\62\10\3\1\63\1\0\1\64"+ + "\10\3\1\60\1\61\1\62\10\3\1\63\1\0\1\64"+ "\1\65\1\66\1\67\1\70\1\71\1\72\1\73\1\74"+ "\1\75\1\76\1\0\1\77\1\100\1\0\1\101\1\43"+ "\1\3\2\0\1\50\1\102\4\0\1\103\2\3\1\104"+ - "\6\3\1\105\10\3\1\106\1\107\1\3\1\110\1\111"+ + "\7\3\1\105\10\3\1\106\1\107\1\3\1\110\1\111"+ "\1\112\1\113\1\114\1\115\1\0\1\40\1\44\1\45"+ - "\1\0\2\102\1\43\2\0\1\3\1\116\1\117\4\3"+ + "\1\0\2\102\1\43\2\0\1\3\1\116\1\117\5\3"+ "\1\120\1\121\1\3\1\122\2\3\1\123\2\3\1\124"+ - "\1\125\1\76\1\50\2\0\2\3\1\126\1\3\1\127"+ - "\1\130\1\3\1\131\1\132\1\133\1\103\2\3\1\134"+ - "\1\135\3\3\1\136\1\137"; + "\1\125\1\76\1\50\2\0\1\3\1\126\1\3\1\127"+ + "\1\3\1\130\1\131\1\3\1\132\1\133\1\134\1\103"+ + "\2\3\1\135\1\136\3\3\1\137\1\140"; private static int [] zzUnpackAction() { - int [] result = new int[212]; + int [] result = new int[217]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; @@ -170,32 +170,33 @@ class _JetLexer implements FlexLexer { "\0\u0200\0\u0240\0\u0280\0\u02c0\0\u0300\0\u0340\0\u0380\0\u03c0"+ "\0\u0400\0\u0440\0\u0100\0\u0100\0\u0480\0\u04c0\0\u0500\0\u0540"+ "\0\u0580\0\u05c0\0\u0600\0\u0640\0\u0680\0\u06c0\0\u0700\0\u0740"+ - "\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0100\0\u0880\0\u08c0\0\u0900"+ - "\0\u0940\0\u0980\0\u09c0\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100"+ - "\0\u0100\0\u0100\0\u0100\0\u0a00\0\u0a40\0\u0100\0\u0a80\0\u0100"+ - "\0\u0ac0\0\u0b00\0\u0100\0\u0100\0\u0b40\0\u0b80\0\u0bc0\0\u0c00"+ - "\0\u0c40\0\u0c80\0\u0cc0\0\u0100\0\u0d00\0\u0d40\0\u0100\0\u0100"+ - "\0\u0d80\0\u0dc0\0\u0e00\0\u0e40\0\u0100\0\u0100\0\u0100\0\u0100"+ - "\0\u0100\0\u0e80\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0\0\u1000"+ - "\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u0180\0\u0180\0\u0180"+ - "\0\u1180\0\u11c0\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340"+ - "\0\u0180\0\u1380\0\u13c0\0\u1400\0\u0100\0\u0100\0\u0100\0\u0100"+ - "\0\u0100\0\u0100\0\u0100\0\u0100\0\u1440\0\u1480\0\u0100\0\u0100"+ - "\0\u14c0\0\u0100\0\u1500\0\u0100\0\u1540\0\u1580\0\u15c0\0\u1600"+ - "\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0\0\u0100"+ - "\0\u1800\0\u1840\0\u1880\0\u18c0\0\u1900\0\u1940\0\u0180\0\u1980"+ - "\0\u19c0\0\u1a00\0\u1a40\0\u1a80\0\u1ac0\0\u1b00\0\u1b40\0\u0180"+ - "\0\u0180\0\u1b80\0\u0180\0\u0180\0\u1bc0\0\u1bc0\0\u0100\0\u0100"+ - "\0\u1c00\0\u0100\0\u0100\0\u0100\0\u1c40\0\u1c80\0\u0100\0\u1cc0"+ - "\0\u1500\0\u1d00\0\u1d40\0\u0180\0\u0180\0\u1d80\0\u1dc0\0\u1e00"+ - "\0\u1e40\0\u0180\0\u0180\0\u1e80\0\u0180\0\u1ec0\0\u1f00\0\u0180"+ - "\0\u1f40\0\u1f80\0\u0180\0\u0100\0\u0100\0\u0100\0\u1fc0\0\u2000"+ - "\0\u2040\0\u2080\0\u0180\0\u20c0\0\u0180\0\u0180\0\u2100\0\u0180"+ - "\0\u0180\0\u0180\0\u0100\0\u2140\0\u2180\0\u0180\0\u0180\0\u21c0"+ - "\0\u2200\0\u2240\0\u0180\0\u0180"; + "\0\u0780\0\u07c0\0\u0800\0\u0840\0\u0880\0\u0100\0\u08c0\0\u0900"+ + "\0\u0940\0\u0980\0\u09c0\0\u0a00\0\u0100\0\u0100\0\u0100\0\u0100"+ + "\0\u0100\0\u0100\0\u0100\0\u0100\0\u0a40\0\u0a80\0\u0100\0\u0ac0"+ + "\0\u0100\0\u0b00\0\u0b40\0\u0100\0\u0100\0\u0b80\0\u0bc0\0\u0c00"+ + "\0\u0c40\0\u0c80\0\u0cc0\0\u0d00\0\u0100\0\u0d40\0\u0d80\0\u0100"+ + "\0\u0100\0\u0dc0\0\u0e00\0\u0e40\0\u0e80\0\u0100\0\u0100\0\u0100"+ + "\0\u0100\0\u0100\0\u0ec0\0\u0f00\0\u0f40\0\u0f80\0\u0fc0\0\u1000"+ + "\0\u1040\0\u1080\0\u10c0\0\u1100\0\u1140\0\u1180\0\u11c0\0\u0180"+ + "\0\u0180\0\u0180\0\u1200\0\u1240\0\u1280\0\u12c0\0\u1300\0\u1340"+ + "\0\u1380\0\u13c0\0\u0180\0\u1400\0\u1440\0\u1480\0\u0100\0\u0100"+ + "\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u0100\0\u14c0\0\u1500"+ + "\0\u0100\0\u0100\0\u1540\0\u0100\0\u1580\0\u0100\0\u15c0\0\u1600"+ + "\0\u1640\0\u1680\0\u16c0\0\u1700\0\u1740\0\u1780\0\u17c0\0\u1800"+ + "\0\u1840\0\u0100\0\u1880\0\u18c0\0\u1900\0\u1940\0\u1980\0\u19c0"+ + "\0\u1a00\0\u0180\0\u1a40\0\u1a80\0\u1ac0\0\u1b00\0\u1b40\0\u1b80"+ + "\0\u1bc0\0\u1c00\0\u0180\0\u0180\0\u1c40\0\u0180\0\u0180\0\u1c80"+ + "\0\u1c80\0\u0100\0\u0100\0\u1cc0\0\u0100\0\u0100\0\u0100\0\u1d00"+ + "\0\u1d40\0\u0100\0\u1d80\0\u1580\0\u1dc0\0\u1e00\0\u0180\0\u0180"+ + "\0\u1e40\0\u1e80\0\u1ec0\0\u1f00\0\u1f40\0\u0180\0\u0180\0\u1f80"+ + "\0\u0180\0\u1fc0\0\u2000\0\u0180\0\u2040\0\u2080\0\u0180\0\u0100"+ + "\0\u0100\0\u0100\0\u20c0\0\u2100\0\u2140\0\u0180\0\u2180\0\u0180"+ + "\0\u21c0\0\u0180\0\u0180\0\u2200\0\u0180\0\u0180\0\u0180\0\u0100"+ + "\0\u2240\0\u2280\0\u0180\0\u0180\0\u22c0\0\u2300\0\u2340\0\u0180"+ + "\0\u0180"; private static int [] zzUnpackRowMap() { - int [] result = new int[212]; + int [] result = new int[217]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; @@ -221,209 +222,216 @@ class _JetLexer implements FlexLexer { "\1\5\1\6\1\7\1\10\1\7\1\5\1\11\1\12"+ "\1\13\1\14\1\15\1\10\1\16\2\7\1\17\1\7"+ "\1\20\1\7\1\21\1\5\1\22\1\23\1\24\1\25"+ - "\1\26\1\7\1\27\2\7\1\30\1\31\1\32\1\33"+ - "\1\7\1\34\1\35\1\7\1\36\3\7\1\37\1\7"+ - "\1\40\1\41\1\42\1\43\1\44\1\45\1\46\1\47"+ + "\1\26\1\7\1\27\1\30\1\7\1\31\1\32\1\33"+ + "\1\34\1\7\1\35\1\36\1\7\1\37\3\7\1\40"+ + "\1\7\1\41\1\42\1\43\1\44\1\45\1\46\1\47"+ "\1\50\1\51\1\52\1\53\1\54\1\55\1\56\1\57"+ - "\1\60\1\61\1\62\1\63\7\64\1\65\3\64\1\66"+ - "\10\64\1\67\1\70\52\64\2\0\1\71\1\0\1\71"+ - "\1\0\1\72\6\0\2\71\1\0\1\71\1\0\1\71"+ - "\5\0\27\71\21\0\1\5\1\6\1\7\1\10\1\7"+ - "\1\5\1\11\1\12\1\13\1\14\1\15\1\10\1\16"+ - "\2\7\1\17\1\7\1\20\1\7\1\21\1\5\1\22"+ - "\1\73\1\74\1\25\1\26\1\7\1\27\2\7\1\30"+ - "\1\31\1\32\1\33\1\7\1\34\1\35\1\7\1\36"+ - "\3\7\1\37\1\7\1\40\1\41\1\42\1\43\1\44"+ - "\1\45\1\46\1\47\1\50\1\51\1\52\1\53\1\54"+ - "\1\55\1\56\1\57\1\60\1\61\1\62\1\63\101\0"+ - "\1\6\12\0\1\6\2\0\1\75\1\76\12\0\1\76"+ - "\45\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\27\7\24\0\1\10\7\0\1\10"+ - "\66\0\1\77\1\0\1\77\10\0\2\77\1\0\1\77"+ - "\1\0\1\77\5\0\27\77\23\0\1\100\1\0\1\100"+ - "\1\0\1\101\6\0\2\100\1\0\1\100\1\0\1\100"+ - "\5\0\27\100\23\0\1\102\1\0\1\102\1\0\1\103"+ - "\1\0\1\104\4\0\2\102\1\0\1\102\1\0\1\102"+ - "\5\0\27\102\32\0\1\105\1\106\45\0\1\107\77\0"+ - "\1\110\20\0\1\111\12\0\1\111\1\112\1\113\1\75"+ - "\1\76\12\0\1\76\10\0\1\113\34\0\1\114\12\0"+ - "\1\114\2\0\1\115\101\0\1\116\36\0\1\117\3\0"+ - "\1\120\13\0\13\21\1\0\7\21\1\121\1\122\53\21"+ - "\25\0\1\123\53\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\1\7\1\124\10\7"+ - "\1\125\14\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\4\7\1\126\22\7"+ + "\1\60\1\61\1\62\1\63\1\64\7\65\1\66\3\65"+ + "\1\67\10\65\1\70\1\71\52\65\2\0\1\72\1\0"+ + "\1\72\1\0\1\73\6\0\2\72\1\0\1\72\1\0"+ + "\1\72\5\0\27\72\21\0\1\5\1\6\1\7\1\10"+ + "\1\7\1\5\1\11\1\12\1\13\1\14\1\15\1\10"+ + "\1\16\2\7\1\17\1\7\1\20\1\7\1\21\1\5"+ + "\1\22\1\74\1\75\1\25\1\26\1\7\1\27\1\30"+ + "\1\7\1\31\1\32\1\33\1\34\1\7\1\35\1\36"+ + "\1\7\1\37\3\7\1\40\1\7\1\41\1\42\1\43"+ + "\1\44\1\45\1\46\1\47\1\50\1\51\1\52\1\53"+ + "\1\54\1\55\1\56\1\57\1\60\1\61\1\62\1\63"+ + "\1\64\101\0\1\6\12\0\1\6\2\0\1\76\1\77"+ + "\12\0\1\77\45\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\27\7\24\0\1\10"+ + "\7\0\1\10\66\0\1\100\1\0\1\100\10\0\2\100"+ + "\1\0\1\100\1\0\1\100\5\0\27\100\23\0\1\101"+ + "\1\0\1\101\1\0\1\102\6\0\2\101\1\0\1\101"+ + "\1\0\1\101\5\0\27\101\23\0\1\103\1\0\1\103"+ + "\1\0\1\104\1\0\1\105\4\0\2\103\1\0\1\103"+ + "\1\0\1\103\5\0\27\103\32\0\1\106\1\107\45\0"+ + "\1\110\77\0\1\111\20\0\1\112\12\0\1\112\1\113"+ + "\1\114\1\76\1\77\12\0\1\77\10\0\1\114\34\0"+ + "\1\115\12\0\1\115\2\0\1\116\101\0\1\117\36\0"+ + "\1\120\3\0\1\121\13\0\13\21\1\0\7\21\1\122"+ + "\1\123\53\21\25\0\1\124\53\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\7"+ + "\1\125\10\7\1\126\14\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\4\7"+ + "\1\127\22\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\20\7\1\130\6\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\20\7\1\127\6\7\22\0\2\7"+ + "\1\0\1\7\5\0\12\7\1\131\14\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\7\7\1\130\10\7\1\131\6\7\22\0\2\7"+ + "\5\0\7\7\1\132\10\7\1\133\6\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\14\7\1\132\12\7\22\0\2\7\1\0\2\7"+ + "\5\0\14\7\1\134\12\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\13\7"+ - "\1\133\3\7\1\134\3\7\1\135\3\7\22\0\2\7"+ + "\1\135\3\7\1\136\3\7\1\137\3\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\1\136\3\7\1\137\15\7\1\140\4\7\22\0"+ + "\5\0\1\140\3\7\1\141\15\7\1\142\4\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\3\7\1\141\23\7\22\0\2\7\1\0"+ + "\1\7\5\0\3\7\1\143\23\7\22\0\2\7\1\0"+ "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\13\7\1\142\13\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\17\7\1\143"+ + "\13\7\1\144\13\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\17\7\1\145"+ "\7\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\1\7\1\144\5\7\1\145"+ - "\2\7\1\146\14\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\17\7\1\147"+ + "\1\7\1\0\1\7\5\0\1\7\1\146\5\7\1\147"+ + "\2\7\1\150\14\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\17\7\1\151"+ "\7\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\1\7\1\150\25\7\22\0"+ + "\1\7\1\0\1\7\5\0\1\7\1\152\25\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\7\7\1\151\17\7\62\0\1\152\16\0"+ - "\1\153\77\0\1\154\3\0\1\155\73\0\1\156\1\0"+ - "\1\157\75\0\1\160\77\0\1\161\104\0\1\162\100\0"+ - "\1\163\71\0\1\164\17\0\7\64\1\0\3\64\1\0"+ - "\10\64\2\0\52\64\2\0\1\165\1\0\1\165\1\0"+ - "\1\166\6\0\2\165\1\0\1\165\1\0\1\165\3\0"+ - "\1\167\1\0\27\165\21\0\13\170\1\0\64\170\1\0"+ - "\2\71\1\0\2\71\6\0\3\71\1\0\1\71\1\0"+ - "\1\71\5\0\27\71\23\0\1\171\1\0\1\171\10\0"+ - "\2\171\1\0\1\171\1\0\1\171\5\0\27\171\22\0"+ - "\1\114\12\0\1\114\2\0\1\172\61\0\1\173\12\0"+ - "\1\173\4\0\1\173\40\0\1\173\16\0\2\77\1\0"+ - "\2\77\1\174\5\0\3\77\1\0\1\77\1\0\1\77"+ - "\5\0\27\77\22\0\2\100\1\0\2\100\6\0\3\100"+ - "\1\0\1\100\1\0\1\100\5\0\27\100\23\0\1\175"+ - "\1\0\1\175\10\0\2\175\1\0\1\175\1\0\1\175"+ - "\5\0\27\175\22\0\2\102\1\0\2\102\6\0\3\102"+ - "\1\0\1\102\1\0\1\102\5\0\27\102\23\0\1\176"+ - "\1\0\1\176\10\0\2\176\1\0\1\176\1\0\1\176"+ - "\5\0\27\176\21\0\13\105\1\0\64\105\12\177\1\200"+ - "\65\177\1\0\1\111\12\0\1\111\2\0\1\201\1\76"+ - "\12\0\1\76\45\0\2\112\11\0\1\112\1\0\1\112"+ - "\1\202\1\112\1\0\1\203\6\0\1\112\1\0\1\112"+ - "\1\0\1\203\1\112\5\0\1\112\5\0\1\112\3\0"+ - "\1\112\22\0\1\113\12\0\1\113\2\0\1\204\61\0"+ - "\1\114\12\0\1\114\3\0\1\76\12\0\1\76\44\0"+ - "\13\21\1\0\64\21\25\0\1\205\53\0\2\7\1\0"+ + "\1\7\5\0\7\7\1\153\17\7\62\0\1\154\16\0"+ + "\1\155\77\0\1\156\3\0\1\157\73\0\1\160\1\0"+ + "\1\161\75\0\1\162\77\0\1\163\104\0\1\164\100\0"+ + "\1\165\71\0\1\166\17\0\7\65\1\0\3\65\1\0"+ + "\10\65\2\0\52\65\2\0\1\167\1\0\1\167\1\0"+ + "\1\170\6\0\2\167\1\0\1\167\1\0\1\167\3\0"+ + "\1\171\1\0\27\167\21\0\13\172\1\0\64\172\1\0"+ + "\2\72\1\0\2\72\6\0\3\72\1\0\1\72\1\0"+ + "\1\72\5\0\27\72\23\0\1\173\1\0\1\173\10\0"+ + "\2\173\1\0\1\173\1\0\1\173\5\0\27\173\22\0"+ + "\1\115\12\0\1\115\2\0\1\174\61\0\1\175\12\0"+ + "\1\175\4\0\1\175\40\0\1\175\16\0\2\100\1\0"+ + "\2\100\1\176\5\0\3\100\1\0\1\100\1\0\1\100"+ + "\5\0\27\100\22\0\2\101\1\0\2\101\6\0\3\101"+ + "\1\0\1\101\1\0\1\101\5\0\27\101\23\0\1\177"+ + "\1\0\1\177\10\0\2\177\1\0\1\177\1\0\1\177"+ + "\5\0\27\177\22\0\2\103\1\0\2\103\6\0\3\103"+ + "\1\0\1\103\1\0\1\103\5\0\27\103\23\0\1\200"+ + "\1\0\1\200\10\0\2\200\1\0\1\200\1\0\1\200"+ + "\5\0\27\200\21\0\13\106\1\0\64\106\12\201\1\202"+ + "\65\201\1\0\1\112\12\0\1\112\2\0\1\203\1\77"+ + "\12\0\1\77\45\0\2\113\11\0\1\113\1\0\1\113"+ + "\1\204\1\113\1\0\1\205\6\0\1\113\1\0\1\113"+ + "\1\0\1\205\1\113\5\0\1\113\5\0\1\113\3\0"+ + "\1\113\22\0\1\114\12\0\1\114\2\0\1\206\61\0"+ + "\1\115\12\0\1\115\3\0\1\77\12\0\1\77\44\0"+ + "\13\21\1\0\64\21\25\0\1\207\53\0\2\7\1\0"+ "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\2\7\1\206\24\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\20\7\1\207"+ + "\2\7\1\210\24\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\20\7\1\211"+ "\6\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\27\7\2\0\1\210\17\0"+ + "\1\7\1\0\1\7\5\0\27\7\2\0\1\212\17\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\4\7\1\211\22\7\22\0\2\7\1\0"+ + "\1\7\5\0\4\7\1\213\22\7\22\0\2\7\1\0"+ "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\1\212\26\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\1\7\1\213\25\7"+ + "\5\7\1\214\21\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\1\215\26\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\15\7\1\214\11\7\22\0\2\7"+ + "\1\0\1\7\5\0\1\7\1\216\25\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\1\7\1\215\10\7\1\216\10\7\1\217\3\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\11\7\1\220\1\7\1\221\13\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\5\7\1\222\21\7\22\0\2\7"+ + "\5\0\15\7\1\217\11\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\7"+ + "\1\220\10\7\1\221\10\7\1\222\3\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\10\7\1\223\16\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\3\7"+ - "\1\224\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\3\7\1\225\5\7"+ - "\1\226\15\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\20\7\1\227\6\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\13\7\1\230\13\7\22\0\2\7"+ + "\5\0\11\7\1\223\1\7\1\224\13\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\1\231\26\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\11\7\1\232"+ - "\15\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\13\7\1\233\4\7\1\234"+ - "\6\7\51\0\1\235\3\0\1\236\123\0\1\237\77\0"+ - "\1\240\20\0\2\165\1\0\2\165\6\0\3\165\1\0"+ - "\1\165\1\0\1\165\5\0\27\165\23\0\1\241\1\0"+ - "\1\241\10\0\2\241\1\0\1\241\1\0\1\241\5\0"+ - "\27\241\22\0\2\171\1\0\2\171\1\242\5\0\3\171"+ - "\1\0\1\171\1\0\1\171\5\0\27\171\22\0\1\173"+ - "\12\0\1\173\64\0\2\175\1\0\2\175\1\243\5\0"+ - "\3\175\1\0\1\175\1\0\1\175\5\0\27\175\22\0"+ - "\2\176\1\0\2\176\1\244\5\0\3\176\1\0\1\176"+ - "\1\0\1\176\5\0\27\176\21\0\12\177\1\245\65\177"+ - "\11\246\1\247\1\200\65\246\1\0\1\114\12\0\1\114"+ - "\64\0\2\250\11\0\1\250\1\0\1\250\1\172\1\250"+ - "\10\0\1\250\1\0\1\250\2\0\1\250\5\0\1\250"+ - "\5\0\1\250\3\0\1\250\22\0\1\173\12\0\1\173"+ - "\4\0\1\251\40\0\1\251\34\0\1\172\60\0\25\205"+ - "\1\252\52\205\1\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\3\7\1\253\23\7"+ - "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\20\7\1\254\6\7\22\0\2\7"+ - "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\3\7\1\255\23\7\22\0\2\7\1\0\2\7"+ + "\5\0\5\7\1\225\21\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\10\7"+ - "\1\256\16\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\4\7\1\257\22\7"+ + "\1\226\16\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\3\7\1\227\23\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\3\7\1\260\23\7\22\0\2\7"+ + "\1\0\1\7\5\0\3\7\1\230\5\7\1\231\15\7"+ + "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\5\0\20\7\1\232\6\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\11\7\1\261\15\7\22\0\2\7\1\0\2\7"+ + "\5\0\13\7\1\233\13\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\234"+ + "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\11\7\1\235\15\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\13\7\1\236\4\7\1\237\6\7\51\0"+ + "\1\240\3\0\1\241\123\0\1\242\77\0\1\243\20\0"+ + "\2\167\1\0\2\167\6\0\3\167\1\0\1\167\1\0"+ + "\1\167\5\0\27\167\23\0\1\244\1\0\1\244\10\0"+ + "\2\244\1\0\1\244\1\0\1\244\5\0\27\244\22\0"+ + "\2\173\1\0\2\173\1\245\5\0\3\173\1\0\1\173"+ + "\1\0\1\173\5\0\27\173\22\0\1\175\12\0\1\175"+ + "\64\0\2\177\1\0\2\177\1\246\5\0\3\177\1\0"+ + "\1\177\1\0\1\177\5\0\27\177\22\0\2\200\1\0"+ + "\2\200\1\247\5\0\3\200\1\0\1\200\1\0\1\200"+ + "\5\0\27\200\21\0\12\201\1\250\65\201\11\251\1\252"+ + "\1\202\65\251\1\0\1\115\12\0\1\115\64\0\2\253"+ + "\11\0\1\253\1\0\1\253\1\174\1\253\10\0\1\253"+ + "\1\0\1\253\2\0\1\253\5\0\1\253\5\0\1\253"+ + "\3\0\1\253\22\0\1\175\12\0\1\175\4\0\1\254"+ + "\40\0\1\254\34\0\1\174\60\0\25\207\1\255\52\207"+ + "\1\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ + "\1\0\1\7\5\0\3\7\1\256\23\7\22\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\5\0\20\7\1\257\6\7\22\0\2\7\1\0\2\7"+ "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\3\7"+ - "\1\262\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\4\7\1\263\22\7"+ + "\1\260\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\3\7\1\261\23\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\7\7\1\264\17\7\22\0\2\7"+ + "\1\0\1\7\5\0\10\7\1\262\16\7\22\0\2\7"+ "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ - "\5\0\3\7\1\265\23\7\22\0\2\7\1\0\2\7"+ - "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\12\7"+ - "\1\266\14\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\1\7\1\267\25\7"+ + "\5\0\4\7\1\263\22\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\3\7"+ + "\1\264\23\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\11\7\1\265\15\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\1\270\26\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\20\7\1\271\6\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\4\7\1\272"+ - "\22\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\4\7\1\273\22\7\22\0"+ - "\2\274\1\0\2\274\6\0\3\274\1\0\1\274\1\0"+ - "\1\274\5\0\27\274\22\0\2\241\1\0\2\241\1\275"+ - "\5\0\3\241\1\0\1\241\1\0\1\241\5\0\27\241"+ - "\21\0\11\177\1\276\1\245\65\177\12\246\1\277\65\246"+ - "\1\0\2\250\11\0\1\250\1\0\1\250\1\0\1\250"+ - "\1\0\1\203\6\0\1\250\1\0\1\250\1\0\1\203"+ - "\1\250\5\0\1\250\5\0\1\250\3\0\1\250\21\0"+ - "\25\205\1\300\52\205\1\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\4\7\1\301"+ - "\22\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\11\7\1\302\15\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\4\7\1\303\22\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\6\7\1\304\20\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\10\7\1\305"+ - "\16\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\16\7\1\306\10\7\22\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\13\7\1\307\13\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\21\7\1\310\5\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\3\7\1\311"+ - "\23\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\3\7\1\312\23\7\21\0"+ - "\11\246\1\247\1\277\65\246\25\205\1\313\52\205\1\0"+ - "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\5\7\1\314\21\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\1\315\26\7\22\0\2\7\1\0\2\7\6\0\3\7"+ - "\1\0\1\7\1\0\1\7\5\0\10\7\1\316\16\7"+ + "\1\0\1\7\5\0\3\7\1\266\23\7\22\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\5\0\4\7\1\267\22\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\7\7"+ + "\1\270\17\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\3\7\1\271\23\7"+ "\22\0\2\7\1\0\2\7\6\0\3\7\1\0\1\7"+ - "\1\0\1\7\5\0\1\317\26\7\22\0\2\7\1\0"+ - "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\1\7\1\320\25\7\22\0\2\7\1\0\2\7\6\0"+ - "\3\7\1\0\1\7\1\0\1\7\5\0\12\7\1\321"+ - "\14\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ - "\1\7\1\0\1\7\5\0\6\7\1\322\20\7\22\0"+ + "\1\0\1\7\5\0\12\7\1\272\14\7\22\0\2\7"+ + "\1\0\2\7\6\0\3\7\1\0\1\7\1\0\1\7"+ + "\5\0\1\7\1\273\25\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\1\274"+ + "\26\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\20\7\1\275\6\7\22\0"+ "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ - "\1\7\5\0\3\7\1\323\23\7\22\0\2\7\1\0"+ + "\1\7\5\0\4\7\1\276\22\7\22\0\2\7\1\0"+ "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ - "\3\7\1\324\23\7\21\0"; + "\4\7\1\277\22\7\22\0\2\300\1\0\2\300\6\0"+ + "\3\300\1\0\1\300\1\0\1\300\5\0\27\300\22\0"+ + "\2\244\1\0\2\244\1\301\5\0\3\244\1\0\1\244"+ + "\1\0\1\244\5\0\27\244\21\0\11\201\1\302\1\250"+ + "\65\201\12\251\1\303\65\251\1\0\2\253\11\0\1\253"+ + "\1\0\1\253\1\0\1\253\1\0\1\205\6\0\1\253"+ + "\1\0\1\253\1\0\1\205\1\253\5\0\1\253\5\0"+ + "\1\253\3\0\1\253\21\0\25\207\1\304\52\207\1\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\4\7\1\305\22\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\13\7\1\306\13\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\11\7\1\307"+ + "\15\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\4\7\1\310\22\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\6\7\1\311\20\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\10\7\1\312\16\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\16\7\1\313"+ + "\10\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\13\7\1\314\13\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\21\7\1\315\5\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\3\7\1\316\23\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\3\7\1\317"+ + "\23\7\21\0\11\251\1\252\1\303\65\251\25\207\1\320"+ + "\52\207\1\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\5\7\1\321\21\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\1\322\26\7\22\0\2\7\1\0\2\7"+ + "\6\0\3\7\1\0\1\7\1\0\1\7\5\0\10\7"+ + "\1\323\16\7\22\0\2\7\1\0\2\7\6\0\3\7"+ + "\1\0\1\7\1\0\1\7\5\0\1\324\26\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\1\7\1\325\25\7\22\0\2\7\1\0"+ + "\2\7\6\0\3\7\1\0\1\7\1\0\1\7\5\0"+ + "\12\7\1\326\14\7\22\0\2\7\1\0\2\7\6\0"+ + "\3\7\1\0\1\7\1\0\1\7\5\0\6\7\1\327"+ + "\20\7\22\0\2\7\1\0\2\7\6\0\3\7\1\0"+ + "\1\7\1\0\1\7\5\0\3\7\1\330\23\7\22\0"+ + "\2\7\1\0\2\7\6\0\3\7\1\0\1\7\1\0"+ + "\1\7\5\0\3\7\1\331\23\7\21\0"; private static int [] zzUnpackTrans() { - int [] result = new int[8832]; + int [] result = new int[9088]; int offset = 0; offset = zzUnpackTrans(ZZ_TRANS_PACKED_0, offset, result); return result; @@ -464,17 +472,17 @@ class _JetLexer implements FlexLexer { private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = - "\4\0\1\11\15\1\2\11\20\1\1\11\6\1\10\11"+ + "\4\0\1\11\15\1\2\11\21\1\1\11\6\1\10\11"+ "\2\1\1\11\1\0\1\11\1\1\1\0\2\11\1\0"+ "\1\1\1\0\1\1\1\0\1\1\1\0\1\11\2\1"+ - "\2\11\4\1\5\11\1\1\1\0\26\1\1\0\2\1"+ + "\2\11\4\1\5\11\1\1\1\0\27\1\1\0\2\1"+ "\10\11\1\1\1\0\2\11\1\0\1\11\1\1\1\11"+ - "\2\0\2\1\4\0\3\1\1\11\26\1\2\11\1\0"+ - "\3\11\1\0\1\1\1\11\1\1\2\0\21\1\3\11"+ - "\2\0\12\1\1\11\11\1"; + "\2\0\2\1\4\0\3\1\1\11\27\1\2\11\1\0"+ + "\3\11\1\0\1\1\1\11\1\1\2\0\22\1\3\11"+ + "\2\0\13\1\1\11\11\1"; private static int [] zzUnpackAttribute() { - int [] result = new int[212]; + int [] result = new int[217]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; @@ -808,23 +816,23 @@ class _JetLexer implements FlexLexer { case 3: { return JetTokens.IDENTIFIER; } - case 96: break; + case 97: break; case 11: { pushState(STRING); return JetTokens.OPEN_QUOTE; } - case 97: break; + case 98: break; case 70: { return JetTokens.FOR_KEYWORD ; } - case 98: break; - case 93: + case 99: break; + case 94: { return JetTokens.RETURN_KEYWORD ; } - case 99: break; + case 100: break; case 78: { return JetTokens.NULL_KEYWORD ; } - case 100: break; + case 101: break; case 34: { if (lBraceCount == 0) { popState(); @@ -833,365 +841,369 @@ class _JetLexer implements FlexLexer { lBraceCount--; return JetTokens.RBRACE; } - case 101: break; + case 102: break; case 18: { return JetTokens.LT ; } - case 102: break; + case 103: break; case 51: { return JetTokens.DO_KEYWORD ; } - case 103: break; + case 104: break; case 17: { return JetTokens.PLUS ; } - case 104: break; + case 105: break; case 67: { return JetTokens.RAW_STRING_LITERAL; } - case 105: break; + case 106: break; case 55: { return JetTokens.PLUSEQ ; } - case 106: break; + case 107: break; case 27: { return JetTokens.COMMA ; } - case 107: break; + case 108: break; case 19: { return JetTokens.GT ; } - case 108: break; + case 109: break; case 4: { return JetTokens.WHITE_SPACE; } - case 109: break; + case 110: break; case 24: { return JetTokens.RPAR ; } - case 110: break; + case 111: break; case 54: { return JetTokens.DOUBLE_ARROW; } - case 111: break; + case 112: break; case 80: { return JetTokens.TRUE_KEYWORD ; } - case 112: break; + case 113: break; case 36: { return JetTokens.FIELD_IDENTIFIER; } - case 113: break; + case 114: break; case 59: { return JetTokens.ANDAND ; } - case 114: break; + case 115: break; case 63: { pushState(LONG_TEMPLATE_ENTRY); return JetTokens.LONG_TEMPLATE_ENTRY_START; } - case 115: break; + case 116: break; case 66: { return JetTokens.DOC_COMMENT; } - case 116: break; + case 117: break; case 35: { return JetTokens.FLOAT_LITERAL; } - case 117: break; + case 118: break; case 39: { return JetTokens.EOL_COMMENT; } - case 118: break; + case 119: break; case 83: { return JetTokens.WHEN_KEYWORD ; } - case 119: break; + case 120: break; case 25: { return JetTokens.COLON ; } - case 120: break; + case 121: break; case 57: { return JetTokens.LTEQ ; } - case 121: break; + case 122: break; case 46: { return JetTokens.ARROW ; } - case 122: break; + case 123: break; case 32: { popState(); return JetTokens.IDENTIFIER; } - case 123: break; + case 124: break; case 21: { return JetTokens.LBRACKET ; } - case 124: break; + case 125: break; case 65: { yypushback(2); return JetTokens.INTEGER_LITERAL; } - case 125: break; + case 126: break; case 10: { return JetTokens.CHARACTER_LITERAL; } - case 126: break; + case 127: break; case 72: { return JetTokens.VAR_KEYWORD ; } - case 127: break; + case 128: break; case 58: { return JetTokens.GTEQ ; } - case 128: break; + case 129: break; case 2: { return JetTokens.INTEGER_LITERAL; } - case 129: break; + case 130: break; case 13: { return JetTokens.RBRACE ; } - case 130: break; - case 86: + case 131: break; + case 87: { return JetTokens.CLASS_KEYWORD ; } - case 131: break; + case 132: break; case 14: { return JetTokens.EXCL ; } - case 132: break; + case 133: break; case 69: { return JetTokens.TRY_KEYWORD ; } - case 133: break; + case 134: break; case 52: { return JetTokens.EXCLEQ ; } - case 134: break; + case 135: break; case 45: { return JetTokens.MINUSEQ ; } - case 135: break; - case 88: + case 136: break; + case 89: { return JetTokens.THROW_KEYWORD ; } - case 136: break; - case 90: + case 137: break; + case 86: + { return JetTokens.SUPER_KEYWORD ; + } + case 138: break; + case 91: { return JetTokens.WHILE_KEYWORD ; } - case 137: break; + case 139: break; case 44: { return JetTokens.MINUSMINUS; } - case 138: break; - case 94: + case 140: break; + case 95: { return JetTokens.CONTINUE_KEYWORD ; } - case 139: break; + case 141: break; case 74: { return JetTokens.NOT_IN; } - case 140: break; + case 142: break; case 38: { return JetTokens.ATAT ; } - case 141: break; + case 143: break; case 6: { return JetTokens.DIV ; } - case 142: break; + case 144: break; case 37: { return JetTokens.LABEL_IDENTIFIER; } - case 143: break; + case 145: break; case 29: { return JetTokens.REGULAR_STRING_PART; } - case 144: break; + case 146: break; case 16: { return JetTokens.QUEST ; } - case 145: break; + case 147: break; case 60: { return JetTokens.OROR ; } - case 146: break; + case 148: break; case 20: { return JetTokens.PERC ; } - case 147: break; + case 149: break; case 76: { return JetTokens.EXCLEQEQEQ; } - case 148: break; + case 150: break; case 61: { return JetTokens.PERCEQ ; } - case 149: break; + case 151: break; case 43: { return JetTokens.RANGE ; } - case 150: break; + case 152: break; case 1: { return TokenType.BAD_CHARACTER; } - case 151: break; - case 95: + case 153: break; + case 96: { return JetTokens.NAMESPACE_KEYWORD ; } - case 152: break; + case 154: break; case 75: { return JetTokens.NOT_IS; } - case 153: break; + case 155: break; case 7: { return JetTokens.MUL ; } - case 154: break; + case 156: break; case 22: { return JetTokens.RBRACKET ; } - case 155: break; + case 157: break; case 56: { return JetTokens.PLUSPLUS ; } - case 156: break; + case 158: break; case 81: { return JetTokens.THIS_KEYWORD ; } - case 157: break; + case 159: break; case 8: { return JetTokens.DOT ; } - case 158: break; + case 160: break; case 26: { return JetTokens.SEMICOLON ; } - case 159: break; + case 161: break; case 50: { return JetTokens.IF_KEYWORD ; } - case 160: break; + case 162: break; case 64: { return JetTokens.ESCAPE_SEQUENCE; } - case 161: break; + case 163: break; case 31: { popState(); return JetTokens.CLOSING_QUOTE; } - case 162: break; + case 164: break; case 15: { return JetTokens.EQ ; } - case 163: break; + case 165: break; case 5: { return JetTokens.AT ; } - case 164: break; + case 166: break; case 68: { return JetTokens.AS_SAFE; } - case 165: break; + case 167: break; case 23: { return JetTokens.LPAR ; } - case 166: break; + case 168: break; case 9: { return JetTokens.MINUS ; } - case 167: break; - case 91: + case 169: break; + case 92: { return JetTokens.FALSE_KEYWORD ; } - case 168: break; + case 170: break; case 82: { return JetTokens.TYPE_KEYWORD ; } - case 169: break; + case 171: break; case 71: { return JetTokens.FUN_KEYWORD ; } - case 170: break; + case 172: break; case 49: { return JetTokens.IS_KEYWORD ; } - case 171: break; + case 173: break; case 30: { popState(); yypushback(1); return JetTokens.DANGLING_NEWLINE; } - case 172: break; + case 174: break; case 33: { lBraceCount++; return JetTokens.LBRACE; } - case 173: break; + case 175: break; case 85: { yypushback(3); return JetTokens.EXCL; } - case 174: break; + case 176: break; case 41: { return JetTokens.DIVEQ ; } - case 175: break; + case 177: break; case 79: { return JetTokens.ELSE_KEYWORD ; } - case 176: break; + case 178: break; case 47: { return JetTokens.AS_KEYWORD ; } - case 177: break; + case 179: break; case 48: { return JetTokens.IN_KEYWORD ; } - case 178: break; + case 180: break; case 53: { return JetTokens.EQEQ ; } - case 179: break; + case 181: break; case 77: { return JetTokens.EQEQEQ ; } - case 180: break; + case 182: break; case 73: { return JetTokens.VAL_KEYWORD ; } - case 181: break; + case 183: break; case 84: { return JetTokens.CAPITALIZED_THIS_KEYWORD ; } - case 182: break; + case 184: break; case 42: { return JetTokens.MULTEQ ; } - case 183: break; + case 185: break; case 62: { pushState(SHORT_TEMPLATE_ENTRY); yypushback(yylength() - 1); return JetTokens.SHORT_TEMPLATE_ENTRY_START; } - case 184: break; + case 186: break; case 12: { return JetTokens.LBRACE ; } - case 185: break; - case 92: + case 187: break; + case 93: { return JetTokens.OBJECT_KEYWORD ; } - case 186: break; - case 89: + case 188: break; + case 90: { return JetTokens.BREAK_KEYWORD ; } - case 187: break; + case 189: break; case 40: { return JetTokens.BLOCK_COMMENT; } - case 188: break; - case 87: + case 190: break; + case 88: { return JetTokens.TRAIT_KEYWORD ; } - case 189: break; + case 191: break; case 28: { return JetTokens.HASH ; } - case 190: break; + case 192: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; diff --git a/grammar/src/class.grm b/grammar/src/class.grm index 8bf1e016edd..56cd2938ad0 100644 --- a/grammar/src/class.grm +++ b/grammar/src/class.grm @@ -19,7 +19,7 @@ internal class Example>(protected val x : Foo, y : So class : modifiers ("class" | "trait") SimpleName typeParameters? - modifiers ("(" primaryConstructorParameter{","} ")")? + modifiers ("(" functionParameter{","} ")")? (":" annotations delegationSpecifier{","})? typeConstraints (classBody? | enumClassBody) diff --git a/grammar/src/expressions.grm b/grammar/src/expressions.grm index fafe44f37f0..af07f14c2e9 100644 --- a/grammar/src/expressions.grm +++ b/grammar/src/expressions.grm @@ -16,7 +16,7 @@ h3. Precedence | |Elvis|{{?:}} | | |Named checks|{{in}}, {{\!in}}, {{is}}, {{\!is}} | | |Comparison|{{<}}, {{>}}, {{<=}}, {{>=}} | -| |Equality|{{==}}, {{\!==}}, {{===}}, {{\!===}} | +| |Equality|{{==}}, {{\!==}}| | |Conjunction|{{&&}}| | |Disjunction|{{\|\|}}| | |Arrow|{{\->}}| @@ -113,7 +113,8 @@ atomicExpression : literalConstant : functionLiteral : tupleLiteral - : "this" label? ("<" type ">")? + : "this" label? + : "super" ("<" type ">")? label? : if : when : try @@ -184,7 +185,7 @@ comparisonOperation ; equalityOperation - : "!=" : "==" : "===" : "!==" + : "!=" : "==" ; assignmentOperator diff --git a/idea/testData/checkerWithErrorTypes/quick/Super.jet b/idea/testData/checkerWithErrorTypes/quick/Super.jet new file mode 100644 index 00000000000..4fdbd177e85 --- /dev/null +++ b/idea/testData/checkerWithErrorTypes/quick/Super.jet @@ -0,0 +1,49 @@ +namespace example; + +trait T { + fun foo() {} +} +open class C() { + fun bar() {} +} + +class A() : C(), T { + + fun test() { + super + super + super.foo() + super.foo() + super.bar() + super@A.foo() + super@A.bar() + super<E>.bar() + super<E>@A.bar() + super<Int>.foo() + super<>.foo() + super<fun() : Unit>.foo() + super<()>.foo() + super@B.foo() + super@B.bar() + } + + class B : T { + fun test() { + super.foo(); + super<C>.bar() + super@A.bar() + super@A.foo() + super@B.foo() + super<C>@B.foo() + super.foo() + super + super + } + } +} + +fun foo() { + super + super.foo() + super.foo() +} \ No newline at end of file diff --git a/idea/testData/psi/Labels.jet b/idea/testData/psi/Labels.jet index 57f1eb85da4..43299ecec35 100644 --- a/idea/testData/psi/Labels.jet +++ b/idea/testData/psi/Labels.jet @@ -53,8 +53,8 @@ fun foo() { this@a this@@ - this - this@ - this@a - this@@ + super + super@ + super@a + super@@ } \ No newline at end of file diff --git a/idea/testData/psi/Labels.txt b/idea/testData/psi/Labels.txt index 23a51e07506..118356f871c 100644 --- a/idea/testData/psi/Labels.txt +++ b/idea/testData/psi/Labels.txt @@ -412,9 +412,9 @@ JetFile: Labels.jet LABEL_REFERENCE PsiElement(ATAT)('@@') PsiWhiteSpace('\n\n ') - THIS_EXPRESSION + SUPER_EXPRESSION REFERENCE_EXPRESSION - PsiElement(this)('this') + PsiElement(super)('super') PsiElement(LT)('<') TYPE_REFERENCE USER_TYPE @@ -422,43 +422,43 @@ JetFile: Labels.jet PsiElement(IDENTIFIER)('A') PsiElement(GT)('>') PsiWhiteSpace('\n ') - THIS_EXPRESSION + SUPER_EXPRESSION REFERENCE_EXPRESSION - PsiElement(this)('this') + PsiElement(super)('super') + PsiElement(LT)('<') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('A') + PsiElement(GT)('>') LABEL_QUALIFIER LABEL_REFERENCE PsiElement(AT)('@') + PsiWhiteSpace('\n ') + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') PsiElement(LT)('<') TYPE_REFERENCE USER_TYPE REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('A') PsiElement(GT)('>') - PsiWhiteSpace('\n ') - THIS_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(this)('this') LABEL_QUALIFIER LABEL_REFERENCE PsiElement(LABEL_IDENTIFIER)('@a') + PsiWhiteSpace('\n ') + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') PsiElement(LT)('<') TYPE_REFERENCE USER_TYPE REFERENCE_EXPRESSION PsiElement(IDENTIFIER)('A') PsiElement(GT)('>') - PsiWhiteSpace('\n ') - THIS_EXPRESSION - REFERENCE_EXPRESSION - PsiElement(this)('this') LABEL_QUALIFIER LABEL_REFERENCE PsiElement(ATAT)('@@') - PsiElement(LT)('<') - TYPE_REFERENCE - USER_TYPE - REFERENCE_EXPRESSION - PsiElement(IDENTIFIER)('A') - PsiElement(GT)('>') PsiWhiteSpace('\n') PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/idea/testData/psi/SimpleExpressions.jet b/idea/testData/psi/SimpleExpressions.jet index 2bdebc0f908..a3969d2b230 100644 --- a/idea/testData/psi/SimpleExpressions.jet +++ b/idea/testData/psi/SimpleExpressions.jet @@ -15,7 +15,7 @@ fun a( a : foo = false, a : foo = null, a : foo = this, - a : foo = this, + a : foo = super, a : foo = (10), a : foo = (10, "A", 0xf), a : foo = Foo(bar), diff --git a/idea/testData/psi/SimpleExpressions.txt b/idea/testData/psi/SimpleExpressions.txt index 077ad384866..16219eac0b0 100644 --- a/idea/testData/psi/SimpleExpressions.txt +++ b/idea/testData/psi/SimpleExpressions.txt @@ -280,9 +280,9 @@ JetFile: SimpleExpressions.jet PsiWhiteSpace(' ') PsiElement(EQ)('=') PsiWhiteSpace(' ') - THIS_EXPRESSION + SUPER_EXPRESSION REFERENCE_EXPRESSION - PsiElement(this)('this') + PsiElement(super)('super') PsiElement(LT)('<') TYPE_REFERENCE USER_TYPE diff --git a/idea/testData/psi/Super.jet b/idea/testData/psi/Super.jet new file mode 100644 index 00000000000..8b024506722 --- /dev/null +++ b/idea/testData/psi/Super.jet @@ -0,0 +1,7 @@ +// KT-156 Fix the this syntax +fun foo() { + super.foo(); + super.foo(); + super<>.foo(); + super@label.foo(); +} \ No newline at end of file diff --git a/idea/testData/psi/Super.txt b/idea/testData/psi/Super.txt new file mode 100644 index 00000000000..c9cd569dcaa --- /dev/null +++ b/idea/testData/psi/Super.txt @@ -0,0 +1,88 @@ +JetFile: Super.jet + PsiComment(EOL_COMMENT)('// KT-156 Fix the this syntax') + PsiWhiteSpace('\n') + NAMESPACE + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') + PsiElement(LT)('<') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(GT)('>') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') + PsiElement(LT)('<') + TYPE_REFERENCE + PsiErrorElement:Type expected + + PsiElement(GT)('>') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n ') + DOT_QUALIFIED_EXPRESSION + SUPER_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(super)('super') + PsiElement(LT)('<') + TYPE_REFERENCE + USER_TYPE + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('Int') + PsiElement(GT)('>') + LABEL_QUALIFIER + LABEL_REFERENCE + PsiElement(LABEL_IDENTIFIER)('@label') + PsiElement(DOT)('.') + CALL_EXPRESSION + REFERENCE_EXPRESSION + PsiElement(IDENTIFIER)('foo') + VALUE_ARGUMENT_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiElement(SEMICOLON)(';') + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') \ No newline at end of file diff --git a/idea/testData/resolve/Super.jet b/idea/testData/resolve/Super.jet new file mode 100644 index 00000000000..11a8083f538 --- /dev/null +++ b/idea/testData/resolve/Super.jet @@ -0,0 +1,26 @@ +~T~trait T { + fun foo() {} +} +~C~open class C() { + fun bar() {} +} + +~A~class A() : C(), T { + + fun test() { + `T`super.foo() + `C`super.bar() + `T`super@A.foo() + `C`super@A.bar() + } + + class B : T { + fun test() { + `T`super.foo(); + `C`super@A.bar() + `T`super@A.foo() + `T`super@B.foo() + `T`super.foo() + } + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java index 72d9bdcbffe..148d5335e6c 100644 --- a/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java +++ b/idea/tests/org/jetbrains/jet/types/JetTypeCheckerTest.java @@ -310,7 +310,7 @@ public class JetTypeCheckerTest extends LightDaemonAnalyzerTestCase { public void testThis() throws Exception { assertType("Derived_T", "this", "Derived_T"); - assertType("Derived_T", "this", "Base_T"); + assertType("Derived_T", "super", "Base_T"); } public void testLoops() throws Exception {