"trait" modifier supported
This commit is contained in:
@@ -47,4 +47,6 @@ public interface ClassDescriptor extends ClassifierDescriptor {
|
|||||||
boolean isAbstract();
|
boolean isAbstract();
|
||||||
|
|
||||||
boolean isOpen();
|
boolean isOpen();
|
||||||
|
|
||||||
|
boolean isTrait();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,4 +125,9 @@ public class ClassDescriptorImpl extends DeclarationDescriptorImpl implements Cl
|
|||||||
public boolean isOpen() {
|
public boolean isOpen() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTrait() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -149,6 +149,11 @@ public class LazySubstitutingClassDescriptor implements ClassDescriptor {
|
|||||||
return original.isOpen();
|
return original.isOpen();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTrait() {
|
||||||
|
return original.isTrait();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isClassObjectAValue() {
|
public boolean isClassObjectAValue() {
|
||||||
return original.isClassObjectAValue();
|
return original.isClassObjectAValue();
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
|
|||||||
|
|
||||||
private boolean open;
|
private boolean open;
|
||||||
private boolean isAbstract;
|
private boolean isAbstract;
|
||||||
|
private boolean trait;
|
||||||
private TypeConstructor typeConstructor;
|
private TypeConstructor typeConstructor;
|
||||||
private final WritableScope scopeForMemberResolution;
|
private final WritableScope scopeForMemberResolution;
|
||||||
private final WritableScope scopeForMemberLookup;
|
private final WritableScope scopeForMemberLookup;
|
||||||
@@ -151,6 +152,15 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
|
|||||||
this.isAbstract = isAbstract;
|
this.isAbstract = isAbstract;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isTrait() {
|
||||||
|
return trait;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrait(boolean trait) {
|
||||||
|
this.trait = trait;
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isOpen() {
|
public boolean isOpen() {
|
||||||
return open;
|
return open;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -147,6 +147,7 @@ public class ClassDescriptorResolver {
|
|||||||
|
|
||||||
descriptor.setOpen(classElement.hasModifier(JetTokens.OPEN_KEYWORD) || classElement.hasModifier(JetTokens.ABSTRACT_KEYWORD));
|
descriptor.setOpen(classElement.hasModifier(JetTokens.OPEN_KEYWORD) || classElement.hasModifier(JetTokens.ABSTRACT_KEYWORD));
|
||||||
descriptor.setAbstract(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);
|
trace.record(BindingContext.CLASS, classElement, descriptor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,9 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
|
|||||||
private JavaClassMembersScope unsubstitutedMemberScope;
|
private JavaClassMembersScope unsubstitutedMemberScope;
|
||||||
private JetType classObjectType;
|
private JetType classObjectType;
|
||||||
private final WritableFunctionGroup constructors = new WritableFunctionGroup("<init>");
|
private final WritableFunctionGroup constructors = new WritableFunctionGroup("<init>");
|
||||||
|
private boolean isAbstract;
|
||||||
|
private boolean isOpen;
|
||||||
|
private boolean isTrait;
|
||||||
|
|
||||||
public JavaClassDescriptor(DeclarationDescriptor containingDeclaration) {
|
public JavaClassDescriptor(DeclarationDescriptor containingDeclaration) {
|
||||||
super(containingDeclaration);
|
super(containingDeclaration);
|
||||||
@@ -29,6 +32,12 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
|
|||||||
this.typeConstructor = typeConstructor;
|
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) {
|
public void setUnsubstitutedMemberScope(JavaClassMembersScope memberScope) {
|
||||||
this.unsubstitutedMemberScope = memberScope;
|
this.unsubstitutedMemberScope = memberScope;
|
||||||
}
|
}
|
||||||
@@ -110,6 +119,11 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
|
|||||||
return classObjectType;
|
return classObjectType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isClassObjectAValue() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isObject() {
|
public boolean isObject() {
|
||||||
return false;
|
return false;
|
||||||
@@ -117,17 +131,17 @@ public class JavaClassDescriptor extends MutableDeclarationDescriptor implements
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isAbstract() {
|
public boolean isAbstract() {
|
||||||
return false;
|
return isAbstract;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isOpen() {
|
public boolean isOpen() {
|
||||||
return false;
|
return isOpen;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isClassObjectAValue() {
|
public boolean isTrait() {
|
||||||
return false;
|
return isTrait;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -106,6 +106,11 @@ public class JavaDescriptorResolver {
|
|||||||
supertypes
|
supertypes
|
||||||
|
|
||||||
));
|
));
|
||||||
|
classDescriptor.setModifiers(
|
||||||
|
psiClass.hasModifierProperty(PsiModifier.ABSTRACT),
|
||||||
|
!psiClass.hasModifierProperty(PsiModifier.FINAL),
|
||||||
|
psiClass.isInterface()
|
||||||
|
);
|
||||||
classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
|
classDescriptorCache.put(psiClass.getQualifiedName(), classDescriptor);
|
||||||
classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
|
classDescriptor.setUnsubstitutedMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, false));
|
||||||
classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true));
|
classDescriptor.setClassObjectMemberScope(new JavaClassMembersScope(classDescriptor, psiClass, semanticServices, true));
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ public interface JetTokens {
|
|||||||
JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected");
|
JetKeywordToken PROTECTED_KEYWORD = JetKeywordToken.softKeyword("protected");
|
||||||
JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch");
|
JetKeywordToken CATCH_KEYWORD = JetKeywordToken.softKeyword("catch");
|
||||||
JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out");
|
JetKeywordToken OUT_KEYWORD = JetKeywordToken.softKeyword("out");
|
||||||
|
JetKeywordToken TRAIT_KEYWORD = JetKeywordToken.softKeyword("trait");
|
||||||
|
|
||||||
JetKeywordToken FINALLY_KEYWORD = JetKeywordToken.softKeyword("finally");
|
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,
|
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,
|
SET_KEYWORD, ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD, OPEN_KEYWORD, ATTRIBUTE_KEYWORD,
|
||||||
OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_KEYWORD, PROTECTED_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,
|
TokenSet MODIFIER_KEYWORDS = TokenSet.create(ABSTRACT_KEYWORD, VIRTUAL_KEYWORD, ENUM_KEYWORD,
|
||||||
OPEN_KEYWORD, ATTRIBUTE_KEYWORD, OVERRIDE_KEYWORD, PRIVATE_KEYWORD, PUBLIC_KEYWORD, INTERNAL_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 WHITE_SPACE_OR_COMMENT_BIT_SET = TokenSet.create(WHITE_SPACE, BLOCK_COMMENT, EOL_COMMENT, DOC_COMMENT);
|
||||||
TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
|
TokenSet WHITESPACES = TokenSet.create(TokenType.WHITE_SPACE);
|
||||||
|
|||||||
@@ -251,7 +251,7 @@ public class DescriptorRenderer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) {
|
public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) {
|
||||||
String keyword = "class";
|
String keyword = descriptor.isTrait() ? "trait class" : "class";
|
||||||
renderClassDescriptor(descriptor, builder, keyword);
|
renderClassDescriptor(descriptor, builder, keyword);
|
||||||
return super.visitClassDescriptor(descriptor, builder);
|
return super.visitClassDescriptor(descriptor, builder);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user