use of org.eclipse.n4js.ts.types.ContainerType in project n4js by eclipse.
the class N4JSASTUtils method isSemiLegalAssignmentToFinalFieldInCtor.
/**
* Returns true iff <code>expr</code> is a semi-legal assignment expression within a constructor to a final field of
* the same class. Here, "semi"-legal means that one requirement for a fully legal such assignment is <b>not</b>
* checked by this method: the requirement that the declaration of the assigned final field must not have an
* initializer expression. For a fully legal assignment to a final field this has to be checked by client code.
*/
public static boolean isSemiLegalAssignmentToFinalFieldInCtor(EObject expr, TMember writtenMember) {
if (!(expr instanceof AssignmentExpression))
return false;
final AssignmentExpression assExpr = (AssignmentExpression) expr;
// left-hand side must be a property access to 'this'
final Expression lhs = assExpr.getLhs();
if (!(lhs instanceof ParameterizedPropertyAccessExpression))
return false;
final ParameterizedPropertyAccessExpression paExpr = (ParameterizedPropertyAccessExpression) lhs;
if (!(paExpr.getTarget() instanceof ThisLiteral))
return false;
// BUT: check this only if we have a resolved property in paExpr (important if this method used from scoping)
if (paExpr.getProperty() != null && !paExpr.getProperty().eIsProxy()) {
if (writtenMember != null) {
// case 1: writtenMember provided as argument -> must be identical
if (paExpr.getProperty() != writtenMember)
return false;
} else {
// case 2: writtenMember not provided -> take from paExpr
if (paExpr.getProperty() instanceof TMember)
writtenMember = (TMember) paExpr.getProperty();
}
}
// written member must be a final field
if (!(writtenMember instanceof TField))
return false;
final TField field = (TField) writtenMember;
if (!field.isFinal())
return false;
// (IMPORTANT: we do not assert !field.isHasExpression() here, which would be required for a fully-legal write
// access)
// assExpr must be located in the constructor of the owner of 'field'
// (a) find type model element for the function containing the assignment expression
final FunctionDefinition containingFunction = getContainingFunction(assExpr);
if (containingFunction == null)
return false;
final Type containingTFunction = containingFunction.getDefinedType();
if (containingTFunction == null)
return false;
// (b) find constructor of the owner of the field
final ContainerType<?> ownerOfField = field.getContainingType();
if (ownerOfField == null)
return false;
final TMember ctorOfOwner = getOwnOrSuperCtor(ownerOfField);
if (ctorOfOwner == null)
return false;
// (c) compare
boolean simpleCompare = containingTFunction == ctorOfOwner;
if (simpleCompare) {
return true;
}
// filled type:
if (containingTFunction.eContainer() instanceof TClass) {
TClass containingTClass = (TClass) containingTFunction.eContainer();
if (containingTClass.isStaticPolyfill() && containingTClass.getSuperClassRef() != null && containingTClass.getSuperClassRef().getDeclaredType() instanceof TClass) {
// get replaced ctor:
TClass filledClass = (TClass) containingTClass.getSuperClassRef().getDeclaredType();
TMember replacedCtorOfFilledClass = getOwnOrSuperCtor(filledClass);
// compare (incl. null)
return replacedCtorOfFilledClass == ctorOfOwner;
}
}
return false;
}
use of org.eclipse.n4js.ts.types.ContainerType in project n4js by eclipse.
the class WildcardImpl method getDeclaredOrImplicitUpperBound.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public TypeRef getDeclaredOrImplicitUpperBound() {
final TypeRef declUB = this.getDeclaredUpperBound();
if ((declUB != null)) {
return declUB;
}
TypeRef _declaredLowerBound = this.getDeclaredLowerBound();
boolean _tripleNotEquals = (_declaredLowerBound != null);
if (_tripleNotEquals) {
return null;
}
final EObject parent = this.eContainer();
if ((parent instanceof ParameterizedTypeRef)) {
final int typeArgIndex = ((ParameterizedTypeRef) parent).getTypeArgs().indexOf(this);
if ((typeArgIndex >= 0)) {
final Object declType = ((ParameterizedTypeRef) parent).eGet(TypeRefsPackage.eINSTANCE.getParameterizedTypeRef_DeclaredType(), false);
if ((declType instanceof ContainerType<?>)) {
boolean _eIsProxy = ((ContainerType<?>) declType).eIsProxy();
boolean _not = (!_eIsProxy);
if (_not) {
final EList<TypeVariable> typeVars = ((ContainerType<?>) declType).getTypeVars();
TypeVariable _xifexpression = null;
int _size = typeVars.size();
boolean _lessThan = (typeArgIndex < _size);
if (_lessThan) {
_xifexpression = typeVars.get(typeArgIndex);
} else {
_xifexpression = null;
}
final TypeVariable typeVar = _xifexpression;
if ((typeVar != null)) {
final TypeRef implicitUB = typeVar.getDeclaredUpperBound();
return implicitUB;
}
}
}
}
}
return null;
}
use of org.eclipse.n4js.ts.types.ContainerType in project n4js by eclipse.
the class TMemberImpl method getContainingType.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public ContainerType<?> getContainingType() {
final EObject myContainer = this.eContainer();
ContainerType<?> _xifexpression = null;
if ((myContainer instanceof ContainerType<?>)) {
_xifexpression = ((ContainerType<?>) myContainer);
} else {
_xifexpression = null;
}
return _xifexpression;
}
use of org.eclipse.n4js.ts.types.ContainerType in project n4js by eclipse.
the class TMethodImpl method getContainingType.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public ContainerType<?> getContainingType() {
final EObject myContainer = this.eContainer();
ContainerType<?> _xifexpression = null;
if ((myContainer instanceof ContainerType<?>)) {
_xifexpression = ((ContainerType<?>) myContainer);
} else {
_xifexpression = null;
}
return _xifexpression;
}
use of org.eclipse.n4js.ts.types.ContainerType in project n4js by eclipse.
the class TFunctionImpl method isCallableConstructor.
/**
* <!-- begin-user-doc -->
* <!-- end-user-doc -->
* @generated
*/
public boolean isCallableConstructor() {
final EObject parent = this.eContainer();
boolean _xifexpression = false;
if ((parent instanceof ContainerType<?>)) {
TMethod _callableCtor = ((ContainerType<?>) parent).getCallableCtor();
_xifexpression = (_callableCtor == this);
} else {
_xifexpression = false;
}
return _xifexpression;
}
Aggregations