Search in sources :

Example 1 with WrongWriteAccessDescription

use of org.eclipse.n4js.scoping.utils.WrongWriteAccessDescription in project n4js by eclipse.

the class AbstractMemberScope method getSingleLocalElementByName.

@Override
protected IEObjectDescription getSingleLocalElementByName(QualifiedName name) {
    if (name.getSegmentCount() != 1) {
        return null;
    }
    final String nameAsString = name.getFirstSegment();
    // both read/write required
    if (ExpressionExtensions.isBothReadFromAndWrittenTo(context)) {
        TMember reader = findMember(nameAsString, false, staticAccess);
        TMember writer = findMember(nameAsString, true, staticAccess);
        if (null == reader && null == writer) {
            // will be caught as error "Could not resolve reference"
            return null;
        }
        if (null == reader) {
            return new UnsatisfiedRWAccessDescription(EObjectDescription.create(writer.getName(), writer), true);
        }
        if (null == writer) {
            return new UnsatisfiedRWAccessDescription(EObjectDescription.create(reader.getName(), reader), false);
        }
        // pick arbitrarily the setter
        return createSingleElementDescription(writer);
    }
    // either read or write requirement that moreover is satisfied
    final boolean accessForWriteOperation = ExpressionExtensions.isLeftHandSide(context);
    TMember existingMember = findMember(nameAsString, accessForWriteOperation, staticAccess);
    if (existingMember != null) {
        return createSingleElementDescription(existingMember);
    }
    // wrong read/write
    existingMember = findMember(nameAsString, !accessForWriteOperation, staticAccess);
    if (existingMember != null) {
        // allowed special case: writing in the ctor to a final field that lacks init value
        final boolean isAssOfFinalInCtor = N4JSASTUtils.isSemiLegalAssignmentToFinalFieldInCtor(context.eContainer(), existingMember);
        final boolean isLegalAssOfFinalInCtor = isAssOfFinalInCtor && !((TField) existingMember).isHasExpression();
        if (isLegalAssOfFinalInCtor) {
            return createSingleElementDescription(existingMember);
        }
        // allowed special case: wrong read/write in a mode other than N4JS
        if (jsVariantHelper.allowWrongReadWrite(context)) {
            // cf. sec. 13.1
            return createSingleElementDescription(existingMember);
        }
        return new WrongWriteAccessDescription(EObjectDescription.create(existingMember.getName(), existingMember), accessForWriteOperation, isAssOfFinalInCtor);
    }
    // wrong static / non-static
    existingMember = findMember(nameAsString, accessForWriteOperation, !staticAccess);
    if (existingMember == null) {
        // if both read/write access and static access are wrong, we want to
        // complain (only) about "wrong static access" -> so include this case here
        existingMember = findMember(nameAsString, !accessForWriteOperation, !staticAccess);
    }
    if (existingMember != null) {
        return new WrongStaticAccessDescription(EObjectDescription.create(existingMember.getName(), existingMember), staticAccess);
    }
    return null;
}
Also used : WrongWriteAccessDescription(org.eclipse.n4js.scoping.utils.WrongWriteAccessDescription) TField(org.eclipse.n4js.ts.types.TField) TMember(org.eclipse.n4js.ts.types.TMember) WrongStaticAccessDescription(org.eclipse.n4js.scoping.utils.WrongStaticAccessDescription) UnsatisfiedRWAccessDescription(org.eclipse.n4js.scoping.utils.UnsatisfiedRWAccessDescription)

Aggregations

UnsatisfiedRWAccessDescription (org.eclipse.n4js.scoping.utils.UnsatisfiedRWAccessDescription)1 WrongStaticAccessDescription (org.eclipse.n4js.scoping.utils.WrongStaticAccessDescription)1 WrongWriteAccessDescription (org.eclipse.n4js.scoping.utils.WrongWriteAccessDescription)1 TField (org.eclipse.n4js.ts.types.TField)1 TMember (org.eclipse.n4js.ts.types.TMember)1