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:
@@ -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);
|
||||
|
||||
-3
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user