"trait" modifier supported

This commit is contained in:
Andrey Breslav
2011-09-06 18:09:11 +04:00
parent 6158c30690
commit 5b0eb5f4a7
9 changed files with 50 additions and 7 deletions
@@ -47,4 +47,6 @@ public interface ClassDescriptor extends ClassifierDescriptor {
boolean isAbstract();
boolean isOpen();
boolean isTrait();
}
@@ -125,4 +125,9 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
public boolean isOpen() {
return false;
}
@Override
public boolean isTrait() {
return false;
}
}
@@ -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();
@@ -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;
}
@@ -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);
}
@@ -20,6 +20,9 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
private JavaClassMembersScope unsubstitutedMemberScope;
private JetType classObjectType;
private final WritableFunctionGroup constructors = new WritableFunctionGroup("<init>");
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
@@ -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));
@@ -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);
@@ -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);
}