From 5b0eb5f4a7ea31e9532c6f0a828cd8faa9167341 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 6 Sep 2011 18:09:11 +0400 Subject: [PATCH] "trait" modifier supported --- .../jet/lang/descriptors/ClassDescriptor.java | 2 ++ .../lang/descriptors/ClassDescriptorImpl.java | 5 +++++ .../LazySubstitutingClassDescriptor.java | 5 +++++ .../descriptors/MutableClassDescriptor.java | 10 +++++++++ .../lang/resolve/ClassDescriptorResolver.java | 1 + .../resolve/java/JavaClassDescriptor.java | 22 +++++++++++++++---- .../resolve/java/JavaDescriptorResolver.java | 5 +++++ .../org/jetbrains/jet/lexer/JetTokens.java | 5 +++-- .../jet/resolve/DescriptorRenderer.java | 2 +- 9 files changed, 50 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java index 7e351cde8bc..004e900923e 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptor.java @@ -47,4 +47,6 @@ public interface ClassDescriptor extends ClassifierDescriptor { boolean isAbstract(); boolean isOpen(); + + boolean isTrait(); } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java index 6b29bae2742..8e9407c092e 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/ClassDescriptorImpl.java @@ -125,4 +125,9 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl public boolean isOpen() { return false; } + + @Override + public boolean isTrait() { + return false; + } } diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java index 4de2514e1be..10193133e74 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/LazySubstitutingClassDescriptor.java @@ -149,6 +149,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor { return original.isOpen(); } + @Override + public boolean isTrait() { + return original.isTrait(); + } + @Override public boolean isClassObjectAValue() { return original.isClassObjectAValue(); diff --git a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java index 9161d9b0014..bd99d0e794c 100644 --- a/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/descriptors/MutableClassDescriptor.java @@ -24,6 +24,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme private boolean open; private boolean isAbstract; + private boolean trait; private TypeConstructor typeConstructor; private final WritableScope scopeForMemberResolution; private final WritableScope scopeForMemberLookup; @@ -151,6 +152,15 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme this.isAbstract = isAbstract; } + @Override + public boolean isTrait() { + return trait; + } + + public void setTrait(boolean trait) { + this.trait = trait; + } + public boolean isOpen() { return open; } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java index b296e46e583..bfeb02bd50f 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/ClassDescriptorResolver.java @@ -147,6 +147,7 @@ public class ClassDescriptorResolver { descriptor.setOpen(classElement.hasModifier(JetTokens.OPEN_KEYWORD) || classElement.hasModifier(JetTokens.ABSTRACT_KEYWORD)); descriptor.setAbstract(classElement.hasModifier(JetTokens.ABSTRACT_KEYWORD)); + descriptor.setTrait(classElement.hasModifier(JetTokens.TRAIT_KEYWORD)); trace.record(BindingContext.CLASS, classElement, descriptor); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java index 98ed1b2be9d..c13ba2a44fa 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaClassDescriptor.java @@ -20,6 +20,9 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements private JavaClassMembersScope unsubstitutedMemberScope; private JetType classObjectType; private final WritableFunctionGroup constructors = new WritableFunctionGroup(""); + private boolean isAbstract; + private boolean isOpen; + private boolean isTrait; public JavaClassDescriptor(DeclarationDescriptor containingDeclaration) { super(containingDeclaration); @@ -29,6 +32,12 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements this.typeConstructor = typeConstructor; } + public void setModifiers(boolean isAbstract, boolean isOpen, boolean isTrait) { + this.isAbstract = isAbstract; + this.isOpen = isOpen; + this.isTrait = isTrait; + } + public void setUnsubstitutedMemberScope(JavaClassMembersScope memberScope) { this.unsubstitutedMemberScope = memberScope; } @@ -110,6 +119,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements return classObjectType; } + @Override + public boolean isClassObjectAValue() { + return false; + } + @Override public boolean isObject() { return false; @@ -117,17 +131,17 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements @Override public boolean isAbstract() { - return false; + return isAbstract; } @Override public boolean isOpen() { - return false; + return isOpen; } @Override - public boolean isClassObjectAValue() { - return false; + public boolean isTrait() { + return isTrait; } @Override diff --git a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index 3c3b4dea8d2..093c93f7a74 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -106,6 +106,11 @@ public class JavaDescriptorResolver { supertypes )); + classDescriptor.setModifiers( + psiClass.hasModifierProperty(PsiModifier.ABSTRACT), + !psiClass.hasModifierProperty(PsiModifier.FINAL), + psiClass.isInterface() + ); classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor); classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false)); classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true)); diff --git a/idea/src/org/jetbrains/jet/lexer/JetTokens.java b/idea/src/org/jetbrains/jet/lexer/JetTokens.java index 818b9860135..f6651c2c4c2 100644 --- a/idea/src/org/jetbrains/jet/lexer/JetTokens.java +++ b/idea/src/org/jetbrains/jet/lexer/JetTokens.java @@ -136,6 +136,7 @@ public interface JetTokens { JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected"); JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch"); JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out"); + JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.softKeyword("trait"); JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally"); @@ -154,12 +155,12 @@ public interface JetTokens { TokenSet SOFT_KEYWORDS = TokenSet.create(WRAPS_KEYWORD, IMPORT_KEYWORD, WHERE_KEYWORD, BY_KEYWORD, GET_KEYWORD, SET_KEYWORD, ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_KEYWORD, - CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD + CATCH_KEYWORD, FINALLY_KEYWORD, REF_KEYWORD, OUT_KEYWORD, TRAIT_KEYWORD ); TokenSet MODIFIER_KEYWORDS = TokenSet.create(ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, - PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD + PROTECTED_KEYWORD, REF_KEYWORD, OUT_KEYWORD, IN_KEYWORD, TRAIT_KEYWORD ); TokenSet WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT); TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE); diff --git a/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java b/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java index 8f2028f98e7..d76ae4e600b 100644 --- a/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java +++ b/idea/src/org/jetbrains/jet/resolve/DescriptorRenderer.java @@ -251,7 +251,7 @@ public class DescriptorRenderer { @Override public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) { - String keyword = "class"; + String keyword = descriptor.isTrait() ? "trait class" : "class"; renderClassDescriptor(descriptor, builder, keyword); return super.visitClassDescriptor(descriptor, builder); }