use of org.eclipse.n4js.ts.types.TMember in project n4js by eclipse.
the class N4JSMemberRedefinitionValidator method checkMemberRedefinitions.
/**
* Checks constraints defined in chapter 5.4. Redefinition of Members.
*/
@Check
public void checkMemberRedefinitions(N4ClassifierDefinition n4ClassifierDefinition) {
if (!(n4ClassifierDefinition.getDefinedType() instanceof TClassifier)) {
// wrongly parsed
return;
}
TClassifier tClassifier = (TClassifier) n4ClassifierDefinition.getDefinedType();
getContext().put(TClassifier.class, tClassifier);
RuleEnvironment g = RuleEnvironmentExtensions.newRuleEnvironment(tClassifier);
getContext().put(RuleEnvironment.class, g);
// the context for type variables
ParameterizedTypeRef classTypeRef = TypeUtils.createTypeRef(tClassifier);
getContext().put(TYPE_VAR_CONTEXT, classTypeRef);
MemberCube memberCube = createMemberValidationList();
final boolean isClass = tClassifier instanceof TClass;
final Map<ParameterizedTypeRef, MemberList<TMember>> nonAccessibleAbstractMembersBySuperTypeRef = new HashMap<>();
for (Entry<NameStaticPair, MemberMatrix> entry : memberCube.entrySet()) {
MemberMatrix mm = entry.getValue();
// Set to collect all owned members that are lacking an override annotation.
Collection<TMember> membersMissingOverrideAnnotation = new HashSet<>();
if (isClass) {
constraints_67_MemberOverride_checkEntry(mm, membersMissingOverrideAnnotation);
}
if (mm.hasImplemented()) {
// first mix in
if (holdConstraints_68_Consumption(mm)) {
// then check if everything is implemented
constraints_69_Implementation(mm, membersMissingOverrideAnnotation);
}
}
constraints_60_InheritedConsumedCovariantSpecConstructor(tClassifier, mm);
constraints_66_NonOverride(mm);
constraints_42_45_46_AbstractMember(mm, nonAccessibleAbstractMembersBySuperTypeRef);
unusedGenericTypeVariable(mm);
checkUnpairedAccessorConsumption(mm, n4ClassifierDefinition);
checkUnpairedAccessorFilling(mm, n4ClassifierDefinition);
messageMissingOverrideAnnotation(mm, membersMissingOverrideAnnotation);
}
final boolean foundImpossibleExtendsImplements = !nonAccessibleAbstractMembersBySuperTypeRef.isEmpty();
if (foundImpossibleExtendsImplements) {
messageImpossibleExtendsImplements(n4ClassifierDefinition, nonAccessibleAbstractMembersBySuperTypeRef);
}
if (!foundImpossibleExtendsImplements) {
// avoid consequential errors
constraints_41_AbstractClass(tClassifier, memberCube);
}
}
use of org.eclipse.n4js.ts.types.TMember in project n4js by eclipse.
the class N4JSMemberRedefinitionValidator method holdConstraints_68_Consumption.
/**
* Constraints 68: Consumption of Interface Members
*
* Returns false if an error occurred which is not solvable in current classifier (i.e., incompatible meta types).
*/
private boolean holdConstraints_68_Consumption(MemberMatrix mm) {
TClassifier currentType = getCurrentClassifier();
MemberList<TMember> consumedMembers = new MemberList<>(2);
for (TMember m : mm.implemented()) {
boolean consume = true;
for (SourceAwareIterator iter = mm.allMembers(); iter.hasNext(); ) {
TMember m_ = iter.next();
if (m_ == m && iter.isInterfaceMember()) {
// again. Thus, we only consume if both members stem from interfaces
continue;
}
// 1. meta type
if ((m.isMethod() && !m_.isMethod()) || (!m.isMethod() && !(m_.isAccessor() || m_.isField()))) {
if (iter.isInterfaceMember()) {
messageIncompatibleMembersToImplement(mm.implemented());
return false;
} else if (iter.isInheritedMember()) {
messageIncompatibleInheritedMembersToImplement(m_, mm.implemented());
return false;
} else {
return true;
}
}
// 2 (abstract/owned), 3 (visibility) and 4 (type):
boolean accessorPair = TypeUtils.isAccessorPair(m, m_);
if (!accessorPair) {
// 2. not abstract or owned
if ((!m_.isAbstract() || m_.getContainingType() == currentType)) {
consume = false;
break;
}
// 3. access modifier
if (AccessModifiers.less(m, m_)) {
consume = false;
break;
}
// 4. type
if (!m_.isSetter()) {
if (!isSubType(m, m_)) {
consume = false;
break;
}
}
if (m_.isSetter() || m_.isField()) {
if (!isSubType(m_, m)) {
consume = false;
break;
}
}
}
}
if (consume) {
if (!consumedMembers.contains(m)) {
// in case an interface is (indirectly) redundantly implemented
consumedMembers.add(m);
}
}
}
mm.markConsumed(consumedMembers);
return true;
}
use of org.eclipse.n4js.ts.types.TMember in project n4js by eclipse.
the class InternalTypeSystem method applyRuleTypeIndexedAccessExpression.
protected Result<TypeRef> applyRuleTypeIndexedAccessExpression(final RuleEnvironment G, final RuleApplicationTrace _trace_, final IndexedAccessExpression expr) throws RuleFailedException {
// output parameter
TypeRef T = null;
/* { expr.target === null || expr.index === null; T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } or { expr.target instanceof SuperLiteral T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } or { G |- expr.target : var TypeRef targetTypeRef targetTypeRef = typeSystemHelper.resolveType(G, targetTypeRef); G |- expr.index : var TypeRef indexTypeRef; val targetDeclType = targetTypeRef.declaredType; val targetIsLiteralOfStringBasedEnum = targetDeclType instanceof TEnum && AnnotationDefinition.STRING_BASED.hasAnnotation(targetDeclType); val indexIsNumeric = { G |- indexTypeRef <: G.numberTypeRef }; val indexValue = ASTMetaInfoUtils.getCompileTimeValue(expr.index); val memberName = N4JSLanguageUtils.derivePropertyNameFromCompileTimeValue(indexValue); if (indexIsNumeric && (targetTypeRef.isArrayLike || targetIsLiteralOfStringBasedEnum)) { if (targetDeclType.generic && targetTypeRef.typeArgs.isEmpty) { T = G.anyTypeRef } else { val G2 = G.wrap typeSystemHelper.addSubstitutions(G2, targetTypeRef) G2.addThisType(targetTypeRef) val elementTypeRef = if(targetIsLiteralOfStringBasedEnum) { G.stringType.elementType } else { targetDeclType.elementType }; G2 |- elementTypeRef ~> T } } else if (memberName!==null) { val staticAccess = (targetTypeRef instanceof TypeTypeRef) val checkVisibility = false val scope = memberScopingHelper.createMemberScope(targetTypeRef, expr, checkVisibility, staticAccess) val memberDesc = if(memberName!==null && !memberName.isEmpty()) { scope.getSingleElement(qualifiedNameConverter.toQualifiedName(memberName)) }; val member = if(memberDesc!==null && !IEObjectDescriptionWithError.isErrorDescription(memberDesc)) { memberDesc.getEObjectOrProxy() }; if(member instanceof TMember && !member.eIsProxy) { G |- (member as TMember) : var TypeRef memberTypeRef val G2 = G.wrap typeSystemHelper.addSubstitutions(G2,targetTypeRef) G2.addThisType(targetTypeRef) G2 |- memberTypeRef ~> T } else if (targetTypeRef.dynamic) { T = G.anyTypeRefDynamic } else { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } } else if (targetTypeRef.dynamic) { T = G.anyTypeRefDynamic } else { T = G.anyTypeRef } } */
{
RuleFailedException previousFailure = null;
try {
/* expr.target === null || expr.index === null */
if (!((expr.getTarget() == null) || (expr.getIndex() == null))) {
sneakyThrowRuleFailedException("expr.target === null || expr.index === null");
}
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
} catch (Exception e) {
previousFailure = extractRuleFailedException(e);
/* { expr.target instanceof SuperLiteral T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } or { G |- expr.target : var TypeRef targetTypeRef targetTypeRef = typeSystemHelper.resolveType(G, targetTypeRef); G |- expr.index : var TypeRef indexTypeRef; val targetDeclType = targetTypeRef.declaredType; val targetIsLiteralOfStringBasedEnum = targetDeclType instanceof TEnum && AnnotationDefinition.STRING_BASED.hasAnnotation(targetDeclType); val indexIsNumeric = { G |- indexTypeRef <: G.numberTypeRef }; val indexValue = ASTMetaInfoUtils.getCompileTimeValue(expr.index); val memberName = N4JSLanguageUtils.derivePropertyNameFromCompileTimeValue(indexValue); if (indexIsNumeric && (targetTypeRef.isArrayLike || targetIsLiteralOfStringBasedEnum)) { if (targetDeclType.generic && targetTypeRef.typeArgs.isEmpty) { T = G.anyTypeRef } else { val G2 = G.wrap typeSystemHelper.addSubstitutions(G2, targetTypeRef) G2.addThisType(targetTypeRef) val elementTypeRef = if(targetIsLiteralOfStringBasedEnum) { G.stringType.elementType } else { targetDeclType.elementType }; G2 |- elementTypeRef ~> T } } else if (memberName!==null) { val staticAccess = (targetTypeRef instanceof TypeTypeRef) val checkVisibility = false val scope = memberScopingHelper.createMemberScope(targetTypeRef, expr, checkVisibility, staticAccess) val memberDesc = if(memberName!==null && !memberName.isEmpty()) { scope.getSingleElement(qualifiedNameConverter.toQualifiedName(memberName)) }; val member = if(memberDesc!==null && !IEObjectDescriptionWithError.isErrorDescription(memberDesc)) { memberDesc.getEObjectOrProxy() }; if(member instanceof TMember && !member.eIsProxy) { G |- (member as TMember) : var TypeRef memberTypeRef val G2 = G.wrap typeSystemHelper.addSubstitutions(G2,targetTypeRef) G2.addThisType(targetTypeRef) G2 |- memberTypeRef ~> T } else if (targetTypeRef.dynamic) { T = G.anyTypeRefDynamic } else { T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef } } else if (targetTypeRef.dynamic) { T = G.anyTypeRefDynamic } else { T = G.anyTypeRef } } */
{
try {
Expression _target = expr.getTarget();
/* expr.target instanceof SuperLiteral */
if (!(_target instanceof SuperLiteral)) {
sneakyThrowRuleFailedException("expr.target instanceof SuperLiteral");
}
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
} catch (Exception e_1) {
previousFailure = extractRuleFailedException(e_1);
/* G |- expr.target : var TypeRef targetTypeRef */
Expression _target_1 = expr.getTarget();
TypeRef targetTypeRef = null;
Result<TypeRef> result = typeInternal(G, _trace_, _target_1);
checkAssignableTo(result.getFirst(), TypeRef.class);
targetTypeRef = (TypeRef) result.getFirst();
targetTypeRef = this.typeSystemHelper.resolveType(G, targetTypeRef);
/* G |- expr.index : var TypeRef indexTypeRef */
Expression _index = expr.getIndex();
TypeRef indexTypeRef = null;
Result<TypeRef> result_1 = typeInternal(G, _trace_, _index);
checkAssignableTo(result_1.getFirst(), TypeRef.class);
indexTypeRef = (TypeRef) result_1.getFirst();
final Type targetDeclType = targetTypeRef.getDeclaredType();
final boolean targetIsLiteralOfStringBasedEnum = ((targetDeclType instanceof TEnum) && AnnotationDefinition.STRING_BASED.hasAnnotation(targetDeclType));
/* G |- indexTypeRef <: G.numberTypeRef */
ParameterizedTypeRef _numberTypeRef = RuleEnvironmentExtensions.numberTypeRef(G);
boolean _ruleinvocation = subtypeSucceeded(G, _trace_, indexTypeRef, _numberTypeRef);
final boolean indexIsNumeric = _ruleinvocation;
final CompileTimeValue indexValue = ASTMetaInfoUtils.getCompileTimeValue(expr.getIndex());
final String memberName = N4JSLanguageUtils.derivePropertyNameFromCompileTimeValue(indexValue);
if ((indexIsNumeric && (targetTypeRef.isArrayLike() || targetIsLiteralOfStringBasedEnum))) {
if ((targetDeclType.isGeneric() && targetTypeRef.getTypeArgs().isEmpty())) {
T = RuleEnvironmentExtensions.anyTypeRef(G);
} else {
final RuleEnvironment G2 = RuleEnvironmentExtensions.wrap(G);
this.typeSystemHelper.addSubstitutions(G2, targetTypeRef);
RuleEnvironmentExtensions.addThisType(G2, targetTypeRef);
TypeRef _xifexpression = null;
if (targetIsLiteralOfStringBasedEnum) {
_xifexpression = RuleEnvironmentExtensions.stringType(G).getElementType();
} else {
_xifexpression = targetDeclType.getElementType();
}
final TypeRef elementTypeRef = _xifexpression;
/* G2 |- elementTypeRef ~> T */
Result<TypeArgument> result_2 = substTypeVariablesInternal(G2, _trace_, elementTypeRef);
checkAssignableTo(result_2.getFirst(), TypeRef.class);
T = (TypeRef) result_2.getFirst();
}
} else {
if ((memberName != null)) {
final boolean staticAccess = (targetTypeRef instanceof TypeTypeRef);
final boolean checkVisibility = false;
final IScope scope = this.memberScopingHelper.createMemberScope(targetTypeRef, expr, checkVisibility, staticAccess);
IEObjectDescription _xifexpression_1 = null;
if (((memberName != null) && (!memberName.isEmpty()))) {
_xifexpression_1 = scope.getSingleElement(this.qualifiedNameConverter.toQualifiedName(memberName));
}
final IEObjectDescription memberDesc = _xifexpression_1;
EObject _xifexpression_2 = null;
if (((memberDesc != null) && (!IEObjectDescriptionWithError.isErrorDescription(memberDesc)))) {
_xifexpression_2 = memberDesc.getEObjectOrProxy();
}
final EObject member = _xifexpression_2;
if (((member instanceof TMember) && (!member.eIsProxy()))) {
/* G |- (member as TMember) : var TypeRef memberTypeRef */
TypeRef memberTypeRef = null;
Result<TypeRef> result_3 = typeInternal(G, _trace_, ((TMember) member));
checkAssignableTo(result_3.getFirst(), TypeRef.class);
memberTypeRef = (TypeRef) result_3.getFirst();
final RuleEnvironment G2_1 = RuleEnvironmentExtensions.wrap(G);
this.typeSystemHelper.addSubstitutions(G2_1, targetTypeRef);
RuleEnvironmentExtensions.addThisType(G2_1, targetTypeRef);
/* G2 |- memberTypeRef ~> T */
Result<TypeArgument> result_4 = substTypeVariablesInternal(G2_1, _trace_, memberTypeRef);
checkAssignableTo(result_4.getFirst(), TypeRef.class);
T = (TypeRef) result_4.getFirst();
} else {
boolean _isDynamic = targetTypeRef.isDynamic();
if (_isDynamic) {
T = RuleEnvironmentExtensions.anyTypeRefDynamic(G);
} else {
T = TypeRefsFactory.eINSTANCE.createUnknownTypeRef();
}
}
} else {
boolean _isDynamic_1 = targetTypeRef.isDynamic();
if (_isDynamic_1) {
T = RuleEnvironmentExtensions.anyTypeRefDynamic(G);
} else {
T = RuleEnvironmentExtensions.anyTypeRef(G);
}
}
}
}
}
}
}
return new Result<TypeRef>(T);
}
use of org.eclipse.n4js.ts.types.TMember in project n4js by eclipse.
the class Reducer method reduceStructuralTypeRef.
private boolean reduceStructuralTypeRef(TypeRef left, TypeRef right, Variance variance) {
if (variance == CONTRA) {
return reduceStructuralTypeRef(right, left, CO);
}
// now, variance is either CO or INV
final StructuralTypingComputer stc = tsh.getStructuralTypingComputer();
final RuleEnvironment G2 = RuleEnvironmentExtensions.wrap(G);
final StructTypingInfo infoFaked = new // <- G2 will be changed!
StructTypingInfo(// <- G2 will be changed!
G2, // <- G2 will be changed!
left, // <- G2 will be changed!
right, left.getTypingStrategy(), right.getTypingStrategy());
boolean wasAdded = false;
final StructuralTypesHelper structTypesHelper = tsh.getStructuralTypesHelper();
final StructuralMembersTripleIterator iter = structTypesHelper.getMembersTripleIterator(G2, left, right, false);
while (iter.hasNext()) {
final StructuralMembersTriple next = iter.next();
final TMember l = next.getLeft();
final TMember r = next.getRight();
if (l == null || r == null) {
// commencing with type inference here produces better error messages.)
continue;
}
final TypeConstraint constraint = stc.reduceMembers(left, l, r, variance, infoFaked);
if (containsReopenedExistentialType(G2, constraint)) {
// TODO reconsider handling of re-opened ExistentialTypeRefs in InferenceContext, IDE-1653
continue;
}
wasAdded |= reduce(constraint);
}
return wasAdded;
}
use of org.eclipse.n4js.ts.types.TMember in project n4js by eclipse.
the class FindReferenceHelper method getTargets.
private TargetURIs getTargets(EObject declaration) {
// Special handling for composed members
List<EObject> realTargets = new ArrayList<>();
if ((declaration instanceof TMember) && ((TMember) declaration).isComposed()) {
// In case of composed member, add the constituent members instead.
List<TMember> constituentMembers = ((TMember) declaration).getConstituentMembers();
for (TMember constituentMember : constituentMembers) {
realTargets.add(constituentMember);
}
} else {
// Standard case
realTargets.add(declaration);
}
TargetURIs targets = targetURISetProvider.get();
for (EObject realTarget : realTargets) {
collector.add(realTarget, targets);
}
return targets;
}
Aggregations