提交 f89a29ff 编写于 作者: S svtk

rollback -resolveModifiers() method location

上级 5cb298c0
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 { ...@@ -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)
);
}
} }
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 { ...@@ -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.*; ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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()),
...@@ -560,6 +557,30 @@ public class ClassDescriptorResolver { ...@@ -560,6 +557,30 @@ public class ClassDescriptorResolver {
} }
} }
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) {
JetPropertyAccessor setter = property.getSetter(); JetPropertyAccessor setter = property.getSetter();
...@@ -569,7 +590,7 @@ public class ClassDescriptorResolver { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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) {}
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册