Get rid of FIELD_IDENTIFIER at syntax level, two errors dropped, a set of tests fixed / deleted #KT-9539 Fixed

This commit is contained in:
Mikhail Glukhikh
2015-10-20 13:55:37 +03:00
parent 8ea0501a30
commit d6988ad69e
97 changed files with 177 additions and 792 deletions
@@ -402,7 +402,7 @@ public class JetFlowInformationProvider {
) {
VariableDescriptor variableDescriptor = ctxt.variableDescriptor;
PropertyDescriptor propertyDescriptor = SyntheticFieldDescriptorKt.getReferencedProperty(variableDescriptor);
if (KtPsiUtil.isBackingFieldReference(expression, variableDescriptor) && propertyDescriptor != null) {
if (KtPsiUtil.isBackingFieldReference(variableDescriptor) && propertyDescriptor != null) {
KtPropertyAccessor accessor = PsiTreeUtil.getParentOfType(expression, KtPropertyAccessor.class);
if (accessor != null) {
DeclarationDescriptor accessorDescriptor = trace.get(BindingContext.DECLARATION_TO_DESCRIPTOR, accessor);
@@ -511,11 +511,8 @@ public class JetFlowInformationProvider {
}
}
if (variable instanceof KtSimpleNameExpression) {
KtSimpleNameExpression simpleNameExpression = (KtSimpleNameExpression) variable;
if (simpleNameExpression.getReferencedNameElementType() != KtTokens.FIELD_IDENTIFIER) {
trace.record(IS_UNINITIALIZED, (PropertyDescriptor) variableDescriptor);
return true;
}
trace.record(IS_UNINITIALIZED, (PropertyDescriptor) variableDescriptor);
return true;
}
}
return false;
@@ -551,9 +548,6 @@ public class JetFlowInformationProvider {
DeclarationDescriptor containingDeclaration = variableDescriptor.getContainingDeclaration();
if ((containingDeclaration instanceof ClassDescriptor)
&& DescriptorUtils.isAncestor(containingDeclaration, declarationDescriptor, false)) {
if (element instanceof KtSimpleNameExpression) {
report(Errors.BACKING_FIELD_USAGE_FORBIDDEN.on((KtSimpleNameExpression) element), cxtx);
}
return false;
}
report(Errors.INACCESSIBLE_BACKING_FIELD.on(element), cxtx);
@@ -567,9 +561,6 @@ public class JetFlowInformationProvider {
boolean reportError
) {
error[0] = false;
if (KtPsiUtil.isBackingFieldReference(element, null)) {
return true;
}
if (element instanceof KtDotQualifiedExpression && isCorrectBackingFieldReference(
((KtDotQualifiedExpression) element).getSelectorExpression(), ctxt, error, false)) {
if (((KtDotQualifiedExpression) element).getReceiverExpression() instanceof KtThisExpression) {
@@ -361,9 +361,6 @@ public interface Errors {
DiagnosticFactory0<KtProperty> PRIVATE_PROPERTY_IN_INTERFACE = DiagnosticFactory0.create(ERROR, PRIVATE_MODIFIER);
DiagnosticFactory0<KtProperty> BACKING_FIELD_IN_INTERFACE = DiagnosticFactory0.create(ERROR, DECLARATION_SIGNATURE);
DiagnosticFactory0<KtSimpleNameExpression> BACKING_FIELD_OLD_SYNTAX = DiagnosticFactory0.create(ERROR);
DiagnosticFactory0<KtSimpleNameExpression> BACKING_FIELD_USAGE_FORBIDDEN = DiagnosticFactory0.create(ERROR);
DiagnosticFactory1<PsiElement, String> INAPPLICABLE_LATEINIT_MODIFIER = DiagnosticFactory1.create(ERROR);
DiagnosticFactory2<KtModifierListOwner, String, ClassDescriptor> ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS = DiagnosticFactory2.create(ERROR, ABSTRACT_MODIFIER);
@@ -170,9 +170,6 @@ public class DefaultErrorMessages {
MAP.put(INACCESSIBLE_BACKING_FIELD, "The backing field is not accessible here");
MAP.put(NOT_PROPERTY_BACKING_FIELD, "The referenced variable is not a property and doesn't have backing field");
MAP.put(BACKING_FIELD_OLD_SYNTAX, "This backing field syntax is forbidden, use 'field' instead");
MAP.put(BACKING_FIELD_USAGE_FORBIDDEN, "Backing field usage is forbidden here");
MAP.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments is not allowed");
MAP.put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter");
MAP.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", ELEMENT_TEXT);
@@ -106,7 +106,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
DO_KEYWORD,
IDENTIFIER, // SimpleName
FIELD_IDENTIFIER, // Field reference
PACKAGE_KEYWORD, // for absolute qualified names
AT // Just for better recovery and maybe for annotations
@@ -679,9 +678,6 @@ public class JetExpressionParsing extends AbstractJetParsing {
VAR_KEYWORD, TYPE_ALIAS_KEYWORD)) {
parseLocalDeclaration();
}
else if (at(FIELD_IDENTIFIER)) {
parseSimpleNameExpression();
}
else if (at(IDENTIFIER)) {
parseSimpleNameExpression();
}
@@ -1019,12 +1015,7 @@ public class JetExpressionParsing extends AbstractJetParsing {
*/
public void parseSimpleNameExpression() {
PsiBuilder.Marker simpleName = mark();
if (at(FIELD_IDENTIFIER)) {
advance(); //
}
else {
expect(IDENTIFIER, "Expecting an identifier");
}
expect(IDENTIFIER, "Expecting an identifier");
simpleName.done(REFERENCE_EXPRESSION);
}
@@ -64,6 +64,6 @@ public class KtNameReferenceExpression : KtExpressionImplStub<KotlinNameReferenc
}
companion object {
private val NAME_REFERENCE_EXPRESSIONS = TokenSet.create(IDENTIFIER, FIELD_IDENTIFIER, THIS_KEYWORD, SUPER_KEYWORD)
private val NAME_REFERENCE_EXPRESSIONS = TokenSet.create(IDENTIFIER, THIS_KEYWORD, SUPER_KEYWORD)
}
}
@@ -361,12 +361,8 @@ public class KtPsiUtil {
return declaration.getBodyExpression() == null;
}
public static boolean isBackingFieldReference(@NotNull KtSimpleNameExpression expression, @Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof SyntheticFieldDescriptor || expression.getReferencedNameElementType() == KtTokens.FIELD_IDENTIFIER;
}
public static boolean isBackingFieldReference(@Nullable KtElement element, @Nullable DeclarationDescriptor descriptor) {
return element instanceof KtSimpleNameExpression && isBackingFieldReference((KtSimpleNameExpression) element, descriptor);
public static boolean isBackingFieldReference(@Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof SyntheticFieldDescriptor;
}
@Nullable
@@ -669,18 +669,8 @@ public class BodyResolver {
return new ObservableBindingTrace(trace).addHandler(BindingContext.REFERENCE_TARGET, new ObservableBindingTrace.RecordHandler<KtReferenceExpression, DeclarationDescriptor>() {
@Override
public void handleRecord(WritableSlice<KtReferenceExpression, DeclarationDescriptor> slice, KtReferenceExpression expression, DeclarationDescriptor descriptor) {
if (expression instanceof KtSimpleNameExpression) {
KtSimpleNameExpression simpleNameExpression = (KtSimpleNameExpression) expression;
if (simpleNameExpression.getReferencedNameElementType() == KtTokens.FIELD_IDENTIFIER) {
// This check may be considered redundant as long as $x is only accessible from accessors to $x
if (descriptor == propertyDescriptor) { // TODO : original?
trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor); // TODO: this trace?
trace.report(Errors.BACKING_FIELD_OLD_SYNTAX.on(simpleNameExpression));
}
}
if (descriptor instanceof SyntheticFieldDescriptor) {
trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
}
if (expression instanceof KtSimpleNameExpression && descriptor instanceof SyntheticFieldDescriptor) {
trace.record(BindingContext.BACKING_FIELD_REQUIRED, propertyDescriptor);
}
}
});
@@ -141,14 +141,7 @@ public class CallResolver {
assert calleeExpression instanceof KtSimpleNameExpression;
KtSimpleNameExpression nameExpression = (KtSimpleNameExpression) calleeExpression;
Name referencedName = nameExpression.getReferencedNameAsName();
CallableDescriptorCollectors<VariableDescriptor> callableDescriptorCollectors;
if (nameExpression.getReferencedNameElementType() == KtTokens.FIELD_IDENTIFIER) {
referencedName = Name.identifier(referencedName.asString().substring(1));
callableDescriptorCollectors = CallableDescriptorCollectors.PROPERTIES;
}
else {
callableDescriptorCollectors = CallableDescriptorCollectors.VARIABLES;
}
CallableDescriptorCollectors<VariableDescriptor> callableDescriptorCollectors = CallableDescriptorCollectors.VARIABLES;
return computeTasksAndResolveCall(
context, referencedName, nameExpression,
callableDescriptorCollectors, CallTransformer.VARIABLE_CALL_TRANSFORMER);