rollback -resolveModifiers() method location
This commit is contained in:
@@ -1,10 +1,5 @@
|
|||||||
package org.jetbrains.jet.lang.descriptors;
|
package org.jetbrains.jet.lang.descriptors;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetModifierList;
|
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author svtk
|
* @author svtk
|
||||||
*/
|
*/
|
||||||
@@ -28,13 +23,5 @@ public class ClassModifiers extends Modifiers {
|
|||||||
return trait;
|
return trait;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ClassModifiers resolveModifiers(@Nullable JetModifierList modifierList) {
|
|
||||||
if (modifierList == null) return DEFAULT_MODIFIERS;
|
|
||||||
return new ClassModifiers(
|
|
||||||
modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
|
||||||
modifierList.hasModifier(JetTokens.OPEN_KEYWORD) || modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
|
||||||
modifierList.hasModifier(JetTokens.TRAIT_KEYWORD)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,5 @@
|
|||||||
package org.jetbrains.jet.lang.descriptors;
|
package org.jetbrains.jet.lang.descriptors;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
import org.jetbrains.jet.lang.psi.JetModifierList;
|
|
||||||
import org.jetbrains.jet.lexer.JetTokens;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
@@ -32,19 +27,4 @@ public class MemberModifiers extends Modifiers {
|
|||||||
public boolean isOverridable() {
|
public boolean isOverridable() {
|
||||||
return isAbstract() || isVirtual() || isOverride();
|
return isAbstract() || isVirtual() || isOverride();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static MemberModifiers resolveModifiers(@Nullable JetModifierList modifierList) {
|
|
||||||
return resolveModifiers(modifierList, DEFAULT_MODIFIERS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NotNull
|
|
||||||
public static MemberModifiers resolveModifiers(@Nullable JetModifierList modifierList, @NotNull MemberModifiers defaultModifiers) {
|
|
||||||
if (modifierList == null) return defaultModifiers;
|
|
||||||
return new MemberModifiers(
|
|
||||||
modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
|
||||||
modifierList.hasModifier(JetTokens.VIRTUAL_KEYWORD),
|
|
||||||
modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,6 @@ import java.util.*;
|
|||||||
* @author abreslav
|
* @author abreslav
|
||||||
*/
|
*/
|
||||||
public class ClassDescriptorResolver {
|
public class ClassDescriptorResolver {
|
||||||
|
|
||||||
// private static final MemberModifiers DEFAULT_MODIFIERS = new MemberModifiers(false, false, false);
|
|
||||||
|
|
||||||
private final JetSemanticServices semanticServices;
|
private final JetSemanticServices semanticServices;
|
||||||
private final TypeResolver typeResolver;
|
private final TypeResolver typeResolver;
|
||||||
private final TypeResolver typeResolverNotCheckingBounds;
|
private final TypeResolver typeResolverNotCheckingBounds;
|
||||||
@@ -144,7 +141,7 @@ public class ClassDescriptorResolver {
|
|||||||
index++;
|
index++;
|
||||||
}
|
}
|
||||||
descriptor.setTypeParameterDescriptors(typeParameters);
|
descriptor.setTypeParameterDescriptors(typeParameters);
|
||||||
descriptor.setClassModifiers(ClassModifiers.resolveModifiers(classElement.getModifierList()));
|
descriptor.setClassModifiers(resolveClassModifiers(classElement.getModifierList()));
|
||||||
|
|
||||||
trace.record(BindingContext.CLASS, classElement, descriptor);
|
trace.record(BindingContext.CLASS, classElement, descriptor);
|
||||||
}
|
}
|
||||||
@@ -230,7 +227,7 @@ public class ClassDescriptorResolver {
|
|||||||
typeParameterDescriptors,
|
typeParameterDescriptors,
|
||||||
valueParameterDescriptors,
|
valueParameterDescriptors,
|
||||||
returnType,
|
returnType,
|
||||||
MemberModifiers.resolveModifiers(function.getModifierList()));
|
resolveMemberModifiers(function.getModifierList()));
|
||||||
|
|
||||||
trace.record(BindingContext.FUNCTION, function, functionDescriptor);
|
trace.record(BindingContext.FUNCTION, function, functionDescriptor);
|
||||||
return functionDescriptor;
|
return functionDescriptor;
|
||||||
@@ -463,7 +460,7 @@ public class ClassDescriptorResolver {
|
|||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
containingDeclaration,
|
containingDeclaration,
|
||||||
annotationResolver.createAnnotationStubs(modifierList),
|
annotationResolver.createAnnotationStubs(modifierList),
|
||||||
MemberModifiers.resolveModifiers(modifierList), // TODO : default modifiers differ in different contexts
|
resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts
|
||||||
false,
|
false,
|
||||||
null,
|
null,
|
||||||
JetPsiUtil.safeName(objectDeclaration.getName()),
|
JetPsiUtil.safeName(objectDeclaration.getName()),
|
||||||
@@ -513,7 +510,7 @@ public class ClassDescriptorResolver {
|
|||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
containingDeclaration,
|
containingDeclaration,
|
||||||
annotationResolver.resolveAnnotations(scope, modifierList),
|
annotationResolver.resolveAnnotations(scope, modifierList),
|
||||||
MemberModifiers.resolveModifiers(modifierList), // TODO : default modifiers differ in different contexts
|
resolveMemberModifiers(modifierList), // TODO : default modifiers differ in different contexts
|
||||||
isVar,
|
isVar,
|
||||||
receiverType,
|
receiverType,
|
||||||
JetPsiUtil.safeName(property.getName()),
|
JetPsiUtil.safeName(property.getName()),
|
||||||
@@ -559,6 +556,30 @@ public class ClassDescriptorResolver {
|
|||||||
return typeResolver.resolveType(scope, propertyTypeRef);
|
return typeResolver.resolveType(scope, propertyTypeRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ClassModifiers resolveClassModifiers(@Nullable JetModifierList modifierList) {
|
||||||
|
if (modifierList == null) return ClassModifiers.DEFAULT_MODIFIERS;
|
||||||
|
return new ClassModifiers(
|
||||||
|
modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
||||||
|
modifierList.hasModifier(JetTokens.OPEN_KEYWORD) || modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
||||||
|
modifierList.hasModifier(JetTokens.TRAIT_KEYWORD)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList, @NotNull MemberModifiers defaultModifiers) {
|
||||||
|
if (modifierList == null) return defaultModifiers;
|
||||||
|
return new MemberModifiers(
|
||||||
|
modifierList.hasModifier(JetTokens.ABSTRACT_KEYWORD),
|
||||||
|
modifierList.hasModifier(JetTokens.VIRTUAL_KEYWORD),
|
||||||
|
modifierList.hasModifier(JetTokens.OVERRIDE_KEYWORD)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
private MemberModifiers resolveMemberModifiers(@Nullable JetModifierList modifierList) {
|
||||||
|
return resolveMemberModifiers(modifierList, MemberModifiers.DEFAULT_MODIFIERS);
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) {
|
private PropertySetterDescriptor resolvePropertySetterDescriptor(@NotNull JetScope scope, @NotNull JetProperty property, @NotNull PropertyDescriptor propertyDescriptor) {
|
||||||
@@ -569,7 +590,7 @@ public class ClassDescriptorResolver {
|
|||||||
JetParameter parameter = setter.getParameter();
|
JetParameter parameter = setter.getParameter();
|
||||||
|
|
||||||
setterDescriptor = new PropertySetterDescriptor(
|
setterDescriptor = new PropertySetterDescriptor(
|
||||||
MemberModifiers.resolveModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts
|
resolveMemberModifiers(setter.getModifierList()), // TODO : default modifiers differ in different contexts
|
||||||
propertyDescriptor, annotations, setter.getBodyExpression() != null, false);
|
propertyDescriptor, annotations, setter.getBodyExpression() != null, false);
|
||||||
if (parameter != null) {
|
if (parameter != null) {
|
||||||
if (parameter.isRef()) {
|
if (parameter.isRef()) {
|
||||||
@@ -633,7 +654,7 @@ public class ClassDescriptorResolver {
|
|||||||
}
|
}
|
||||||
|
|
||||||
getterDescriptor = new PropertyGetterDescriptor(
|
getterDescriptor = new PropertyGetterDescriptor(
|
||||||
MemberModifiers.resolveModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts
|
resolveMemberModifiers(getter.getModifierList()), // TODO : default modifiers differ in different contexts
|
||||||
propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false);
|
propertyDescriptor, annotations, returnType, getter.getBodyExpression() != null, false);
|
||||||
trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor);
|
trace.record(BindingContext.PROPERTY_ACCESSOR, getter, getterDescriptor);
|
||||||
}
|
}
|
||||||
@@ -708,7 +729,7 @@ public class ClassDescriptorResolver {
|
|||||||
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(
|
||||||
classDescriptor,
|
classDescriptor,
|
||||||
annotationResolver.resolveAnnotations(scope, modifierList),
|
annotationResolver.resolveAnnotations(scope, modifierList),
|
||||||
MemberModifiers.resolveModifiers(modifierList),
|
resolveMemberModifiers(modifierList),
|
||||||
isMutable,
|
isMutable,
|
||||||
null,
|
null,
|
||||||
name == null ? "<no name>" : name,
|
name == null ? "<no name>" : name,
|
||||||
|
|||||||
@@ -451,7 +451,7 @@ public class TopDownAnalyzer {
|
|||||||
@Override
|
@Override
|
||||||
public void visitNamedFunction(JetNamedFunction function) {
|
public void visitNamedFunction(JetNamedFunction function) {
|
||||||
FunctionDescriptorImpl functionDescriptor = classDescriptorResolver.resolveFunctionDescriptor(namespaceLike, scope, function);
|
FunctionDescriptorImpl functionDescriptor = classDescriptorResolver.resolveFunctionDescriptor(namespaceLike, scope, function);
|
||||||
checkFunctionCorrectness(function, functionDescriptor, namespaceLike);
|
checkFunction(function, functionDescriptor, namespaceLike);
|
||||||
namespaceLike.addFunctionDescriptor(functionDescriptor);
|
namespaceLike.addFunctionDescriptor(functionDescriptor);
|
||||||
functions.put(function, functionDescriptor);
|
functions.put(function, functionDescriptor);
|
||||||
declaringScopes.put(function, scope);
|
declaringScopes.put(function, scope);
|
||||||
@@ -550,14 +550,31 @@ public class TopDownAnalyzer {
|
|||||||
private void bindOverridesInAClass(MutableClassDescriptor classDescriptor) {
|
private void bindOverridesInAClass(MutableClassDescriptor classDescriptor) {
|
||||||
|
|
||||||
for (FunctionDescriptor declaredFunction : classDescriptor.getFunctions()) {
|
for (FunctionDescriptor declaredFunction : classDescriptor.getFunctions()) {
|
||||||
|
// JetFunction function = (JetFunction) trace.get(BindingContext.DESCRIPTOR_TO_DECLARATION, declaredFunction);
|
||||||
|
// boolean isOverride = declaredFunction.getModifiers().isOverride();
|
||||||
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype);
|
FunctionDescriptor overridden = findFunctionOverridableBy(declaredFunction, supertype);
|
||||||
if (overridden != null) {
|
if (overridden != null) {
|
||||||
|
// if (isOverride && !overridden.getModifiers().isOverridable()) {
|
||||||
|
// trace.getErrorHandler().genericError(function.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD),
|
||||||
|
// "Method " + overridden.getName() + " in " + overridden.getContainingDeclaration().getName() + " is final and can not be overridden");
|
||||||
|
// isOverride = false;
|
||||||
|
// }
|
||||||
((FunctionDescriptorImpl) declaredFunction).addOverriddenFunction(overridden);
|
((FunctionDescriptorImpl) declaredFunction).addOverriddenFunction(overridden);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
// if (declaredFunction.getModifiers().isOverride() && declaredFunction.getOverriddenDescriptors().size() == 0) {
|
||||||
}
|
// trace.getErrorHandler().genericError(function.getModifierList().getModifierNode(JetTokens.OVERRIDE_KEYWORD),
|
||||||
|
// "Method " + declaredFunction.getName() + " overrides nothing");
|
||||||
|
}
|
||||||
|
// if (!declaredFunction.getModifiers().isOverride() && declaredFunction.getOverriddenDescriptors().size() > 0) {
|
||||||
|
// FunctionDescriptor overriddenMethod = declaredFunction.getOverriddenDescriptors().iterator().next();
|
||||||
|
// trace.getErrorHandler().genericError(function.getNameIdentifier().getNode(),
|
||||||
|
// "Method " + declaredFunction.getName() + " overrides method " + overriddenMethod.getName() + " in class " +
|
||||||
|
// overriddenMethod.getContainingDeclaration().getName() + " and needs 'override' modifier");
|
||||||
|
}
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private FunctionDescriptor findFunctionOverridableBy(@NotNull FunctionDescriptor declaredFunction, @NotNull JetType supertype) {
|
private FunctionDescriptor findFunctionOverridableBy(@NotNull FunctionDescriptor declaredFunction, @NotNull JetType supertype) {
|
||||||
@@ -916,11 +933,6 @@ public class TopDownAnalyzer {
|
|||||||
if (setter != null && setterDescriptor != null) {
|
if (setter != null && setterDescriptor != null) {
|
||||||
resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope);
|
resolveFunctionBody(fieldAccessTrackingTrace, setter, setterDescriptor, accessorScope);
|
||||||
}
|
}
|
||||||
|
|
||||||
// JetExpression initializer = property.getInitializer();
|
|
||||||
// if (!property.isVar() && initializer != null && !trace.getBindingContext().get(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor)) {
|
|
||||||
// trace.getErrorHandler().genericError(initializer.getNode(), "Initializer is not allowed here because this property has no setter and no backing field either");
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor, @Nullable ClassDescriptor classDescriptor) {
|
protected void checkProperty(JetProperty property, PropertyDescriptor propertyDescriptor, @Nullable ClassDescriptor classDescriptor) {
|
||||||
@@ -968,7 +980,7 @@ public class TopDownAnalyzer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void checkFunctionCorrectness(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {
|
protected void checkFunction(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {
|
||||||
PsiElement nameIdentifier = function.getNameIdentifier();
|
PsiElement nameIdentifier = function.getNameIdentifier();
|
||||||
if (containingDescriptor instanceof ClassDescriptor) {
|
if (containingDescriptor instanceof ClassDescriptor) {
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) containingDescriptor;
|
ClassDescriptor classDescriptor = (ClassDescriptor) containingDescriptor;
|
||||||
|
|||||||
@@ -27,5 +27,5 @@ public class TopDownAnalyzerForStandardLibrary extends TopDownAnalyzer {
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void checkFunctionCorrectness(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {}
|
protected void checkFunction(JetNamedFunction function, FunctionDescriptor functionDescriptor, DeclarationDescriptor containingDescriptor) {}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user